blob: e314defd4f4961079f524b651f378602a0a69b7c [file] [log] [blame]
vlmfa67ddc2004-06-03 03:38:44 +00001#include <stdio.h>
2#include <string.h>
3#include <errno.h>
4#include <assert.h>
5
6#include <asn1parser.h>
vlm4808c702004-08-18 04:50:37 +00007#include <asn1fix_export.h>
vlm04a79e62004-08-18 05:41:05 +00008#include <asn1fix_crange.h>
vlmfa67ddc2004-06-03 03:38:44 +00009
10#include "asn1print.h"
11
12#define INDENT(fmt, args...) do { \
13 int __i = level; while(__i--) putchar(' '); \
14 printf(fmt, ##args); \
15 } while(0)
16
vlm4808c702004-08-18 04:50:37 +000017static int asn1print_module(asn1p_t *asn, asn1p_module_t *mod, enum asn1print_flags flags);
18static int asn1print_oid(asn1p_oid_t *oid, enum asn1print_flags flags);
19static int asn1print_ref(asn1p_ref_t *ref, enum asn1print_flags flags);
20static int asn1print_tag(asn1p_expr_t *tc, enum asn1print_flags flags);
21static int asn1print_params(asn1p_paramlist_t *pl,enum asn1print_flags flags);
22static int asn1print_with_syntax(asn1p_wsyntx_t *wx, enum asn1print_flags flags);
23static int asn1print_constraint(asn1p_constraint_t *, enum asn1print_flags);
24static int asn1print_value(asn1p_value_t *val, enum asn1print_flags flags);
25static int asn1print_expr(asn1p_t *asn, asn1p_module_t *mod, asn1p_expr_t *tc, enum asn1print_flags flags,
vlmfa67ddc2004-06-03 03:38:44 +000026 int level);
27
28/*
29 * Print the contents of the parsed ASN tree.
30 */
31int
vlm4808c702004-08-18 04:50:37 +000032asn1print(asn1p_t *asn, enum asn1print_flags flags) {
vlmfa67ddc2004-06-03 03:38:44 +000033 asn1p_module_t *mod;
34
35 if(asn == NULL) {
36 errno = EINVAL;
37 return -1;
38 }
39
40 TQ_FOR(mod, &(asn->modules), mod_next) {
vlm4808c702004-08-18 04:50:37 +000041 asn1print_module(asn, mod, flags);
vlmfa67ddc2004-06-03 03:38:44 +000042 }
43
44 return 0;
45}
46
47static int
vlm4808c702004-08-18 04:50:37 +000048asn1print_module(asn1p_t *asn, asn1p_module_t *mod, enum asn1print_flags flags) {
vlmfa67ddc2004-06-03 03:38:44 +000049 asn1p_expr_t *tc;
50
vlmfa67ddc2004-06-03 03:38:44 +000051 printf("\n%s ", mod->Identifier);
52 if(mod->module_oid) {
53 asn1print_oid(mod->module_oid, flags);
54 printf("\n");
55 }
56
57 printf("DEFINITIONS");
58
vlm4808c702004-08-18 04:50:37 +000059 if(mod->module_flags & MSF_TAG_INSTRUCTIONS)
60 printf(" TAG INSTRUCTIONS");
61 if(mod->module_flags & MSF_XER_INSTRUCTIONS)
62 printf(" XER INSTRUCTIONS");
vlmfa67ddc2004-06-03 03:38:44 +000063 if(mod->module_flags & MSF_EXPLICIT_TAGS)
64 printf(" EXPLICIT TAGS");
65 if(mod->module_flags & MSF_IMPLICIT_TAGS)
66 printf(" IMPLICIT TAGS");
67 if(mod->module_flags & MSF_AUTOMATIC_TAGS)
68 printf(" AUTOMATIC TAGS");
69 if(mod->module_flags & MSF_EXTENSIBILITY_IMPLIED)
70 printf(" EXTENSIBILITY IMPLIED");
71
72 printf(" ::=\n");
73 printf("BEGIN\n\n");
74
75 TQ_FOR(tc, &(mod->members), next) {
vlm4808c702004-08-18 04:50:37 +000076 asn1print_expr(asn, mod, tc, flags, 0);
vlm00ad2822004-08-20 13:24:28 +000077 if(flags & APF_DEBUG_CONSTRAINTS)
78 printf("\n");
79 else
80 printf("\n\n");
vlmfa67ddc2004-06-03 03:38:44 +000081 }
82
83 printf("END\n");
84
85 return 0;
86}
87
88static int
vlm4808c702004-08-18 04:50:37 +000089asn1print_oid(asn1p_oid_t *oid, enum asn1print_flags flags) {
vlmfa67ddc2004-06-03 03:38:44 +000090 int ac;
91 int accum = 0;
92
vlmb42843a2004-06-05 08:17:50 +000093 (void)flags; /* Unused argument */
94
vlmfa67ddc2004-06-03 03:38:44 +000095 printf("{");
96 for(ac = 0; ac < oid->arcs_count; ac++) {
97 if(accum + strlen(oid->arcs[ac].name?:"") > 50) {
98 printf("\n\t");
99 accum = 0;
100 } else if(ac) printf(" ");
101
102 if(oid->arcs[ac].name) {
vlmdc4d95a2004-09-05 10:38:50 +0000103 printf("%s", oid->arcs[ac].name);
104 if(oid->arcs[ac].number >= 0) {
105 printf("(%lld)",
106 (long long)oid->arcs[ac].number);
107 }
vlmfa67ddc2004-06-03 03:38:44 +0000108 accum += strlen(oid->arcs[ac].name);
109 } else {
110 printf("%d",
111 (int)oid->arcs[ac].number);
112 }
113 accum += 4;
114 }
115 printf(" }");
116
117 return 0;
118}
119
120static int
vlm4808c702004-08-18 04:50:37 +0000121asn1print_ref(asn1p_ref_t *ref, enum asn1print_flags flags) {
vlmfa67ddc2004-06-03 03:38:44 +0000122 int cc;
123
vlmb42843a2004-06-05 08:17:50 +0000124 (void)flags; /* Unused argument */
125
vlmfa67ddc2004-06-03 03:38:44 +0000126 for(cc = 0; cc < ref->comp_count; cc++) {
127 if(cc) printf(".");
128 printf("%s", ref->components[cc].name);
129 }
130
131 return 0;
132}
133
134static int
vlm4808c702004-08-18 04:50:37 +0000135asn1print_tag(asn1p_expr_t *tc, enum asn1print_flags flags) {
vlmfa67ddc2004-06-03 03:38:44 +0000136 struct asn1p_type_tag_s *tag = &tc->tag;
137
vlmb42843a2004-06-05 08:17:50 +0000138 (void)flags; /* Unused argument */
139
vlmfa67ddc2004-06-03 03:38:44 +0000140 if(tag->tag_class == TC_NOCLASS)
141 return 0;
142
143 printf("[");
144 switch(tag->tag_class) {
145 case TC_NOCLASS:
146 assert(tag->tag_class != TC_NOCLASS);
147 break;
148 case TC_UNIVERSAL: printf("UNIVERSAL "); break;
149 case TC_PRIVATE: printf("PRIVATE "); break;
150 case TC_APPLICATION: printf("APPLICATION "); break;
151 case TC_CONTEXT_SPECIFIC:
152 break;
153 }
154 printf("%lld]", (long long)tag->tag_value);
155
156 switch(tag->tag_mode) {
157 case TM_DEFAULT: break;
158 case TM_IMPLICIT: printf(" IMPLICIT"); break;
159 case TM_EXPLICIT: printf(" EXPLICIT"); break;
160 }
161
162 return 0;
163}
164
165static int
vlm4808c702004-08-18 04:50:37 +0000166asn1print_value(asn1p_value_t *val, enum asn1print_flags flags) {
vlmfa67ddc2004-06-03 03:38:44 +0000167
168 if(val == NULL)
169 return 0;
170
171 switch(val->type) {
172 case ATV_NOVALUE:
173 break;
vlm093f6752004-09-15 11:44:55 +0000174 case ATV_NULL:
175 printf("NULL");
176 return 0;
177 case ATV_REAL:
178 printf("%f", val->value.v_double);
179 return 0;
vlmfa67ddc2004-06-03 03:38:44 +0000180 case ATV_INTEGER:
181 printf("%lld", (long long)val->value.v_integer);
182 return 0;
183 case ATV_MIN: printf("MIN"); return 0;
184 case ATV_MAX: printf("MAX"); return 0;
185 case ATV_FALSE: printf("FALSE"); return 0;
186 case ATV_TRUE: printf("TRUE"); return 0;
vlmfa67ddc2004-06-03 03:38:44 +0000187 case ATV_STRING:
188 {
189 char *p = val->value.string.buf;
190 putchar('"');
191 if(strchr(p, '"')) {
192 /* Mask quotes */
193 for(; *p; p++) {
194 if(*p == '"')
195 putchar(*p);
196 putchar(*p);
197 }
198 } else {
199 fputs(p, stdout);
200 }
201 putchar('"');
202 }
203 return 0;
204 case ATV_UNPARSED:
205 fputs(val->value.string.buf, stdout);
206 return 0;
207 case ATV_BITVECTOR:
208 {
209 uint8_t *bitvector;
210 int bits;
211 int i;
212
213 bitvector = val->value.binary_vector.bits;
214 bits = val->value.binary_vector.size_in_bits;
215
216 printf("'");
217 if(bits%8) {
218 for(i = 0; i < bits; i++) {
219 uint8_t uc;
220 uc = bitvector[i>>3];
221 putchar(((uc >> (7-(i%8)))&1)?'1':'0');
222 }
223 printf("'B");
224 } else {
225 char hextable[16] = "0123456789ABCDEF";
226 for(i = 0; i < (bits>>3); i++) {
227 putchar(hextable[bitvector[i] >> 4]);
228 putchar(hextable[bitvector[i] & 0x0f]);
229 }
230 printf("'H");
231 }
232 }
vlm093f6752004-09-15 11:44:55 +0000233 case ATV_REFERENCED:
234 return asn1print_ref(val->value.reference, flags);
235 case ATV_CHOICE_IDENTIFIER:
236 printf("%s: ", val->value.choice_identifier.identifier);
237 return asn1print_value(val->value.choice_identifier.value, flags);
vlmfa67ddc2004-06-03 03:38:44 +0000238 }
239
240 assert(val->type || !"Unknown");
241
242 return 0;
243}
244
245static int
vlm4808c702004-08-18 04:50:37 +0000246asn1print_constraint(asn1p_constraint_t *ct, enum asn1print_flags flags) {
vlmfa67ddc2004-06-03 03:38:44 +0000247 int symno = 0;
248
249 if(ct == 0) return 0;
250
251 if(ct->type == ACT_CA_SET)
252 printf("(");
253
254 switch(ct->type) {
255 case ACT_EL_VALUE:
256 asn1print_value(ct->value, flags);
257 break;
258 case ACT_EL_RANGE:
259 case ACT_EL_LLRANGE:
260 case ACT_EL_RLRANGE:
261 case ACT_EL_ULRANGE:
262 asn1print_value(ct->range_start, flags);
263 switch(ct->type) {
264 case ACT_EL_RANGE: printf(".."); break;
265 case ACT_EL_LLRANGE: printf("<.."); break;
266 case ACT_EL_RLRANGE: printf("..<"); break;
267 case ACT_EL_ULRANGE: printf("<..<"); break;
268 default: printf("?..?"); break;
269 }
270 asn1print_value(ct->range_stop, flags);
271 break;
272 case ACT_EL_EXT:
273 printf("...");
274 break;
275 case ACT_CT_SIZE:
276 case ACT_CT_FROM:
277 switch(ct->type) {
vlm4808c702004-08-18 04:50:37 +0000278 case ACT_CT_SIZE: printf("SIZE("); break;
279 case ACT_CT_FROM: printf("FROM("); break;
vlmfa67ddc2004-06-03 03:38:44 +0000280 default: printf("??? ("); break;
281 }
282 assert(ct->el_count != 0);
283 assert(ct->el_count == 1);
284 asn1print_constraint(ct->elements[0], flags);
285 printf(")");
286 break;
287 case ACT_CT_WCOMP:
288 case ACT_CT_WCOMPS:
289 printf("???");
290 break;
291 case ACT_CA_SET: symno++;
292 case ACT_CA_CRC: symno++;
293 case ACT_CA_CSV: symno++;
294 case ACT_CA_UNI: symno++;
295 case ACT_CA_INT: symno++;
296 case ACT_CA_EXC:
297 {
vlm4808c702004-08-18 04:50:37 +0000298 char *symtable[] = { " EXCEPT ", " ^ ", " | ", ",",
vlmfa67ddc2004-06-03 03:38:44 +0000299 "", "(" };
vlmdc4d95a2004-09-05 10:38:50 +0000300 unsigned int i;
vlmfa67ddc2004-06-03 03:38:44 +0000301 for(i = 0; i < ct->el_count; i++) {
vlm4808c702004-08-18 04:50:37 +0000302 enum asn1print_flags nflags = flags;
vlmfa67ddc2004-06-03 03:38:44 +0000303 if(i) fputs(symtable[symno], stdout);
304 if(ct->type == ACT_CA_CRC) fputs("{", stdout);
305 asn1print_constraint(ct->elements[i], nflags);
306 if(ct->type == ACT_CA_CRC) fputs("}", stdout);
307 if(i+1 < ct->el_count
308 && ct->type == ACT_CA_SET)
309 fputs(")", stdout);
310 }
311 }
312 break;
313 case ACT_INVALID:
314 assert(ct->type != ACT_INVALID);
315 break;
316 }
317
318 if(ct->type == ACT_CA_SET)
319 printf(")");
320
321 return 0;
322}
323
324static int
vlm4808c702004-08-18 04:50:37 +0000325asn1print_params(asn1p_paramlist_t *pl, enum asn1print_flags flags) {
vlmfa67ddc2004-06-03 03:38:44 +0000326 if(pl) {
327 int i;
328 printf("{");
329 for(i = 0; i < pl->params_count; i++) {
330 if(i) printf(", ");
331 if(pl->params[i].governor) {
332 asn1print_ref(pl->params[i].governor, flags);
333 printf(":");
334 }
335 printf("%s", pl->params[i].argument);
336 }
337 printf("}");
338 }
339
340 return 0;
341}
342
343static int
vlm4808c702004-08-18 04:50:37 +0000344asn1print_with_syntax(asn1p_wsyntx_t *wx, enum asn1print_flags flags) {
vlmfa67ddc2004-06-03 03:38:44 +0000345 if(wx) {
346 asn1p_wsyntx_chunk_t *wc;
347 printf(" WITH SYNTAX {");
348 TQ_FOR(wc, &(wx->chunks), next) {
349 if(wc->ref) {
350 asn1print_ref(wc->ref, flags);
351 } else {
352 fwrite(wc->buf, 1, wc->len, stdout);
353 }
354 }
355 printf("}\n");
356 }
357
358 return 0;
359}
360
361static int
vlm4808c702004-08-18 04:50:37 +0000362asn1print_crange_value(asn1cnst_edge_t *edge, int as_char) {
363 switch(edge->type) {
364 case ARE_MIN: printf("MIN"); break;
365 case ARE_MAX: printf("MAX"); break;
366 case ARE_VALUE:
367 if(as_char) {
368 printf("\"%c\"", (unsigned char)edge->value);
369 } else {
370 printf("%lld", (long long)edge->value);
371 }
372 }
373 return 0;
374}
375
376static int
vlmeeca98f2004-08-25 02:00:03 +0000377asn1print_constraint_explain_type(asn1p_expr_type_e expr_type, asn1p_constraint_t *ct, enum asn1p_constraint_type_e type, int strict_PER_visible) {
vlm4808c702004-08-18 04:50:37 +0000378 asn1cnst_range_t *range;
379 int as_char = (type==ACT_CT_FROM);
380 int i;
381
vlmeeca98f2004-08-25 02:00:03 +0000382 range = asn1constraint_compute_PER_range(expr_type, ct, type,
383 0, 0, strict_PER_visible);
vlm4808c702004-08-18 04:50:37 +0000384 if(!range) return -1;
385
vlmeeca98f2004-08-25 02:00:03 +0000386 if(range->incompatible
387 || (strict_PER_visible && range->not_PER_visible)) {
388 asn1constraint_range_free(range);
389 return 0;
390 }
391
vlm4808c702004-08-18 04:50:37 +0000392 switch(type) {
393 case ACT_CT_FROM: printf("(FROM("); break;
394 case ACT_CT_SIZE: printf("(SIZE("); break;
395 default: printf("("); break;
396 }
397 for(i = -1; i < range->el_count; i++) {
398 asn1cnst_range_t *r;
399 if(i == -1) {
400 if(range->el_count) continue;
401 r = range;
402 } else {
403 r = range->elements[i];
404 }
405 if(i > 0) {
406 printf(" | ");
407 }
408 asn1print_crange_value(&r->left, as_char);
409 if(r->left.type != r->right.type
410 || r->left.value != r->right.value) {
411 printf("..");
412 asn1print_crange_value(&r->right, as_char);
413 }
414 }
415 if(range->extensible)
416 printf(",...");
417 printf(type==ACT_EL_RANGE?")":"))");
418
419 if(range->empty_constraint)
420 printf(":Empty!");
421
422 asn1constraint_range_free(range);
423 return 0;
424}
425
426static int
427asn1print_constraint_explain(asn1p_expr_type_e expr_type,
vlmeeca98f2004-08-25 02:00:03 +0000428 asn1p_constraint_t *ct, int s_PV) {
vlm4808c702004-08-18 04:50:37 +0000429
vlmeeca98f2004-08-25 02:00:03 +0000430 asn1print_constraint_explain_type(expr_type, ct, ACT_EL_RANGE, s_PV);
vlm4808c702004-08-18 04:50:37 +0000431 printf(" ");
vlmeeca98f2004-08-25 02:00:03 +0000432 asn1print_constraint_explain_type(expr_type, ct, ACT_CT_SIZE, s_PV);
vlm4808c702004-08-18 04:50:37 +0000433 printf(" ");
vlmeeca98f2004-08-25 02:00:03 +0000434 asn1print_constraint_explain_type(expr_type, ct, ACT_CT_FROM, s_PV);
vlm4808c702004-08-18 04:50:37 +0000435
436 return 0;
437}
438
439static int
440asn1print_expr(asn1p_t *asn, asn1p_module_t *mod, asn1p_expr_t *tc, enum asn1print_flags flags, int level) {
vlm00ad2822004-08-20 13:24:28 +0000441 int SEQ_OF = 0;
vlmfa67ddc2004-06-03 03:38:44 +0000442
443 if(flags & APF_LINE_COMMENTS)
444 INDENT("-- #line %d\n", tc->_lineno);
445 if(tc->Identifier)
446 INDENT("%s", tc->Identifier);
447
448 if(tc->params) {
449 asn1print_params(tc->params, flags);
450 }
451
452 if(tc->meta_type != AMT_VALUE
vlmda4df3f2004-08-25 02:27:47 +0000453 && tc->meta_type != AMT_VALUESET
vlmfa67ddc2004-06-03 03:38:44 +0000454 && tc->expr_type != A1TC_EXTENSIBLE) {
455 if(level) {
456 if(tc->Identifier)
457 printf("\t");
458 } else {
459 printf(" ::=");
460 }
461 }
462
463 if(tc->tag.tag_class) {
464 printf(" ");
465 asn1print_tag(tc, flags);
466 }
467
468 switch(tc->expr_type) {
469 case A1TC_EXTENSIBLE:
470 if(tc->value) {
471 printf("!");
472 asn1print_value(tc->value, flags);
473 }
474 break;
vlmddd6fd12004-08-22 03:08:51 +0000475 case A1TC_COMPONENTS_OF:
476 SEQ_OF = 1; /* Equivalent to SET OF for printint purposes */
477 printf(" COMPONENTS OF");
478 break;
vlmfa67ddc2004-06-03 03:38:44 +0000479 case A1TC_REFERENCE:
480 case A1TC_UNIVERVAL:
481 case A1TC_PARAMETRIZED:
482 break;
483 case A1TC_CLASSDEF:
484 printf(" CLASS");
485 break;
486 case A1TC_CLASSFIELD:
487 /* Nothing to print here */
488 break;
vlm00ad2822004-08-20 13:24:28 +0000489 case ASN_CONSTR_SET_OF:
490 case ASN_CONSTR_SEQUENCE_OF:
491 SEQ_OF = 1;
492 if(tc->expr_type == ASN_CONSTR_SET_OF)
493 printf(" SET");
494 else
495 printf(" SEQUENCE");
496 if(tc->constraints) {
497 printf(" ");
498 asn1print_constraint(tc->constraints, flags);
499 }
500 printf(" OF");
501 break;
vlmfa67ddc2004-06-03 03:38:44 +0000502 default:
503 {
504 char *p = ASN_EXPR_TYPE2STR(tc->expr_type);
505 printf(" %s", p?p:"<unknown type!>");
506 }
507 break;
508 }
509
510 if(tc->reference) {
511 printf(" ");
512 asn1print_ref(tc->reference, flags);
513 }
514
vlmda4df3f2004-08-25 02:27:47 +0000515 if(tc->meta_type == AMT_VALUESET)
516 printf(" ::=");
517
vlmfa67ddc2004-06-03 03:38:44 +0000518 /*
519 * Display the descendants (children) of the current type.
520 */
vlmda4df3f2004-08-25 02:27:47 +0000521 if(TQ_FIRST(&(tc->members))
522 || (tc->expr_type & ASN_CONSTR_MASK)
523 || tc->meta_type == AMT_VALUESET
524 || tc->meta_type == AMT_OBJECT
525 || tc->meta_type == AMT_OBJECTSET
526 ) {
vlmfa67ddc2004-06-03 03:38:44 +0000527 asn1p_expr_t *se; /* SubExpression */
vlmddd6fd12004-08-22 03:08:51 +0000528 int put_braces = !SEQ_OF; /* Don't need 'em, if SET OF... */
vlmfa67ddc2004-06-03 03:38:44 +0000529
vlmda4df3f2004-08-25 02:27:47 +0000530 if(put_braces) {
531 printf(" {");
532 if(TQ_FIRST(&tc->members))
533 printf("\n");
534 else printf(" }");
535 }
vlmfa67ddc2004-06-03 03:38:44 +0000536
537 TQ_FOR(se, &(tc->members), next) {
538 /*
vlmddd6fd12004-08-22 03:08:51 +0000539 * Print the expression as it were a stand-alone type.
vlmfa67ddc2004-06-03 03:38:44 +0000540 */
vlm4808c702004-08-18 04:50:37 +0000541 asn1print_expr(asn, mod, se, flags, level + 4);
vlm093f6752004-09-15 11:44:55 +0000542 if((se->marker.flags & EM_DEFAULT) == EM_DEFAULT) {
543 printf(" DEFAULT ");
544 asn1print_value(se->marker.default_value, flags);
545 } else if((se->marker.flags & EM_OPTIONAL)
546 == EM_OPTIONAL) {
vlmd82eb012004-09-10 08:21:27 +0000547 printf(" OPTIONAL");
vlm093f6752004-09-15 11:44:55 +0000548 }
vlmfa67ddc2004-06-03 03:38:44 +0000549 if(TQ_NEXT(se, next)) {
550 printf(",");
551 INDENT("\n");
552 }
553 }
554
vlmda4df3f2004-08-25 02:27:47 +0000555 if(put_braces && TQ_FIRST(&tc->members)) {
vlmfa67ddc2004-06-03 03:38:44 +0000556 printf("\n");
557 INDENT("}");
558 }
559 }
560
561 if(tc->with_syntax)
562 asn1print_with_syntax(tc->with_syntax, flags);
563
vlm00ad2822004-08-20 13:24:28 +0000564 if(!SEQ_OF && tc->constraints) {
vlmfa67ddc2004-06-03 03:38:44 +0000565 printf(" ");
566 asn1print_constraint(tc->constraints, flags);
567 }
vlm4808c702004-08-18 04:50:37 +0000568
vlmfa67ddc2004-06-03 03:38:44 +0000569 if(tc->unique) {
570 printf(" UNIQUE");
571 }
572
573 if(tc->meta_type == AMT_VALUE
574 && tc->expr_type != A1TC_EXTENSIBLE) {
vlmdc4d95a2004-09-05 10:38:50 +0000575 if(tc->expr_type == A1TC_UNIVERVAL) {
vlm093f6752004-09-15 11:44:55 +0000576 if(tc->value) {
577 printf("(");
578 asn1print_value(tc->value, flags);
579 printf(")");
580 }
vlmdc4d95a2004-09-05 10:38:50 +0000581 } else {
582 printf(" ::= ");
583 asn1print_value(tc->value, flags);
584 }
vlmfa67ddc2004-06-03 03:38:44 +0000585 }
586
vlmddd6fd12004-08-22 03:08:51 +0000587 /*
588 * The following section exists entirely for debugging only.
589 */
vlm00ad2822004-08-20 13:24:28 +0000590 if(flags & APF_DEBUG_CONSTRAINTS
591 && tc->expr_type != A1TC_EXTENSIBLE) {
vlm4808c702004-08-18 04:50:37 +0000592 asn1p_expr_t *top_parent;
593
594 if(tc->combined_constraints) {
595 printf("\n-- Combined constraints: ");
596 asn1print_constraint(tc->combined_constraints, flags);
597 }
598
vlmcbebb812004-09-22 16:05:13 +0000599 top_parent = asn1f_find_terminal_type_ex(asn, tc);
vlm4808c702004-08-18 04:50:37 +0000600 if(top_parent) {
vlmeeca98f2004-08-25 02:00:03 +0000601 printf("\n-- Practical constraints (%s): ",
602 top_parent->Identifier);
603 asn1print_constraint_explain(top_parent->expr_type,
604 tc->combined_constraints, 0);
vlm00ad2822004-08-20 13:24:28 +0000605 printf("\n-- PER-visible constraints (%s): ",
606 top_parent->Identifier);
vlm4808c702004-08-18 04:50:37 +0000607 asn1print_constraint_explain(top_parent->expr_type,
vlmeeca98f2004-08-25 02:00:03 +0000608 tc->combined_constraints, 1);
vlm4808c702004-08-18 04:50:37 +0000609 }
vlm00ad2822004-08-20 13:24:28 +0000610 printf("\n");
vlm4808c702004-08-18 04:50:37 +0000611 }
612
vlmfa67ddc2004-06-03 03:38:44 +0000613 return 0;
614}
vlm4808c702004-08-18 04:50:37 +0000615