NCEPLIBS-g2c  1.8.0
g2cfile.c File Reference

File functions for the g2c library. More...

#include "grib2_int.h"

Go to the source code of this file.

Macros

#define BYTES_TO_DISCIPLINE   6
 Number of bytes to discipline field in GRIB2 message. More...
 
#define G2C_SEEKMSG_BUFSIZE   4092
 Size of buffer used in g2c_seekmsg(). More...
 
#define MIN(a, b)   ((a) < (b) ? (a) : (b))
 Find a minimum. More...
 
#define READ_BUF_SIZE   4092
 Default size of read-buffer. More...
 

Functions

int add_msg (G2C_FILE_INFO_T *file, int msg_num, size_t bytes_to_msg, size_t bytes_in_msg, int read_file, G2C_MESSAGE_INFO_T **msg)
 Add new message to linked list. More...
 
int add_section (FILE *f, G2C_MESSAGE_INFO_T *msg, int sec_id, unsigned int sec_len, size_t bytes_to_sec, unsigned char sec_num)
 Add metadata about a new section 3, 4, 5, 6, or 7. More...
 
static int determine_dims (G2C_SECTION_INFO_T *sec)
 Determine the dimension information from the section 3 metadata. More...
 
static int find_available_g2cid (int *g2cid)
 Find a g2cid to use for a newly opened or created file. More...
 
static int free_metadata (int g2cid)
 Free resources holding the file metadata. More...
 
int g2c_add_file (const char *path, int mode, int *g2cid)
 Open a GRIB2 file and add it to the list of open files. More...
 
int g2c_close (int g2cid)
 Close a GRIB2 file, freeing resources. More...
 
int g2c_find_msg2 (int g2cid, size_t skip_bytes, size_t max_bytes, size_t *bytes_to_msg, size_t *bytes_in_msg)
 Search a file for the next GRIB1 or GRIB2 message. More...
 
int g2c_get_msg (int g2cid, size_t skip_bytes, size_t max_bytes, size_t *bytes_to_msg, size_t *bytes_in_msg, unsigned char **cbuf)
 Search a file for the next GRIB1 or GRIB2 message, and read it, allocating space in memory to hold the message. More...
 
int g2c_open (const char *path, int mode, int *g2cid)
 Open an existing GRIB2 file. More...
 
int g2c_rw_section1_metadata (FILE *f, int rw_flag, G2C_MESSAGE_INFO_T *msg)
 Read Section 1. More...
 
int g2c_rw_section3_metadata (FILE *f, int rw_flag, G2C_SECTION_INFO_T *sec)
 Read the metadata from section 3 (Grid Definition Section) of a GRIB2 message. More...
 
int g2c_rw_section4_metadata (FILE *f, int rw_flag, G2C_SECTION_INFO_T *sec)
 Read or write the metadata from section 4 (Product Definition Section) of a GRIB2 message. More...
 
int g2c_rw_section5_metadata (FILE *f, int rw_flag, G2C_SECTION_INFO_T *sec)
 Read or write the metadata from section 5 (Data Representation Section) of a GRIB2 message. More...
 
int g2c_rw_section6_metadata (FILE *f, int rw_flag, G2C_SECTION_INFO_T *sec)
 Read or write the metadata from section 6 (Data Representation Section) of a GRIB2 message. More...
 
int g2c_seekmsg (int g2cid, size_t skip, size_t *offset, size_t *msglen)
 Search a file for the next GRIB2 Message. More...
 
 MUTEX (m)
 Define mutex for thread-safety. More...
 
static int read_metadata (int g2cid)
 Read metadata from a GRIB2 file being opened with g2c_open(). More...
 
static int read_msg_metadata (G2C_MESSAGE_INFO_T *msg)
 Read the file to get metadata about a message. More...
 

Variables

G2C_FILE_INFO_T g2c_file [G2C_MAX_FILES+1]
 Global file information. More...
 
int g2c_next_g2cid = 1
 Next g2cid file ID - used when opening or creating a file. More...
 

Detailed Description

File functions for the g2c library.

Author
Ed Hartnett
Date
Aug 16, 2022

Definition in file g2cfile.c.

Macro Definition Documentation

◆ BYTES_TO_DISCIPLINE

#define BYTES_TO_DISCIPLINE   6

Number of bytes to discipline field in GRIB2 message.

Definition at line 22 of file g2cfile.c.

◆ G2C_SEEKMSG_BUFSIZE

#define G2C_SEEKMSG_BUFSIZE   4092

Size of buffer used in g2c_seekmsg().

Definition at line 27 of file g2cfile.c.

◆ MIN

#define MIN (   a,
 
)    ((a) < (b) ? (a) : (b))

Find a minimum.

Definition at line 16 of file g2cfile.c.

◆ READ_BUF_SIZE

#define READ_BUF_SIZE   4092

Default size of read-buffer.

Definition at line 19 of file g2cfile.c.

Function Documentation

◆ add_msg()

int add_msg ( G2C_FILE_INFO_T file,
int  msg_num,
size_t  bytes_to_msg,
size_t  bytes_in_msg,
int  read_file,
G2C_MESSAGE_INFO_T **  msg 
)

Add new message to linked list.

Parameters
filePointer to the G2C_FILE_INFO_T for this file.
msg_numNumber of the message in file (0-based).
bytes_to_msgNumber of bytes to the start of the message in the file.
bytes_in_msgLength of message in bytes.
read_fileSet to true to cause metadata to be read from a GRIB2 data file.
msgPointer to a pointer that will get the location of the newly created G2C_MESSAGE_INFO_T object. Ignored if NULL.
Returns
Author
Ed Hartnett
Date
Sep 12, 2022

Definition at line 1020 of file g2cfile.c.

References g2c_message_info::bytes_in_msg, g2c_message_info::bytes_to_msg, g2c_message_info::file, G2C_ENOMEM, G2C_NOERROR, LOG, g2c_file_info::msg, g2c_message_info::msg_num, g2c_message_info::next, g2c_file_info::num_messages, and read_msg_metadata().

Referenced by g2c_open_index(), and read_metadata().

◆ add_section()

int add_section ( FILE *  f,
G2C_MESSAGE_INFO_T msg,
int  sec_id,
unsigned int  sec_len,
size_t  bytes_to_sec,
unsigned char  sec_num 
)

Add metadata about a new section 3, 4, 5, 6, or 7.

Parameters
fFILE pointer to open GRIB2 file.
msgPointer to the G2C_MESSAGE_INFO_T struct.
sec_id0-based section ID.
sec_lenLength of section.
bytes_to_secNumber of bytes from start of message to this section.
sec_numSection number.
Returns
Author
Ed Hartnett
Date
Sep 12, 2022

Definition at line 797 of file g2cfile.c.

References g2c_section_info::bytes_to_sec, G2C_EBADSECTION, G2C_ENOMEM, G2C_FILE_READ, G2C_NOERROR, g2c_rw_section3_metadata(), g2c_rw_section4_metadata(), g2c_rw_section5_metadata(), g2c_rw_section6_metadata(), LOG, g2c_section_info::msg, g2c_section_info::next, g2c_message_info::num_local, g2c_section_info::prev, g2c_message_info::sec, g2c_section_info::sec_id, g2c_section_info::sec_len, and g2c_section_info::sec_num.

Referenced by g2c_open_index(), and read_msg_metadata().

◆ determine_dims()

static int determine_dims ( G2C_SECTION_INFO_T sec)
static

Determine the dimension information from the section 3 metadata.

See (GRIB2 - SECTION 3 GRID DEFINITION SECTION)[https://www.nco.ncep.noaa.gov/pmb/docs/grib2/grib2_doc/grib2_sect3.shtml].

For a list of grid definitions see [GRIB2 - TABLE 3.1 Grid Definition Template Number](https://www.nco.ncep.noaa.gov/pmb/docs/grib2/grib2_doc/grib2_table3-1.shtml).

Parameters
secG2C_SECTION3_INFO_T struct.
Returns
Author
Ed Hartnett
Date
Sep 15, 2022

Definition at line 418 of file g2cfile.c.

References g2c_section3_info::dim, G2C_ENOMEM, G2C_MAX_NAME, G2C_NOERROR, g2c_section3_info::grid_def, LATITUDE, g2c_dim_info::len, LOG, LONGITUDE, g2c_dim_info::name, g2c_section_info::sec_info, g2c_section_info::template, and g2c_dim_info::value.

Referenced by g2c_rw_section3_metadata().

◆ find_available_g2cid()

static int find_available_g2cid ( int *  g2cid)
static

Find a g2cid to use for a newly opened or created file.

Parameters
g2cidPointer that gets the next available g2cid.
Returns
Author
Ed Hartnett 8/18/22

Definition at line 365 of file g2cfile.c.

References G2C_EINVAL, G2C_ETOOMANYFILES, g2c_file, G2C_MAX_FILES, g2c_next_g2cid, and G2C_NOERROR.

Referenced by g2c_add_file().

◆ free_metadata()

static int free_metadata ( int  g2cid)
static

Free resources holding the file metadata.

Parameters
g2cidIndentifier for the file.
Returns
Author
Ed Hartnett
Date
Aug 16, 2022

Definition at line 1294 of file g2cfile.c.

References G2C_EBADID, g2c_file, G2C_MAX_FILES, G2C_NOERROR, LOG, g2c_file_info::msg, g2c_message_info::next, g2c_section_info::next, g2c_message_info::sec, g2c_section_info::sec_info, g2c_section_info::sec_num, and g2c_section_info::template.

Referenced by g2c_close().

◆ g2c_add_file()

int g2c_add_file ( const char *  path,
int  mode,
int *  g2cid 
)

Open a GRIB2 file and add it to the list of open files.

Parameters
pathPath of the file.
modeOpen mode flags.
g2cidPointer that gets an indentifier for the file.
Returns
Author
Ed Hartnett
Date
Aug 16, 2022

Definition at line 1146 of file g2cfile.c.

References find_available_g2cid(), G2C_EFILE, G2C_EINVAL, G2C_ENAMETOOLONG, g2c_file, G2C_MAX_NAME, G2C_NOERROR, G2C_WRITE, g2c_file_info::g2cid, LOG, g2c_file_info::msg, and g2c_file_info::num_messages.

Referenced by g2c_open(), and g2c_open_index().

◆ g2c_close()

int g2c_close ( int  g2cid)

Close a GRIB2 file, freeing resources.

Parameters
g2cidIndentifier for the file.
Returns
Author
Ed Hartnett
Date
Aug 16, 2022

Definition at line 1357 of file g2cfile.c.

References g2c_file_info::f, free_metadata(), G2C_EBADID, G2C_EFILE, g2c_file, G2C_MAX_FILES, G2C_NOERROR, g2c_file_info::g2cid, LOG, MUTEX_LOCK, MUTEX_UNLOCK, g2c_file_info::num_messages, and g2c_file_info::path.

Referenced by main().

◆ g2c_find_msg2()

int g2c_find_msg2 ( int  g2cid,
size_t  skip_bytes,
size_t  max_bytes,
size_t *  bytes_to_msg,
size_t *  bytes_in_msg 
)

Search a file for the next GRIB1 or GRIB2 message.

A grib message is identified by its indicator section, i.e. an 8-byte sequence with 'GRIB' in bytes 1-4 and a '1' or '2' in byte 8. If found, the length of the message is decoded from bytes 5-7. The search is done over a given section of the file. The search is terminated if an eof or i/o error is encountered.

Parameters
g2cidID of the opened grib file, returned by g2c_open().
skip_bytesNumber of bytes to skip before search.
max_bytesMaximum number of bytes to search.
bytes_to_msgPointer that gets the number of bytes to skip before message.
bytes_in_msgPointer that gets the number of bytes in message (or 0 if no message found)
Returns
Author
Ed Hartnett
Date
2022-08-19

Definition at line 164 of file g2cfile.c.

References G2C_EBADID, G2C_EFILE, G2C_EINVAL, G2C_EMSG, G2C_ENOMEM, G2C_ERROR, g2c_file, G2C_MAGIC_HEADER_LEN, G2C_NOERROR, LOG, MIN, and READ_BUF_SIZE.

◆ g2c_get_msg()

int g2c_get_msg ( int  g2cid,
size_t  skip_bytes,
size_t  max_bytes,
size_t *  bytes_to_msg,
size_t *  bytes_in_msg,
unsigned char **  cbuf 
)

Search a file for the next GRIB1 or GRIB2 message, and read it, allocating space in memory to hold the message.

A grib message is identified by its indicator section, i.e. an 8-byte sequence with 'GRIB' in bytes 1-4 and a '1' or '2' in byte 8. If found, the length of the message is decoded from bytes 5-7. The search is done over a given section of the file. The search is terminated if an EOF or I/O error is encountered.

Parameters
g2cidID of the opened grib file, returned by g2c_open().
skip_bytesThe number of bytes to skip before search.
max_bytesThe maximum number of bytes to search. Must be at least 16.
bytes_to_msgA pointer that gets the number of bytes to skip before message.
bytes_in_msgA pointer that gets the number of bytes in message (or 0 if no message found)
cbufA pointer that gets allocation of memory, into which the message is copied. This memory must be freed by the caller.
Returns
Author
Ed Hartnett
Date
2022-08-20

Definition at line 293 of file g2cfile.c.

References G2C_EBADID, G2C_EFILE, G2C_EINVAL, G2C_ENOMEM, G2C_ENOMSG, G2C_ERROR, g2c_file, G2C_MIN_MAX_BYTES, G2C_NOERROR, LOG, and seekgb().

◆ g2c_open()

int g2c_open ( const char *  path,
int  mode,
int *  g2cid 
)

Open an existing GRIB2 file.

Parameters
pathPath of the file.
modeOpen mode flags.
g2cidPointer that gets an indentifier for the file.
Returns
Author
Ed Hartnett
Date
Aug 16, 2022

Definition at line 1193 of file g2cfile.c.

References g2c_add_file(), MUTEX_LOCK, MUTEX_UNLOCK, and read_metadata().

Referenced by main().

◆ g2c_rw_section1_metadata()

int g2c_rw_section1_metadata ( FILE *  f,
int  rw_flag,
G2C_MESSAGE_INFO_T msg 
)

Read Section 1.

Parameters
fPointer to open file.
rw_flagG2C_FILE_WRITE if function should write, G2C_FILE_READ if it should read.
msgPointer to G2C_MESSAGE_INFO_T which will be populated with the values of section 0.
Returns
-G2C_NOERROR No error.
Author
Ed Hartnett
Date
10/16/22

Definition at line 877 of file g2cfile.c.

References g2c_message_info::center, g2c_message_info::day, G2C_ENOSECTION, g2c_file_io_short(), g2c_file_io_ubyte(), g2c_file_io_uint(), G2C_NOERROR, G2C_SECTION1_BYTES, g2c_message_info::hour, g2c_message_info::local_version, LOG, g2c_message_info::master_version, g2c_message_info::minute, g2c_message_info::month, g2c_message_info::sec1_len, g2c_message_info::second, g2c_message_info::sig_ref_time, g2c_message_info::status, g2c_message_info::subcenter, g2c_message_info::type, and g2c_message_info::year.

Referenced by g2c_open_index(), g2c_write_index(), and read_msg_metadata().

◆ g2c_rw_section3_metadata()

int g2c_rw_section3_metadata ( FILE *  f,
int  rw_flag,
G2C_SECTION_INFO_T sec 
)

Read the metadata from section 3 (Grid Definition Section) of a GRIB2 message.

When this function is called, the file cursor is positioned just after the section number field in the section. The size of the section, and the section number, have already been read when this function is called.

Parameters
fFILE pointer to open GRIB2 file.
rw_flagG2C_FILE_WRITE if function should write, G2C_FILE_READ (0) if it should read.
secPointer to the G2C_SECTION_INFO_T struct.
Returns
Author
Ed Hartnett
Date
Sep 15, 2022

Definition at line 481 of file g2cfile.c.

References determine_dims(), G2C_EINVAL, G2C_ENOMEM, g2c_file_io_template(), g2c_file_io_ubyte(), g2c_file_io_uint(), g2c_file_io_ushort(), g2c_get_grid_template(), G2C_MAX_GDS_TEMPLATE_MAPLEN, G2C_NOERROR, g2c_section3_info::grid_def, g2c_section3_info::interp_list, LOG, g2c_section3_info::num_data_points, g2c_section3_info::num_opt, g2c_section_info::sec_info, g2c_section_info::sec_num, g2c_section3_info::source_grid_def, g2c_section_info::template, and g2c_section_info::template_len.

Referenced by add_section(), and g2c_write_index().

◆ g2c_rw_section4_metadata()

int g2c_rw_section4_metadata ( FILE *  f,
int  rw_flag,
G2C_SECTION_INFO_T sec 
)

Read or write the metadata from section 4 (Product Definition Section) of a GRIB2 message.

When this function is called, the file cursor is positioned just after the section number field in the section. The size of the section, and the section number, have already been read/written when this function is called.

Parameters
fFILE pointer to open GRIB2 file.
rw_flagG2C_FILE_WRITE if function should write, G2C_FILE_READ if it should read.
secPointer to the G2C_SECTION_INFO_T struct.
Returns
Author
Ed Hartnett
Date
Sep 16, 2022

Definition at line 577 of file g2cfile.c.

References G2C_EINVAL, G2C_ENOMEM, g2c_file_io_template(), g2c_file_io_ushort(), g2c_get_pds_template(), G2C_MAX_PDS_TEMPLATE_MAPLEN, G2C_NOERROR, LOG, g2c_section_info::msg, g2c_section4_info::num_coord, g2c_message_info::num_fields, g2c_section4_info::prod_def, g2c_section_info::sec_info, g2c_section_info::sec_num, g2c_section_info::template, and g2c_section_info::template_len.

Referenced by add_section(), and g2c_write_index().

◆ g2c_rw_section5_metadata()

int g2c_rw_section5_metadata ( FILE *  f,
int  rw_flag,
G2C_SECTION_INFO_T sec 
)

Read or write the metadata from section 5 (Data Representation Section) of a GRIB2 message.

When this function is called, the file cursor is positioned just after the section number field in the section. The size of the section, and the section number, have already been read when this function is called.

Parameters
fFILE pointer to open GRIB2 file.
rw_flagG2C_FILE_WRITE if function should write, G2C_FILE_READ if it should read.
secPointer to the G2C_SECTION_INFO_T struct.
Returns
Author
Ed Hartnett
Date
Sep 16, 2022

Definition at line 666 of file g2cfile.c.

References g2c_section5_info::data_def, G2C_EINVAL, G2C_ENOMEM, g2c_file_io_template(), g2c_file_io_uint(), g2c_file_io_ushort(), g2c_get_drs_template(), G2C_MAX_PDS_TEMPLATE_MAPLEN, G2C_NOERROR, LOG, g2c_section5_info::num_data_points, g2c_section_info::sec_info, g2c_section_info::template, and g2c_section_info::template_len.

Referenced by add_section(), and g2c_write_index().

◆ g2c_rw_section6_metadata()

int g2c_rw_section6_metadata ( FILE *  f,
int  rw_flag,
G2C_SECTION_INFO_T sec 
)

Read or write the metadata from section 6 (Data Representation Section) of a GRIB2 message.

When this function is called, the file cursor is positioned just after the section number field in the section. The size of the section, and the section number, have already been read when this function is called.

Parameters
fFILE pointer to open GRIB2 file.
rw_flagG2C_FILE_WRITE if function should write, G2C_FILE_READ if it should read.
secPointer to the G2C_SECTION_INFO_T struct.
Returns
Author
Ed Hartnett
Date
Sep 16, 2022

Definition at line 748 of file g2cfile.c.

References G2C_EINVAL, G2C_ENOMEM, g2c_file_io_ubyte(), G2C_NOERROR, g2c_section6_info::indicator, LOG, and g2c_section_info::sec_info.

Referenced by add_section().

◆ g2c_seekmsg()

int g2c_seekmsg ( int  g2cid,
size_t  skip,
size_t *  offset,
size_t *  msglen 
)

Search a file for the next GRIB2 Message.

The search is terminated when a GRIB2 message is found, or the end of the file is reached.

Parameters
g2cidID of an open GRIB2 file, returned from g2c_open()/g2c_create().
skipThe number of bytes in the file to skip before starting the search.
offsetPointer that gets the number of bytes to skip from the beggining of the file to where the GRIB message starts. Ignored if NULL.
msglenPointer that gets the number of bytes in message (set to 0, if no message found). Ignored if NULL.
Returns
Author
Ed Hartnett
Date
2022-09-11

Definition at line 56 of file g2cfile.c.

References G2C_EBADID, G2C_EFILE, G2C_ENOMEM, g2c_file, G2C_MAGIC_HEADER, G2C_NOERROR, G2C_SEEKMSG_BUFSIZE, hton64, and LOG.

Referenced by read_metadata().

◆ MUTEX()

MUTEX ( )

Define mutex for thread-safety.

◆ read_metadata()

static int read_metadata ( int  g2cid)
static

Read metadata from a GRIB2 file being opened with g2c_open().

Parameters
g2cidThe indentifier for the file.
Returns
Author
Ed Hartnett
Date
Aug 22, 2022

Definition at line 1082 of file g2cfile.c.

References add_msg(), G2C_EBADID, G2C_ENOMSG, g2c_file, g2c_log_file(), G2C_NOERROR, g2c_seekmsg(), and LOG.

Referenced by g2c_open().

◆ read_msg_metadata()

static int read_msg_metadata ( G2C_MESSAGE_INFO_T msg)
static

Read the file to get metadata about a message.

Parameters
msgPointer to the G2C_MESSAGE_INFO_T struct for this message.
Returns
Author
Ed Hartnett
Date
Sep 12, 2022

Definition at line 940 of file g2cfile.c.

References add_section(), BYTES_TO_DISCIPLINE, g2c_message_info::bytes_to_msg, g2c_message_info::discipline, g2c_file_info::f, g2c_message_info::file, FOUR_BYTES, G2C_EBADSECTION, G2C_EFILE, g2c_file_io_ubyte(), g2c_file_io_uint(), G2C_FILE_READ, G2C_NOERROR, g2c_rw_section1_metadata(), G2C_SECTION0_BYTES, LOG, ONE_BYTE, and g2c_message_info::sec1_len.

Referenced by add_msg().

Variable Documentation

◆ g2c_file

◆ g2c_next_g2cid

int g2c_next_g2cid = 1

Next g2cid file ID - used when opening or creating a file.

Definition at line 13 of file g2cfile.c.

Referenced by find_available_g2cid().