mirror of https://github.com/ecmwf/eccodes.git
ECC-1126: Simplify keys
This commit is contained in:
parent
15f2b7eb76
commit
f78f19c2e5
|
@ -82,9 +82,8 @@ if (section2Present && bufrHeaderCentre==98 && section2Length==52) {
|
||||||
} else {
|
} else {
|
||||||
meta ls.localLatitude bits(keyData,72,25,-9000000,100000) : dump,no_copy;
|
meta ls.localLatitude bits(keyData,72,25,-9000000,100000) : dump,no_copy;
|
||||||
meta ls.localLongitude bits(keyData,40,26,-18000000,100000) : dump,no_copy;
|
meta ls.localLongitude bits(keyData,40,26,-18000000,100000) : dump,no_copy;
|
||||||
meta identTrimmed trim(keyMore,1,1): no_copy, hidden;
|
meta ident trim(keyMore,1,1): dump, no_copy; # remove whitespaces left and right
|
||||||
meta mars.ident sprintf("%s", identTrimmed) : string_type, no_copy;
|
alias mars.ident = ident : string_type, no_copy;
|
||||||
alias ls.ident=identTrimmed : dump,string_type,no_copy;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -16,7 +16,7 @@
|
||||||
CLASS = accessor
|
CLASS = accessor
|
||||||
SUPER = grib_accessor_class_ascii
|
SUPER = grib_accessor_class_ascii
|
||||||
IMPLEMENTS = unpack_string;pack_string
|
IMPLEMENTS = unpack_string;pack_string
|
||||||
IMPLEMENTS = init
|
IMPLEMENTS = init; string_length
|
||||||
MEMBERS= const char* input
|
MEMBERS= const char* input
|
||||||
MEMBERS= int trim_left
|
MEMBERS= int trim_left
|
||||||
MEMBERS= int trim_right
|
MEMBERS= int trim_right
|
||||||
|
@ -36,6 +36,7 @@ or edit "accessor.class" and rerun ./make_class.pl
|
||||||
|
|
||||||
static int pack_string(grib_accessor*, const char*, size_t* len);
|
static int pack_string(grib_accessor*, const char*, size_t* len);
|
||||||
static int unpack_string(grib_accessor*, char*, size_t* len);
|
static int unpack_string(grib_accessor*, char*, size_t* len);
|
||||||
|
static size_t string_length(grib_accessor*);
|
||||||
static void init(grib_accessor*, const long, grib_arguments*);
|
static void init(grib_accessor*, const long, grib_arguments*);
|
||||||
static void init_class(grib_accessor_class*);
|
static void init_class(grib_accessor_class*);
|
||||||
|
|
||||||
|
@ -63,7 +64,7 @@ static grib_accessor_class _grib_accessor_class_trim = {
|
||||||
0, /* free mem */
|
0, /* free mem */
|
||||||
0, /* describes himself */
|
0, /* describes himself */
|
||||||
0, /* get length of section */
|
0, /* get length of section */
|
||||||
0, /* get length of string */
|
&string_length, /* get length of string */
|
||||||
0, /* get number of values */
|
0, /* get number of values */
|
||||||
0, /* get number of bytes */
|
0, /* get number of bytes */
|
||||||
0, /* get offset to bytes */
|
0, /* get offset to bytes */
|
||||||
|
@ -103,7 +104,6 @@ static void init_class(grib_accessor_class* c)
|
||||||
{
|
{
|
||||||
c->dump = (*(c->super))->dump;
|
c->dump = (*(c->super))->dump;
|
||||||
c->next_offset = (*(c->super))->next_offset;
|
c->next_offset = (*(c->super))->next_offset;
|
||||||
c->string_length = (*(c->super))->string_length;
|
|
||||||
c->value_count = (*(c->super))->value_count;
|
c->value_count = (*(c->super))->value_count;
|
||||||
c->byte_count = (*(c->super))->byte_count;
|
c->byte_count = (*(c->super))->byte_count;
|
||||||
c->byte_offset = (*(c->super))->byte_offset;
|
c->byte_offset = (*(c->super))->byte_offset;
|
||||||
|
@ -193,3 +193,8 @@ static int pack_string(grib_accessor* a, const char* val, size_t* len)
|
||||||
|
|
||||||
return grib_pack_string(inputAccesstor, pBuf, len);
|
return grib_pack_string(inputAccesstor, pBuf, len);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static size_t string_length(grib_accessor* a)
|
||||||
|
{
|
||||||
|
return 1024;
|
||||||
|
}
|
||||||
|
|
|
@ -547,12 +547,13 @@ static void dump_string_array(grib_dumper* d, grib_accessor* a, const char* comm
|
||||||
(void)err; /* TODO */
|
(void)err; /* TODO */
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#define MAX_STRING_SIZE 4096
|
||||||
static void dump_string(grib_dumper* d, grib_accessor* a, const char* comment)
|
static void dump_string(grib_dumper* d, grib_accessor* a, const char* comment)
|
||||||
{
|
{
|
||||||
grib_dumper_bufr_decode_C* self = (grib_dumper_bufr_decode_C*)d;
|
grib_dumper_bufr_decode_C* self = (grib_dumper_bufr_decode_C*)d;
|
||||||
char* value = NULL;
|
char value[MAX_STRING_SIZE] = {0,}; /* See ECC-710 */
|
||||||
|
size_t size = MAX_STRING_SIZE;
|
||||||
char* p = NULL;
|
char* p = NULL;
|
||||||
size_t size = 0;
|
|
||||||
grib_context* c = a->context;
|
grib_context* c = a->context;
|
||||||
int r = 0, err = 0;
|
int r = 0, err = 0;
|
||||||
grib_handle* h = grib_handle_of_accessor(a);
|
grib_handle* h = grib_handle_of_accessor(a);
|
||||||
|
@ -560,16 +561,6 @@ static void dump_string(grib_dumper* d, grib_accessor* a, const char* comment)
|
||||||
if ((a->flags & GRIB_ACCESSOR_FLAG_DUMP) == 0 || (a->flags & GRIB_ACCESSOR_FLAG_READ_ONLY) != 0)
|
if ((a->flags & GRIB_ACCESSOR_FLAG_DUMP) == 0 || (a->flags & GRIB_ACCESSOR_FLAG_READ_ONLY) != 0)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
_grib_get_string_length(a, &size);
|
|
||||||
if (size == 0)
|
|
||||||
return;
|
|
||||||
|
|
||||||
value = (char*)grib_context_malloc_clear(c, size);
|
|
||||||
if (!value) {
|
|
||||||
grib_context_log(c, GRIB_LOG_FATAL, "unable to allocate %d bytes", (int)size);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
self->empty = 0;
|
self->empty = 0;
|
||||||
|
|
||||||
err = grib_unpack_string(a, value, &size);
|
err = grib_unpack_string(a, value, &size);
|
||||||
|
@ -613,7 +604,6 @@ static void dump_string(grib_dumper* d, grib_accessor* a, const char* comment)
|
||||||
depth -= 2;
|
depth -= 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
grib_context_free(c, value);
|
|
||||||
(void)err; /* TODO */
|
(void)err; /* TODO */
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -460,31 +460,21 @@ static void dump_string_array(grib_dumper* d, grib_accessor* a, const char* comm
|
||||||
(void)err; /* TODO */
|
(void)err; /* TODO */
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#define MAX_STRING_SIZE 4096
|
||||||
static void dump_string(grib_dumper* d, grib_accessor* a, const char* comment)
|
static void dump_string(grib_dumper* d, grib_accessor* a, const char* comment)
|
||||||
{
|
{
|
||||||
grib_dumper_bufr_decode_filter* self = (grib_dumper_bufr_decode_filter*)d;
|
grib_dumper_bufr_decode_filter* self = (grib_dumper_bufr_decode_filter*)d;
|
||||||
char* value = NULL;
|
char value[MAX_STRING_SIZE] = {0,}; /* See ECC-710 */
|
||||||
char* p = NULL;
|
size_t size = MAX_STRING_SIZE;
|
||||||
size_t size = 0;
|
char* p = NULL;
|
||||||
grib_context* c = a->context;
|
grib_context* c = a->context;
|
||||||
int r =0, err = 0;
|
int r =0, err = 0;
|
||||||
grib_handle* h = grib_handle_of_accessor(a);
|
grib_handle* h = grib_handle_of_accessor(a);
|
||||||
|
|
||||||
if ((a->flags & GRIB_ACCESSOR_FLAG_DUMP) == 0 || (a->flags & GRIB_ACCESSOR_FLAG_READ_ONLY) != 0)
|
if ((a->flags & GRIB_ACCESSOR_FLAG_DUMP) == 0 || (a->flags & GRIB_ACCESSOR_FLAG_READ_ONLY) != 0)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
_grib_get_string_length(a, &size);
|
self->begin = 0;
|
||||||
if (size == 0)
|
|
||||||
return;
|
|
||||||
|
|
||||||
value = (char*)grib_context_malloc_clear(c, size);
|
|
||||||
if (!value) {
|
|
||||||
grib_context_log(c, GRIB_LOG_FATAL, "unable to allocate %d bytes", (int)size);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
else
|
|
||||||
self->begin = 0;
|
|
||||||
|
|
||||||
self->empty = 0;
|
self->empty = 0;
|
||||||
|
|
||||||
|
@ -492,7 +482,6 @@ static void dump_string(grib_dumper* d, grib_accessor* a, const char* comment)
|
||||||
p = value;
|
p = value;
|
||||||
r = compute_bufr_key_rank(h, self->keys, a->name);
|
r = compute_bufr_key_rank(h, self->keys, a->name);
|
||||||
if (grib_is_missing_string(a, (unsigned char*)value, size)) {
|
if (grib_is_missing_string(a, (unsigned char*)value, size)) {
|
||||||
grib_context_free(c, value);
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -528,7 +517,6 @@ static void dump_string(grib_dumper* d, grib_accessor* a, const char* comment)
|
||||||
depth -= 2;
|
depth -= 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
grib_context_free(c, value);
|
|
||||||
(void)err; /* TODO */
|
(void)err; /* TODO */
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -489,29 +489,20 @@ static void dump_string_array(grib_dumper* d, grib_accessor* a, const char* comm
|
||||||
(void)err; /* TODO */
|
(void)err; /* TODO */
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#define MAX_STRING_SIZE 4096
|
||||||
static void dump_string(grib_dumper* d, grib_accessor* a, const char* comment)
|
static void dump_string(grib_dumper* d, grib_accessor* a, const char* comment)
|
||||||
{
|
{
|
||||||
grib_dumper_bufr_decode_fortran* self = (grib_dumper_bufr_decode_fortran*)d;
|
grib_dumper_bufr_decode_fortran* self = (grib_dumper_bufr_decode_fortran*)d;
|
||||||
char* value = NULL;
|
char value[MAX_STRING_SIZE] = {0,}; /* See ECC-710 */
|
||||||
char* p = NULL;
|
size_t size = MAX_STRING_SIZE;
|
||||||
size_t size = 0;
|
char* p = NULL;
|
||||||
grib_context* c = a->context;
|
grib_context* c = a->context;
|
||||||
int r = 0, err = 0;
|
int r = 0, err = 0;
|
||||||
grib_handle* h = grib_handle_of_accessor(a);
|
grib_handle* h = grib_handle_of_accessor(a);
|
||||||
|
|
||||||
if ((a->flags & GRIB_ACCESSOR_FLAG_DUMP) == 0 || (a->flags & GRIB_ACCESSOR_FLAG_READ_ONLY) != 0)
|
if ((a->flags & GRIB_ACCESSOR_FLAG_DUMP) == 0 || (a->flags & GRIB_ACCESSOR_FLAG_READ_ONLY) != 0)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
_grib_get_string_length(a, &size);
|
|
||||||
if (size == 0)
|
|
||||||
return;
|
|
||||||
|
|
||||||
value = (char*)grib_context_malloc_clear(c, size);
|
|
||||||
if (!value) {
|
|
||||||
grib_context_log(c, GRIB_LOG_FATAL, "unable to allocate %d bytes", (int)size);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
self->empty = 0;
|
self->empty = 0;
|
||||||
|
|
||||||
err = grib_unpack_string(a, value, &size);
|
err = grib_unpack_string(a, value, &size);
|
||||||
|
@ -556,7 +547,6 @@ static void dump_string(grib_dumper* d, grib_accessor* a, const char* comment)
|
||||||
depth -= 2;
|
depth -= 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
grib_context_free(c, value);
|
|
||||||
(void)err; /* TODO */
|
(void)err; /* TODO */
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -502,12 +502,13 @@ static void dump_string_array(grib_dumper* d, grib_accessor* a, const char* comm
|
||||||
(void)err; /* TODO */
|
(void)err; /* TODO */
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#define MAX_STRING_SIZE 4096
|
||||||
static void dump_string(grib_dumper* d, grib_accessor* a, const char* comment)
|
static void dump_string(grib_dumper* d, grib_accessor* a, const char* comment)
|
||||||
{
|
{
|
||||||
grib_dumper_bufr_decode_python* self = (grib_dumper_bufr_decode_python*)d;
|
grib_dumper_bufr_decode_python* self = (grib_dumper_bufr_decode_python*)d;
|
||||||
char* value = NULL;
|
char value[MAX_STRING_SIZE] = {0,}; /* See ECC-710 */
|
||||||
char* p = NULL;
|
char* p = NULL;
|
||||||
size_t size = 0;
|
size_t size = MAX_STRING_SIZE;
|
||||||
grib_context* c = a->context;
|
grib_context* c = a->context;
|
||||||
int r = 0, err = 0;
|
int r = 0, err = 0;
|
||||||
grib_handle* h = grib_handle_of_accessor(a);
|
grib_handle* h = grib_handle_of_accessor(a);
|
||||||
|
@ -515,16 +516,6 @@ static void dump_string(grib_dumper* d, grib_accessor* a, const char* comment)
|
||||||
if ((a->flags & GRIB_ACCESSOR_FLAG_DUMP) == 0 || (a->flags & GRIB_ACCESSOR_FLAG_READ_ONLY) != 0)
|
if ((a->flags & GRIB_ACCESSOR_FLAG_DUMP) == 0 || (a->flags & GRIB_ACCESSOR_FLAG_READ_ONLY) != 0)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
_grib_get_string_length(a, &size);
|
|
||||||
if (size == 0)
|
|
||||||
return;
|
|
||||||
|
|
||||||
value = (char*)grib_context_malloc_clear(c, size);
|
|
||||||
if (!value) {
|
|
||||||
grib_context_log(c, GRIB_LOG_FATAL, "unable to allocate %d bytes", (int)size);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
self->empty = 0;
|
self->empty = 0;
|
||||||
|
|
||||||
err = grib_unpack_string(a, value, &size);
|
err = grib_unpack_string(a, value, &size);
|
||||||
|
@ -567,7 +558,6 @@ static void dump_string(grib_dumper* d, grib_accessor* a, const char* comment)
|
||||||
depth -= 2;
|
depth -= 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
grib_context_free(c, value);
|
|
||||||
(void)err; /* TODO */
|
(void)err; /* TODO */
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -628,49 +628,31 @@ static void dump_string_array(grib_dumper* d, grib_accessor* a, const char* comm
|
||||||
(void)err; /* TODO */
|
(void)err; /* TODO */
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#define MAX_STRING_SIZE 4096
|
||||||
static void dump_string(grib_dumper* d, grib_accessor* a, const char* comment)
|
static void dump_string(grib_dumper* d, grib_accessor* a, const char* comment)
|
||||||
{
|
{
|
||||||
grib_dumper_bufr_simple* self = (grib_dumper_bufr_simple*)d;
|
grib_dumper_bufr_simple* self = (grib_dumper_bufr_simple*)d;
|
||||||
char* value = NULL;
|
char value[MAX_STRING_SIZE] = {0,}; /* See ECC-710 */
|
||||||
char* p = NULL;
|
char* p = NULL;
|
||||||
size_t size = 0;
|
size_t size = MAX_STRING_SIZE;
|
||||||
grib_context* c = a->context;
|
grib_context* c = a->context;
|
||||||
int r = 0;
|
int r = 0;
|
||||||
int is_missing = 0;
|
int is_missing = 0;
|
||||||
int err = 0;
|
int err = 0;
|
||||||
grib_handle* h = grib_handle_of_accessor(a);
|
grib_handle* h = grib_handle_of_accessor(a);
|
||||||
const char* acc_name = a->name;
|
const char* acc_name = a->name;
|
||||||
|
|
||||||
_grib_get_string_length(a, &size);
|
if ( strcmp(acc_name,"ident")==0 )
|
||||||
if (size == 0)
|
puts("");
|
||||||
return;
|
|
||||||
|
|
||||||
if ((a->flags & GRIB_ACCESSOR_FLAG_DUMP) == 0 || (a->flags & GRIB_ACCESSOR_FLAG_READ_ONLY) != 0) {
|
if ((a->flags & GRIB_ACCESSOR_FLAG_DUMP) == 0 || (a->flags & GRIB_ACCESSOR_FLAG_READ_ONLY) != 0) {
|
||||||
/* ECC-356: Solution for the special local section key 'keyMore' and its alias 'ident' */
|
|
||||||
int skip = 1;
|
|
||||||
if ((a->flags & GRIB_ACCESSOR_FLAG_HIDDEN) != 0) {
|
|
||||||
/* We've come across a key which is hidden */
|
|
||||||
if (strcmp(a->name, "keyMore") == 0 && grib_is_defined(h, "ls.ident")) {
|
|
||||||
grib_accessor* acc = NULL;
|
|
||||||
skip = 0;
|
|
||||||
acc_name = "ident";
|
|
||||||
acc = grib_find_accessor(h, "identTrimmed");
|
|
||||||
if (acc) a = acc;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (skip)
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
value = (char*)grib_context_malloc_clear(c, size);
|
|
||||||
if (!value) {
|
|
||||||
grib_context_log(c, GRIB_LOG_FATAL, "unable to allocate %d bytes", (int)size);
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
self->empty = 0;
|
self->empty = 0;
|
||||||
|
|
||||||
err = grib_unpack_string(a, value, &size);
|
err = grib_unpack_string(a, value, &size);
|
||||||
|
Assert(size < MAX_STRING_SIZE);
|
||||||
p = value;
|
p = value;
|
||||||
r = compute_bufr_key_rank(h, self->keys, acc_name);
|
r = compute_bufr_key_rank(h, self->keys, acc_name);
|
||||||
if (grib_is_missing_string(a, (unsigned char*)value, size)) {
|
if (grib_is_missing_string(a, (unsigned char*)value, size)) {
|
||||||
|
@ -711,7 +693,6 @@ static void dump_string(grib_dumper* d, grib_accessor* a, const char* comment)
|
||||||
grib_context_free(c, prefix);
|
grib_context_free(c, prefix);
|
||||||
}
|
}
|
||||||
|
|
||||||
grib_context_free(c, value);
|
|
||||||
(void)err; /* TODO */
|
(void)err; /* TODO */
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -450,23 +450,14 @@ static void dump_string(grib_dumper* d, grib_accessor* a, const char* comment)
|
||||||
{
|
{
|
||||||
grib_dumper_json* self = (grib_dumper_json*)d;
|
grib_dumper_json* self = (grib_dumper_json*)d;
|
||||||
char value[MAX_STRING_SIZE] = {0,}; /* See ECC-710 */
|
char value[MAX_STRING_SIZE] = {0,}; /* See ECC-710 */
|
||||||
|
size_t size = MAX_STRING_SIZE;
|
||||||
char* p = NULL;
|
char* p = NULL;
|
||||||
size_t size = MAX_STRING_SIZE;
|
|
||||||
int is_missing = 0;
|
int is_missing = 0;
|
||||||
int err = 0;
|
int err = 0;
|
||||||
const char* acc_name = a->name;
|
const char* acc_name = a->name;
|
||||||
|
|
||||||
if ((a->flags & GRIB_ACCESSOR_FLAG_DUMP) == 0) {
|
if ((a->flags & GRIB_ACCESSOR_FLAG_DUMP) == 0) {
|
||||||
/* ECC-356: Solution for the special local section key 'keyMore' and its alias 'ident' */
|
return;
|
||||||
int skip = 1;
|
|
||||||
if ((a->flags & GRIB_ACCESSOR_FLAG_HIDDEN) != 0) {
|
|
||||||
if (strcmp(a->name, "identTrimmed") == 0) {
|
|
||||||
skip = 0;
|
|
||||||
acc_name = "ident";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (skip)
|
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ECC-710: It is MUCH slower determining the string length here
|
/* ECC-710: It is MUCH slower determining the string length here
|
||||||
|
|
Loading…
Reference in New Issue