mirror of https://github.com/ecmwf/eccodes.git
Merge branch 'feature/ECC-1137-bufr-fixed-length' into develop
This commit is contained in:
commit
57b2d991dc
|
@ -343,6 +343,8 @@ static int bufr_get_from_table(grib_accessor* a, bufr_descriptor* v)
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
char** list = 0;
|
char** list = 0;
|
||||||
char code[7] = { 0 };
|
char code[7] = { 0 };
|
||||||
|
const size_t maxlen_shortName = sizeof(v->shortName);
|
||||||
|
const size_t maxlen_units = sizeof(v->units);
|
||||||
|
|
||||||
grib_trie* table = load_bufr_elements_table(a, &ret);
|
grib_trie* table = load_bufr_elements_table(a, &ret);
|
||||||
if (ret)
|
if (ret)
|
||||||
|
@ -354,10 +356,12 @@ static int bufr_get_from_table(grib_accessor* a, bufr_descriptor* v)
|
||||||
if (!list)
|
if (!list)
|
||||||
return GRIB_NOT_FOUND;
|
return GRIB_NOT_FOUND;
|
||||||
|
|
||||||
v->shortName = grib_context_strdup(a->context, list[1]);
|
DebugAssert( strlen(list[1]) < maxlen_shortName );
|
||||||
|
strcpy(v->shortName, list[1]);
|
||||||
v->type = convert_type(list[2]);
|
v->type = convert_type(list[2]);
|
||||||
/* v->name=grib_context_strdup(c,list[3]); See ECC-489 */
|
/* v->name=grib_context_strdup(c,list[3]); See ECC-489 */
|
||||||
v->units = grib_context_strdup(a->context, list[4]);
|
DebugAssert( strlen(list[4]) < maxlen_units );
|
||||||
|
strcpy(v->units, list[4]);
|
||||||
|
|
||||||
/* ECC-985: Scale and reference are often 0 so we can reduce calls to atol */
|
/* ECC-985: Scale and reference are often 0 so we can reduce calls to atol */
|
||||||
v->scale = atol_fast(list[5]);
|
v->scale = atol_fast(list[5]);
|
||||||
|
|
|
@ -399,9 +399,9 @@ static void __expand(grib_accessor* a, bufr_descriptors_array* unexpanded, bufr_
|
||||||
bufr_descriptor* au = grib_bufr_descriptor_new(self->tablesAccessor, 999999, err);
|
bufr_descriptor* au = grib_bufr_descriptor_new(self->tablesAccessor, 999999, err);
|
||||||
au->width = ccp->associatedFieldWidth;
|
au->width = ccp->associatedFieldWidth;
|
||||||
grib_bufr_descriptor_set_scale(au, 0);
|
grib_bufr_descriptor_set_scale(au, 0);
|
||||||
au->shortName = grib_context_strdup(c, "associatedField");
|
strcpy(au->shortName, "associatedField");
|
||||||
/* au->name=grib_context_strdup(c,"associated field"); See ECC-489 */
|
/* au->name=grib_context_strdup(c,"associated field"); See ECC-489 */
|
||||||
au->units = grib_context_strdup(c, "associated units");
|
strcpy(au->units, "associated units");
|
||||||
#if MYDEBUG
|
#if MYDEBUG
|
||||||
for (idepth = 0; idepth < global_depth; idepth++)
|
for (idepth = 0; idepth < global_depth; idepth++)
|
||||||
printf("\t");
|
printf("\t");
|
||||||
|
|
|
@ -820,8 +820,8 @@ struct bufr_descriptor
|
||||||
int Y;
|
int Y;
|
||||||
int type;
|
int type;
|
||||||
/*char* name; Not needed: All usage commented out. See ECC-489 */
|
/*char* name; Not needed: All usage commented out. See ECC-489 */
|
||||||
char* shortName;
|
char shortName[128];
|
||||||
char* units;
|
char units[128];
|
||||||
long scale;
|
long scale;
|
||||||
double factor;
|
double factor;
|
||||||
long reference;
|
long reference;
|
||||||
|
|
|
@ -35,8 +35,8 @@ bufr_descriptor* grib_bufr_descriptor_clone(bufr_descriptor* d)
|
||||||
cd->X = d->X;
|
cd->X = d->X;
|
||||||
cd->Y = d->Y;
|
cd->Y = d->Y;
|
||||||
/* cd->name=grib_context_strdup(d->context,d->name); See ECC-489 */
|
/* cd->name=grib_context_strdup(d->context,d->name); See ECC-489 */
|
||||||
cd->shortName = grib_context_strdup(d->context, d->shortName);
|
strcpy(cd->shortName, d->shortName);
|
||||||
cd->units = grib_context_strdup(d->context, d->units);
|
strcpy(cd->units, d->units);
|
||||||
cd->scale = d->scale;
|
cd->scale = d->scale;
|
||||||
cd->factor = d->factor;
|
cd->factor = d->factor;
|
||||||
cd->width = d->width;
|
cd->width = d->width;
|
||||||
|
@ -50,14 +50,11 @@ bufr_descriptor* grib_bufr_descriptor_clone(bufr_descriptor* d)
|
||||||
int grib_bufr_descriptor_set_code(grib_accessor* tables_accessor, int code, bufr_descriptor* v)
|
int grib_bufr_descriptor_set_code(grib_accessor* tables_accessor, int code, bufr_descriptor* v)
|
||||||
{
|
{
|
||||||
int err = 0;
|
int err = 0;
|
||||||
grib_context* c;
|
|
||||||
bufr_descriptor* d;
|
bufr_descriptor* d;
|
||||||
|
|
||||||
if (!v)
|
if (!v)
|
||||||
return GRIB_NULL_POINTER;
|
return GRIB_NULL_POINTER;
|
||||||
|
|
||||||
c = v->context;
|
|
||||||
|
|
||||||
if (v->type == BUFR_DESCRIPTOR_TYPE_REPLICATION || v->type == BUFR_DESCRIPTOR_TYPE_OPERATOR) {
|
if (v->type == BUFR_DESCRIPTOR_TYPE_REPLICATION || v->type == BUFR_DESCRIPTOR_TYPE_OPERATOR) {
|
||||||
v->code = code;
|
v->code = code;
|
||||||
v->F = code / 100000;
|
v->F = code / 100000;
|
||||||
|
@ -74,10 +71,10 @@ int grib_bufr_descriptor_set_code(grib_accessor* tables_accessor, int code, bufr
|
||||||
v->Y = d->Y;
|
v->Y = d->Y;
|
||||||
/* grib_context_free(c,v->name); See ECC-489 */
|
/* grib_context_free(c,v->name); See ECC-489 */
|
||||||
/* v->name=grib_context_strdup(c,d->name); See ECC-489 */
|
/* v->name=grib_context_strdup(c,d->name); See ECC-489 */
|
||||||
grib_context_free(c, v->shortName);
|
|
||||||
v->shortName = grib_context_strdup(c, d->shortName);
|
strcpy(v->shortName,d->shortName);
|
||||||
grib_context_free(c, v->units);
|
strcpy(v->units,d->units);
|
||||||
v->units = grib_context_strdup(c, d->units);
|
|
||||||
v->scale = d->scale;
|
v->scale = d->scale;
|
||||||
v->factor = d->factor;
|
v->factor = d->factor;
|
||||||
v->width = d->width;
|
v->width = d->width;
|
||||||
|
@ -130,7 +127,5 @@ void grib_bufr_descriptor_delete(bufr_descriptor* v)
|
||||||
c = v->context;
|
c = v->context;
|
||||||
|
|
||||||
/* grib_context_free(c,v->name); See ECC-489 */
|
/* grib_context_free(c,v->name); See ECC-489 */
|
||||||
grib_context_free(c, v->shortName);
|
|
||||||
grib_context_free(c, v->units);
|
|
||||||
grib_context_free(c, v);
|
grib_context_free(c, v);
|
||||||
}
|
}
|
||||||
|
|
|
@ -30,6 +30,7 @@ list( APPEND test_bins
|
||||||
bufr_ecc-517
|
bufr_ecc-517
|
||||||
bufr_get_element
|
bufr_get_element
|
||||||
bufr_extract_headers
|
bufr_extract_headers
|
||||||
|
bufr_check_descriptors
|
||||||
grib_sh_ieee64
|
grib_sh_ieee64
|
||||||
ieee
|
ieee
|
||||||
grib_sh_imag
|
grib_sh_imag
|
||||||
|
@ -52,6 +53,7 @@ list(APPEND tests_no_data_reqd
|
||||||
julian
|
julian
|
||||||
grib_dump_samples
|
grib_dump_samples
|
||||||
bufr_dump_samples
|
bufr_dump_samples
|
||||||
|
bufr_check_descriptors
|
||||||
definitions
|
definitions
|
||||||
grib_calendar
|
grib_calendar
|
||||||
grib_md5
|
grib_md5
|
||||||
|
|
|
@ -0,0 +1,59 @@
|
||||||
|
/*
|
||||||
|
* (C) Copyright 2005- 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 <assert.h>
|
||||||
|
#include "grib_api_internal.h"
|
||||||
|
|
||||||
|
int main(int argc, char** argv)
|
||||||
|
{
|
||||||
|
char* filename = NULL;
|
||||||
|
FILE* fp = NULL;
|
||||||
|
char line[1024] = {0,};
|
||||||
|
char** list = NULL;
|
||||||
|
size_t i = 0, line_number = 0;
|
||||||
|
char* str_key = NULL;
|
||||||
|
char* str_units = NULL;
|
||||||
|
bufr_descriptor v = {0,};
|
||||||
|
const size_t maxlen_keyName = sizeof(v.shortName);
|
||||||
|
const size_t maxlen_units = sizeof(v.units);
|
||||||
|
|
||||||
|
Assert(argc == 2);
|
||||||
|
|
||||||
|
filename = argv[1];
|
||||||
|
fp = fopen(filename, "r");
|
||||||
|
Assert(fp);
|
||||||
|
|
||||||
|
while (fgets(line, sizeof(line) - 1, fp)) {
|
||||||
|
++line_number;
|
||||||
|
Assert(strlen(line) > 0);
|
||||||
|
if (line[0] == '#') continue; /* Ignore first line with column titles */
|
||||||
|
list = string_split(line, "|");
|
||||||
|
Assert(list);
|
||||||
|
str_key = list[1];
|
||||||
|
str_units = list[4];
|
||||||
|
if (strlen(str_key) >= maxlen_keyName) {
|
||||||
|
fprintf(stderr, "Error on line %lu: bufr_descriptor key name '%s' exceeds %lu characters.\n",
|
||||||
|
line_number, str_key, maxlen_keyName);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
if (strlen(str_units) >= maxlen_units) {
|
||||||
|
fprintf(stderr, "Error on line %lu: bufr_descriptor units '%s' exceeds %lu characters.\n",
|
||||||
|
line_number, str_units, maxlen_units);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (i = 0; list[i] != NULL; ++i) free(list[i]);
|
||||||
|
free(list);
|
||||||
|
}
|
||||||
|
|
||||||
|
fclose(fp);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
|
@ -0,0 +1,16 @@
|
||||||
|
#!/bin/sh
|
||||||
|
# (C) Copyright 2005- 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.sh
|
||||||
|
|
||||||
|
for file in `find ${ECCODES_DEFINITION_PATH}/bufr/ -name 'element.table' -print`
|
||||||
|
do
|
||||||
|
${test_dir}/bufr_check_descriptors $file
|
||||||
|
done
|
Loading…
Reference in New Issue