From 62cfacc0aed8e261302426bb00efdf6d019ba9b0 Mon Sep 17 00:00:00 2001 From: Shahram Najm Date: Tue, 2 Jan 2018 16:32:55 +0000 Subject: [PATCH] ECC-394: bufr_dump -E option: include keys whose values are MISSING --- src/grib_dumper_class_bufr_encode_C.c | 95 +++++++++-------- src/grib_dumper_class_bufr_encode_filter.c | 5 +- src/grib_dumper_class_bufr_encode_fortran.c | 108 ++++++++++---------- src/grib_dumper_class_bufr_encode_python.c | 96 +++++++++-------- src/grib_value.c | 3 +- tests/bufr_dump_encode_C.sh | 12 +-- tests/bufr_dump_encode_filter.sh | 12 +-- tests/bufr_dump_encode_fortran.sh | 13 +-- tests/bufr_dump_encode_python.sh | 12 +-- tools/bufr_compare.c | 20 +++- 10 files changed, 193 insertions(+), 183 deletions(-) diff --git a/src/grib_dumper_class_bufr_encode_C.c b/src/grib_dumper_class_bufr_encode_C.c index dca5d9008..5f1f4fa96 100644 --- a/src/grib_dumper_class_bufr_encode_C.c +++ b/src/grib_dumper_class_bufr_encode_C.c @@ -144,10 +144,18 @@ static int destroy(grib_dumper* d) return GRIB_SUCCESS; } +static char* lval_to_string(grib_context* c, long v) +{ + char* sval=grib_context_malloc_clear(c,sizeof(char)*40); + if (v == GRIB_MISSING_LONG) sprintf(sval,"CODES_MISSING_LONG"); + else sprintf(sval,"%ld",v); + return sval; +} static char* dval_to_string(grib_context* c, double v) { char* sval=(char*)grib_context_malloc_clear(c,sizeof(char)*40); - sprintf(sval,"%.18e",v); + if (v == GRIB_MISSING_DOUBLE) sprintf(sval,"CODES_MISSING_DOUBLE"); + else sprintf(sval,"%.18e",v); return sval; } @@ -208,16 +216,12 @@ static void dump_values(grib_dumper* d, grib_accessor* a) fprintf(self->dumper.out," CODES_CHECK(codes_set_double_array(h, \"%s\", rvalues, size), 0);\n",a->name); } else { r=compute_bufr_key_rank(h,self->keys,a->name); - if( !grib_is_missing_double(a,value) ) { - - sval=dval_to_string(c,value); - if (r!=0) - fprintf(self->dumper.out," CODES_CHECK(codes_set_double(h, \"#%d#%s\", %s), 0);\n", r, a->name, sval); - else - fprintf(self->dumper.out," CODES_CHECK(codes_set_double(h, \"%s\", %s), 0);\n", a->name, sval); - - grib_context_free(c,sval); - } + sval=dval_to_string(c,value); + if (r!=0) + fprintf(self->dumper.out," CODES_CHECK(codes_set_double(h, \"#%d#%s\", %s), 0);\n", r, a->name, sval); + else + fprintf(self->dumper.out," CODES_CHECK(codes_set_double(h, \"%s\", %s), 0);\n", a->name, sval); + grib_context_free(c,sval); } if (self->isLeaf==0) { @@ -290,15 +294,9 @@ static void dump_values_attribute(grib_dumper* d, grib_accessor* a, const char* fprintf(self->dumper.out," CODES_CHECK(codes_set_double_array(h, \"%s->%s\", rvalues, size), 0);\n", prefix,a->name); } else { - /* int r=compute_bufr_key_rank(h,self->keys,a->name); */ - if( !grib_is_missing_double(a,value) ) { - - sval=dval_to_string(c,value); - fprintf(self->dumper.out," CODES_CHECK(codes_set_double(h, \"%s->%s\", %s), 0);\n", prefix,a->name, sval); - - grib_context_free(c,sval); - - } + sval=dval_to_string(c,value); + fprintf(self->dumper.out," CODES_CHECK(codes_set_double(h, \"%s->%s\", %s), 0);\n", prefix,a->name, sval); + grib_context_free(c,sval); } if (self->isLeaf==0) { @@ -325,6 +323,7 @@ static void dump_long(grib_dumper* d,grib_accessor* a, const char* comment) int i,r,icount; int cols=4; long count=0; + char* sval = NULL; grib_context* c=a->context; grib_handle* h=grib_handle_of_accessor(a); @@ -388,22 +387,22 @@ static void dump_long(grib_dumper* d,grib_accessor* a, const char* comment) } else { r=compute_bufr_key_rank(h,self->keys,a->name); - if( !grib_is_missing_long(a,value) ) { - int doing_unexpandedDescriptors=0; - if (r!=0) { - fprintf(self->dumper.out," CODES_CHECK(codes_set_long(h, \"#%d#%s\", ", r,a->name); - } else { - if (strcmp(a->name, "unexpandedDescriptors")==0) { - doing_unexpandedDescriptors=1; - fprintf(self->dumper.out,"\n /* Create the structure of the data section */\n"); - } - fprintf(self->dumper.out," CODES_CHECK(codes_set_long(h, \"%s\", ", a->name); + sval=lval_to_string(c,value); + int doing_unexpandedDescriptors=0; + if (r!=0) { + fprintf(self->dumper.out," CODES_CHECK(codes_set_long(h, \"#%d#%s\", ", r,a->name); + } else { + if (strcmp(a->name, "unexpandedDescriptors")==0) { + doing_unexpandedDescriptors=1; + fprintf(self->dumper.out,"\n /* Create the structure of the data section */\n"); } - - fprintf(self->dumper.out,"%ld), 0);\n",value); - if (doing_unexpandedDescriptors) - fprintf(self->dumper.out,"\n"); + fprintf(self->dumper.out," CODES_CHECK(codes_set_long(h, \"%s\", ", a->name); } + + fprintf(self->dumper.out,"%s), 0);\n",sval); + grib_context_free(c,sval); + if (doing_unexpandedDescriptors) + fprintf(self->dumper.out,"\n"); } if (self->isLeaf==0) { @@ -471,11 +470,10 @@ static void dump_long_attribute(grib_dumper* d, grib_accessor* a, const char* pr fprintf(self->dumper.out," CODES_CHECK(codes_set_long_array(h, \"%s->%s\", ivalues, size), 0);\n", prefix,a->name); } else { - /* int r=compute_bufr_key_rank(h,self->keys,a->name); */ - if( !grib_is_missing_long(a,value) ) { - fprintf(self->dumper.out," CODES_CHECK(codes_set_long(h, \"%s->%s\", ", prefix,a->name); - fprintf(self->dumper.out,"%ld), 0);\n",value); - } + char* sval=lval_to_string(c,value); + fprintf(self->dumper.out," CODES_CHECK(codes_set_long(h, \"%s->%s\", ", prefix,a->name); + fprintf(self->dumper.out,"%s), 0);\n",sval); + grib_context_free(c,sval); } if (self->isLeaf==0) { @@ -512,15 +510,13 @@ static void dump_double(grib_dumper* d, grib_accessor* a, const char* comment) self->empty=0; r=compute_bufr_key_rank(h,self->keys,a->name); - if( !grib_is_missing_double(a,value) ) { - sval=dval_to_string(c,value); - if (r!=0) - fprintf(self->dumper.out," CODES_CHECK(codes_set_double(h, \"#%d#%s\", %s), 0);\n", r,a->name, sval); - else - fprintf(self->dumper.out," CODES_CHECK(codes_set_double(h, \"%s\", %s), 0);\n", a->name, sval); - grib_context_free(c,sval); - } + sval=dval_to_string(c,value); + if (r!=0) + fprintf(self->dumper.out," CODES_CHECK(codes_set_double(h, \"#%d#%s\", %s), 0);\n", r,a->name, sval); + else + fprintf(self->dumper.out," CODES_CHECK(codes_set_double(h, \"%s\", %s), 0);\n", a->name, sval); + grib_context_free(c,sval); if (self->isLeaf==0) { char* prefix; @@ -630,8 +626,9 @@ static void dump_string(grib_dumper* d, grib_accessor* a, const char* comment) err = grib_unpack_string(a,value,&size); p=value; r=compute_bufr_key_rank(h,self->keys,a->name); - if (grib_is_missing_string(a,(unsigned char *)value,size)) - return; + if (grib_is_missing_string(a,(unsigned char *)value,size)) { + strcpy(value, ""); /* Empty string means MISSING string */ + } while(*p) { if(!isprint(*p)) *p = '.'; p++; } diff --git a/src/grib_dumper_class_bufr_encode_filter.c b/src/grib_dumper_class_bufr_encode_filter.c index 0e79e7299..f4b9f8f95 100644 --- a/src/grib_dumper_class_bufr_encode_filter.c +++ b/src/grib_dumper_class_bufr_encode_filter.c @@ -590,8 +590,9 @@ static void dump_string(grib_dumper* d, grib_accessor* a, const char* comment) err = grib_unpack_string(a,value,&size); p=value; r=compute_bufr_key_rank(h,self->keys,a->name); - if (grib_is_missing_string(a,(unsigned char *)value,size)) - return; + if (grib_is_missing_string(a,(unsigned char *)value,size)) { + strcpy(value, ""); /* Empty string means MISSING string */ + } while(*p) { if(!isprint(*p)) *p = '.'; p++; } diff --git a/src/grib_dumper_class_bufr_encode_fortran.c b/src/grib_dumper_class_bufr_encode_fortran.c index 4946292e1..625a310bf 100644 --- a/src/grib_dumper_class_bufr_encode_fortran.c +++ b/src/grib_dumper_class_bufr_encode_fortran.c @@ -144,15 +144,26 @@ static int destroy(grib_dumper* d) return GRIB_SUCCESS; } +static char* lval_to_string(grib_context* c, long v) +{ + char* sval=grib_context_malloc_clear(c,sizeof(char)*40); + if (v == GRIB_MISSING_LONG) sprintf(sval,"CODES_MISSING_LONG"); + else sprintf(sval,"%ld",v); + return sval; +} static char* dval_to_string(grib_context* c, double v) { char* sval=(char*)grib_context_malloc_clear(c,sizeof(char)*40); - char* p; - sprintf(sval,"%.18e",v); - p=sval; - while (*p !=0 ) { - if (*p == 'e') *p='d'; - p++; + if (v == GRIB_MISSING_DOUBLE) { + sprintf(sval,"CODES_MISSING_DOUBLE"); + } else { + char* p; + sprintf(sval,"%.18e",v); + p=sval; + while (*p !=0 ) { + if (*p == 'e') *p='d'; + p++; + } } return sval; } @@ -215,17 +226,12 @@ static void dump_values(grib_dumper* d, grib_accessor* a) fprintf(self->dumper.out," call codes_set(ibufr,'%s',rvalues)\n",a->name); } else { r=compute_bufr_key_rank(h,self->keys,a->name); - if( !grib_is_missing_double(a,value) ) { - - sval=dval_to_string(c,value); - if (r!=0) - fprintf(self->dumper.out," call codes_set(ibufr,'#%d#%s',%s)\n",r,a->name,sval); - else - fprintf(self->dumper.out," call codes_set(ibufr,'%s',%s)\n",a->name,sval); - - grib_context_free(c,sval); - - } + sval=dval_to_string(c,value); + if (r!=0) + fprintf(self->dumper.out," call codes_set(ibufr,'#%d#%s',%s)\n",r,a->name,sval); + else + fprintf(self->dumper.out," call codes_set(ibufr,'%s',%s)\n",a->name,sval); + grib_context_free(c,sval); } if (self->isLeaf==0) { @@ -299,14 +305,9 @@ static void dump_values_attribute(grib_dumper* d, grib_accessor* a, const char* fprintf(self->dumper.out," call codes_set(ibufr,'%s->%s' &\n,rvalues)\n",prefix,a->name); } else { - if( !grib_is_missing_double(a,value) ) { - - sval=dval_to_string(c,value); - fprintf(self->dumper.out," call codes_set(ibufr,'%s->%s' &\n,%s)\n",prefix,a->name,sval); - - grib_context_free(c,sval); - - } + sval=dval_to_string(c,value); + fprintf(self->dumper.out," call codes_set(ibufr,'%s->%s' &\n,%s)\n",prefix,a->name,sval); + grib_context_free(c,sval); } if (self->isLeaf==0) { @@ -333,6 +334,7 @@ static void dump_long(grib_dumper* d,grib_accessor* a, const char* comment) int i,r,icount; int cols=4; long count=0; + char* sval = NULL; grib_context* c=a->context; grib_handle* h=grib_handle_of_accessor(a); @@ -394,22 +396,22 @@ static void dump_long(grib_dumper* d,grib_accessor* a, const char* comment) } else { r=compute_bufr_key_rank(h,self->keys,a->name); - if( !grib_is_missing_long(a,value) ) { - int doing_unexpandedDescriptors=0; - if (r!=0) { - fprintf(self->dumper.out," call codes_set(ibufr,'#%d#%s',",r,a->name); - } else { - if (strcmp(a->name, "unexpandedDescriptors")==0) { - doing_unexpandedDescriptors=1; - fprintf(self->dumper.out,"\n ! Create the structure of the data section\n"); - } - fprintf(self->dumper.out," call codes_set(ibufr,'%s',",a->name); + sval=lval_to_string(c,value); + int doing_unexpandedDescriptors=0; + if (r!=0) { + fprintf(self->dumper.out," call codes_set(ibufr,'#%d#%s',",r,a->name); + } else { + if (strcmp(a->name, "unexpandedDescriptors")==0) { + doing_unexpandedDescriptors=1; + fprintf(self->dumper.out,"\n ! Create the structure of the data section\n"); } - - fprintf(self->dumper.out,"%ld)\n",value); - if (doing_unexpandedDescriptors) - fprintf(self->dumper.out,"\n"); + fprintf(self->dumper.out," call codes_set(ibufr,'%s',",a->name); } + + fprintf(self->dumper.out,"%s)\n",sval); + grib_context_free(c,sval); + if (doing_unexpandedDescriptors) + fprintf(self->dumper.out,"\n"); } if (self->isLeaf==0) { @@ -476,11 +478,10 @@ static void dump_long_attribute(grib_dumper* d, grib_accessor* a, const char* pr fprintf(self->dumper.out," call codes_set(ibufr,'%s->%s' &\n,ivalues)\n",prefix,a->name); } else { - /* int r=compute_bufr_key_rank(h,self->keys,a->name); */ - if( !grib_is_missing_long(a,value) ) { - fprintf(self->dumper.out," call codes_set(ibufr,'%s->%s'&\n,",prefix,a->name); - fprintf(self->dumper.out,"%ld)\n",value); - } + char* sval=lval_to_string(c,value); + fprintf(self->dumper.out," call codes_set(ibufr,'%s->%s'&\n,",prefix,a->name); + fprintf(self->dumper.out,"%s)\n",sval); + grib_context_free(c,sval); } if (self->isLeaf==0) { @@ -517,15 +518,13 @@ static void dump_double(grib_dumper* d, grib_accessor* a, const char* comment) self->empty=0; r=compute_bufr_key_rank(h,self->keys,a->name); - if( !grib_is_missing_double(a,value) ) { - sval=dval_to_string(c,value); - if (r!=0) - fprintf(self->dumper.out," call codes_set(ibufr,'#%d#%s',%s)\n",r,a->name,sval); - else - fprintf(self->dumper.out," call codes_set(ibufr,'%s',%s)\n",a->name,sval); - grib_context_free(c,sval); - } + sval=dval_to_string(c,value); + if (r!=0) + fprintf(self->dumper.out," call codes_set(ibufr,'#%d#%s',%s)\n",r,a->name,sval); + else + fprintf(self->dumper.out," call codes_set(ibufr,'%s',%s)\n",a->name,sval); + grib_context_free(c,sval); if (self->isLeaf==0) { char* prefix; @@ -640,8 +639,9 @@ static void dump_string(grib_dumper* d, grib_accessor* a, const char* comment) err = grib_unpack_string(a,value,&size); p=value; r=compute_bufr_key_rank(h,self->keys,a->name); - if (grib_is_missing_string(a,(unsigned char *)value,size)) - return; + if (grib_is_missing_string(a,(unsigned char *)value,size)) { + strcpy(value, ""); /* Empty string means MISSING string */ + } while(*p) { if(!isprint(*p)) *p = '.'; p++; } diff --git a/src/grib_dumper_class_bufr_encode_python.c b/src/grib_dumper_class_bufr_encode_python.c index 824954148..a4d44ff36 100644 --- a/src/grib_dumper_class_bufr_encode_python.c +++ b/src/grib_dumper_class_bufr_encode_python.c @@ -144,10 +144,18 @@ static int destroy(grib_dumper* d) return GRIB_SUCCESS; } +static char* lval_to_string(grib_context* c, long v) +{ + char* sval=grib_context_malloc_clear(c,sizeof(char)*40); + if (v == GRIB_MISSING_LONG) sprintf(sval,"CODES_MISSING_LONG"); + else sprintf(sval,"%ld",v); + return sval; +} static char* dval_to_string(const grib_context* c,double v) { char* sval=(char*)grib_context_malloc_clear(c,sizeof(char)*40); - sprintf(sval,"%.18e",v); + if (v == GRIB_MISSING_DOUBLE) sprintf(sval,"CODES_MISSING_DOUBLE"); + else sprintf(sval,"%.18e",v); return sval; } @@ -196,7 +204,7 @@ static void dump_values(grib_dumper* d,grib_accessor* a) grib_context_free(c,sval); depth-=2; - /* Note: In python to make a tuple with one element, you need the trailing comma */ + /* Note: In Python to make a tuple with one element, you need the trailing comma */ fprintf(self->dumper.out,",)\n"); grib_context_free(c,values); @@ -206,16 +214,12 @@ static void dump_values(grib_dumper* d,grib_accessor* a) fprintf(self->dumper.out," codes_set_array(ibufr, '%s', rvalues)\n",a->name); } else { r=compute_bufr_key_rank(h,self->keys,a->name); - if( !grib_is_missing_double(a,value) ) { - - sval=dval_to_string(c,value); - if (r!=0) - fprintf(self->dumper.out," codes_set(ibufr, '#%d#%s', %s)\n",r,a->name,sval); - else - fprintf(self->dumper.out," codes_set(ibufr, '%s', %s)\n",a->name,sval); - - grib_context_free(c,sval); - } + sval=dval_to_string(c,value); + if (r!=0) + fprintf(self->dumper.out," codes_set(ibufr, '#%d#%s', %s)\n",r,a->name,sval); + else + fprintf(self->dumper.out," codes_set(ibufr, '%s', %s)\n",a->name,sval); + grib_context_free(c,sval); } if (self->isLeaf==0) { @@ -287,14 +291,9 @@ static void dump_values_attribute(grib_dumper* d,grib_accessor* a, const char* p fprintf(self->dumper.out," codes_set_array(ibufr, '%s->%s' \n, rvalues)\n",prefix,a->name); } else { - /* int r=compute_bufr_key_rank(h,self->keys,a->name); */ - if( !grib_is_missing_double(a,value) ) { - - sval=dval_to_string(c,value); - fprintf(self->dumper.out," codes_set(ibufr, '%s->%s' \n,%s)\n",prefix,a->name,sval); - - grib_context_free(c,sval); - } + sval=dval_to_string(c,value); + fprintf(self->dumper.out," codes_set(ibufr, '%s->%s' \n,%s)\n",prefix,a->name,sval); + grib_context_free(c,sval); } if (self->isLeaf==0) { @@ -321,6 +320,7 @@ static void dump_long(grib_dumper* d, grib_accessor* a, const char* comment) int i,r,icount; int cols=4; long count=0; + char* sval = NULL; grib_context* c=a->context; grib_handle* h=grib_handle_of_accessor(a); @@ -380,22 +380,22 @@ static void dump_long(grib_dumper* d, grib_accessor* a, const char* comment) } else { r=compute_bufr_key_rank(h,self->keys,a->name); - if( !grib_is_missing_long(a,value) ) { - int doing_unexpandedDescriptors=0; - if (r!=0) { - fprintf(self->dumper.out," codes_set(ibufr, '#%d#%s', ",r,a->name); - } else { - if (strcmp(a->name, "unexpandedDescriptors")==0) { - doing_unexpandedDescriptors=1; - fprintf(self->dumper.out,"\n # Create the structure of the data section\n"); - } - fprintf(self->dumper.out," codes_set(ibufr, '%s', ",a->name); + sval=lval_to_string(c,value); + int doing_unexpandedDescriptors=0; + if (r!=0) { + fprintf(self->dumper.out," codes_set(ibufr, '#%d#%s', ",r,a->name); + } else { + if (strcmp(a->name, "unexpandedDescriptors")==0) { + doing_unexpandedDescriptors=1; + fprintf(self->dumper.out,"\n # Create the structure of the data section\n"); } - - fprintf(self->dumper.out,"%ld)\n",value); - if (doing_unexpandedDescriptors) - fprintf(self->dumper.out,"\n"); + fprintf(self->dumper.out," codes_set(ibufr, '%s', ",a->name); } + + fprintf(self->dumper.out,"%s)\n",sval); + grib_context_free(c,sval); + if (doing_unexpandedDescriptors) + fprintf(self->dumper.out,"\n"); } if (self->isLeaf==0) { @@ -460,11 +460,10 @@ static void dump_long_attribute(grib_dumper* d, grib_accessor* a, const char* pr fprintf(self->dumper.out," codes_set_array(ibufr, '%s->%s' \n,ivalues)\n",prefix,a->name); } else { - /* int r=compute_bufr_key_rank(h,self->keys,a->name); */ - if( !grib_is_missing_long(a,value) ) { - fprintf(self->dumper.out," codes_set(ibufr, '%s->%s'\n,",prefix,a->name); - fprintf(self->dumper.out,"%ld)\n",value); - } + char* sval=lval_to_string(c,value); + fprintf(self->dumper.out," codes_set(ibufr, '%s->%s'\n,",prefix,a->name); + fprintf(self->dumper.out,"%s)\n",sval); + grib_context_free(c,sval); } if (self->isLeaf==0) { @@ -501,15 +500,13 @@ static void dump_double(grib_dumper* d,grib_accessor* a,const char* comment) self->empty=0; r=compute_bufr_key_rank(h,self->keys,a->name); - if( !grib_is_missing_double(a,value) ) { - sval=dval_to_string(c,value); - if (r!=0) - fprintf(self->dumper.out," codes_set(ibufr, '#%d#%s', %s)\n",r,a->name,sval); - else - fprintf(self->dumper.out," codes_set(ibufr, '%s', %s)\n",a->name,sval); - grib_context_free(c,sval); - } + sval=dval_to_string(c,value); + if (r!=0) + fprintf(self->dumper.out," codes_set(ibufr, '#%d#%s', %s)\n",r,a->name,sval); + else + fprintf(self->dumper.out," codes_set(ibufr, '%s', %s)\n",a->name,sval); + grib_context_free(c,sval); if (self->isLeaf==0) { char* prefix; @@ -621,8 +618,9 @@ static void dump_string(grib_dumper* d,grib_accessor* a,const char* comment) err = grib_unpack_string(a,value,&size); p=value; r=compute_bufr_key_rank(h,self->keys,a->name); - if (grib_is_missing_string(a,(unsigned char *)value,size)) - return; + if (grib_is_missing_string(a,(unsigned char *)value,size)) { + strcpy(value, ""); /* Empty string means MISSING string */ + } while(*p) { if(!isprint(*p)) *p = '.'; p++; } diff --git a/src/grib_value.c b/src/grib_value.c index 247d883da..2f20f102b 100644 --- a/src/grib_value.c +++ b/src/grib_value.c @@ -551,10 +551,11 @@ int grib_is_missing_string(grib_accessor* a, unsigned char* x, size_t len) { /* For a string value to be missing, every character has to be */ /* all 1's (i.e. 0xFF) */ + /* Note: An empty string is also classified as missing */ int ret; size_t i=0; - if (len==0) return 0; + if (len==0) return 1; /* empty string */ ret=1; for (i=0;i $TEMP_JSON1 - ${tools_dir}/bufr_dump $tempBufr > $TEMP_JSON2 - diff $TEMP_JSON1 $TEMP_JSON2 - rm -f $TEMP_JSON1 $TEMP_JSON2 + TEMP_OUT1=${label}.$file.dump.out + TEMP_OUT2=${label}.$tempBufr.dump.out + ${tools_dir}/bufr_dump -p ${data_dir}/bufr/$file > $TEMP_OUT1 + ${tools_dir}/bufr_dump -p $tempBufr > $TEMP_OUT2 + diff $TEMP_OUT1 $TEMP_OUT2 + rm -f $TEMP_OUT1 $TEMP_OUT2 fi rm -f $tempExe $tempSrc $tempBufr diff --git a/tests/bufr_dump_encode_filter.sh b/tests/bufr_dump_encode_filter.sh index e5552ce78..d85ad64cb 100755 --- a/tests/bufr_dump_encode_filter.sh +++ b/tests/bufr_dump_encode_filter.sh @@ -54,12 +54,12 @@ do ${tools_dir}/codes_bufr_filter -o $fBufrTmp $fRules $f ${tools_dir}/bufr_compare $fBufrTmp $f - TEMP_JSON1=${label}.$f.json - TEMP_JSON2=${label}.$fBufrTmp.json - ${tools_dir}/bufr_dump $f > $TEMP_JSON1 - ${tools_dir}/bufr_dump $fBufrTmp > $TEMP_JSON2 - diff $TEMP_JSON1 $TEMP_JSON2 - rm -f $TEMP_JSON1 $TEMP_JSON2 + TEMP_OUT1=${label}.$f.dump.out + TEMP_OUT2=${label}.$fBufrTmp.dump.out + ${tools_dir}/bufr_dump -p $f > $TEMP_OUT1 + ${tools_dir}/bufr_dump -p $fBufrTmp > $TEMP_OUT2 + diff $TEMP_OUT1 $TEMP_OUT2 + rm -f $TEMP_OUT1 $TEMP_OUT2 rm -f $fBufrTmp $fRules fi diff --git a/tests/bufr_dump_encode_fortran.sh b/tests/bufr_dump_encode_fortran.sh index 7e6628452..1bbd5b925 100755 --- a/tests/bufr_dump_encode_fortran.sh +++ b/tests/bufr_dump_encode_fortran.sh @@ -41,6 +41,7 @@ if command -v pkg-config >/dev/null 2>&1; then INSTALL_DIR=`grep -w CMAKE_INSTALL_PREFIX $CACHE_FILE | cut -d'=' -f2` FLAGS_LINKER=`echo $FLAGS_LINKER | sed -e "s:$INSTALL_DIR:$BUILD_DIR:g"` FLAGS_COMPILER=`echo $FLAGS_COMPILER | sed -e "s:$INSTALL_DIR:$BUILD_DIR:g"` + FLAGS_COMPILER="$FLAGS_COMPILER -ffree-line-length-0" # TODO: For now only support when shared libs enabled SHARED_LIBS=`grep -w BUILD_SHARED_LIBS $CACHE_FILE | cut -d'=' -f2` @@ -73,12 +74,12 @@ do ./$tempExe ${tools_dir}/bufr_compare ${data_dir}/bufr/$file $tempBufr - TEMP_JSON1=${label}.$file.json - TEMP_JSON2=${label}.$tempBufr.json - ${tools_dir}/bufr_dump ${data_dir}/bufr/$file > $TEMP_JSON1 - ${tools_dir}/bufr_dump $tempBufr > $TEMP_JSON2 - diff $TEMP_JSON1 $TEMP_JSON2 - rm -f $TEMP_JSON1 $TEMP_JSON2 + TEMP_OUT1=${label}.$file.dump.out + TEMP_OUT2=${label}.$tempBufr.dump.out + ${tools_dir}/bufr_dump -p ${data_dir}/bufr/$file > $TEMP_OUT1 + ${tools_dir}/bufr_dump -p $tempBufr > $TEMP_OUT2 + diff $TEMP_OUT1 $TEMP_OUT2 + rm -f $TEMP_OUT1 $TEMP_OUT2 fi rm -f $tempExe $tempSrc $tempBufr diff --git a/tests/bufr_dump_encode_python.sh b/tests/bufr_dump_encode_python.sh index 12bf8d235..3d7b5e59d 100755 --- a/tests/bufr_dump_encode_python.sh +++ b/tests/bufr_dump_encode_python.sh @@ -42,12 +42,12 @@ do # Check original BUFR file against one we generated from sample ${tools_dir}/bufr_compare $inputBufr $tempBufr - TEMP_JSON1=${label}.$file.json - TEMP_JSON2=${label}.$tempBufr.json - ${tools_dir}/bufr_dump $inputBufr > $TEMP_JSON1 - ${tools_dir}/bufr_dump $tempBufr > $TEMP_JSON2 - diff $TEMP_JSON1 $TEMP_JSON2 2>/dev/null - rm -f $TEMP_JSON1 $TEMP_JSON2 + TEMP_OUT1=${label}.$file.dump.out + TEMP_OUT2=${label}.$tempBufr.dump.out + ${tools_dir}/bufr_dump -p $inputBufr > $TEMP_OUT1 + ${tools_dir}/bufr_dump -p $tempBufr > $TEMP_OUT2 + diff $TEMP_OUT1 $TEMP_OUT2 + rm -f $TEMP_OUT1 $TEMP_OUT2 rm -f $tempSrc $tempBufr done diff --git a/tools/bufr_compare.c b/tools/bufr_compare.c index bf0c016bd..55b109894 100644 --- a/tools/bufr_compare.c +++ b/tools/bufr_compare.c @@ -741,10 +741,22 @@ static int compare_values(grib_runtime_options* options, grib_handle* handle1, g { if(grib_inline_strcmp(sval1,sval2) != 0) { - printInfo(handle1); - printf("string [%s]: [%s] != [%s]\n", name, sval1, sval2); - err1 = GRIB_VALUE_MISMATCH; - save_error(c,name); + /* Check if strings are 'missing'. + * Note: one string could have all its bits=1 and the other empty */ + int equal = 0; + grib_accessor* a1 = grib_find_accessor(handle1, name); + grib_accessor* a2 = grib_find_accessor(handle2, name); + int is_miss_1 = grib_is_missing_string(a1, (unsigned char *)sval1, len1); + int is_miss_2 = grib_is_missing_string(a2, (unsigned char *)sval2, len2); + if ( is_miss_1 && is_miss_2 ) { + equal = 1; + } + if (!equal) { + printInfo(handle1); + printf("string [%s]: [%s] != [%s]\n", name, sval1, sval2); + err1 = GRIB_VALUE_MISMATCH; + save_error(c,name); + } } }