NCEPLIBS-g2c 2.0.0
Loading...
Searching...
No Matches
g2_gribend.c
Go to the documentation of this file.
1
6#include "grib2_int.h"
7#include <stdio.h>
8
40g2_gribend(unsigned char *cgrib)
41{
42 g2int iofst, lencurr, len, ilen, isecnum;
43 g2int lengrib;
44 unsigned char seven = 0x37; /* '7' */
45 int ret;
46
47 /* Check for GRIB header and terminator. Translate the error codes
48 * to the legacy G2 error codes. */
49 if ((ret = g2c_check_msg(cgrib, &lencurr, 1)))
50 {
51 if (ret == G2C_ENOTGRIB)
52 return G2_ADD_MSG_INIT;
53 if (ret == G2C_EMSGCOMPLETE)
55 }
56
57 /* Loop through all current sections of the GRIB message to find
58 * the last section number. */
59 len = 16; /* Length of Section 0. */
60 for (;;)
61 {
62 /* Get number and length of next section. */
63 iofst = len * 8;
64 gbit(cgrib, &ilen, iofst, 32);
65 iofst = iofst + 32;
66 gbit(cgrib, &isecnum, iofst, 8);
67 len = len + ilen;
68
69 /* Exit loop if last section reached. */
70 if (len == lencurr)
71 break;
72
73 /* If byte count for each section doesn't match current
74 * total length, then there is a problem. */
75 if (len > lencurr)
76 {
77 printf("g2_gribend: Section byte counts don''t add to total.\n");
78 printf("g2_gribend: Sum of section byte counts = %d\n", (int)len);
79 printf("g2_gribend: Total byte count in Section 0 = %d\n", (int)lencurr);
80 return G2_BAD_SEC_COUNTS;
81 }
82 }
83
84 /* Can only add End Section (Section 8) after Section 7. */
85 if (isecnum != 7)
86 {
87 printf("g2_gribend: Section 8 can only be added after Section 7.\n");
88 printf("g2_gribend: Section %ld was the last found in given GRIB message.\n", isecnum);
89 return G2_BAD_SEC;
90 }
91
92 /* Add Section 8 - End Section */
93 cgrib[lencurr] = seven;
94 cgrib[lencurr + 1] = seven;
95 cgrib[lencurr + 2] = seven;
96 cgrib[lencurr + 3] = seven;
97
98 /* Update current byte total of message in Section 0. */
99 lengrib = lencurr + 4;
100 sbit(cgrib, &lengrib, 96, 32);
101
102 /* Return the length of the message. */
103 return lengrib;
104}
g2int g2_gribend(unsigned char *cgrib)
Finalize a GRIB2 message after all grids and fields have been added.
Definition g2_gribend.c:40
void gbit(unsigned char *in, g2int *iout, g2int iskip, g2int nbits)
Get arbitrary size values from a packed bit string, right justifying each value in the unpacked iout ...
Definition gbits.c:20
void sbit(unsigned char *out, g2int *in, g2int iskip, g2int nbits)
Store arbitrary size values into a packed bit string, taking the low order bits from each value in th...
Definition gbits.c:38
#define G2_BAD_SEC_COUNTS
Sum of Section byte counts doesn't add to total byte count.
Definition grib2.h:460
#define G2_BAD_SEC
Previous Section was unexpected.
Definition grib2.h:448
#define G2_ADD_MSG_COMPLETE
GRIB message already complete.
Definition grib2.h:459
#define G2_ADD_MSG_INIT
GRIB message was not initialized - call g2_create() first.
Definition grib2.h:458
#define G2C_ENOTGRIB
GRIB header not found.
Definition grib2.h:478
#define G2C_EMSGCOMPLETE
GRIB message already complete.
Definition grib2.h:479
int64_t g2int
Long integer type.
Definition grib2.h:32
Header file with internal function prototypes NCEPLIBS-g2c library.
int g2c_check_msg(unsigned char *cgrib, g2int *lencurr, int verbose)
Check for 'GRIB' at the beginning of a GRIB message, and check to see if the message is already termi...
Definition util.c:26