File: tst_gbits.c

package info (click to toggle)
g2clib 2.3.0-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 13,524 kB
  • sloc: ansic: 28,287; python: 76; sh: 46; makefile: 26
file content (146 lines) | stat: -rw-r--r-- 5,730 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
/* This is a test for the NCEPLIBS-g2c project. This test is for
 * gbits.c.
 *
 * Ed Hartnett 7/19/21
 */

#include "grib2_int.h"
#include <stdio.h>

int
main()
{

    printf("Testing sbit.\n");
    printf("Testing simple sbit() call...");
    {
        unsigned char out[1] = {0x00};
        g2int in[1] = {0x01};

        sbit(out, in, 0, 8);
        if (out[0] != 1)
            return G2C_ERROR;
    }
    printf("ok!\n");
    printf("Testing sbit() call as used in g2_create() for section 0...");
    {
        unsigned char cgrib[16]; /* Section 0 is 16 bytes long. */
        g2int listsec0[2] = {1, 2};
        g2int zero = 0;

        /* This code matches code in g2_create(). See
         * https://www.nco.ncep.noaa.gov/pmb/docs/grib2/grib2_doc/grib2_sect0.shtml. */
        /* Pack Section 0 - Indicator Section (except for total length of
         * GRIB message). */
        cgrib[0] = 0x47;            /* 'G' */
        cgrib[1] = 0x52;            /* 'R' */
        cgrib[2] = 0x49;            /* 'I' */
        cgrib[3] = 0x42;            /* 'B' */
        sbit(cgrib, &zero, 32, 16); /* reserved for future use */
        if (cgrib[4] != 0 || cgrib[5] != 0)
            return G2C_ERROR;
        sbit(cgrib, &listsec0[0], 48, 8); /* Discipline */
        if (cgrib[6] != 1)
            return G2C_ERROR;
        sbit(cgrib, &listsec0[1], 56, 8); /* GRIB edition number */
        if (cgrib[7] != 2)
            return G2C_ERROR;
    }
    printf("ok!\n");
    printf("Testing sbit() call as used in g2_create() for section 1...");
    {
#define LENSEC0 16
#define MAPSEC1LEN 13                      /**< Length of Map Section 1. */
        unsigned char cgrib[LENSEC0 + 21]; /* Section 1 at least 21 bytes long. */
        unsigned char expected_sec1_cgrib[21] = {0, 0, 0, 21, 1, 0, 7, 0, 4, 24, 0, 0,
                                                 7, 229, 10, 24, 6, 54, 59, 7, 192};
        g2int listsec1[13] = {7, 4, 24, 0, 0, 2021, 10, 24, 6, 54, 59, 7, 192};
        g2int i, lensec1, iofst, ibeg, nbits;
        g2int mapsec1[MAPSEC1LEN] = {2, 2, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1};
        g2int one = 1;

        /* This code matches code in g2_create(). See
         * https://www.nco.ncep.noaa.gov/pmb/docs/grib2/grib2_doc/grib2_sect1.shtml. */
        /* Pack Section 1 - Identification Section. */
        ibeg = LENSEC0 * 8;          /* Calculate offset for beginning of section 1. */
        iofst = ibeg + 32;           /* Leave space for length of section. */
        sbit(cgrib, &one, iofst, 8); /* Store section number (1). */
        iofst = iofst + 8;
        if (cgrib[20] != 1)
            return G2C_ERROR;

        /* Pack up each input value in array listsec1 into the the
         * appropriate number of octets, which are specified in
         * corresponding entries in array mapsec1. */
        for (i = 0; i < MAPSEC1LEN; i++)
        {
            nbits = mapsec1[i] * 8;
            sbit(cgrib, listsec1 + i, iofst, nbits);
            iofst = iofst + nbits;
        }

        /* Calculate length of section 1 and store it in octets 1-4 of
         * section 1. */
        lensec1 = (iofst - ibeg) / 8;
        sbit(cgrib, &lensec1, ibeg, 32);

        /* Check results. */
        for (i = 0; i < 21; i++)
            if (cgrib[i + LENSEC0] != expected_sec1_cgrib[i])
                return G2C_ERROR;
    }
    printf("ok!\n");
    /* THis works on my local machine, but not on GitHUb CI
     * machines. A mystery! */

    /* printf("Testing more sbit() calls..."); */
    /* { */
    /*     unsigned char out; */
    /*     g2int in = 1; */
    /*     g2int expected_out[8] = {0x95, 0x55, 0x35, 0x15, 0x0d, 0x05, 0x03, 0x01}; */
    /*     int i; */

    /*     for (i = 0; i < 8; i++) */
    /*     { */
    /*         sbit(&out, &in, 0, i + 1); */
    /*         /\* printf("0x%02x, ", out); *\/ */
    /*         if (out != expected_out[i]) */
    /*             return G2C_ERROR; */
    /*     } */
    /* } */
    /* printf("ok!\n"); */
    printf("Testing gbit() call...");
    {
#define MSG_LEN 109
        g2int lencurr;
        /* This message comes from the code in tst_g2_addgrid.c. */
        unsigned char cgrib[MSG_LEN] = {71, 82, 73, 66, 0, 0, 1, 2, 0, 0, 0, 0, 0, 0, 0,
                                        109, 0, 0, 0, 21, 1, 0, 7, 0, 4, 24, 0, 0, 7, 229, 10, 24, 6, 54, 59, 7, 192, 0, 0, 0,
                                        72, 3, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 1, 0, 0, 0, 2, 3, 0, 0, 0, 4, 5, 0, 0, 0, 6, 0, 0,
                                        0, 7, 0, 0, 0, 8, 0, 0, 0, 9, 0, 0, 0, 10, 0, 0, 0, 11, 0, 0, 0, 12, 13, 0, 0, 0, 14,
                                        0, 0, 0, 15, 0, 0, 0, 16, 0, 0, 0, 17, 18};

        gbit(cgrib, &lencurr, 96, 32);
        if (lencurr != MSG_LEN)
            return G2C_ERROR;
    }
    printf("ok!\n");
    printf("Testing g2c_gbit_int() call...");
    {
#define MSG_LEN 109
        int lencurr;
        /* This message comes from the code in tst_g2_addgrid.c. */
        unsigned char cgrib[MSG_LEN] = {71, 82, 73, 66, 0, 0, 1, 2, 0, 0, 0, 0, 0, 0, 0,
                                        109, 0, 0, 0, 21, 1, 0, 7, 0, 4, 24, 0, 0, 7, 229, 10, 24, 6, 54, 59, 7, 192, 0, 0, 0,
                                        72, 3, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 1, 0, 0, 0, 2, 3, 0, 0, 0, 4, 5, 0, 0, 0, 6, 0, 0,
                                        0, 7, 0, 0, 0, 8, 0, 0, 0, 9, 0, 0, 0, 10, 0, 0, 0, 11, 0, 0, 0, 12, 13, 0, 0, 0, 14,
                                        0, 0, 0, 15, 0, 0, 0, 16, 0, 0, 0, 17, 18};

        g2c_gbit_int(cgrib, &lencurr, 96, 32);
        if (lencurr != MSG_LEN)
            return G2C_ERROR;
    }
    printf("ok!\n");
    printf("SUCCESS!\n");
    return 0;
}