NCEPLIBS-g2c 1.9.0
Loading...
Searching...
No Matches
g2_addlocal.c
Go to the documentation of this file.
1
6#include <stdio.h>
7#include "grib2_int.h"
8
41g2_addlocal(unsigned char *cgrib, unsigned char *csec2, g2int lcsec2)
42{
43 static g2int two = 2;
44 g2int j, k, lensec2, iofst, ibeg, lencurr, ilen, len, istart;
45 g2int isecnum;
46 int ret;
47
48 /* Check for GRIB header and terminator. Translate the error codes
49 * to the legacy G2 error codes. */
50 if ((ret = g2c_check_msg(cgrib, &lencurr, 1)))
51 {
52 if (ret == G2C_ENOTGRIB)
53 return G2_ADD_MSG_INIT;
54 if (ret == G2C_EMSGCOMPLETE)
56 }
57
58 /* Loop through all current sections of the GRIB message to find
59 * the last section number. */
60 len = 16; /* length of Section 0 */
61 for (;;)
62 {
63 /* Get section number and length of next section. */
64 iofst = len * 8;
65 gbit(cgrib, &ilen, iofst, 32);
66 iofst = iofst + 32;
67 gbit(cgrib, &isecnum, iofst, 8);
68 len = len + ilen;
69
70 /* Exit loop if last section reached. */
71 if (len == lencurr)
72 break;
73
74 /* If byte count for each section doesn't match current total
75 * length, then there is a problem. */
76 if (len > lencurr)
77 {
78 printf("g2_addlocal: Section byte counts don't add to total.\n");
79 printf("g2_addlocal: Sum of section byte counts = %ld\n", len);
80 printf("g2_addlocal: Total byte count in Section 0 = %ld\n", lencurr);
81 return G2_BAD_SEC_COUNTS;
82 }
83 }
84
85 /* Section 2 can only be added after sections 1 and 7. */
86 if (isecnum != 1 && isecnum != 7)
87 {
88 printf("g2_addlocal: Section 2 can only be added after Section 1 or Section 7.\n");
89 printf("g2_addlocal: Section %ld was the last found in given GRIB message.\n", isecnum);
90 return G2_BAD_SEC;
91 }
92
93 /* Add Section 2 - Local Use Section. */
94 ibeg = lencurr * 8; /* Calculate offset for beginning of section 2 */
95 iofst = ibeg + 32; /* leave space for length of section */
96 sbit(cgrib, &two, iofst, 8); /* Store section number (2) */
97 istart = lencurr + 5;
98 k = 0;
99 for (j = istart; j < istart + lcsec2; j++)
100 cgrib[j] = csec2[k++];
101
102 /* Calculate length of section 2 and store it in octets 1-4 of
103 * section 2. */
104 lensec2 = lcsec2 + 5; /* bytes */
105 sbit(cgrib, &lensec2, ibeg, 32);
106
107 /* Update current byte total of message in Section 0. */
108 lencurr += lensec2;
109 sbit(cgrib, &lencurr, 96, 32);
110
111 return lencurr;
112}
g2int g2_addlocal(unsigned char *cgrib, unsigned char *csec2, g2int lcsec2)
Adds a Local Use Section (Section 2) to a GRIB2 message.
Definition g2_addlocal.c:41
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:475
#define G2_BAD_SEC
Previous Section was unexpected.
Definition grib2.h:463
#define G2_ADD_MSG_COMPLETE
GRIB message already complete.
Definition grib2.h:474
#define G2_ADD_MSG_INIT
GRIB message was not initialized - call g2_create() first.
Definition grib2.h:473
#define G2C_ENOTGRIB
GRIB header not found.
Definition grib2.h:493
#define G2C_EMSGCOMPLETE
GRIB message already complete.
Definition grib2.h:494
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