mirror of https://github.com/ecmwf/eccodes.git
ECC-958: grib_compare: show bit values for codeflag keys
This commit is contained in:
parent
662fc587bc
commit
1ca2f676e3
|
@ -572,6 +572,24 @@ static void save_error(grib_context* c,const char* key)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int test_bit(long a, long b) {return a&(1<<b);}
|
||||||
|
|
||||||
|
/* If the accessor represents a codeflag key, then return its binary rep in 'result' */
|
||||||
|
static int codeflag_to_bitstr(grib_accessor* a, long val, char* result)
|
||||||
|
{
|
||||||
|
if (a && grib_inline_strcmp(a->cclass->name, "codeflag")==0) {
|
||||||
|
long i;
|
||||||
|
const long bytelen = a->length*8;
|
||||||
|
for(i=0; i<bytelen; i++) {
|
||||||
|
if (test_bit(val, bytelen-i-1)) *result='1';
|
||||||
|
else *result='0';
|
||||||
|
result++;
|
||||||
|
}
|
||||||
|
return GRIB_SUCCESS;
|
||||||
|
}
|
||||||
|
return GRIB_INVALID_TYPE;
|
||||||
|
}
|
||||||
|
|
||||||
static int compare_values(grib_runtime_options* options,grib_handle* h1,grib_handle *h2,const char *name,int type)
|
static int compare_values(grib_runtime_options* options,grib_handle* h1,grib_handle *h2,const char *name,int type)
|
||||||
{
|
{
|
||||||
size_t len1 = 0;
|
size_t len1 = 0;
|
||||||
|
@ -805,16 +823,23 @@ static int compare_values(grib_runtime_options* options,grib_handle* h1,grib_han
|
||||||
printInfo(h1);
|
printInfo(h1);
|
||||||
save_error(c,name);
|
save_error(c,name);
|
||||||
err1 = GRIB_VALUE_MISMATCH;
|
err1 = GRIB_VALUE_MISMATCH;
|
||||||
if(len1 == 1)
|
if(len1 == 1) {
|
||||||
printf("long [%s]: [%ld] != [%ld]\n",
|
char buf1[128]={0,}; /* buffers to store the binary representation of codeflags */
|
||||||
name,*lval1,*lval2);
|
char buf2[128]={0,};
|
||||||
else
|
grib_accessor* acc1=grib_find_accessor(h1, name);
|
||||||
printf("long [%s] %d out of %ld different\n",
|
grib_accessor* acc2=grib_find_accessor(h2, name);
|
||||||
name,countdiff,(long)len1);
|
printf("long [%s]: [%ld] != [%ld]", name,*lval1,*lval2);
|
||||||
|
if (codeflag_to_bitstr(acc1, *lval1, buf1)==GRIB_SUCCESS && codeflag_to_bitstr(acc2, *lval2, buf2)==GRIB_SUCCESS) {
|
||||||
|
printf(" ([%s] != [%s])", buf1, buf2);
|
||||||
|
}
|
||||||
|
printf("\n");
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
printf("long [%s] %d out of %ld different\n", name,countdiff,(long)len1);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
grib_context_free(h1->context,lval1);
|
grib_context_free(h1->context,lval1);
|
||||||
grib_context_free(h2->context,lval2);
|
grib_context_free(h2->context,lval2);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue