11 #define RETURN(_code) do {\
12 asn_dec_rval_t tmprval;\
13 tmprval.code = _code;\
14 tmprval.consumed = consumed_myself;\
19 { APC_CONSTRAINED, 8, 8, 0, 255 },
20 { APC_SEMI_CONSTRAINED, -1, -1, 0, 0 },
38 ssize_t consumed_myself = 0;
45 unsigned int unit_bits;
46 unsigned int canonical_unit_bits;
58 switch(specs->subvariant) {
62 ASN_DEBUG(
"Unrecognized subvariant %d", specs->subvariant);
66 canonical_unit_bits = unit_bits = 8;
67 if(cval->flags & APC_CONSTRAINED)
68 unit_bits = cval->range_bits;
72 canonical_unit_bits = unit_bits = 16;
73 if(cval->flags & APC_CONSTRAINED)
74 unit_bits = cval->range_bits;
78 canonical_unit_bits = unit_bits = 32;
79 if(cval->flags & APC_CONSTRAINED)
80 unit_bits = cval->range_bits;
94 csiz->flags & APC_EXTENSIBLE ?
"extensible" :
"non-extensible",
95 csiz->lower_bound, csiz->upper_bound, csiz->effective_bits);
97 if(csiz->flags & APC_EXTENSIBLE) {
102 unit_bits = canonical_unit_bits;
106 if(csiz->effective_bits >= 0) {
109 st->
size = csiz->upper_bound * bpc;
111 st->
size = (csiz->upper_bound + 7) >> 3;
120 if(csiz->effective_bits == 0) {
123 ASN_DEBUG(
"Encoding OCTET STRING size %"ASN_PRIdMAX"",
133 ASN_DEBUG(
"Encoding BIT STRING size %"ASN_PRIdMAX"",
136 unit_bits * csiz->upper_bound);
139 consumed_myself += unit_bits * csiz->upper_bound;
155 if(raw_len == 0 && st->
buf)
break;
157 ASN_DEBUG(
"Got PER length eb %ld, len %ld, %s (%s)",
158 (
long)csiz->effective_bits, (
long)raw_len,
159 repeat ?
"repeat" :
"once", td->name);
160 len_bytes = raw_len * bpc;
163 st->
buf = (uint8_t *)p;
166 bpc, unit_bits, cval->lower_bound,
167 cval->upper_bound, pc);
170 st->
size += len_bytes;
192 unsigned int unit_bits;
193 unsigned int canonical_unit_bits;
194 size_t size_in_units;
204 if(!st || (!st->
buf && st->
size))
214 ct_extensible = csiz->
flags & APC_EXTENSIBLE;
222 canonical_unit_bits = unit_bits = 8;
223 if(cval->flags & APC_CONSTRAINED)
224 unit_bits = cval->range_bits;
226 size_in_units = st->
size;
229 canonical_unit_bits = unit_bits = 16;
230 if(cval->flags & APC_CONSTRAINED)
231 unit_bits = cval->range_bits;
233 size_in_units = st->
size >> 1;
235 ASN_DEBUG(
"%s string size is not modulo 2", td->
name);
240 canonical_unit_bits = unit_bits = 32;
241 if(cval->flags & APC_CONSTRAINED)
242 unit_bits = cval->range_bits;
244 size_in_units = st->
size >> 2;
246 ASN_DEBUG(
"%s string size is not modulo 4", td->
name);
252 ASN_DEBUG(
"Encoding %s into %" ASN_PRI_SIZE " units of %d bits"
254 td->
name, size_in_units, unit_bits,
255 csiz->lower_bound, csiz->upper_bound,
256 csiz->effective_bits, ct_extensible ?
" EXT" :
"");
260 if(csiz->effective_bits >= 0) {
261 if((ssize_t)size_in_units < csiz->lower_bound
262 || (ssize_t)size_in_units > csiz->upper_bound) {
265 unit_bits = canonical_unit_bits;
281 if(csiz->effective_bits >= 0 && !inext) {
283 size_in_units - csiz->lower_bound, csiz->effective_bits);
285 csiz->effective_bits);
288 unit_bits, cval->lower_bound,
289 cval->upper_bound, pc);
297 ASN_DEBUG(
"Encoding %" ASN_PRI_SIZE " in units", size_in_units);
304 need_eom ?
",+EOM" :
"");
308 cval->upper_bound, pc);
311 buf += may_save * bpc;
312 size_in_units -= may_save;
313 assert(!(may_save & 0x07) || !size_in_units);
316 }
while(size_in_units);