44 uint8_t *bufrx = NULL;
52 if ( stat ( filename, &st ) < 0 )
54 snprintf ( b->
error, sizeof ( b->
error ),
"%s(): cannot stat file '%s'\n", __func__, filename );
59 if ( S_ISREG ( st.st_mode ) || S_ISLNK ( st.st_mode ) )
61 if ( ( bufrx = ( uint8_t * ) calloc ( 1, st.st_size + 4 ) ) == NULL )
63 snprintf ( b->
error, sizeof ( b->
error ),
"%s(): cannot alloc memory for file '%s'\n", __func__, filename );
69 snprintf ( b->
error, sizeof ( b->
error ),
"%s(): '%s' is not a regular file nor symbolic link\n", __func__, filename );
74 if ( ( st.st_size + 4 ) >=
BUFR_LEN )
76 snprintf ( b->
error, sizeof ( b->
error ),
"%s(): File '%s' too large. Consider increase BUFR_LEN\n", __func__, filename );
77 free ( (
void * ) bufrx );
82 if ( ( fp = fopen ( filename,
"r" ) ) == NULL )
84 snprintf ( b->
error, sizeof ( b->
error ),
"%s(): cannot open file '%s'\n", __func__, filename );
85 free ( (
void * ) bufrx );
89 while ( ( aux = fgetc ( fp ) ) != EOF && (
int ) n < st.st_size )
90 bufrx[n++] = ( uint8_t ) aux;
123 uint8_t *bufrx = NULL, *pbeg = NULL;
124 buf_t n = 0, beg, end, size = 0;
131 if ( stat ( filename, &st ) < 0 )
133 snprintf ( b->
error, sizeof ( b->
error ),
"%s(): cannot stat file '%s'\n", __func__, filename );
138 if ( S_ISREG ( st.st_mode ) || S_ISLNK ( st.st_mode ) )
140 if ( ( bufrx = ( uint8_t * ) calloc ( 1, st.st_size + 4 ) ) == NULL )
142 snprintf ( b->
error, sizeof ( b->
error ),
"%s(): cannot alloc memory for file '%s'\n", __func__, filename );
148 snprintf ( b->
error, sizeof ( b->
error ),
"%s(): '%s' is not a regular file nor symbolic link\n", __func__, filename );
153 if ( ( st.st_size + 4 ) >=
BUFR_LEN )
155 snprintf ( b->
error, sizeof ( b->
error ),
"%s(): File '%s' too large. Consider increase BUFR_LEN\n", __func__, filename );
156 free ( (
void * ) bufrx );
161 if ( ( fp = fopen ( filename,
"r" ) ) == NULL )
163 snprintf ( b->
error, sizeof ( b->
error ),
"%s(): cannot open file '%s'\n", __func__, filename );
164 free ( (
void * ) bufrx );
168 beg = end = st.st_size;
169 while ( ( aux = fgetc ( fp ) ) != EOF && (
int ) n < st.st_size )
171 bufrx[n++] = ( uint8_t ) aux;
175 bufrx[n - 4] ==
'B' &&
176 bufrx[n - 3] ==
'U' &&
177 bufrx[n - 2] ==
'F' &&
178 bufrx[n - 1] ==
'R' )
181 pbeg = &bufrx[ n - 4];
186 beg < ( (
size_t ) st.st_size - 4 ) &&
187 bufrx[n - 4] ==
'7' &&
188 bufrx[n - 3] ==
'7' &&
189 bufrx[n - 2] ==
'7' &&
190 bufrx[n - 1] ==
'7' )
193 size = end - beg + 1;
203 snprintf ( b->
error, sizeof ( b->
error ),
"%s(): not found a '7777' item after 'BUFR'\n", __func__ );
235 snprintf ( b->
error, sizeof ( b->
error ),
"%s(): Buffer provided too large. Consider increase BUFR_LEN\n", __func__ );
241 snprintf ( b->
error, sizeof ( b->
error ),
"%s(): Too few bytes for a bufr\n", __func__ );
246 if ( bufrx[0] !=
'B' || bufrx[1] !=
'U' || bufrx[2] !=
'F' || bufrx[3] !=
'R' )
248 snprintf ( b->
error, sizeof ( b->
error ),
"%s(): bufr file does not begin with 'BUFR' chars\n", __func__ );
253 if ( bufrx[size - 4] !=
'7' || bufrx[size - 3] !=
'7' || bufrx[size - 2] !=
'7' || bufrx[size - 1] !=
'7' )
255 snprintf ( b->
error, sizeof ( b->
error ),
"%s(): bufe file does not end with '7777' chars\n", __func__ );
268 snprintf ( b->
error, sizeof ( b->
error ),
"%s(): bufr file have %u bytes and it says %u\n", __func__,
278 snprintf ( b->
error, sizeof ( b->
error ),
"%s(): Bufr edition must be 3 or superior and this file is coded with version %u\n", __func__, b->
sec0.
edition );
283 memcpy ( &b->
sec0.
raw[0], &bufrx[0], 8 );
334 snprintf ( b->
error, sizeof ( b->
error ),
"%s(): This file is coded with version %u and is not supported\n", __func__, b->
sec0.
edition );
335 free ( (
void * ) bufrx );
388 bufrdeco_clock_start = clock();
396 bufrdeco_clock_end = clock();
397 print_timing ( bufrdeco_clock_start, bufrdeco_clock_end,bufr_read_tables_wmo() );
Include header file for bufrdeco library.
buf_t bufrdeco_print_json_sec2(FILE *out, struct bufrdeco *b)
Print info form optional sec 2 in json format.
uint32_t buf_t
Type to set offsets and dimension of arrays or counters used in bufrdeco.
uint32_t two_bytes_to_uint32(const uint8_t *source)
returns the uint32_t value from an array of two bytes, most significant first
#define bufrdeco_assert(__my_expr__)
Check a expression and exit if it fails.
uint32_t three_bytes_to_uint32(const uint8_t *source)
returns the uint32_t value from an array of three bytes, most significant first
buf_t bufrdeco_print_json_sec0(FILE *out, struct bufrdeco *b)
#define BUFRDECO_OUTPUT_JSON_SEC2
Bit mask to the member mask of struct bufrdeco to print bufr info for SEC 2 in json format.
int bufr_read_tables(struct bufrdeco *b)
Read the tables according with bufr file data from a bufr table directory.
#define BUFRDECO_OUTPUT_JSON_SEC3
Bit mask to the member mask of struct bufrdeco to print bufr info for SEC 3 in json format.
#define BUFRDECO_OUTPUT_JSON_SEC0
Bit mask to the member mask of struct bufrdeco to print info for SEC 0 in json format.
#define BUFRDECO_OUTPUT_JSON_SEC1
Bit mask to the member mask of struct bufrdeco to print info for SEC 1 in json format.
#define BUFR_LEN_UNEXPANDED_DESCRIPTOR
Max amount of unexpanded descriptors in a SEC3.
buf_t bufrdeco_print_json_sec3(FILE *out, struct bufrdeco *b)
Print info form sec 3 in json format.
#define BUFR_LEN
Max length of a BUFR file.
buf_t bufrdeco_print_json_sec1(FILE *out, struct bufrdeco *b)
Print info form sec 1 in json format.
int two_bytes_to_descriptor(struct bufr_descriptor *d, const uint8_t *source)
set a struct bufr_descriptor from two consecutive bytes in bufr file
int bufrdeco_read_buffer(struct bufrdeco *b, uint8_t *bufrx, buf_t size)
int bufrdeco_extract_bufr(struct bufrdeco *b, char *filename)
Read file and try to find a bufr report inserted in. Once found do the same that bufrdeco_read_file()
int bufrdeco_read_bufr(struct bufrdeco *b, char *filename)
Read bufr file and does preliminary and first decode pass.
uint8_t subcategory_local
uint8_t raw[BUFR_LEN_SEC1]
uint8_t raw[BUFR_LEN_SEC2]
struct bufr_descriptor unexpanded[BUFR_LEN_UNEXPANDED_DESCRIPTOR]
uint8_t raw[BUFR_LEN_SEC3]
This struct contains all needed data to parse and decode a BUFR file.