blob: b44974ca3f0ce0ff83c2f96a0e0546a048c5444b [file] [log] [blame]
Lev Walkinae1422b2013-03-24 02:08:42 -07001#include <stdio.h>
2#include <assert.h>
3
4#define EMIT_ASN_DEBUG 1
5#include <INTEGER.h>
6#include <INTEGER.c>
7#include <per_support.c>
8#include <per_support.h>
9
10static int FailOut(const void *data, size_t size, void *op_key) {
11 assert(!"UNREACHABLE");
12 return 0;
13}
14
15static void normalize(asn_per_outp_t *po) {
16 if(po->nboff >= 8) {
17 po->buffer += (po->nboff >> 3);
18 po->nbits -= (po->nboff & ~0x07);
19 po->nboff &= 0x07;
20 }
21}
22
23static void
24check_per_encode_constrained(int lineno, int unsigned_, long value, long lbound, unsigned long ubound, int bit_range) {
25 INTEGER_t st;
26 INTEGER_t *reconstructed_st = 0;
27 asn_INTEGER_specifics_t specs;
28 asn_per_constraints_t cts;
29 asn_enc_rval_t enc_rval;
30 asn_dec_rval_t dec_rval;
31 asn_per_outp_t po;
32 asn_per_data_t pd;
33 long reconstructed_value;
34
35 printf("%d: Recoding %s %ld [%ld..%lu]\n", lineno,
36 unsigned_ ? "unsigned" : "signed", value, lbound, ubound);
37
38 memset(&st, 0, sizeof(st));
39 memset(&po, 0, sizeof(po));
40 memset(&pd, 0, sizeof(pd));
41 memset(&cts, 0, sizeof(cts));
42 memset(&specs, 0, sizeof(specs));
43
44 cts.value.flags = APC_CONSTRAINED;
45 cts.value.range_bits = bit_range;
46 cts.value.effective_bits = bit_range;
47 cts.value.lower_bound = lbound;
48 cts.value.upper_bound = ubound;
49
50 asn_long2INTEGER(&st, value);
51
52 po.buffer = po.tmpspace;
53 po.nboff = 0;
54 po.nbits = 8 * sizeof(po.tmpspace);
55 po.outper = FailOut;
56
57 specs.field_width = sizeof(long);
58 specs.field_unsigned = unsigned_;
59
60 asn_DEF_INTEGER.specifics = &specs;
61 enc_rval = INTEGER_encode_uper(&asn_DEF_INTEGER, &cts, &st, &po);
62 assert(enc_rval.encoded == 0);
63
64 normalize(&po);
65
66 assert(po.buffer == &po.tmpspace[bit_range / 8]);
67 long recovered_value =
68 ((uint32_t)po.tmpspace[0] << 24)
69 | ((uint32_t)po.tmpspace[1] << 16)
70 | ((uint32_t)po.tmpspace[2] << 8)
71 | ((uint32_t)po.tmpspace[3] << 0);
72 recovered_value >>= (32 - bit_range);
73 recovered_value += cts.value.lower_bound;
74 assert(recovered_value == value);
75 assert(po.nboff == ((bit_range == 32) ? 0 : (8 - (32 - bit_range))));
76 assert(po.nbits == 8 * (sizeof(po.tmpspace) - (po.buffer-po.tmpspace)));
77 assert(po.flushed_bytes == 0);
78
79 pd.buffer = po.tmpspace;
80 pd.nboff = 0;
81 pd.nbits = 8 * (po.buffer - po.tmpspace) + po.nboff;
82 pd.moved = 0;
83 dec_rval = INTEGER_decode_uper(0, &asn_DEF_INTEGER, &cts,
84 (void **)&reconstructed_st, &pd);
85 reconstructed_value = 0;
86 asn_INTEGER2long(reconstructed_st, &reconstructed_value);
87 assert(reconstructed_value == value);
88}
89
90#define CHECK(u, v, l, r, b) \
91 check_per_encode_constrained(__LINE__, u, v, l, r, b)
92
93int
94main() {
95 int unsigned_;
96 for(unsigned_ = 0; unsigned_ < 2; unsigned_++) {
97 int u = unsigned_;
98
99 /* Encode a signed 0x8babab into a range constrained by 0..2^29-1 */
100 CHECK(u, 0x8babab, 0, 536870911UL, 29);
101 CHECK(u, 0x8babab, 0, 1073741823UL, 30);
102 CHECK(u, 0x8babab, 0, 2147483647UL, 31);
103 CHECK(u, 0x8babab, 0, 4294967295UL, 32);
104
105 CHECK(u, 0x8babab, 10, 536870901UL, 29);
106 CHECK(u, 0x8babab, 10, 1073741803UL, 30);
107 CHECK(u, 0x8babab, 10, 2147483607UL, 31);
108 CHECK(u, 0x8babab, 10, 4294967205UL, 32);
109
110 CHECK(0, 0x8babab, -10, 536870901UL, 29);
111 CHECK(0, 0x8babab, -10, 1073741803UL, 30);
112 CHECK(0, 0x8babab, -10, 2147483607UL, 31);
113 CHECK(0, 0x8babab, -10, 4294967205UL, 32);
114
115 CHECK(u, 11, 10, 536870901UL, 29);
116 CHECK(u, 11, 10, 1073741803UL, 30);
117 CHECK(u, 11, 10, 2147483607UL, 31);
118 CHECK(u, 11, 10, 4294967205UL, 32);
119
120 CHECK(0, 1, -10, 536870901UL, 29);
121 CHECK(0, 1, -10, 1073741803UL, 30);
122 CHECK(0, 1, -10, 2147483607UL, 31);
123 CHECK(0, 1, -10, 4294967205UL, 32);
124
125 CHECK(u, 10, 10, 536870901UL, 29);
126 CHECK(u, 10, 10, 1073741803UL, 30);
127 CHECK(u, 10, 10, 2147483607UL, 31);
128 CHECK(u, 10, 10, 4294967205UL, 32);
129
130 CHECK(0, 0, -10, 536870901UL, 29);
131 CHECK(0, 0, -10, 1073741803UL, 30);
132 CHECK(0, 0, -10, 2147483607UL, 31);
133 CHECK(0, 0, -10, 4294967205UL, 32);
134
135 CHECK(0, -1, -10, 536870901UL, 29);
136 CHECK(0, -1, -10, 1073741803UL, 30);
137 CHECK(0, -1, -10, 2147483607UL, 31);
138 CHECK(0, -1, -10, 4294967205UL, 32);
139
140 CHECK(0, -10, -10, 536870901UL, 29);
141 CHECK(0, -10, -10, 1073741803UL, 30);
142 CHECK(0, -10, -10, 2147483607UL, 31);
143 CHECK(0, -10, -10, 4294967205UL, 32);
144
145 CHECK(u, 536870901UL, 10, 536870901UL, 29);
146 CHECK(u, 1073741803UL, 10, 1073741803UL, 30);
147 CHECK(u, 2147483607UL, 10, 2147483607UL, 31);
148 CHECK(u, 4294967205UL, 10, 4294967205UL, 32);
149
150 CHECK(0, 536870901UL, -10, 536870901UL, 29);
151 CHECK(0, 1073741803UL, -10, 1073741803UL, 30);
152 CHECK(0, 2147483607UL, -10, 2147483607UL, 31);
153 CHECK(0, 4294967205UL, -10, 4294967205UL, 32);
154
155 CHECK(u, 2000000000, 0, 4294967295UL, 32);
156 CHECK(u, 2147483647, 0, 4294967295UL, 32);
157 CHECK(u, 2147483648, 0, 4294967295UL, 32);
158 CHECK(u, 4000000000, 0, 4294967295UL, 32);
159 CHECK(u, 4294967295UL, 1, 4294967295UL, 32);
160 }
161
162 return 0;
163}