Lev Walkin | ae1422b | 2013-03-24 02:08:42 -0700 | [diff] [blame^] | 1 | #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 | |
| 10 | static int FailOut(const void *data, size_t size, void *op_key) { |
| 11 | assert(!"UNREACHABLE"); |
| 12 | return 0; |
| 13 | } |
| 14 | |
| 15 | static 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 | |
| 23 | static void |
| 24 | check_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 | |
| 93 | int |
| 94 | main() { |
| 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 | } |