ECC-856: BUFR - length of string attribute not correct if used with subset section

This commit is contained in:
Shahram Najm 2018-12-18 11:16:34 +00:00
parent 8d725958aa
commit 0cbfa864a5
2 changed files with 25 additions and 8 deletions

View File

@ -16,6 +16,7 @@
*/ */
#include "eccodes.h" #include "eccodes.h"
#include <assert.h>
int main(int argc,char* argv[]) int main(int argc,char* argv[])
{ {
@ -65,22 +66,27 @@ int main(int argc,char* argv[])
printf(" subsetNumber=%d",i); printf(" subsetNumber=%d",i);
/* read and print some data values */ /* read and print some data values */
CODES_CHECK(codes_get_long(h,key,&longVal),0); CODES_CHECK(codes_get_long(h,key,&longVal), 0);
printf(" blockNumber=%ld",longVal); printf(" blockNumber=%ld",longVal);
sprintf(key,"/subsetNumber=%d/stationNumber",i); sprintf(key,"/subsetNumber=%d/stationNumber",i);
CODES_CHECK(codes_get_long(h,key,&longVal),0); CODES_CHECK(codes_get_long(h,key,&longVal), 0);
printf(" stationNumber=%ld",longVal); printf(" stationNumber=%ld",longVal);
sprintf(key,"/subsetNumber=%d/stationOrSiteName->units",i);
CODES_CHECK(codes_get_length(h,key,&stringLen), 0);
assert(stringLen == 10); /* should be "CCITT IA5" */
sprintf(key,"/subsetNumber=%d/stationOrSiteName",i); sprintf(key,"/subsetNumber=%d/stationOrSiteName",i);
stringLen=100; CODES_CHECK(codes_get_length(h,key,&stringLen), 0);
CODES_CHECK(codes_get_string(h,key,stringVal,&stringLen),0); CODES_CHECK(codes_get_string(h,key,stringVal,&stringLen), 0);
assert(stringLen > 0 && stringLen < 17);
printf(" stationOrSiteName=\"%s\"",stringVal); printf(" stationOrSiteName=\"%s\"",stringVal);
sprintf(key,"/subsetNumber=%d/airTemperature",i); sprintf(key,"/subsetNumber=%d/airTemperature",i);
CODES_CHECK(codes_get_double(h,key,&doubleVal),0); CODES_CHECK(codes_get_double(h,key,&doubleVal),0);
printf(" airTemperature=%g\n",doubleVal); printf(" airTemperature=%g\n",doubleVal);
assert(doubleVal > 265 && doubleVal < 278);
} }
/* delete handle */ /* delete handle */

View File

@ -1157,10 +1157,21 @@ int _grib_get_string_length(grib_accessor* a, size_t* size)
int grib_get_string_length(grib_handle* h, const char* name,size_t* size) int grib_get_string_length(grib_handle* h, const char* name,size_t* size)
{ {
grib_accessor* a = grib_find_accessor(h, name); grib_accessor* a = NULL;
if(!a) return GRIB_NOT_FOUND; grib_accessors_list* al=NULL;
int ret=0;
return _grib_get_string_length(a,size); if (name[0] == '/' ) {
al=grib_find_accessors_list(h,name);
if (!al) return GRIB_NOT_FOUND;
ret=_grib_get_string_length(al->accessor,size);
grib_context_free(h->context,al);
return ret;
} else {
a = grib_find_accessor(h, name);
if(!a) return GRIB_NOT_FOUND;
return _grib_get_string_length(a,size);
}
} }
int _grib_get_size(grib_handle* h, grib_accessor* a,size_t* size) int _grib_get_size(grib_handle* h, grib_accessor* a,size_t* size)