NativeEnumerated.c vars NULL init and check
[com/asn1c.git] / tests / tests-c-compiler / check-src / check-148.c
1 #undef  NDEBUG
2 #include <stdio.h>
3 #include <stdlib.h>
4 #include <sys/types.h>
5 #include <string.h>
6 #include <assert.h>
7
8 #include <DefaultSequence.h>
9 #include <DefaultSet.h>
10
11 uint8_t berSeq1[] = {
12   32 | 16, /* [UNIVERSAL 16], constructed */
13   6, /* L */
14   /* aBool BOOLEAN */
15   ((2 << 6) + 0), /* [0], primitive */
16   1, /* L */
17   0, /* FALSE */
18   /* anInteger INTEGER */
19   ((2 << 6) + 1), /* [1], primitive */
20   1, /* L */
21   1
22 };
23
24 uint8_t derSeq1[] = {
25   32 | 16, /* [UNIVERSAL 16], constructed */
26   3, /* L */
27   /* anInteger INTEGER */
28   ((2 << 6) + 1), /* [1], primitive */
29   1, /* L */
30   1
31 };
32
33 uint8_t berSeq2[] = {
34   32 | 16, /* [UNIVERSAL 16], constructed */
35   3, /* L */
36   /* aBool BOOLEAN */
37   ((2 << 6) + 0), /* [0], primitive */
38   1, /* L */
39   0 /* FALSE */
40 };
41
42 uint8_t derSeq2[] = {
43   32 | 16, /* [UNIVERSAL 16], constructed */
44   0 /* L */
45 };
46
47 uint8_t berSet1[] = {
48   32 | 17, /* [UNIVERSAL 17], constructed */
49   6, /* L */
50   /* aBool BOOLEAN */
51   ((2 << 6) + 0), /* [0], primitive */
52   1, /* L */
53   0, /* FALSE */
54   /* anInteger INTEGER */
55   ((2 << 6) + 1), /* [1], primitive */
56   1, /* L */
57   1
58 };
59
60 uint8_t derSet1[] = {
61   32 | 17, /* [UNIVERSAL 17], constructed */
62   3, /* L */
63   /* anInteger INTEGER */
64   ((2 << 6) + 1), /* [1], primitive */
65   1, /* L */
66   1
67 };
68
69 uint8_t berSet2[] = {
70   32 | 17, /* [UNIVERSAL 17], constructed */
71   3, /* L */
72   /* aBool BOOLEAN */
73   ((2 << 6) + 0), /* [0], primitive */
74   1, /* L */
75   0 /* FALSE */
76 };
77
78 uint8_t derSet2[] = {
79   32 | 17, /* [UNIVERSAL 17], constructed */
80   0 /* L */
81 };
82
83 uint8_t buf2[128];
84 int buf2_pos;
85
86 static int
87 buf2_fill(const void *buffer, size_t size, void *app_key) {
88
89         (void)app_key;
90
91         if(buf2_pos + size > sizeof(buf2))
92                 return -1;
93
94         memcpy(buf2 + buf2_pos, buffer, size);
95         buf2_pos += size;
96
97         return 0;
98 }
99
100 static void
101 compare_encoding(asn_enc_rval_t *erval, uint8_t *expected, size_t expected_size,
102                  uint8_t *actual) {
103
104   assert(erval->encoded != -1);
105   if((size_t)erval->encoded != expected_size) {
106     printf("%d != %d\n", (int)erval->encoded, (int)expected_size);
107     assert((size_t)erval->encoded == expected_size);
108   }
109   for(size_t i = 0; i < expected_size; i++) {
110       if(expected[i] != actual[i]) {
111           fprintf(stderr, "Recreated buffer content mismatch:\n");
112           fprintf(stderr, "Byte %zu, %x != %x (%d != %d)\n", i, expected[i],
113                   actual[i], expected[i], actual[i]);
114       }
115       assert(expected[i] == actual[i]);
116   }
117 }
118
119 static void
120 check_sequence(uint8_t *in, size_t in_size, uint8_t *expected,
121                size_t expected_size) {
122   DefaultSequence_t t, *tp;
123   void *tpp = &tp;
124   asn_dec_rval_t rval;
125   asn_enc_rval_t erval;
126
127   tp = memset(&t, 0, sizeof(t));
128
129   /* Try to decode the BER encoding. */ 
130   rval = ber_decode(0, &asn_DEF_DefaultSequence, (void**)tpp, in, in_size);
131   assert(rval.code == RC_OK);
132   assert(rval.consumed == in_size);
133
134   /* Try to re-create using DER encoding. */
135   buf2_pos = 0;
136   erval = der_encode(&asn_DEF_DefaultSequence, tp, buf2_fill, 0);
137   compare_encoding(&erval, expected, expected_size, buf2);
138
139   ASN_STRUCT_RESET(asn_DEF_DefaultSequence, tp);
140 }
141
142 static void
143 check_set(uint8_t *in, size_t in_size, uint8_t *expected,
144           size_t expected_size) {
145   DefaultSet_t t, *tp;
146   void *tpp = &tp;
147   asn_dec_rval_t rval;
148   asn_enc_rval_t erval;
149
150   tp = memset(&t, 0, sizeof(t));
151
152   /* Try to decode the BER encoding. */ 
153   rval = ber_decode(0, &asn_DEF_DefaultSet, (void**)tpp, in, in_size);
154   assert(rval.code == RC_OK);
155   assert(rval.consumed == in_size);
156
157   /* Try to re-create using DER encoding. */
158   buf2_pos = 0;
159   erval = der_encode(&asn_DEF_DefaultSet, tp, buf2_fill, 0);
160   compare_encoding(&erval, expected, expected_size, buf2);
161   ASN_STRUCT_RESET(asn_DEF_DefaultSet, tp);
162 }
163
164 int
165 main(int ac, char **av) {
166
167   (void)ac; /* Unused argument */
168   (void)av; /* Unused argument */
169
170   check_sequence(berSeq1, sizeof(berSeq1), derSeq1, sizeof(derSeq1));
171   check_sequence(berSeq2, sizeof(berSeq2), derSeq2, sizeof(derSeq2));
172   check_set(berSet1, sizeof(berSet1), derSet1, sizeof(derSet1));
173   check_set(berSet2, sizeof(berSet2), derSet2, sizeof(derSet2));
174 }