mirror of https://github.com/ecmwf/eccodes.git
created class for descriptors. Improved design and performance (see
tests/bufrdc_ref.sh)
This commit is contained in:
parent
376fb90fff
commit
f22153bd1a
|
@ -67,21 +67,22 @@ position offsetDescriptors;
|
|||
meta numberOfUnexpandedDescriptors evaluate( (section3Length - 7) / 2 ) ;
|
||||
meta unexpandedDescriptors unexpanded_descriptors(numberOfUnexpandedDescriptors) :dump;
|
||||
|
||||
transient elementCode="000000";
|
||||
elementAbbreviation=dict_search("element.table",elementCode,1,tablesMasterDir,tablesLocalDir) : string_type,hidden ;
|
||||
elementType=dict_search("element.table",elementCode,2,tablesMasterDir,tablesLocalDir) : string_type,hidden ;
|
||||
elementName=dict_search("element.table",elementCode,3,tablesMasterDir,tablesLocalDir) : string_type,hidden ;
|
||||
elementUnit=dict_search("element.table",elementCode,4,tablesMasterDir,tablesLocalDir) : string_type,hidden ;
|
||||
elementScale=dict_search("element.table",elementCode,5,tablesMasterDir,tablesLocalDir) : string_type,hidden ;
|
||||
elementReference=dict_search("element.table",elementCode,6,tablesMasterDir,tablesLocalDir) : string_type,hidden ;
|
||||
elementWidth=dict_search("element.table",elementCode,7,tablesMasterDir,tablesLocalDir) : string_type,hidden ;
|
||||
meta elementsTable bufr_elements_table("element.table",tablesMasterDir,tablesLocalDir) : hidden;
|
||||
|
||||
meta expandedCodes expanded_descriptors(expandedCodes,0,unexpandedDescriptors,sequences,elementCode,
|
||||
elementUnit,elementScale,elementReference,elementWidth);
|
||||
meta expandedScales expanded_descriptors(expandedCodes,1);
|
||||
meta expandedReferences expanded_descriptors(expandedCodes,2);
|
||||
meta expandedWidths expanded_descriptors(expandedCodes,3);
|
||||
meta expandedFlags expanded_descriptors(expandedCodes,4);
|
||||
#transient elementCode="000000";
|
||||
#elementAbbreviation=dict_search("element.table",elementCode,1,tablesMasterDir,tablesLocalDir) : string_type,hidden ;
|
||||
#elementType=dict_search("element.table",elementCode,2,tablesMasterDir,tablesLocalDir) : string_type,hidden ;
|
||||
#elementName=dict_search("element.table",elementCode,3,tablesMasterDir,tablesLocalDir) : string_type,hidden ;
|
||||
#elementUnit=dict_search("element.table",elementCode,4,tablesMasterDir,tablesLocalDir) : string_type,hidden ;
|
||||
#elementScale=dict_search("element.table",elementCode,5,tablesMasterDir,tablesLocalDir) : string_type,hidden ;
|
||||
#elementReference=dict_search("element.table",elementCode,6,tablesMasterDir,tablesLocalDir) : string_type,hidden ;
|
||||
#elementWidth=dict_search("element.table",elementCode,7,tablesMasterDir,tablesLocalDir) : string_type,hidden ;
|
||||
|
||||
meta expandedCodes expanded_descriptors(elementsTable,expandedCodes,0,unexpandedDescriptors,sequences);
|
||||
#meta expandedScales expanded_descriptors(elemetsTable,expandedCodes,1);
|
||||
#meta expandedReferences expanded_descriptors(elemetsTable,expandedCodes,2);
|
||||
#meta expandedWidths expanded_descriptors(elemetsTable,expandedCodes,3);
|
||||
#meta expandedType expanded_descriptors(elemetsTable,expandedCodes,4);
|
||||
|
||||
meta bufrdcExpandedDescriptors bufrdc_expanded_descriptors(expandedCodes);
|
||||
|
||||
|
|
|
@ -37,7 +37,6 @@ int main(int argc, char** argv)
|
|||
/* setting the environment variable GRIB_SAMPLES_PATH */
|
||||
const char* sample_filename = "regular_ll_pl_grib1";
|
||||
/* Here is how you can get the samples path */
|
||||
const char* samples_path = grib_samples_path(NULL);
|
||||
grib_handle *h = NULL;
|
||||
double d,e;
|
||||
long count;
|
||||
|
|
|
@ -1,3 +1,4 @@
|
|||
integer, parameter,public :: GRIB_NULL_POINTER = -60
|
||||
integer, parameter,public :: GRIB_MISSING_BUFR_ENTRY = -59
|
||||
integer, parameter,public :: GRIB_WRONG_CONVERSION = -58
|
||||
integer, parameter,public :: GRIB_STRING_TOO_SMALL = -57
|
||||
|
|
|
@ -125,5 +125,7 @@ Error codes returned by the grib_api functions.
|
|||
#define GRIB_WRONG_CONVERSION -58
|
||||
/** Missing BUFR table entry for descriptor */
|
||||
#define GRIB_MISSING_BUFR_ENTRY -59
|
||||
/** Null pointer */
|
||||
#define GRIB_NULL_POINTER -60
|
||||
/*! @}*/
|
||||
#endif
|
||||
|
|
|
@ -60,6 +60,7 @@ list( APPEND grib_api_srcs
|
|||
grib_accessor_class_unpack_bufr_values.c
|
||||
grib_accessor_class_bufr_uncompressed_data.c
|
||||
grib_accessor_class_bufr_element.c
|
||||
grib_accessor_class_bufr_elements_table.c
|
||||
grib_accessor_class_bufr_has_delayed_replication.c
|
||||
grib_accessor_class_bufr_subset_number.c
|
||||
grib_accessor_class_bufr_group_number.c
|
||||
|
|
|
@ -69,6 +69,7 @@ libgrib_api_la_prototypes= \
|
|||
grib_accessor_class_unpack_bufr_values.c \
|
||||
grib_accessor_class_bufr_uncompressed_data.c \
|
||||
grib_accessor_class_bufr_element.c \
|
||||
grib_accessor_class_bufr_elements_table.c \
|
||||
grib_accessor_class_bufr_has_delayed_replication.c \
|
||||
grib_accessor_class_bufr_subset_number.c \
|
||||
grib_accessor_class_bufr_group_number.c \
|
||||
|
|
|
@ -15,6 +15,7 @@ extern grib_accessor_class* grib_accessor_class_bufr_data;
|
|||
extern grib_accessor_class* grib_accessor_class_bufr_data_array;
|
||||
extern grib_accessor_class* grib_accessor_class_bufr_data_element;
|
||||
extern grib_accessor_class* grib_accessor_class_bufr_element;
|
||||
extern grib_accessor_class* grib_accessor_class_bufr_elements_table;
|
||||
extern grib_accessor_class* grib_accessor_class_bufr_group;
|
||||
extern grib_accessor_class* grib_accessor_class_bufr_group_number;
|
||||
extern grib_accessor_class* grib_accessor_class_bufr_has_delayed_replication;
|
||||
|
|
|
@ -430,7 +430,7 @@ static void decode_element(grib_context* c,grib_accessor_bufr_data_array* self,
|
|||
int index=0,ii,sar_size;
|
||||
char* csval=0;
|
||||
double cdval=0,x;
|
||||
if (self->expanded->v[i]->flags & BUFR_DESCRIPTOR_FLAG_IS_STRING) {
|
||||
if (self->expanded->v[i]->type==BUFR_DESCRIPTOR_TYPE_STRING) {
|
||||
/* string */
|
||||
if (self->compressedData) {
|
||||
sar=decode_string_array(c,data,pos,i,self);
|
||||
|
@ -568,6 +568,48 @@ static void push_zero_element(grib_accessor_bufr_data_array* self,grib_darray* d
|
|||
}
|
||||
}
|
||||
|
||||
/*
|
||||
static grib_accessor* create_accessor_from_descriptor(grib_accessor* a,long ide,long subset) {
|
||||
grib_accessor_bufr_data_array *self =(grib_accessor_bufr_data_array*)a;
|
||||
grib_accessor* elementAccessor=NULL;
|
||||
grib_action creator = {0, };
|
||||
creator.op = "bufr_data_element";
|
||||
creator.name_space = "";
|
||||
creator.flags = GRIB_ACCESSOR_FLAG_DUMP;
|
||||
creator.set = 0;
|
||||
|
||||
creator.name=self->expanded->v[self->elementsDescriptorsIndex->v[ide]]->name;
|
||||
elementAccessor = grib_accessor_factory(section, &creator, 0, NULL);
|
||||
accessor_bufr_data_element_set_index(elementAccessor,ide);
|
||||
accessor_bufr_data_element_set_descriptors(elementAccessor,self->expanded);
|
||||
accessor_bufr_data_element_set_numericValues(elementAccessor,self->numericValues);
|
||||
accessor_bufr_data_element_set_stringValue(elementAccessor,self->stringValue);
|
||||
accessor_bufr_data_element_set_compressedData(elementAccessor,self->compressedData);
|
||||
|
||||
return elementAccessor;
|
||||
}
|
||||
|
||||
static int create_keys(grib_accessor* a) {
|
||||
grib_accessor_bufr_data_array *self =(grib_accessor_bufr_data_array*)a;
|
||||
int err=0;
|
||||
long iss,end,elementsInSubset,ide;
|
||||
grib_context* c=a->parent->h->context;
|
||||
|
||||
end= self->compressedData ? 1 : self->numberOfDataSubsets;
|
||||
|
||||
for (iss=0;iss<end;iss++) {
|
||||
elementsInSubset= self->compressedData ? grib_viarray_used_size(self->elementsDescriptorsIndex) :
|
||||
grib_iarray_used_size(self->elementsDescriptorsIndex->v[iss]);
|
||||
for (ide=0;ide<elementsInSubset;ide++) {
|
||||
elementAccessor=create_accessor_from_descriptor(a,ide);
|
||||
grib_push_accessor(elementAccessor,a->subsection->block);
|
||||
}
|
||||
}
|
||||
|
||||
return err;
|
||||
}
|
||||
*/
|
||||
|
||||
#define MAX_NESTED_REPLICATIONS 8
|
||||
|
||||
static int decode_elements(grib_accessor* a) {
|
||||
|
@ -795,6 +837,8 @@ static int decode_elements(grib_accessor* a) {
|
|||
}
|
||||
}
|
||||
|
||||
/* err=create_keys(a); */
|
||||
|
||||
return err;
|
||||
}
|
||||
|
||||
|
|
|
@ -23,12 +23,13 @@
|
|||
IMPLEMENTS = init;dump
|
||||
IMPLEMENTS = unpack_string;unpack_string_array;unpack_long; unpack_double
|
||||
IMPLEMENTS = value_count; destroy; get_native_type;
|
||||
MEMBERS = long index
|
||||
MEMBERS = int type
|
||||
MEMBERS = size_t numberOfValues
|
||||
MEMBERS = double* dvalues
|
||||
MEMBERS = long* lvalues
|
||||
MEMBERS = grib_sarray* svalues
|
||||
MEMBERS = int isConstant
|
||||
MEMBERS = long compressedData
|
||||
MEMBERS = bufr_descriptors_array* descriptors
|
||||
MEMBERS = grib_vdarray* numericValues
|
||||
MEMBERS = grib_vsarray* stringValues
|
||||
MEMBERS = grib_viarray* elementsDescriptorsIndex
|
||||
|
||||
END_CLASS_DEF
|
||||
|
||||
|
@ -59,12 +60,13 @@ typedef struct grib_accessor_bufr_data_element {
|
|||
grib_accessor att;
|
||||
/* Members defined in gen */
|
||||
/* Members defined in bufr_data_element */
|
||||
long index;
|
||||
int type;
|
||||
size_t numberOfValues;
|
||||
double* dvalues;
|
||||
long* lvalues;
|
||||
grib_sarray* svalues;
|
||||
int isConstant;
|
||||
long compressedData;
|
||||
bufr_descriptors_array* descriptors;
|
||||
grib_vdarray* numericValues;
|
||||
grib_vsarray* stringValues;
|
||||
grib_viarray* elementsDescriptorsIndex;
|
||||
} grib_accessor_bufr_data_element;
|
||||
|
||||
extern grib_accessor_class* grib_accessor_class_gen;
|
||||
|
@ -145,14 +147,45 @@ static void init_class(grib_accessor_class* c)
|
|||
|
||||
/* END_CLASS_IMP */
|
||||
|
||||
void accessor_bufr_data_element_set_index(grib_accessor* a,long index) {
|
||||
grib_accessor_bufr_data_element* self = (grib_accessor_bufr_data_element*)a;
|
||||
self->index=index;
|
||||
}
|
||||
|
||||
void accessor_bufr_data_element_set_type(grib_accessor* a,int type) {
|
||||
grib_accessor_bufr_data_element* self = (grib_accessor_bufr_data_element*)a;
|
||||
self->type=type;
|
||||
}
|
||||
|
||||
void accessor_bufr_data_element_set_compressedData(grib_accessor* a,int compressedData) {
|
||||
grib_accessor_bufr_data_element* self = (grib_accessor_bufr_data_element*)a;
|
||||
self->compressedData=compressedData;
|
||||
}
|
||||
|
||||
void accessor_bufr_data_element_set_descriptors(grib_accessor* a,bufr_descriptors_array* descriptors) {
|
||||
grib_accessor_bufr_data_element* self = (grib_accessor_bufr_data_element*)a;
|
||||
self->descriptors=descriptors;
|
||||
}
|
||||
|
||||
void accessor_bufr_data_element_set_numericValues(grib_accessor* a,grib_vdarray* numericValues) {
|
||||
grib_accessor_bufr_data_element* self = (grib_accessor_bufr_data_element*)a;
|
||||
self->numericValues=numericValues;
|
||||
}
|
||||
|
||||
void accessor_bufr_data_element_set_stringValues(grib_accessor* a,grib_vsarray* stringValues) {
|
||||
grib_accessor_bufr_data_element* self = (grib_accessor_bufr_data_element*)a;
|
||||
self->stringValues=stringValues;
|
||||
}
|
||||
|
||||
void accessor_bufr_data_element_set_elementsDescriptorsIndex(grib_accessor* a,grib_viarray* elementsDescriptorsIndex) {
|
||||
grib_accessor_bufr_data_element* self = (grib_accessor_bufr_data_element*)a;
|
||||
self->elementsDescriptorsIndex=elementsDescriptorsIndex;
|
||||
}
|
||||
|
||||
static void init(grib_accessor* a, const long len, grib_arguments* params) {
|
||||
|
||||
grib_accessor_bufr_data_element* self = (grib_accessor_bufr_data_element*)a;
|
||||
/* grib_accessor_bufr_data_element* self = (grib_accessor_bufr_data_element*)a; */
|
||||
a->length = 0;
|
||||
self->dvalues=0;
|
||||
self->lvalues=0;
|
||||
self->svalues=0;
|
||||
/* a->flags |= GRIB_ACCESSOR_FLAG_READ_ONLY; */
|
||||
}
|
||||
|
||||
|
@ -175,162 +208,45 @@ static void dump(grib_accessor* a, grib_dumper* dumper)
|
|||
|
||||
static int unpack_string_array (grib_accessor* a, char** val, size_t *len)
|
||||
{
|
||||
grib_accessor_bufr_data_element* self = (grib_accessor_bufr_data_element*)a;
|
||||
long i=0;
|
||||
long size=0;
|
||||
int err=0;
|
||||
/* grib_accessor_bufr_data_element* self = (grib_accessor_bufr_data_element*)a; */
|
||||
|
||||
err=value_count(a,&size);
|
||||
if (err) return err;
|
||||
|
||||
if (*len < size) return GRIB_ARRAY_TOO_SMALL;
|
||||
|
||||
for (i=0;i<size;i++) val[i]=self->svalues->v[i];
|
||||
*len=size;
|
||||
|
||||
return GRIB_SUCCESS;
|
||||
return GRIB_NOT_IMPLEMENTED;
|
||||
}
|
||||
|
||||
static int unpack_string (grib_accessor* a, char* val, size_t *len)
|
||||
{
|
||||
grib_accessor_bufr_data_element* self = (grib_accessor_bufr_data_element*)a;
|
||||
char buffer[100]={0,};
|
||||
|
||||
if (self->type==GRIB_TYPE_STRING) {
|
||||
if (*len < strlen(self->svalues->v[0]) )
|
||||
return GRIB_ARRAY_TOO_SMALL;
|
||||
sprintf(val,"%s",self->svalues->v[0]);
|
||||
} else {
|
||||
sprintf(buffer,"%g",self->dvalues[0]);
|
||||
if (*len < strlen(buffer) )
|
||||
return GRIB_ARRAY_TOO_SMALL;
|
||||
sprintf(val,"%s",buffer);
|
||||
}
|
||||
|
||||
return GRIB_SUCCESS;
|
||||
return GRIB_NOT_IMPLEMENTED;
|
||||
}
|
||||
|
||||
static int unpack_long (grib_accessor* a, long* val, size_t *len)
|
||||
{
|
||||
grib_accessor_bufr_data_element* self = (grib_accessor_bufr_data_element*)a;
|
||||
size_t i=0,j=0;
|
||||
long size=0;
|
||||
int err=0;
|
||||
long subsetNumber;
|
||||
size_t start,end;
|
||||
double missingValue=GRIB_MISSING_DOUBLE;
|
||||
int navigate_subgroups;
|
||||
|
||||
if (self->type == GRIB_TYPE_STRING) return GRIB_WRONG_TYPE;
|
||||
|
||||
err=value_count(a,&size);
|
||||
if (err) return err;
|
||||
|
||||
if (*len < size) return GRIB_ARRAY_TOO_SMALL;
|
||||
|
||||
navigate_subgroups=a->parent->h->navigate_subgroups;
|
||||
a->parent->h->navigate_subgroups=0;
|
||||
grib_get_double(a->parent->h,"missingValue",&missingValue);
|
||||
|
||||
if (self->isConstant) {
|
||||
subsetNumber=0;
|
||||
size=1;
|
||||
} else {
|
||||
grib_get_long(a->parent->h,"subsetNumber",&subsetNumber);
|
||||
}
|
||||
|
||||
if (subsetNumber) {
|
||||
start=subsetNumber-1;
|
||||
end=subsetNumber-1;
|
||||
} else {
|
||||
start=0;
|
||||
end=size-1;
|
||||
}
|
||||
|
||||
j=0;
|
||||
for (i=start;i<=end;i++) {
|
||||
if (self->dvalues[i]==GRIB_MISSING_DOUBLE)
|
||||
val[j]=missingValue;
|
||||
else
|
||||
val[j]=self->dvalues[i];
|
||||
|
||||
j++;
|
||||
}
|
||||
*len=end-start+1;
|
||||
a->parent->h->navigate_subgroups=navigate_subgroups;
|
||||
|
||||
return GRIB_SUCCESS;
|
||||
return GRIB_NOT_IMPLEMENTED;
|
||||
}
|
||||
|
||||
static int unpack_double (grib_accessor* a, double* val, size_t *len)
|
||||
{
|
||||
grib_accessor_bufr_data_element* self = (grib_accessor_bufr_data_element*)a;
|
||||
int err=0;
|
||||
size_t i=0,j=0;
|
||||
long size=0;
|
||||
size_t start,end;
|
||||
double missingValue=GRIB_MISSING_DOUBLE;
|
||||
long subsetNumber=0;
|
||||
int navigate_subgroups;
|
||||
|
||||
if (self->type == GRIB_TYPE_STRING) return GRIB_WRONG_TYPE;
|
||||
|
||||
err=value_count(a,&size);
|
||||
if (err) return err;
|
||||
|
||||
if (*len < size) return GRIB_ARRAY_TOO_SMALL;
|
||||
navigate_subgroups=a->parent->h->navigate_subgroups;
|
||||
a->parent->h->navigate_subgroups=0;
|
||||
grib_get_double(a->parent->h,"missingValue",&missingValue);
|
||||
|
||||
if (self->isConstant) {
|
||||
subsetNumber=0;
|
||||
size=1;
|
||||
} else {
|
||||
grib_get_long(a->parent->h,"subsetNumber",&subsetNumber);
|
||||
}
|
||||
|
||||
if (subsetNumber) {
|
||||
start=subsetNumber-1;
|
||||
end=subsetNumber-1;
|
||||
} else {
|
||||
start=0;
|
||||
end=size-1;
|
||||
}
|
||||
|
||||
j=0;
|
||||
for (i=start;i<=end;i++) {
|
||||
if (self->dvalues[i]==GRIB_MISSING_DOUBLE)
|
||||
val[j]=missingValue;
|
||||
else
|
||||
val[j]=self->dvalues[i];
|
||||
|
||||
j++;
|
||||
}
|
||||
*len=end-start+1;
|
||||
a->parent->h->navigate_subgroups=navigate_subgroups;
|
||||
|
||||
return GRIB_SUCCESS;
|
||||
return GRIB_NOT_IMPLEMENTED;
|
||||
}
|
||||
|
||||
static int value_count(grib_accessor* a,long* count)
|
||||
{
|
||||
grib_accessor_bufr_data_element* self = (grib_accessor_bufr_data_element*)a;
|
||||
if (self->isConstant) *count=1;
|
||||
else *count=self->numberOfValues;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void destroy(grib_context* context,grib_accessor* a)
|
||||
{
|
||||
grib_accessor_bufr_data_element* self = (grib_accessor_bufr_data_element*)a;
|
||||
if (self->dvalues) grib_context_free(a->parent->h->context,self->dvalues);
|
||||
if (self->svalues) grib_sarray_delete(a->parent->h->context,self->svalues);
|
||||
}
|
||||
|
||||
static int get_native_type(grib_accessor* a){
|
||||
grib_accessor_bufr_data_element* self = (grib_accessor_bufr_data_element*)a;
|
||||
|
||||
/*
|
||||
if (self->compressedData) {
|
||||
|
||||
} else {
|
||||
}
|
||||
*/
|
||||
|
||||
return self->type;
|
||||
}
|
||||
|
||||
|
|
|
@ -29,15 +29,12 @@ IMPLEMENTS = value_count; get_native_type
|
|||
MEMBERS = const char* unexpandedDescriptors
|
||||
MEMBERS = const char* sequence
|
||||
MEMBERS = const char* expandedName
|
||||
MEMBERS = const char* elementCode
|
||||
MEMBERS = const char* elementUnit
|
||||
MEMBERS = const char* elementScale
|
||||
MEMBERS = const char* elementReference
|
||||
MEMBERS = const char* elementWidth
|
||||
MEMBERS = const char* tablesAccessorName
|
||||
MEMBERS = bufr_descriptors_array* expanded
|
||||
MEMBERS = int rank
|
||||
MEMBERS = grib_accessor* expandedAccessor
|
||||
MEMBERS = int dirty
|
||||
MEMBERS = grib_accessor* tablesAccessor
|
||||
|
||||
END_CLASS_DEF
|
||||
|
||||
|
@ -71,15 +68,12 @@ typedef struct grib_accessor_expanded_descriptors {
|
|||
const char* unexpandedDescriptors;
|
||||
const char* sequence;
|
||||
const char* expandedName;
|
||||
const char* elementCode;
|
||||
const char* elementUnit;
|
||||
const char* elementScale;
|
||||
const char* elementReference;
|
||||
const char* elementWidth;
|
||||
const char* tablesAccessorName;
|
||||
bufr_descriptors_array* expanded;
|
||||
int rank;
|
||||
grib_accessor* expandedAccessor;
|
||||
int dirty;
|
||||
grib_accessor* tablesAccessor;
|
||||
} grib_accessor_expanded_descriptors;
|
||||
|
||||
extern grib_accessor_class* grib_accessor_class_long;
|
||||
|
@ -176,6 +170,7 @@ static void init(grib_accessor* a, const long len , grib_arguments* args )
|
|||
{
|
||||
grib_accessor_expanded_descriptors* self = (grib_accessor_expanded_descriptors*)a;
|
||||
int n=0;
|
||||
self->tablesAccessorName=grib_arguments_get_name(a->parent->h,args,n++);
|
||||
self->expandedName=grib_arguments_get_name(a->parent->h,args,n++);
|
||||
self->rank=grib_arguments_get_long(a->parent->h,args,n++);
|
||||
if (self->rank!=0) {
|
||||
|
@ -185,11 +180,6 @@ static void init(grib_accessor* a, const long len , grib_arguments* args )
|
|||
}
|
||||
self->unexpandedDescriptors=grib_arguments_get_name(a->parent->h,args,n++);
|
||||
self->sequence=grib_arguments_get_name(a->parent->h,args,n++);
|
||||
self->elementCode=grib_arguments_get_name(a->parent->h,args,n++);
|
||||
self->elementUnit=grib_arguments_get_name(a->parent->h,args,n++);
|
||||
self->elementScale=grib_arguments_get_name(a->parent->h,args,n++);
|
||||
self->elementReference=grib_arguments_get_name(a->parent->h,args,n++);
|
||||
self->elementWidth=grib_arguments_get_name(a->parent->h,args,n++);
|
||||
self->dirty=1;
|
||||
self->expanded=0;
|
||||
a->length = 0;
|
||||
|
@ -208,12 +198,7 @@ static size_t __expand(grib_accessor* a,bufr_descriptors_array* unexpanded,bufr_
|
|||
change_coding_params* ccp,int* err) {
|
||||
int k,j,i;
|
||||
grib_accessor_expanded_descriptors* self = (grib_accessor_expanded_descriptors*)a;
|
||||
long scale,reference,width;
|
||||
size_t size;
|
||||
char code[]="000000";
|
||||
size_t len_code=6;
|
||||
char unit[100]={0,};
|
||||
size_t len_unit=100;
|
||||
long* v;
|
||||
bufr_descriptor* u;
|
||||
bufr_descriptor* vv;
|
||||
|
@ -256,7 +241,7 @@ static size_t __expand(grib_accessor* a,bufr_descriptors_array* unexpanded,bufr_
|
|||
inner_unexpanded=grib_bufr_descriptors_array_new(c,100,100);
|
||||
inner_expanded=grib_bufr_descriptors_array_new(c,100,100);
|
||||
for (i=0;i<size;i++) {
|
||||
vv=grib_bufr_descriptor_new(c,v[i]);
|
||||
vv=grib_bufr_descriptor_new(self->tablesAccessor,v[i],err);
|
||||
inner_unexpanded=grib_bufr_descriptors_array_push(inner_unexpanded,vv);
|
||||
}
|
||||
grib_context_free(c,v);
|
||||
|
@ -305,7 +290,7 @@ static size_t __expand(grib_accessor* a,bufr_descriptors_array* unexpanded,bufr_
|
|||
#endif
|
||||
expanded=grib_bufr_descriptors_array_append(expanded,inner_expanded);
|
||||
uidx=grib_bufr_descriptors_array_get(expanded,idx);
|
||||
grib_bufr_descriptor_set_code(uidx,(size-1)*1000+100000);
|
||||
grib_bufr_descriptor_set_code(0,(size-1)*1000+100000,uidx);
|
||||
size++;
|
||||
} else {
|
||||
u=grib_bufr_descriptors_array_pop_front(unexpanded);
|
||||
|
@ -328,7 +313,7 @@ static size_t __expand(grib_accessor* a,bufr_descriptors_array* unexpanded,bufr_
|
|||
}
|
||||
for (k=1;k<us->Y;k++) {
|
||||
for (j=0;j<us->X;j++) {
|
||||
grib_bufr_descriptors_array_push(inner_unexpanded,grib_bufr_descriptor_clone(c,ur[j]));
|
||||
grib_bufr_descriptors_array_push(inner_unexpanded,grib_bufr_descriptor_clone(ur[j]));
|
||||
}
|
||||
}
|
||||
inner_expanded=_expand(a,inner_unexpanded,ccp,err);
|
||||
|
@ -349,43 +334,13 @@ static size_t __expand(grib_accessor* a,bufr_descriptors_array* unexpanded,bufr_
|
|||
#if MYDEBUG
|
||||
for (idepth=0;idepth<depth;idepth++) printf("\t");
|
||||
printf("+++ pop %06ld\n",u->code);
|
||||
#endif
|
||||
if ((u->flags & BUFR_DESCRIPTOR_FLAG_HAS_VALUES) == 0) {
|
||||
sprintf(code,"%06ld",u->code);
|
||||
len_code=strlen(code);
|
||||
grib_set_string(a->parent->h,self->elementCode,code,&len_code);
|
||||
*err=grib_get_long(a->parent->h,self->elementScale,&scale);
|
||||
if (*err==GRIB_SUCCESS) {
|
||||
*err=grib_get_long(a->parent->h,self->elementReference,&reference);
|
||||
*err=grib_get_long(a->parent->h,self->elementWidth,&width);
|
||||
grib_bufr_descriptor_set_values(u,scale,reference,width);
|
||||
*err=grib_get_string(a->parent->h,self->elementUnit,unit,&len_unit);
|
||||
if (strstr(unit,"CCITT")) u->flags |= BUFR_DESCRIPTOR_FLAG_IS_STRING;
|
||||
else if (strstr(unit,"TABLE") ) {
|
||||
if (strstr(unit,"FLAG")) {
|
||||
u->flags |= BUFR_DESCRIPTOR_FLAG_IS_FLAG;
|
||||
} else {
|
||||
u->flags |= BUFR_DESCRIPTOR_FLAG_IS_TABLE;
|
||||
}
|
||||
}
|
||||
u->flags |= BUFR_DESCRIPTOR_FLAG_HAS_VALUES;
|
||||
} else {
|
||||
grib_context_log(c,GRIB_LOG_ERROR,"element %s not in table B",code);
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
#if MYDEBUG
|
||||
for (idepth=0;idepth<depth;idepth++) printf("\t");
|
||||
printf("+++ push %06ld [%d,isFlag=%d,isTable=%d,isString=%d] (%ld %g %ld)",u->code,
|
||||
(u->flags & BUFR_DESCRIPTOR_FLAG_HAS_VALUES)==BUFR_DESCRIPTOR_FLAG_HAS_VALUES,
|
||||
(u->flags & BUFR_DESCRIPTOR_FLAG_IS_FLAG)==BUFR_DESCRIPTOR_FLAG_IS_FLAG,
|
||||
(u->flags & BUFR_DESCRIPTOR_FLAG_IS_TABLE)==BUFR_DESCRIPTOR_FLAG_IS_TABLE,
|
||||
(u->flags & BUFR_DESCRIPTOR_FLAG_IS_STRING)==BUFR_DESCRIPTOR_FLAG_IS_STRING,
|
||||
u->scale,u->reference,u->width);
|
||||
printf("+++ push %06ld [type=%d] (%ld %g %ld)",u->code,
|
||||
u->type,u->scale,u->reference,u->width);
|
||||
#endif
|
||||
if ((u->flags & ( BUFR_DESCRIPTOR_FLAG_IS_FLAG |
|
||||
BUFR_DESCRIPTOR_FLAG_IS_TABLE |
|
||||
BUFR_DESCRIPTOR_FLAG_IS_STRING)) == 0) {
|
||||
if ( u->type!=BUFR_DESCRIPTOR_TYPE_FLAG &&
|
||||
u->type!=BUFR_DESCRIPTOR_TYPE_TABLE &&
|
||||
u->type!=BUFR_DESCRIPTOR_TYPE_STRING ) {
|
||||
if (ccp->localDescriptorWidth>0) {
|
||||
u->width=ccp->localDescriptorWidth;
|
||||
u->reference=0;
|
||||
|
@ -403,7 +358,7 @@ static size_t __expand(grib_accessor* a,bufr_descriptors_array* unexpanded,bufr_
|
|||
grib_bufr_descriptors_array_push(expanded,u);
|
||||
size=1;
|
||||
if (ccp->associatedFieldWidth) {
|
||||
bufr_descriptor* au=grib_bufr_descriptor_new(c,999999);
|
||||
bufr_descriptor* au=grib_bufr_descriptor_new(self->tablesAccessor,999999,err);
|
||||
au->width=ccp->associatedFieldWidth;
|
||||
#if MYDEBUG
|
||||
for (idepth=0;idepth<depth;idepth++) printf("\t");
|
||||
|
@ -518,9 +473,7 @@ static bufr_descriptors_array* _expand(grib_accessor* a,bufr_descriptors_array*
|
|||
bufr_descriptor* xx=grib_bufr_descriptors_array_get(expanded,i);
|
||||
for (idepth=0;idepth<depth;idepth++) printf("\t");
|
||||
printf("== %-6d== %06ld ",i,xx->code);
|
||||
if (xx->flags & BUFR_DESCRIPTOR_FLAG_HAS_VALUES) {
|
||||
printf("%ld %g %ld",xx->scale,xx->reference,xx->width);
|
||||
}
|
||||
printf("%ld %g %ld",xx->scale,xx->reference,xx->width);
|
||||
printf("\n");
|
||||
}
|
||||
for (idepth=0;idepth<depth;idepth++) printf("\t");
|
||||
|
@ -548,6 +501,10 @@ static int expand(grib_accessor* a)
|
|||
return err;
|
||||
}
|
||||
self->dirty=0;
|
||||
if (!self->tablesAccessor) {
|
||||
self->tablesAccessor=grib_find_accessor(a->parent->h,self->tablesAccessorName);
|
||||
Assert(self->tablesAccessor);
|
||||
}
|
||||
|
||||
if (self->rank!=0) {
|
||||
err=expand(self->expandedAccessor);
|
||||
|
@ -564,8 +521,9 @@ static int expand(grib_accessor* a)
|
|||
if (err) return err;
|
||||
|
||||
unexpanded=grib_bufr_descriptors_array_new(c,unexpandedSize,100);
|
||||
for (i=0;i<unexpandedSize;i++)
|
||||
grib_bufr_descriptors_array_push(unexpanded,grib_bufr_descriptor_new(c,u[i]));
|
||||
for (i=0;i<unexpandedSize;i++) {
|
||||
grib_bufr_descriptors_array_push(unexpanded,grib_bufr_descriptor_new(self->tablesAccessor,u[i],&err));
|
||||
}
|
||||
|
||||
grib_context_free(c,u);
|
||||
|
||||
|
@ -651,7 +609,7 @@ static int unpack_long (grib_accessor* a, long* val, size_t *len)
|
|||
for (i=0;i<*len;i++) val[i]=self->expanded->v[i]->width;
|
||||
break;
|
||||
case 4:
|
||||
for (i=0;i<*len;i++) val[i]=self->expanded->v[i]->flags;
|
||||
for (i=0;i<*len;i++) val[i]=self->expanded->v[i]->type;
|
||||
break;
|
||||
}
|
||||
|
||||
|
@ -685,7 +643,9 @@ static int value_count(grib_accessor* a,long* rlen)
|
|||
|
||||
static void destroy(grib_context* c,grib_accessor* a) {
|
||||
grib_accessor_expanded_descriptors* self = (grib_accessor_expanded_descriptors*)a;
|
||||
if (self->rank==0 && self->expanded) grib_context_free(c,self->expanded);
|
||||
if (self->rank==0 && self->expanded) {
|
||||
grib_bufr_descriptors_array_delete(self->expanded);
|
||||
}
|
||||
}
|
||||
|
||||
static int get_native_type(grib_accessor* a)
|
||||
|
|
|
@ -15,6 +15,7 @@
|
|||
{ "bufr_data_array", &grib_accessor_class_bufr_data_array, },
|
||||
{ "bufr_data_element", &grib_accessor_class_bufr_data_element, },
|
||||
{ "bufr_element", &grib_accessor_class_bufr_element, },
|
||||
{ "bufr_elements_table", &grib_accessor_class_bufr_elements_table, },
|
||||
{ "bufr_group", &grib_accessor_class_bufr_group, },
|
||||
{ "bufr_group_number", &grib_accessor_class_bufr_group_number, },
|
||||
{ "bufr_has_delayed_replication", &grib_accessor_class_bufr_has_delayed_replication, },
|
||||
|
|
|
@ -15,6 +15,7 @@ bufr_data, &grib_accessor_class_bufr_data
|
|||
bufr_data_array, &grib_accessor_class_bufr_data_array
|
||||
bufr_data_element, &grib_accessor_class_bufr_data_element
|
||||
bufr_element, &grib_accessor_class_bufr_element
|
||||
bufr_elements_table, &grib_accessor_class_bufr_elements_table
|
||||
bufr_group, &grib_accessor_class_bufr_group
|
||||
bufr_group_number, &grib_accessor_class_bufr_group_number
|
||||
bufr_has_delayed_replication, &grib_accessor_class_bufr_has_delayed_replication
|
||||
|
|
|
@ -1598,5 +1598,7 @@ Error codes returned by the grib_api functions.
|
|||
#define GRIB_WRONG_CONVERSION -58
|
||||
/** Missing BUFR table entry for descriptor */
|
||||
#define GRIB_MISSING_BUFR_ENTRY -59
|
||||
/** Null pointer */
|
||||
#define GRIB_NULL_POINTER -60
|
||||
/*! @}*/
|
||||
#endif
|
||||
|
|
|
@ -200,12 +200,6 @@ double rint(double x);
|
|||
#define MAX_SMART_TABLE_COLUMNS 20
|
||||
#define MAX_CODETABLE_ENTRIES 65536
|
||||
|
||||
/* types of BUFR table B elements */
|
||||
#define BUFR_TYPE_STRING 1
|
||||
#define BUFR_TYPE_DOUBLE 2
|
||||
#define BUFR_TYPE_CODETABLE 3
|
||||
#define BUFR_TYPE_FLAGTABLE 4
|
||||
|
||||
/* ACCESSOR COMPARE FLAGS */
|
||||
#define GRIB_COMPARE_NAMES (1<<0)
|
||||
#define GRIB_COMPARE_TYPES (1<<1)
|
||||
|
@ -514,13 +508,6 @@ struct grib_accessor
|
|||
|
||||
};
|
||||
|
||||
#define BUFR_DESCRIPTOR_FLAG_HAS_VALUES (1<<1)
|
||||
#define BUFR_DESCRIPTOR_FLAG_DEFAULT_VALUES (1<<2)
|
||||
#define BUFR_DESCRIPTOR_FLAG_MODIFIED_VALUES (1<<3)
|
||||
#define BUFR_DESCRIPTOR_FLAG_IS_TABLE (1<<4)
|
||||
#define BUFR_DESCRIPTOR_FLAG_IS_FLAG (1<<5)
|
||||
#define BUFR_DESCRIPTOR_FLAG_IS_STRING (1<<6)
|
||||
|
||||
#define GRIB_ACCESSOR_FLAG_READ_ONLY (1<<1)
|
||||
#define GRIB_ACCESSOR_FLAG_DUMP (1<<2)
|
||||
#define GRIB_ACCESSOR_FLAG_EDITION_SPECIFIC (1<<3)
|
||||
|
@ -750,12 +737,27 @@ struct grib_viarray {
|
|||
grib_context* context;
|
||||
} ;
|
||||
|
||||
/* types of BUFR descriptors used in bufr_descriptor->type*/
|
||||
#define BUFR_DESCRIPTOR_TYPE_UNKNOWN 0
|
||||
#define BUFR_DESCRIPTOR_TYPE_STRING 1
|
||||
#define BUFR_DESCRIPTOR_TYPE_DOUBLE 2
|
||||
#define BUFR_DESCRIPTOR_TYPE_LONG 3
|
||||
#define BUFR_DESCRIPTOR_TYPE_TABLE 4
|
||||
#define BUFR_DESCRIPTOR_TYPE_FLAG 5
|
||||
#define BUFR_DESCRIPTOR_TYPE_REPLICATION 6
|
||||
#define BUFR_DESCRIPTOR_TYPE_OPERATOR 7
|
||||
#define BUFR_DESCRIPTOR_TYPE_SEQUENCE 8
|
||||
|
||||
struct bufr_descriptor {
|
||||
grib_context* context;
|
||||
long code;
|
||||
int F;
|
||||
int X;
|
||||
int Y;
|
||||
int flags;
|
||||
int type;
|
||||
char* name;
|
||||
char* shortName;
|
||||
char* units;
|
||||
long scale;
|
||||
double factor;
|
||||
double reference;
|
||||
|
@ -774,8 +776,6 @@ struct bufr_descriptors_array {
|
|||
#define MAX_SET_VALUES 10
|
||||
#define MAX_ACCESSOR_CACHE 100
|
||||
|
||||
|
||||
|
||||
struct grib_handle
|
||||
{
|
||||
grib_context* context; /** < context attached to this handle */
|
||||
|
@ -991,7 +991,6 @@ struct grib_context
|
|||
int hash_array_count;
|
||||
grib_hash_array_value* hash_array[MAX_NUM_HASH_ARRAY];
|
||||
grib_trie* def_files;
|
||||
|
||||
grib_string_list* blacklist;
|
||||
int ieee_packing;
|
||||
int unpack;
|
||||
|
|
|
@ -146,11 +146,13 @@ grib_hash_array_value *grib_double_hash_array_value_new(grib_context *c, const c
|
|||
void grib_hash_array_value_delete(grib_context *c, grib_hash_array_value *v);
|
||||
|
||||
/* grib_bufr_descriptor.c */
|
||||
bufr_descriptor *grib_bufr_descriptor_new(grib_context *c, int code);
|
||||
bufr_descriptor *grib_bufr_descriptor_clone(grib_context *c, bufr_descriptor *d);
|
||||
void grib_bufr_descriptor_set_code(bufr_descriptor *v, int code);
|
||||
bufr_descriptor *grib_bufr_descriptor_new(grib_accessor *tables_accessor, int code, int *err);
|
||||
bufr_descriptor *grib_bufr_descriptor_clone(bufr_descriptor *d);
|
||||
void grib_bufr_descriptor_set_values(bufr_descriptor *v, int scale, int reference, int width);
|
||||
void grib_bufr_descriptor_set_scale(bufr_descriptor *v, int scale);
|
||||
int grib_bufr_descriptor_set_code(grib_accessor *tables_accessor, int code, bufr_descriptor *v);
|
||||
void grib_bufr_descriptor_set_reference(bufr_descriptor *v, double reference);
|
||||
void grib_bufr_descriptor_set_width(bufr_descriptor *v, long width);
|
||||
void grib_bufr_descriptor_set_scale(bufr_descriptor *v, long scale);
|
||||
void grib_bufr_descriptor_delete(grib_context *c, bufr_descriptor *v);
|
||||
|
||||
/* grib_bufr_descriptors_array.c */
|
||||
|
@ -249,6 +251,13 @@ size_t grib_viarray_used_size(grib_viarray *v);
|
|||
/* grib_accessor_class_bufr_data_array.c */
|
||||
|
||||
/* grib_accessor_class_bufr_data_element.c */
|
||||
void accessor_bufr_data_element_set_index(grib_accessor *a, long index);
|
||||
void accessor_bufr_data_element_set_type(grib_accessor *a, int type);
|
||||
void accessor_bufr_data_element_set_compressedData(grib_accessor *a, int compressedData);
|
||||
void accessor_bufr_data_element_set_descriptors(grib_accessor *a, bufr_descriptors_array *descriptors);
|
||||
void accessor_bufr_data_element_set_numericValues(grib_accessor *a, grib_vdarray *numericValues);
|
||||
void accessor_bufr_data_element_set_stringValues(grib_accessor *a, grib_vsarray *stringValues);
|
||||
void accessor_bufr_data_element_set_elementsDescriptorsIndex(grib_accessor *a, grib_viarray *elementsDescriptorsIndex);
|
||||
|
||||
/* grib_accessor_class_bufr_group.c */
|
||||
|
||||
|
@ -258,6 +267,10 @@ size_t grib_viarray_used_size(grib_viarray *v);
|
|||
|
||||
/* grib_accessor_class_bufr_element.c */
|
||||
|
||||
/* grib_accessor_class_bufr_elements_table.c */
|
||||
char **str_split(char *a_str, const char a_delim);
|
||||
bufr_descriptor *accessor_bufr_elements_table_get_descriptor(grib_accessor *a, int code, int *err);
|
||||
|
||||
/* grib_accessor_class_bufr_has_delayed_replication.c */
|
||||
|
||||
/* grib_accessor_class_bufr_subset_number.c */
|
||||
|
@ -1255,6 +1268,7 @@ double grib_arguments_get_double(grib_handle *h, grib_arguments *args, int n);
|
|||
grib_expression *grib_arguments_get_expression(grib_handle *h, grib_arguments *args, int n);
|
||||
|
||||
/* grib_util.c */
|
||||
double rint(double x);
|
||||
grib_handle *grib_util_sections_copy(grib_handle *hfrom, grib_handle *hto, int what, int *err);
|
||||
grib_string_list *grib_util_get_param_id(const char *mars_param);
|
||||
grib_string_list *grib_util_get_mars_param(const char *param_id);
|
||||
|
|
|
@ -11,49 +11,92 @@
|
|||
|
||||
#include "grib_api_internal.h"
|
||||
|
||||
bufr_descriptor* grib_bufr_descriptor_new(grib_context* c,int code) {
|
||||
bufr_descriptor* v=NULL;
|
||||
|
||||
if (!c) c=grib_context_get_default();
|
||||
|
||||
v=(bufr_descriptor*)grib_context_malloc_clear(c,sizeof(bufr_descriptor));
|
||||
if (!v) {
|
||||
grib_context_log(c,GRIB_LOG_ERROR,
|
||||
"grib_bufr_descriptor_new unable to allocate %d bytes\n",sizeof(bufr_descriptor));
|
||||
return NULL;
|
||||
}
|
||||
|
||||
grib_bufr_descriptor_set_code(v,code);
|
||||
|
||||
return v;
|
||||
bufr_descriptor* grib_bufr_descriptor_new(grib_accessor* tables_accessor,int code,int *err) {
|
||||
bufr_descriptor* ret=accessor_bufr_elements_table_get_descriptor(tables_accessor,code,err);
|
||||
if (*err) grib_context_log(tables_accessor->parent->h->context,GRIB_LOG_ERROR,
|
||||
"unable to get descriptor %06d from table",code);
|
||||
return ret;
|
||||
}
|
||||
|
||||
bufr_descriptor* grib_bufr_descriptor_clone(grib_context* c,bufr_descriptor* d) {
|
||||
bufr_descriptor* grib_bufr_descriptor_clone(bufr_descriptor* d) {
|
||||
|
||||
bufr_descriptor* cd=0;
|
||||
|
||||
if (!d) return NULL;
|
||||
|
||||
return grib_bufr_descriptor_new(c,d->code);
|
||||
}
|
||||
cd=grib_context_malloc_clear(d->context,sizeof(bufr_descriptor));
|
||||
|
||||
void grib_bufr_descriptor_set_code(bufr_descriptor* v,int code) {
|
||||
if (!v) return;
|
||||
cd->code=d->code;
|
||||
cd->F=d->F;
|
||||
cd->X=d->X;
|
||||
cd->Y=d->Y;
|
||||
cd->name=grib_context_strdup(d->context,d->name);
|
||||
cd->shortName=grib_context_strdup(d->context,d->shortName);
|
||||
cd->units=grib_context_strdup(d->context,d->units);
|
||||
cd->scale=d->scale;
|
||||
cd->factor=d->factor;
|
||||
cd->width=d->width;
|
||||
cd->reference=d->reference;
|
||||
cd->type=d->type;
|
||||
|
||||
v->code=code;
|
||||
v->F=code/100000;
|
||||
v->X=(code-v->F*100000)/1000;
|
||||
v->Y=(code-v->F*100000)%1000;
|
||||
return cd;
|
||||
}
|
||||
|
||||
void grib_bufr_descriptor_set_values(bufr_descriptor* v,int scale,int reference,int width) {
|
||||
if (!v) return;
|
||||
v->scale=scale;
|
||||
v->reference=reference;
|
||||
v->width=width;
|
||||
v->flags=BUFR_DESCRIPTOR_FLAG_HAS_VALUES;
|
||||
v->factor=grib_power(-scale,10);
|
||||
}
|
||||
|
||||
void grib_bufr_descriptor_set_scale(bufr_descriptor* v,int scale) {
|
||||
int grib_bufr_descriptor_set_code(grib_accessor* tables_accessor,int code,bufr_descriptor* v) {
|
||||
int err=0;
|
||||
grib_context* c;
|
||||
bufr_descriptor* d;
|
||||
|
||||
if (!v) return GRIB_NULL_POINTER;
|
||||
|
||||
c=v->context;
|
||||
|
||||
if (v->type==BUFR_DESCRIPTOR_TYPE_REPLICATION || v->type==BUFR_DESCRIPTOR_TYPE_OPERATOR) {
|
||||
v->code=code;
|
||||
v->F=code/100000;
|
||||
v->X=(code-v->F*100000)/1000;
|
||||
v->Y=(code-v->F*100000)%1000;
|
||||
} else {
|
||||
if (tables_accessor==NULL) return GRIB_NULL_POINTER;
|
||||
d=accessor_bufr_elements_table_get_descriptor(tables_accessor,code,&err);
|
||||
v->code=d->code;
|
||||
v->F=d->F;
|
||||
v->X=d->X;
|
||||
v->Y=d->Y;
|
||||
grib_context_free(c,v->name);
|
||||
v->name=grib_context_strdup(c,d->name);
|
||||
grib_context_free(c,v->shortName);
|
||||
v->shortName=grib_context_strdup(c,d->shortName);
|
||||
grib_context_free(c,v->units);
|
||||
v->units=grib_context_strdup(c,d->units);
|
||||
v->scale=d->scale;
|
||||
v->factor=d->factor;
|
||||
v->width=d->width;
|
||||
v->reference=d->reference;
|
||||
v->type=d->type;
|
||||
grib_bufr_descriptor_delete(c,d);
|
||||
}
|
||||
return err;
|
||||
}
|
||||
|
||||
void grib_bufr_descriptor_set_reference(bufr_descriptor* v,double reference) {
|
||||
if (!v) return;
|
||||
v->reference=reference;
|
||||
}
|
||||
|
||||
void grib_bufr_descriptor_set_width(bufr_descriptor* v,long width) {
|
||||
if (!v) return;
|
||||
v->width=width;
|
||||
}
|
||||
|
||||
void grib_bufr_descriptor_set_scale(bufr_descriptor* v,long scale) {
|
||||
if (!v) return;
|
||||
v->scale=scale;
|
||||
v->factor=grib_power(-scale,10);
|
||||
|
@ -63,6 +106,9 @@ void grib_bufr_descriptor_delete(grib_context* c,bufr_descriptor* v) {
|
|||
|
||||
if (!v) return;
|
||||
|
||||
grib_context_free(c,v->name);
|
||||
grib_context_free(c,v->shortName);
|
||||
grib_context_free(c,v->units);
|
||||
grib_context_free(c,v);
|
||||
}
|
||||
|
||||
|
|
|
@ -175,7 +175,7 @@ bufr_descriptor** grib_bufr_descriptors_array_get_array(bufr_descriptors_array*
|
|||
grib_context* c=grib_context_get_default();
|
||||
|
||||
vv=(bufr_descriptor**)grib_context_malloc_clear(c,sizeof(bufr_descriptor*)*v->n);
|
||||
for (i=0;i<v->n;i++) vv[i]=grib_bufr_descriptor_clone(c,v->v[i]);
|
||||
for (i=0;i<v->n;i++) vv[i]=grib_bufr_descriptor_clone(v->v[i]);
|
||||
|
||||
return vv;
|
||||
}
|
||||
|
|
|
@ -728,8 +728,11 @@ void* grib_context_realloc(const grib_context* c, void *p,size_t size)
|
|||
|
||||
char* grib_context_strdup(const grib_context* c,const char* s)
|
||||
{
|
||||
char *dup = (char*)grib_context_malloc(c,(strlen(s)*sizeof(char))+1);
|
||||
if(dup) strcpy(dup,s);
|
||||
char *dup=0;
|
||||
if (s) {
|
||||
dup = (char*)grib_context_malloc(c,(strlen(s)*sizeof(char))+1);
|
||||
if(dup) strcpy(dup,s);
|
||||
}
|
||||
return dup;
|
||||
}
|
||||
|
||||
|
|
|
@ -63,6 +63,7 @@ static const char *errors[] = {
|
|||
"String is smaller than requested", /* -57 GRIB_STRING_TOO_SMALL */
|
||||
"Wrong type conversion", /* -58 GRIB_WRONG_CONVERSION */
|
||||
"Missing BUFR table entry for descriptor", /* -59 GRIB_MISSING_BUFR_ENTRY */
|
||||
"Null pointer", /* -60 GRIB_NULL_POINTER */
|
||||
"Value mismatch", /* 1 GRIB_VALUE_MISMATCH */
|
||||
"double values are different", /* 2 GRIB_DOUBLE_VALUE_MISMATCH */
|
||||
"long values are different", /* 3 GRIB_LONG_VALUE_MISMATCH */
|
||||
|
|
|
@ -65,3 +65,4 @@ GRIB_INVALID_KEY_VALUE Invalid key value
|
|||
GRIB_STRING_TOO_SMALL String is smaller than requested
|
||||
GRIB_WRONG_CONVERSION Wrong type conversion
|
||||
GRIB_MISSING_BUFR_ENTRY Missing BUFR table entry for descriptor
|
||||
GRIB_NULL_POINTER Null pointer
|
||||
|
|
|
@ -29,6 +29,7 @@ endforeach()
|
|||
list( APPEND tests
|
||||
definitions
|
||||
bufr_dump
|
||||
bufrdc_desc_ref
|
||||
bufrdc_ref
|
||||
ieee
|
||||
grib1to2
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
TESTS = definitions.sh \
|
||||
bufrdc_ref.sh bufr_dump.sh \
|
||||
bufrdc_desc_ref.sh bufrdc_ref.sh bufr_dump.sh \
|
||||
ieee.sh grib1to2.sh \
|
||||
unit_tests.sh \
|
||||
grib2to1.sh badgrib.sh ls.sh filter.sh \
|
||||
|
|
|
@ -8,7 +8,7 @@
|
|||
# virtue of its status as an intergovernmental organisation nor does it submit to any jurisdiction.
|
||||
#
|
||||
|
||||
set -e
|
||||
set -ex
|
||||
. ./include.sh
|
||||
|
||||
REDIRECT=/dev/null
|
||||
|
|
|
@ -8,7 +8,7 @@
|
|||
# virtue of its status as an intergovernmental organisation nor does it submit to any jurisdiction.
|
||||
#
|
||||
|
||||
set -e
|
||||
set -ex
|
||||
|
||||
. ./include.sh
|
||||
|
||||
|
|
Loading…
Reference in New Issue