mirror of https://github.com/ecmwf/eccodes.git
ECC-208 transient vector and subsets
This commit is contained in:
parent
852f99f39c
commit
5fae39d8cb
|
@ -11,11 +11,11 @@ lookup[1] ed (7,editionNumber);
|
|||
transient missingValue=999999;
|
||||
|
||||
#negative value=not used
|
||||
transient inputDelayedDescriptorReplicationFactor=-1;
|
||||
transient inputDelayedDescriptorReplicationFactor={-1};
|
||||
#negative value=not used
|
||||
transient inputExtendedDelayedDescriptorReplicationFactor=-1;
|
||||
transient inputExtendedDelayedDescriptorReplicationFactor={-1};
|
||||
#negative value=not used
|
||||
transient inputShortDelayedDescriptorReplicationFactor=-1;
|
||||
transient inputShortDelayedDescriptorReplicationFactor={-1};
|
||||
|
||||
template boot_edition "bufr/boot_edition_[ed:l].def";
|
||||
|
||||
|
|
|
@ -32,6 +32,7 @@ list( APPEND grib_api_srcs
|
|||
action_class_close.c
|
||||
action_class_variable.c
|
||||
action_class_modify.c
|
||||
action_class_transient_darray.c
|
||||
eccodes.c
|
||||
grib_accessor.c
|
||||
grib_concept.c
|
||||
|
@ -167,6 +168,7 @@ list( APPEND grib_api_srcs
|
|||
grib_accessor_class_spectral_truncation.c
|
||||
grib_accessor_class_time.c
|
||||
grib_accessor_class_transient.c
|
||||
grib_accessor_class_transient_darray.c
|
||||
grib_accessor_class_values.c
|
||||
grib_accessor_class_simple_packing_error.c
|
||||
grib_accessor_class_data_simple_packing.c
|
||||
|
|
|
@ -44,6 +44,7 @@ libeccodes_la_prototypes= \
|
|||
action_class_close.c \
|
||||
action_class_variable.c \
|
||||
action_class_modify.c \
|
||||
action_class_transient_darray.c \
|
||||
grib_accessor.c \
|
||||
grib_concept.c \
|
||||
grib_hash_array.c \
|
||||
|
@ -242,6 +243,7 @@ libeccodes_la_prototypes= \
|
|||
grib_accessor_class_g2_eps.c \
|
||||
grib_accessor_class_g2_chemical.c \
|
||||
grib_accessor_class_g2_mars_labeling.c \
|
||||
grib_accessor_class_transient_darray.c \
|
||||
grib_accessor_class_md5.c \
|
||||
grib_jasper_encoding.c \
|
||||
grib_openjpeg_encoding.c \
|
||||
|
|
|
@ -0,0 +1,141 @@
|
|||
/*
|
||||
* Copyright 2005-2016 ECMWF.
|
||||
*
|
||||
* This software is licensed under the terms of the Apache Licence Version 2.0
|
||||
* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
|
||||
*
|
||||
* In applying this licence, ECMWF does not waive the privileges and immunities granted to it by
|
||||
* virtue of its status as an intergovernmental organisation nor does it submit to any jurisdiction.
|
||||
*/
|
||||
|
||||
/***************************************************************************
|
||||
* Enrico Fucile *
|
||||
***************************************************************************/
|
||||
#include "grib_api_internal.h"
|
||||
/*
|
||||
This is used by make_class.pl
|
||||
|
||||
START_CLASS_DEF
|
||||
CLASS = action
|
||||
SUPER = action_class_gen
|
||||
IMPLEMENTS = dump;xref
|
||||
IMPLEMENTS = destroy;execute
|
||||
MEMBERS = grib_darray *darray
|
||||
MEMBERS = char *name
|
||||
END_CLASS_DEF
|
||||
|
||||
*/
|
||||
|
||||
/* START_CLASS_IMP */
|
||||
|
||||
/*
|
||||
|
||||
Don't edit anything between START_CLASS_IMP and END_CLASS_IMP
|
||||
Instead edit values between START_CLASS_DEF and END_CLASS_DEF
|
||||
or edit "action.class" and rerun ./make_class.pl
|
||||
|
||||
*/
|
||||
|
||||
static void init_class (grib_action_class*);
|
||||
static void dump (grib_action* d, FILE*,int);
|
||||
static void xref (grib_action* d, FILE* f,const char* path);
|
||||
static void destroy (grib_context*,grib_action*);
|
||||
static int execute(grib_action* a,grib_handle* h);
|
||||
|
||||
|
||||
typedef struct grib_action_transient_darray {
|
||||
grib_action act;
|
||||
/* Members defined in gen */
|
||||
long len;
|
||||
grib_arguments* params;
|
||||
/* Members defined in transient_darray */
|
||||
grib_darray *darray;
|
||||
char *name;
|
||||
} grib_action_transient_darray;
|
||||
|
||||
extern grib_action_class* grib_action_class_gen;
|
||||
|
||||
static grib_action_class _grib_action_class_transient_darray = {
|
||||
&grib_action_class_gen, /* super */
|
||||
"action_class_transient_darray", /* name */
|
||||
sizeof(grib_action_transient_darray), /* size */
|
||||
0, /* inited */
|
||||
&init_class, /* init_class */
|
||||
0, /* init */
|
||||
&destroy, /* destroy */
|
||||
|
||||
&dump, /* dump */
|
||||
&xref, /* xref */
|
||||
|
||||
0, /* create_accessor*/
|
||||
|
||||
0, /* notify_change */
|
||||
0, /* reparse */
|
||||
&execute, /* execute */
|
||||
0, /* compile */
|
||||
};
|
||||
|
||||
grib_action_class* grib_action_class_transient_darray = &_grib_action_class_transient_darray;
|
||||
|
||||
static void init_class(grib_action_class* c)
|
||||
{
|
||||
c->create_accessor = (*(c->super))->create_accessor;
|
||||
c->notify_change = (*(c->super))->notify_change;
|
||||
c->reparse = (*(c->super))->reparse;
|
||||
c->compile = (*(c->super))->compile;
|
||||
}
|
||||
/* END_CLASS_IMP */
|
||||
|
||||
grib_action* grib_action_create_transient_darray( grib_context* context, const char* name, grib_darray* darray)
|
||||
{
|
||||
char buf[1024];
|
||||
|
||||
grib_action_transient_darray* a = NULL;
|
||||
grib_action_class* c = grib_action_class_transient_darray;
|
||||
grib_action* act = (grib_action*)grib_context_malloc_clear_persistent(context,c->size);
|
||||
act->op = grib_context_strdup_persistent(context,"transient_darray");
|
||||
|
||||
act->cclass = c;
|
||||
a = (grib_action_transient_darray*)act;
|
||||
act->context = context;
|
||||
|
||||
a->darray = darray;
|
||||
a->name = grib_context_strdup_persistent(context,name);
|
||||
|
||||
act->name = grib_context_strdup_persistent(context,name);
|
||||
|
||||
return act;
|
||||
}
|
||||
|
||||
static int execute(grib_action* act, grib_handle *h)
|
||||
{
|
||||
grib_action_transient_darray* self = (grib_action_transient_darray*) act;
|
||||
grib_accessor* a=grib_create_accessor(h->root, act, NULL );
|
||||
size_t len=grib_darray_used_size(self->darray);
|
||||
|
||||
return grib_pack_double(a,self->darray->v,&len);
|
||||
}
|
||||
|
||||
static void dump(grib_action* act, FILE* f, int lvl)
|
||||
{
|
||||
int i =0;
|
||||
grib_action_transient_darray* self=(grib_action_transient_darray*)act;
|
||||
for (i=0;i<lvl;i++)
|
||||
grib_context_print(act->context,f," ");
|
||||
grib_context_print(act->context,f,self->name);
|
||||
printf("\n");
|
||||
}
|
||||
|
||||
static void destroy(grib_context* context,grib_action* act)
|
||||
{
|
||||
grib_action_transient_darray* a = (grib_action_transient_darray*) act;
|
||||
|
||||
grib_context_free_persistent(context, a->name);
|
||||
grib_darray_delete(context,a->darray);
|
||||
grib_context_free_persistent(context, act->name);
|
||||
grib_context_free_persistent(context, act->op);
|
||||
}
|
||||
|
||||
static void xref(grib_action* d, FILE* f,const char *path)
|
||||
{
|
||||
}
|
|
@ -195,6 +195,7 @@ extern grib_accessor_class* grib_accessor_class_to_double;
|
|||
extern grib_accessor_class* grib_accessor_class_to_integer;
|
||||
extern grib_accessor_class* grib_accessor_class_to_string;
|
||||
extern grib_accessor_class* grib_accessor_class_transient;
|
||||
extern grib_accessor_class* grib_accessor_class_transient_darray;
|
||||
extern grib_accessor_class* grib_accessor_class_uint16;
|
||||
extern grib_accessor_class* grib_accessor_class_uint16_little_endian;
|
||||
extern grib_accessor_class* grib_accessor_class_uint32;
|
||||
|
|
|
@ -53,13 +53,13 @@
|
|||
MEMBERS = int unpackMode
|
||||
MEMBERS = int bitsToEndData
|
||||
MEMBERS = grib_section* dataKeys
|
||||
MEMBERS = int* inputReplications
|
||||
MEMBERS = long* inputReplications
|
||||
MEMBERS = int nInputReplications
|
||||
MEMBERS = int iInputReplications
|
||||
MEMBERS = int* inputExtendedReplications
|
||||
MEMBERS = long* inputExtendedReplications
|
||||
MEMBERS = int nInputExtendedReplications
|
||||
MEMBERS = int iInputExtendedReplications
|
||||
MEMBERS = int* inputShortReplications
|
||||
MEMBERS = long* inputShortReplications
|
||||
MEMBERS = int nInputShortReplications
|
||||
MEMBERS = int iInputShortReplications
|
||||
|
||||
|
@ -124,13 +124,13 @@ typedef struct grib_accessor_bufr_data_array {
|
|||
int unpackMode;
|
||||
int bitsToEndData;
|
||||
grib_section* dataKeys;
|
||||
int* inputReplications;
|
||||
long* inputReplications;
|
||||
int nInputReplications;
|
||||
int iInputReplications;
|
||||
int* inputExtendedReplications;
|
||||
long* inputExtendedReplications;
|
||||
int nInputExtendedReplications;
|
||||
int iInputExtendedReplications;
|
||||
int* inputShortReplications;
|
||||
long* inputShortReplications;
|
||||
int nInputShortReplications;
|
||||
int iInputShortReplications;
|
||||
} grib_accessor_bufr_data_array;
|
||||
|
@ -1629,32 +1629,38 @@ static int create_keys(grib_accessor* a)
|
|||
}
|
||||
|
||||
static int set_input_replications(grib_handle* h,grib_accessor_bufr_data_array *self) {
|
||||
size_t nInputReplications;
|
||||
size_t nInputExtendedReplications;
|
||||
size_t nInputShortReplications;
|
||||
self->nInputReplications=-1;
|
||||
self->nInputExtendedReplications=-1;
|
||||
self->nInputShortReplications=-1;
|
||||
self->iInputReplications=0;
|
||||
self->iInputExtendedReplications=0;
|
||||
self->iInputShortReplications=0;
|
||||
if (grib_get_size(h,"inputDelayedDescriptorReplicationFactor",&(self->nInputReplications))==0) {
|
||||
if (grib_get_size(h,"inputDelayedDescriptorReplicationFactor",&nInputReplications)==0 && nInputReplications!=0) {
|
||||
if (self->inputReplications) grib_context_free(h->context,self->inputReplications);
|
||||
self->inputReplications=grib_context_malloc_clear(h->context,sizeof(long)*self->nInputReplications);
|
||||
grib_get_long_array(h,"inputDelayedDescriptorReplicationFactor",self->inputReplications,&(self->nInputReplications));
|
||||
self->inputReplications=grib_context_malloc_clear(h->context,sizeof(long)*nInputReplications);
|
||||
grib_get_long_array(h,"inputDelayedDescriptorReplicationFactor",self->inputReplications,&nInputReplications);
|
||||
/* default-> no input replications*/
|
||||
if (self->inputReplications[0]<0) self->nInputReplications=-1;
|
||||
else self->nInputReplications=nInputReplications;
|
||||
}
|
||||
if (grib_get_size(h,"inputExtendedDelayedDescriptorReplicationFactor",&(self->nInputExtendedReplications))==0) {
|
||||
if (grib_get_size(h,"inputExtendedDelayedDescriptorReplicationFactor",&nInputExtendedReplications)==0 && nInputExtendedReplications!=0) {
|
||||
if (self->inputExtendedReplications) grib_context_free(h->context,self->inputExtendedReplications);
|
||||
self->inputExtendedReplications=grib_context_malloc_clear(h->context,sizeof(long)*self->nInputExtendedReplications);
|
||||
grib_get_long_array(h,"inputExtendedDelayedDescriptorReplicationFactor",self->inputExtendedReplications,&(self->nInputExtendedReplications));
|
||||
self->inputExtendedReplications=grib_context_malloc_clear(h->context,sizeof(long)*nInputExtendedReplications);
|
||||
grib_get_long_array(h,"inputExtendedDelayedDescriptorReplicationFactor",self->inputExtendedReplications,&nInputExtendedReplications);
|
||||
/* default-> no input replications*/
|
||||
if (self->inputExtendedReplications[0]<0) self->nInputExtendedReplications=-1;
|
||||
else self->nInputExtendedReplications=nInputExtendedReplications;
|
||||
}
|
||||
if (grib_get_size(h,"inputShortDelayedDescriptorReplicationFactor",&(self->nInputShortReplications))==0) {
|
||||
if (grib_get_size(h,"inputShortDelayedDescriptorReplicationFactor",&nInputShortReplications)==0 && nInputShortReplications!=0) {
|
||||
if (self->inputShortReplications) grib_context_free(h->context,self->inputShortReplications);
|
||||
self->inputShortReplications=grib_context_malloc_clear(h->context,sizeof(long)*self->nInputShortReplications);
|
||||
grib_get_long_array(h,"inputShortDelayedDescriptorReplicationFactor",self->inputShortReplications,&(self->nInputShortReplications));
|
||||
self->inputShortReplications=grib_context_malloc_clear(h->context,sizeof(long)*nInputShortReplications);
|
||||
grib_get_long_array(h,"inputShortDelayedDescriptorReplicationFactor",self->inputShortReplications,&nInputShortReplications);
|
||||
/* default-> no input replications*/
|
||||
if (self->inputShortReplications[0]<0) self->nInputShortReplications=-1;
|
||||
else self->nInputShortReplications=nInputShortReplications;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -0,0 +1,285 @@
|
|||
/*
|
||||
* Copyright 2005-2016 ECMWF.
|
||||
*
|
||||
* This software is licensed under the terms of the Apache Licence Version 2.0
|
||||
* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
|
||||
*
|
||||
* In applying this licence, ECMWF does not waive the privileges and immunities granted to it by
|
||||
* virtue of its status as an intergovernmental organisation nor does it submit to any jurisdiction.
|
||||
*/
|
||||
|
||||
#include "grib_api_internal.h"
|
||||
#include <limits.h>
|
||||
/*
|
||||
This is used by make_class.pl
|
||||
|
||||
START_CLASS_DEF
|
||||
CLASS = accessor
|
||||
SUPER = grib_accessor_class_gen
|
||||
IMPLEMENTS = unpack_double;pack_double
|
||||
IMPLEMENTS = unpack_long;pack_long;destroy
|
||||
IMPLEMENTS = init;dump;value_count
|
||||
IMPLEMENTS = compare;get_native_type
|
||||
MEMBERS=grib_darray* arr
|
||||
MEMBERS=int type;
|
||||
END_CLASS_DEF
|
||||
|
||||
*/
|
||||
|
||||
/* START_CLASS_IMP */
|
||||
|
||||
/*
|
||||
|
||||
Don't edit anything between START_CLASS_IMP and END_CLASS_IMP
|
||||
Instead edit values between START_CLASS_DEF and END_CLASS_DEF
|
||||
or edit "accessor.class" and rerun ./make_class.pl
|
||||
|
||||
*/
|
||||
|
||||
static int get_native_type(grib_accessor*);
|
||||
static int pack_double(grib_accessor*, const double* val,size_t *len);
|
||||
static int pack_long(grib_accessor*, const long* val,size_t *len);
|
||||
static int unpack_double(grib_accessor*, double* val,size_t *len);
|
||||
static int unpack_long(grib_accessor*, long* val,size_t *len);
|
||||
static int value_count(grib_accessor*,long*);
|
||||
static void destroy(grib_context*,grib_accessor*);
|
||||
static void dump(grib_accessor*, grib_dumper*);
|
||||
static void init(grib_accessor*,const long, grib_arguments* );
|
||||
static void init_class(grib_accessor_class*);
|
||||
static int compare(grib_accessor*, grib_accessor*);
|
||||
|
||||
typedef struct grib_accessor_transient_darray {
|
||||
grib_accessor att;
|
||||
/* Members defined in gen */
|
||||
/* Members defined in transient_darray */
|
||||
grib_darray* arr;
|
||||
int type;
|
||||
} grib_accessor_transient_darray;
|
||||
|
||||
extern grib_accessor_class* grib_accessor_class_gen;
|
||||
|
||||
static grib_accessor_class _grib_accessor_class_transient_darray = {
|
||||
&grib_accessor_class_gen, /* super */
|
||||
"transient_darray", /* name */
|
||||
sizeof(grib_accessor_transient_darray), /* size */
|
||||
0, /* inited */
|
||||
&init_class, /* init_class */
|
||||
&init, /* init */
|
||||
0, /* post_init */
|
||||
&destroy, /* free mem */
|
||||
&dump, /* describes himself */
|
||||
0, /* get length of section */
|
||||
0, /* get length of string */
|
||||
&value_count, /* get number of values */
|
||||
0, /* get number of bytes */
|
||||
0, /* get offset to bytes */
|
||||
&get_native_type, /* get native type */
|
||||
0, /* get sub_section */
|
||||
0, /* grib_pack procedures long */
|
||||
0, /* grib_pack procedures long */
|
||||
&pack_long, /* grib_pack procedures long */
|
||||
&unpack_long, /* grib_unpack procedures long */
|
||||
&pack_double, /* grib_pack procedures double */
|
||||
&unpack_double, /* grib_unpack procedures double */
|
||||
0, /* grib_pack procedures string */
|
||||
0, /* grib_unpack procedures string */
|
||||
0, /* grib_pack array procedures string */
|
||||
0, /* grib_unpack array procedures string */
|
||||
0, /* grib_pack procedures bytes */
|
||||
0, /* grib_unpack procedures bytes */
|
||||
0, /* pack_expression */
|
||||
0, /* notify_change */
|
||||
0, /* update_size */
|
||||
0, /* preferred_size */
|
||||
0, /* resize */
|
||||
0, /* nearest_smaller_value */
|
||||
0, /* next accessor */
|
||||
&compare, /* compare vs. another accessor */
|
||||
0, /* unpack only ith value */
|
||||
0, /* unpack a subarray */
|
||||
0, /* clear */
|
||||
0, /* clone accessor */
|
||||
};
|
||||
|
||||
|
||||
grib_accessor_class* grib_accessor_class_transient_darray = &_grib_accessor_class_transient_darray;
|
||||
|
||||
|
||||
static void init_class(grib_accessor_class* c)
|
||||
{
|
||||
c->next_offset = (*(c->super))->next_offset;
|
||||
c->string_length = (*(c->super))->string_length;
|
||||
c->byte_count = (*(c->super))->byte_count;
|
||||
c->byte_offset = (*(c->super))->byte_offset;
|
||||
c->sub_section = (*(c->super))->sub_section;
|
||||
c->pack_missing = (*(c->super))->pack_missing;
|
||||
c->is_missing = (*(c->super))->is_missing;
|
||||
c->pack_string = (*(c->super))->pack_string;
|
||||
c->unpack_string = (*(c->super))->unpack_string;
|
||||
c->pack_string_array = (*(c->super))->pack_string_array;
|
||||
c->unpack_string_array = (*(c->super))->unpack_string_array;
|
||||
c->pack_bytes = (*(c->super))->pack_bytes;
|
||||
c->unpack_bytes = (*(c->super))->unpack_bytes;
|
||||
c->pack_expression = (*(c->super))->pack_expression;
|
||||
c->notify_change = (*(c->super))->notify_change;
|
||||
c->update_size = (*(c->super))->update_size;
|
||||
c->preferred_size = (*(c->super))->preferred_size;
|
||||
c->resize = (*(c->super))->resize;
|
||||
c->nearest_smaller_value = (*(c->super))->nearest_smaller_value;
|
||||
c->next = (*(c->super))->next;
|
||||
c->unpack_double_element = (*(c->super))->unpack_double_element;
|
||||
c->unpack_double_subarray = (*(c->super))->unpack_double_subarray;
|
||||
c->clear = (*(c->super))->clear;
|
||||
c->make_clone = (*(c->super))->make_clone;
|
||||
}
|
||||
|
||||
/* END_CLASS_IMP */
|
||||
|
||||
static void init(grib_accessor* a, const long length , grib_arguments* args )
|
||||
{
|
||||
|
||||
grib_accessor_transient_darray *self = (grib_accessor_transient_darray*)a;
|
||||
self->arr=NULL;
|
||||
self->type=GRIB_TYPE_DOUBLE;
|
||||
a->length = 0;
|
||||
}
|
||||
|
||||
|
||||
static void dump(grib_accessor* a, grib_dumper* dumper)
|
||||
{
|
||||
grib_accessor_transient_darray *self = (grib_accessor_transient_darray*)a;
|
||||
grib_dump_double(dumper,a,NULL);
|
||||
|
||||
}
|
||||
|
||||
static int pack_double(grib_accessor* a, const double* val, size_t *len)
|
||||
{
|
||||
grib_accessor_transient_darray *self = (grib_accessor_transient_darray*)a;
|
||||
size_t i;
|
||||
|
||||
if (self->arr) grib_darray_delete(a->context,self->arr);
|
||||
self->arr=grib_darray_new(a->context,*len,10);
|
||||
|
||||
for (i=0;i<*len;i++)
|
||||
grib_darray_push(a->context,self->arr,val[i]);
|
||||
|
||||
return GRIB_SUCCESS;
|
||||
}
|
||||
|
||||
static int pack_long(grib_accessor* a, const long* val, size_t *len)
|
||||
{
|
||||
grib_accessor_transient_darray *self = (grib_accessor_transient_darray*)a;
|
||||
size_t i;
|
||||
|
||||
if (self->arr) grib_darray_delete(a->context,self->arr);
|
||||
self->arr=grib_darray_new(a->context,*len,10);
|
||||
|
||||
for (i=0;i<*len;i++)
|
||||
grib_darray_push(a->context,self->arr,(double)val[i]);
|
||||
|
||||
return GRIB_SUCCESS;
|
||||
}
|
||||
|
||||
static int unpack_double(grib_accessor* a, double* val, size_t *len)
|
||||
{
|
||||
grib_accessor_transient_darray *self = (grib_accessor_transient_darray*)a;
|
||||
long count=0;
|
||||
size_t i;
|
||||
|
||||
value_count(a,&count);
|
||||
|
||||
if(*len < count)
|
||||
{
|
||||
grib_context_log(a->context, GRIB_LOG_ERROR, "Wrong size for %s (setting %d, required %d) ", a->name , *len,count );
|
||||
return GRIB_ARRAY_TOO_SMALL;
|
||||
}
|
||||
|
||||
*len=count;
|
||||
for (i=0;i<*len;i++) val[i]=self->arr->v[i];
|
||||
|
||||
|
||||
return GRIB_SUCCESS;
|
||||
|
||||
}
|
||||
static int unpack_long(grib_accessor* a, long* val, size_t *len)
|
||||
{
|
||||
grib_accessor_transient_darray *self = (grib_accessor_transient_darray*)a;
|
||||
long count=0;
|
||||
size_t i;
|
||||
|
||||
value_count(a,&count);
|
||||
|
||||
if(*len < count)
|
||||
{
|
||||
grib_context_log(a->context, GRIB_LOG_ERROR, "Wrong size for %s (setting %d, required %d) ", a->name , *len,count );
|
||||
return GRIB_ARRAY_TOO_SMALL;
|
||||
}
|
||||
|
||||
*len=count;
|
||||
for (i=0;i<*len;i++) val[i]=(long)self->arr->v[i];
|
||||
|
||||
|
||||
return GRIB_SUCCESS;
|
||||
|
||||
}
|
||||
|
||||
|
||||
static void destroy(grib_context* c,grib_accessor* a)
|
||||
{
|
||||
grib_accessor_transient_darray *self = (grib_accessor_transient_darray*)a;
|
||||
if (self->arr) grib_darray_delete(a->context,self->arr);
|
||||
}
|
||||
|
||||
static int value_count(grib_accessor* a,long* count)
|
||||
{
|
||||
grib_accessor_transient_darray *self = (grib_accessor_transient_darray*)a;
|
||||
if (self->arr) *count=grib_darray_used_size(self->arr);
|
||||
else *count=0;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int compare(grib_accessor* a, grib_accessor* b) {
|
||||
int retval=0;
|
||||
double *aval=0;
|
||||
double *bval=0;
|
||||
|
||||
size_t alen = 0;
|
||||
size_t blen = 0;
|
||||
int err=0;
|
||||
long count=0;
|
||||
|
||||
err=grib_value_count(a,&count);
|
||||
if (err) return err;
|
||||
alen=count;
|
||||
|
||||
err=grib_value_count(b,&count);
|
||||
if (err) return err;
|
||||
blen=count;
|
||||
|
||||
if (alen != blen) return GRIB_COUNT_MISMATCH;
|
||||
|
||||
aval=(double*)grib_context_malloc(a->context,alen*sizeof(double));
|
||||
bval=(double*)grib_context_malloc(b->context,blen*sizeof(double));
|
||||
|
||||
grib_unpack_double(a,aval,&alen);
|
||||
grib_unpack_double(b,bval,&blen);
|
||||
|
||||
retval = GRIB_SUCCESS;
|
||||
while (alen != 0) {
|
||||
if (*bval != *aval) retval = GRIB_DOUBLE_VALUE_MISMATCH;
|
||||
alen--;
|
||||
}
|
||||
|
||||
grib_context_free(a->context,aval);
|
||||
grib_context_free(b->context,bval);
|
||||
|
||||
return retval;
|
||||
}
|
||||
|
||||
static int get_native_type(grib_accessor* a)
|
||||
{
|
||||
grib_accessor_transient_darray *self = (grib_accessor_transient_darray*)a;
|
||||
return self->type;
|
||||
}
|
||||
|
|
@ -194,6 +194,7 @@
|
|||
{ "to_integer", &grib_accessor_class_to_integer, },
|
||||
{ "to_string", &grib_accessor_class_to_string, },
|
||||
{ "transient", &grib_accessor_class_transient, },
|
||||
{ "transient_darray", &grib_accessor_class_transient_darray, },
|
||||
{ "uint16", &grib_accessor_class_uint16, },
|
||||
{ "uint16_little_endian", &grib_accessor_class_uint16_little_endian, },
|
||||
{ "uint32", &grib_accessor_class_uint32, },
|
||||
|
|
|
@ -204,6 +204,7 @@ to_double, &grib_accessor_class_to_double
|
|||
to_integer, &grib_accessor_class_to_integer
|
||||
to_string, &grib_accessor_class_to_string
|
||||
transient, &grib_accessor_class_transient
|
||||
transient_darray, &grib_accessor_class_transient_darray
|
||||
uint16, &grib_accessor_class_uint16
|
||||
uint16_little_endian, &grib_accessor_class_uint16_little_endian
|
||||
uint32, &grib_accessor_class_uint32
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
#line 2 "gribl.c"
|
||||
|
||||
#line 3 "lex.grib_yy.c"
|
||||
#line 4 "gribl.c"
|
||||
|
||||
#define YY_INT_ALIGNED short int
|
||||
|
||||
|
@ -1148,7 +1149,7 @@ void _grib_ignore_grib_yyunput_unused_error() { grib_yyunput(0,0); }
|
|||
#define GET_INPUT input
|
||||
#endif
|
||||
|
||||
#line 1152 "lex.grib_yy.c"
|
||||
#line 1153 "gribl.c"
|
||||
|
||||
#define INITIAL 0
|
||||
|
||||
|
@ -1334,7 +1335,7 @@ YY_DECL
|
|||
|
||||
|
||||
|
||||
#line 1338 "lex.grib_yy.c"
|
||||
#line 1339 "gribl.c"
|
||||
|
||||
if ( !(grib_yy_init) )
|
||||
{
|
||||
|
@ -2166,7 +2167,7 @@ YY_RULE_SETUP
|
|||
#line 283 "gribl.l"
|
||||
ECHO;
|
||||
YY_BREAK
|
||||
#line 2170 "lex.grib_yy.c"
|
||||
#line 2171 "gribl.c"
|
||||
case YY_STATE_EOF(INITIAL):
|
||||
grib_yyterminate();
|
||||
|
||||
|
|
2083
src/grib_yacc.c
2083
src/grib_yacc.c
File diff suppressed because it is too large
Load Diff
|
@ -482,6 +482,8 @@ simple : UNSIGNED '[' INTEGER ']' IDENT default flags
|
|||
|
||||
| TRANS IDENT '=' argument flags
|
||||
{ $$ = grib_action_create_variable(grib_parser_context,$2,"transient",0,$4,$4,$5,NULL); free($2); }
|
||||
| TRANS IDENT '=' '{' dvalues '}'
|
||||
{ $$ = grib_action_create_transient_darray(grib_parser_context,$2,$5); free($2); }
|
||||
|
||||
| FLOAT IDENT default flags
|
||||
{ $$ = grib_action_create_gen(grib_parser_context,$2,"ieeefloat",4,NULL,$3,$4,NULL,NULL); free($2); }
|
||||
|
|
|
@ -6,3 +6,10 @@ sed 's/yy/grib_yy/g' < $LEX_OUT | sed 's/static void grib_yyunput/void grib_yyun
|
|||
sed 's/fgetc/getc/g' < grib_lex1.c > grib_lex.c
|
||||
rm -f grib_lex1.c
|
||||
rm -f $LEX_OUT
|
||||
|
||||
yacc -d griby.y
|
||||
sed 's/yy/grib_yy/g' < y.tab.c > grib_yacc1.c
|
||||
sed 's/fgetc/getc/g' < grib_yacc1.c > grib_yacc.c
|
||||
rm -f grib_yacc1.c
|
||||
sed 's/yy/grib_yy/g' < y.tab.h > grib_yacc.h
|
||||
rm -f y.tab.c y.tab.h
|
||||
|
|
|
@ -832,20 +832,26 @@ cat > $fRules <<EOF
|
|||
set localTablesVersionNumber=0;
|
||||
set masterTablesVersionNumber=23;
|
||||
|
||||
set inputDelayedDescriptorReplicationFactor = 3;
|
||||
set inputExtendedDelayedDescriptorReplicationFactor = 3;
|
||||
set inputDelayedDescriptorReplicationFactor = {2,3};
|
||||
print "inputDelayedDescriptorReplicationFactor=[inputDelayedDescriptorReplicationFactor]";
|
||||
set inputExtendedDelayedDescriptorReplicationFactor = {3,4};
|
||||
print "inputExtendedDelayedDescriptorReplicationFactor=[inputExtendedDelayedDescriptorReplicationFactor]";
|
||||
|
||||
set numberOfSubsets=2;
|
||||
|
||||
set unexpandedDescriptors={309052};
|
||||
|
||||
set pressure={102400,50000,40000,30000,20000,15000};
|
||||
print "/subsetNumber=1/delayedDescriptorReplicationFactor=[/subsetNumber=1/delayedDescriptorReplicationFactor]";
|
||||
print "/subsetNumber=1/extendedDelayedDescriptorReplicationFactor=[/subsetNumber=1/extendedDelayedDescriptorReplicationFactor]";
|
||||
|
||||
print "pressure=[pressure]";
|
||||
print "geopotentialHeight=[geopotentialHeight]";
|
||||
print "delayedDescriptorReplicationFactor=[delayedDescriptorReplicationFactor]";
|
||||
print "extendedDelayedDescriptorReplicationFactor=[extendedDelayedDescriptorReplicationFactor]";
|
||||
print "/subsetNumber=2/delayedDescriptorReplicationFactor=[/subsetNumber=2/delayedDescriptorReplicationFactor]";
|
||||
print "/subsetNumber=2/extendedDelayedDescriptorReplicationFactor=[/subsetNumber=2/extendedDelayedDescriptorReplicationFactor]";
|
||||
|
||||
set pressure={102400,50000,40000,30000,20000,15000,102400,50000,40000,30000,20000,15000};
|
||||
set pack=1;
|
||||
|
||||
print "pressure={[pressure!12',']}";
|
||||
|
||||
write;
|
||||
EOF
|
||||
|
||||
|
@ -858,10 +864,14 @@ ${tools_dir}bufr_filter -o ${fOut} $fRules $f 2>> $fLog 1>> $fLog
|
|||
${tools_dir}bufr_filter -o ${fOut} $fRules $f > ${fOut}.log
|
||||
|
||||
cat > ${fOut}.log.ref <<EOF
|
||||
pressure=102400 50000 40000 30000 20000 15000
|
||||
geopotentialHeight=2147483647 2147483647 2147483647
|
||||
delayedDescriptorReplicationFactor=3
|
||||
extendedDelayedDescriptorReplicationFactor=3
|
||||
inputDelayedDescriptorReplicationFactor=2 3
|
||||
inputExtendedDelayedDescriptorReplicationFactor=3 4
|
||||
/subsetNumber=1/delayedDescriptorReplicationFactor=2
|
||||
/subsetNumber=1/extendedDelayedDescriptorReplicationFactor=3
|
||||
/subsetNumber=2/delayedDescriptorReplicationFactor=3
|
||||
/subsetNumber=2/extendedDelayedDescriptorReplicationFactor=4
|
||||
pressure={102400,50000,40000,30000,20000,15000,102400,50000,40000,30000,20000,15000
|
||||
}
|
||||
EOF
|
||||
|
||||
diff ${fOut}.log.ref ${fOut}.log
|
||||
|
|
Loading…
Reference in New Issue