NCEPLIBS-g2c 1.9.0
Loading...
Searching...
No Matches
util.c
Go to the documentation of this file.
1
7#include "grib2_int.h"
8#include <stdarg.h>
9
25int
26g2c_check_msg(unsigned char *cgrib, g2int *lencurr, int verbose)
27{
28 unsigned char G = 0x47; /* 'G' */
29 unsigned char R = 0x52; /* 'R' */
30 unsigned char I = 0x49; /* 'I' */
31 unsigned char B = 0x42; /* 'B' */
32 unsigned char seven = 0x37; /* '7' */
33
34 assert(cgrib && lencurr);
35
36 /* Check to see if beginning of GRIB message exists. */
37 if (cgrib[0] != G || cgrib[1] != R || cgrib[2] != I || cgrib[3] != B)
38 {
39 if (verbose)
40 printf("GRIB not found in given message. A call to routine g2_create() "
41 "is required to to initialize GRIB messge.\n");
42 return G2C_ENOTGRIB;
43 }
44
45 /* Get current length of GRIB message. */
46 gbit(cgrib, lencurr, 96, 32);
47
48 /* Check to see if GRIB message is already complete. */
49 if (cgrib[*lencurr - 4] == seven && cgrib[*lencurr - 3] == seven &&
50 cgrib[*lencurr - 2] == seven && cgrib[*lencurr - 1] == seven)
51 {
52 if (verbose)
53 printf("GRIB message already complete. Cannot add new section.\n");
54 return G2C_EMSGCOMPLETE;
55 }
56
57 return G2C_NOERROR;
58}
59
60#ifdef LOGGING
61/* This is the severity level of messages which will be logged. Use
62 severity 0 for errors, 1 for important log messages, 2 for less
63 important, etc. */
64int g2_log_level = -1;
65
66/* This function prints out a message, if the severity of
67 * the message is lower than the global g2_log_level. To use it, do
68 * something like this:
69 *
70 * g2_log(0, "this computer will explode in %d seconds", i);
71 *
72 * After the first arg (the severity), use the rest like a normal
73 * printf statement. Output will appear on stderr.
74 *
75 * This function is not included in the build unless NCEPLIBS-g2c was
76 * built with -DLOGGING.
77 *
78 * Ed Hartnett
79 */
80void
81g2_log(int severity, const char *fmt, ...)
82{
83 va_list argp;
84 int t;
85 FILE *f = stderr;
86
87 /* If the severity is greater than the log level, we don't print
88 * this message. */
89 if (severity > g2_log_level)
90 return;
91
92 /* If the severity is zero, this is an error. Otherwise insert that
93 many tabs before the message. */
94 if (!severity)
95 fprintf(f, "ERROR: ");
96 for (t = 0; t < severity; t++)
97 fprintf(f, "\t");
98
99 /* Print out the variable list of args with vprintf. */
100 va_start(argp, fmt);
101 vfprintf(f, fmt, argp);
102 va_end(argp);
103
104 /* Put on a final linefeed. */
105 fprintf(f, "\n");
106 fflush(f);
107}
108#endif /* LOGGING */
109
128int
129g2c_set_log_level(int new_level)
130{
131#ifdef LOGGING
132 /* Remember the new level. */
133 g2_log_level = new_level;
134
135 LOG((1, "log_level changed to %d", g2_log_level));
136#endif
137 return G2C_NOERROR;
138}
139
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
#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
#define G2C_NOERROR
No error.
Definition grib2.h:491
Header file with internal function prototypes NCEPLIBS-g2c library.
#define LOG(e)
Ignore logging to stdout.
Definition grib2_int.h:426
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
int g2c_set_log_level(int new_level)
Use this to set the global log level.
Definition util.c:129