41 if ( lmax == 0 || target == NULL )
43 snprintf ( b->
error, sizeof ( b->
error ),
"%s(): Unspected NULL argument(s)\n", __func__ );
50 used += snprintf ( target + used, lmax - used,
"#### SEC 0 INFO ###\n" );
51 used += snprintf ( target + used, lmax - used,
"Bufr length: %5u\n", b->
sec0.
bufr_length );
52 used += snprintf ( target + used, lmax - used,
"Bufr edition: %5u\n", b->
sec0.
edition );
70 printf (
"%s", caux );
89 if ( lmax == 0 || target == NULL )
91 snprintf ( b->
error, sizeof ( b->
error ),
"%s(): Unspected NULL argument(s)\n", __func__ );
98 used += snprintf ( target + used, lmax - used,
"\n#### SEC 1 INFO ###\n" );
99 used += snprintf ( target + used, lmax - used,
"Sec1 length: %5u\n", b->
sec1.
length );
100 used += snprintf ( target + used, lmax - used,
"Bufr master table: %5u\n", b->
sec1.
master );
101 used += snprintf ( target + used, lmax - used,
"Centre: %5u\n", b->
sec1.
centre );
102 used += snprintf ( target + used, lmax - used,
"Sub-Centre: %5u\n", b->
sec1.
subcentre );
103 used += snprintf ( target + used, lmax - used,
"Update sequence: %5u\n", b->
sec1.
update );
104 used += snprintf ( target + used, lmax - used,
"Options: %5x\n", b->
sec1.
options );
105 used += snprintf ( target + used, lmax - used,
"Category: %5u\n", b->
sec1.
category );
106 used += snprintf ( target + used, lmax - used,
"Subcategory: %5u\n", b->
sec1.
subcategory );
107 used += snprintf ( target + used, lmax - used,
"Sub-category local: %5u\n", b->
sec1.
subcategory_local );
108 used += snprintf ( target + used, lmax - used,
"Master table version: %5u\n", b->
sec1.
master_version );
109 used += snprintf ( target + used, lmax - used,
"Master table local: %5u\n", b->
sec1.
master_local );
110 used += snprintf ( target + used, lmax - used,
"Year: %5u\n", b->
sec1.
year );
111 used += snprintf ( target + used, lmax - used,
"Month: %5u\n", b->
sec1.
month );
112 used += snprintf ( target + used, lmax - used,
"Day: %5u\n", b->
sec1.
day );
113 used += snprintf ( target + used, lmax - used,
"Hour: %5u\n", b->
sec1.
hour );
114 used += snprintf ( target + used, lmax - used,
"Minute: %5u\n", b->
sec1.
minute );
115 used += snprintf ( target + used, lmax - used,
"Second: %5u\n", b->
sec1.
second );
117 used += snprintf ( target + used, lmax - used,
"Aditional space: %5u\n", b->
sec1.
length - 17 );
119 used += snprintf ( target + used, lmax - used,
"Aditional space: %5u\n", b->
sec1.
length - 22 );
122 used += snprintf ( target + used, lmax - used,
"Tables used: '%s'\n", b->
tables->
b.
path );
123 used += snprintf ( target + used, lmax - used,
" '%s'\n", b->
tables->
c.
path );
124 used += snprintf ( target + used, lmax - used,
" '%s'\n", b->
tables->
d.
path );
143 printf (
"%s", caux );
162 if ( lmax == 0 || target == NULL)
164 snprintf ( b->
error, sizeof ( b->
error ),
"%s(): Unspected NULL argument(s)\n", __func__ );
171 used += snprintf ( target + used, lmax - used,
"\n#### SEC 3 INFO ###\n" );
172 used += snprintf ( target + used, lmax - used,
"Sec3 length: %5u\n", b->
sec3.
length );
173 used += snprintf ( target + used, lmax - used,
"Subsets: %5u\n", b->
sec3.
subsets );
174 used += snprintf ( target + used, lmax - used,
"Observed: %5u\n", b->
sec3.
observed );
175 used += snprintf ( target + used, lmax - used,
"Compressed: %5u\n", b->
sec3.
compressed );
176 used += snprintf ( target + used, lmax - used,
"Unexpanded descriptors %5u\n", b->
sec3.
ndesc );
180 used += snprintf ( target + used, lmax - used,
" %3lu: %u %02u %03u\n", i, b->
sec3.
unexpanded[i].
f,
200 printf (
"%s", caux );
219 if ( lmax == 0 || target == NULL )
221 snprintf ( b->
error, sizeof ( b->
error ),
"%s(): Unspected NULL argument(s)\n", __func__ );
228 used += snprintf ( target + used, lmax - used,
"\n#### SEC 4 INFO ###\n" );
229 used += snprintf ( target + used, lmax - used,
"Sec4 length: %5u\n\n", b->
sec4.
length );
247 printf (
"%s", caux );
263 char explanation[256];
276 for ( i = 0; i < l->
ndesc; i++ )
280 for ( j = 0; j < l->
level; j++ )
284 fprintf ( f,
"%u %02u %03u", l->
lseq[i].
f, l->
lseq[i].
x,l->
lseq[i].
y );
286 if ( l->
lseq[i].
f != 3 )
288 if ( l->
lseq[i].
f == 0 )
308 else if ( l->
lseq[i].
f == 2 )
312 else if ( l->
lseq[i].
f == 1 )
314 if ( l->
lseq[i].
y == 0 )
316 if ( l->
lseq[i].
x == 1 )
317 fprintf ( f,
":* Replicator for %d descriptor after next delayed descriptor which set the number of replications.\n", l->
lseq[i].
x );
319 fprintf ( f,
":* Replicator for %d descriptors after next delayed descriptor which set the number of replications.\n", l->
lseq[i].
x );
323 if ( l->
lseq[i].
x == 1 )
324 fprintf ( f,
":* Replicator for next descriptor %d times\n", l->
lseq[i].
y );
326 fprintf ( f,
":* Replicator for next %d descriptors %d times\n", l->
lseq[i].
x, l->
lseq[i].
y );
342 fprintf ( f,
"-> %s\n", l->
sons[i]->
name );
365 fprintf ( f,
"<pre>\n" );
368 fprintf ( f,
"</pre>\n" );
386 printf (
"<pre>\n" );
389 printf (
"</pre>\n" );
409 fprintf ( f,
"%s\n",aux );
437 size_t nlimit, climit;
441 used += snprintf ( target + used, lmax - used,
"%u %02u %03u ", a->
desc.
f, a->
desc.
x, a->
desc.
y );
444 used += snprintf ( target + used, lmax - used,
"%-64s ", aux );
447 used += snprintf ( target + used, lmax - used,
"%-20s", aux );
450 used += snprintf ( target + used, lmax - used,
"%17s",
"MISSING" );
458 used += snprintf ( target + used, lmax - used,
" " );
459 used += snprintf ( target + used, lmax - used,
"%s", aux );
462 || strstr ( a->
unit,
"CODE TABLE" ) == a->
unit
463 || strstr ( a->
unit,
"Code table" ) == a->
unit )
467 used += snprintf ( target + used, lmax - used,
"%17u ", ( uint32_t ) a->
val );
468 used += snprintf ( target + used, lmax - used,
"%s", aux );
474 used += snprintf ( target + used, lmax - used,
" 0x%08X ", ( uint32_t ) a->
val );
475 used += snprintf ( target + used, lmax - used,
"%s", aux );
492 strncpy ( aux, a->
name + nlimit, 64 );
493 used += snprintf ( target + used, lmax - used,
"\n %-64s", aux );
496 strncpy ( aux, a->
ctable + climit, 64 );
497 used += snprintf ( target + used, lmax - used,
" %s", aux );
503 used += snprintf ( target + used, lmax - used,
" *IS BITMAPED BY #%u*", a->
is_bitmaped_by );
506 used += snprintf ( target + used, lmax - used,
" *BITMAP TO #%u*", a->
bitmap_to );
509 used += snprintf ( target + used, lmax - used,
" *RELATED TO #%u*", a->
related_to );
527 for ( i = 0; i < s->
nd ; i++ )
566 if ( r->
cref0[0] ==
'\0' )
568 fprintf ( f,
"bits=%2u, ref=%10d, escale=%3d,", r->
bits, r->
ref, r->
escale );
569 fprintf ( f,
" bit0=%10u, ref0=%10u, inc_bits=%2u ", r->
bit0, r->
ref0, r->
inc_bits );
570 fprintf ( f,
"%s %s\n",r->
name, r->
unit );
605 for ( i = 0; i < r->
nd; i++ )
625 for ( i = 0; i < r->
nd; i++ )
Include header file for bufrdeco library.
uint32_t buf_t
Type to set offsets and dimension of arrays or counters used in bufrdeco.
#define bufrdeco_assert(__my_expr__)
Check a expression and exit if it fails.
#define BUFR_EXPLAINED_LENGTH
Maximum length for a explained descriptor string.
#define strcpy_safe(_target_, _src_)
Macro to make safely a strcpy when we know in calling function the size of string target with sizeof(...
int bufr_find_tableB_index(buf_t *index, struct bufr_tableB *tb, const char *key)
found a descriptor index in a struct bufr_tableB
#define DESCRIPTOR_HAVE_FLAG_TABLE_STRING
Bit mask for a flag table string in a struct bufr_atom_data.
int sprint_sec0_info_html(char *target, size_t lmax, struct bufrdeco *b)
Prints info from sec0 in html format.
int sprint_sec1_info_html(char *target, size_t lmax, struct bufrdeco *b)
Prints info from sec1.
#define BUFRDECO_COMPRESSED_REF_DATA_DESCRIPTOR_BITMASK
Bitmask for struct bufrdeco_compressed_ref which marks a data descriptor.
#define DESCRIPTOR_HAVE_STRING_VALUE
Bit mask for a string in a struct bufr_atom_data.
#define BUFRDECO_OUTPUT_HTML
Bit mask to the member mask for struct bufrdeco to format output as html for SECs 0 to 3.
char * get_formatted_value_from_escale(char *fmt, size_t dim, int32_t escale, double val)
gets a string with formatted value depending of scale
int sprint_sec4_info_html(char *target, size_t lmax, struct bufrdeco *b)
Prints info from sec4.
int is_a_delayed_descriptor(struct bufr_descriptor *d)
check if a descriptor is a delayed descriptor
#define DESCRIPTOR_VALUE_MISSING
Bit mask for a missing value in a struct bufr_atom_data.
int sprint_sec3_info_html(char *target, size_t lmax, struct bufrdeco *b)
Prints info from sec3 formatted as html.
#define BUFR_TABLEB_NAME_LENGTH
Max length (in chars) reserved for a name of variable in table B.
int is_a_short_delayed_descriptor(struct bufr_descriptor *d)
check if a descriptor is a short delayed descriptor
char * bufrdeco_get_f2_descriptor_explanation(char *e, size_t dim, struct bufr_descriptor *d)
#define DESCRIPTOR_HAVE_CODE_TABLE_STRING
Bit mask for a code table string in a struct bufr_atom_data.
int bufrdeco_fprint_subset_sequence_data(FILE *f, struct bufrdeco_subset_sequence_data *s)
int fprint_bufrdeco_compressed_ref(FILE *f, struct bufrdeco_compressed_ref *r)
prints a struct bufrdeco_compressed_ref
int bufrdeco_print_subset_sequence_data(struct bufrdeco_subset_sequence_data *s)
Prints a struct bufrdeco_subset_sequence_data.
int sprint_sec4_info(char *target, size_t lmax, struct bufrdeco *b)
Prints info from sec4.
int sprint_sec3_info(char *target, size_t lmax, struct bufrdeco *b)
Prints info from sec3.
int fprint_bufrdeco_compressed_data_references(FILE *f, struct bufrdeco_compressed_data_references *r)
int print_bufrdeco_compressed_ref(struct bufrdeco_compressed_ref *r)
prints a struct bufrdeco_compressed_ref
int sprint_sec1_info(char *target, size_t lmax, struct bufrdeco *b)
Prints info from sec1.
int print_sec0_info(struct bufrdeco *b)
Prints info from sec0.
int bufrdeco_print_atom_data_stdout(struct bufr_atom_data *a)
print the data in a struct bufr_atom_data to stdout
int print_bufrdeco_compressed_data_references(struct bufrdeco_compressed_data_references *r)
prints a struct bufrdeco_compressed_references
int sprint_sec0_info(char *target, size_t lmax, struct bufrdeco *b)
Prints info from sec0.
int bufrdeco_fprint_tree(FILE *f, struct bufrdeco *b)
Print a tree of descriptors.
int print_sec3_info(struct bufrdeco *b)
Prints info from sec3.
char * bufrdeco_print_atom_data(char *target, size_t lmax, struct bufr_atom_data *a)
print the data in a struct bufr_atom_data to a string
int bufrdeco_print_tree(struct bufrdeco *b)
Print a tree of descriptors.
int print_sec4_info(struct bufrdeco *b)
Prints info from sec3.
int bufrdeco_print_atom_data_file(FILE *f, struct bufr_atom_data *a)
print the data in a struct bufr_atom_data to a file already open by caller
int bufrdeco_fprint_tree_recursive(FILE *f, struct bufrdeco *b, struct bufr_sequence *seq)
Print a tree of descriptors to a file in a recursive way.
int print_sec1_info(struct bufrdeco *b)
Prints info from sec1.
Contains all the information for a single data related with a descriptor in a expanded squence.
char name[BUFR_TABLEB_NAME_LENGTH]
char ctable[BUFR_EXPLAINED_LENGTH]
struct bufr_descriptor desc
char unit[BUFR_TABLEB_UNIT_LENGTH]
char cval[BUFR_CVAL_LENGTH]
struct bufr_sequence * seq
uint8_t subcategory_local
struct bufr_descriptor unexpanded[BUFR_LEN_UNEXPANDED_DESCRIPTOR]
Stores an unexpanded sequence of descriptors.
struct bufr_descriptor lseq[NMAXSEQ_DESCRIPTORS]
uint8_t replicated[NMAXSEQ_DESCRIPTORS]
struct bufr_sequence * sons[NMAXSEQ_DESCRIPTORS]
char name[BUFR_EXPLAINED_LENGTH]
char name[BUFR_TABLEB_NAME_LENGTH]
struct bufr_tableB_decoded_item item[BUFR_MAXLINES_TABLEB]
char path[BUFRDECO_PATH_LENGTH]
char path[BUFRDECO_PATH_LENGTH]
char path[BUFRDECO_PATH_LENGTH]
Manage an array of structs bufrdeco_compressed_ref.
struct bufrdeco_compressed_ref * refs
Struct to hold the needed reference bit offsets, descriptor tree and replications in a compressed BUF...
char unit[BUFR_TABLEB_UNIT_LENGTH]
char name[BUFR_TABLEB_NAME_LENGTH]
struct bufr_descriptor * desc
struct bufr_sequence seq[BUFR_MAX_EXPANDED_SEQUENCES]
Contains all the information for a subset in a expanded squence This is a version to use with bufrdec...
struct bufr_atom_data * sequence
This struct contains all needed data to parse and decode a BUFR file.
struct bufr_tables * tables
struct bufrdeco_expanded_tree * tree