diff options
author | Lev Walkin <vlm@lionet.info> | 2004-08-18 04:50:37 +0000 |
---|---|---|
committer | Lev Walkin <vlm@lionet.info> | 2004-08-18 04:50:37 +0000 |
commit | 3140e0e484a52268b50d71b32058d3a1632ac69d (patch) | |
tree | ffbd8b179a40d0e76fd157957a59654d7c27b096 /libasn1print/asn1print.c | |
parent | d612ce2bee706bac1d7a1db30d6833a6daf2db4d (diff) |
debug constraints
Diffstat (limited to 'libasn1print/asn1print.c')
-rw-r--r-- | libasn1print/asn1print.c | 146 |
1 files changed, 120 insertions, 26 deletions
diff --git a/libasn1print/asn1print.c b/libasn1print/asn1print.c index 9c2fed70..58ce284e 100644 --- a/libasn1print/asn1print.c +++ b/libasn1print/asn1print.c @@ -4,6 +4,7 @@ #include <assert.h> #include <asn1parser.h> +#include <asn1fix_export.h> #include "asn1print.h" @@ -12,22 +13,22 @@ printf(fmt, ##args); \ } while(0) -static int asn1print_module(asn1p_module_t *mod, enum asn1print_flags_e flags); -static int asn1print_oid(asn1p_oid_t *oid, enum asn1print_flags_e flags); -static int asn1print_ref(asn1p_ref_t *ref, enum asn1print_flags_e flags); -static int asn1print_tag(asn1p_expr_t *tc, enum asn1print_flags_e flags); -static int asn1print_params(asn1p_paramlist_t *pl,enum asn1print_flags_e flags); -static int asn1print_with_syntax(asn1p_wsyntx_t *wx, enum asn1print_flags_e flags); -static int asn1print_constraint(asn1p_constraint_t *, enum asn1print_flags_e); -static int asn1print_value(asn1p_value_t *val, enum asn1print_flags_e flags); -static int asn1print_expr(asn1p_expr_t *tc, enum asn1print_flags_e flags, +static int asn1print_module(asn1p_t *asn, asn1p_module_t *mod, enum asn1print_flags flags); +static int asn1print_oid(asn1p_oid_t *oid, enum asn1print_flags flags); +static int asn1print_ref(asn1p_ref_t *ref, enum asn1print_flags flags); +static int asn1print_tag(asn1p_expr_t *tc, enum asn1print_flags flags); +static int asn1print_params(asn1p_paramlist_t *pl,enum asn1print_flags flags); +static int asn1print_with_syntax(asn1p_wsyntx_t *wx, enum asn1print_flags flags); +static int asn1print_constraint(asn1p_constraint_t *, enum asn1print_flags); +static int asn1print_value(asn1p_value_t *val, enum asn1print_flags flags); +static int asn1print_expr(asn1p_t *asn, asn1p_module_t *mod, asn1p_expr_t *tc, enum asn1print_flags flags, int level); /* * Print the contents of the parsed ASN tree. */ int -asn1print(asn1p_t *asn, enum asn1print_flags_e flags) { +asn1print(asn1p_t *asn, enum asn1print_flags flags) { asn1p_module_t *mod; if(asn == NULL) { @@ -36,14 +37,14 @@ asn1print(asn1p_t *asn, enum asn1print_flags_e flags) { } TQ_FOR(mod, &(asn->modules), mod_next) { - asn1print_module(mod, flags); + asn1print_module(asn, mod, flags); } return 0; } static int -asn1print_module(asn1p_module_t *mod, enum asn1print_flags_e flags) { +asn1print_module(asn1p_t *asn, asn1p_module_t *mod, enum asn1print_flags flags) { asn1p_expr_t *tc; printf("\n%s ", mod->Identifier); @@ -54,6 +55,10 @@ asn1print_module(asn1p_module_t *mod, enum asn1print_flags_e flags) { printf("DEFINITIONS"); + if(mod->module_flags & MSF_TAG_INSTRUCTIONS) + printf(" TAG INSTRUCTIONS"); + if(mod->module_flags & MSF_XER_INSTRUCTIONS) + printf(" XER INSTRUCTIONS"); if(mod->module_flags & MSF_EXPLICIT_TAGS) printf(" EXPLICIT TAGS"); if(mod->module_flags & MSF_IMPLICIT_TAGS) @@ -67,7 +72,7 @@ asn1print_module(asn1p_module_t *mod, enum asn1print_flags_e flags) { printf("BEGIN\n\n"); TQ_FOR(tc, &(mod->members), next) { - asn1print_expr(tc, flags, 0); + asn1print_expr(asn, mod, tc, flags, 0); printf("\n\n"); } @@ -77,7 +82,7 @@ asn1print_module(asn1p_module_t *mod, enum asn1print_flags_e flags) { } static int -asn1print_oid(asn1p_oid_t *oid, enum asn1print_flags_e flags) { +asn1print_oid(asn1p_oid_t *oid, enum asn1print_flags flags) { int ac; int accum = 0; @@ -107,7 +112,7 @@ asn1print_oid(asn1p_oid_t *oid, enum asn1print_flags_e flags) { } static int -asn1print_ref(asn1p_ref_t *ref, enum asn1print_flags_e flags) { +asn1print_ref(asn1p_ref_t *ref, enum asn1print_flags flags) { int cc; (void)flags; /* Unused argument */ @@ -121,7 +126,7 @@ asn1print_ref(asn1p_ref_t *ref, enum asn1print_flags_e flags) { } static int -asn1print_tag(asn1p_expr_t *tc, enum asn1print_flags_e flags) { +asn1print_tag(asn1p_expr_t *tc, enum asn1print_flags flags) { struct asn1p_type_tag_s *tag = &tc->tag; (void)flags; /* Unused argument */ @@ -152,7 +157,7 @@ asn1print_tag(asn1p_expr_t *tc, enum asn1print_flags_e flags) { } static int -asn1print_value(asn1p_value_t *val, enum asn1print_flags_e flags) { +asn1print_value(asn1p_value_t *val, enum asn1print_flags flags) { if(val == NULL) return 0; @@ -226,7 +231,7 @@ asn1print_value(asn1p_value_t *val, enum asn1print_flags_e flags) { } static int -asn1print_constraint(asn1p_constraint_t *ct, enum asn1print_flags_e flags) { +asn1print_constraint(asn1p_constraint_t *ct, enum asn1print_flags flags) { int symno = 0; if(ct == 0) return 0; @@ -258,8 +263,8 @@ asn1print_constraint(asn1p_constraint_t *ct, enum asn1print_flags_e flags) { case ACT_CT_SIZE: case ACT_CT_FROM: switch(ct->type) { - case ACT_CT_SIZE: printf("SIZE ("); break; - case ACT_CT_FROM: printf("FROM ("); break; + case ACT_CT_SIZE: printf("SIZE("); break; + case ACT_CT_FROM: printf("FROM("); break; default: printf("??? ("); break; } assert(ct->el_count != 0); @@ -278,11 +283,11 @@ asn1print_constraint(asn1p_constraint_t *ct, enum asn1print_flags_e flags) { case ACT_CA_INT: symno++; case ACT_CA_EXC: { - char *symtable[] = { " EXCEPT ", "^", "|", ",", + char *symtable[] = { " EXCEPT ", " ^ ", " | ", ",", "", "(" }; int i; for(i = 0; i < ct->el_count; i++) { - enum asn1print_flags_e nflags = flags; + enum asn1print_flags nflags = flags; if(i) fputs(symtable[symno], stdout); if(ct->type == ACT_CA_CRC) fputs("{", stdout); asn1print_constraint(ct->elements[i], nflags); @@ -305,7 +310,7 @@ asn1print_constraint(asn1p_constraint_t *ct, enum asn1print_flags_e flags) { } static int -asn1print_params(asn1p_paramlist_t *pl, enum asn1print_flags_e flags) { +asn1print_params(asn1p_paramlist_t *pl, enum asn1print_flags flags) { if(pl) { int i; printf("{"); @@ -324,7 +329,7 @@ asn1print_params(asn1p_paramlist_t *pl, enum asn1print_flags_e flags) { } static int -asn1print_with_syntax(asn1p_wsyntx_t *wx, enum asn1print_flags_e flags) { +asn1print_with_syntax(asn1p_wsyntx_t *wx, enum asn1print_flags flags) { if(wx) { asn1p_wsyntx_chunk_t *wc; printf(" WITH SYNTAX {"); @@ -342,7 +347,78 @@ asn1print_with_syntax(asn1p_wsyntx_t *wx, enum asn1print_flags_e flags) { } static int -asn1print_expr(asn1p_expr_t *tc, enum asn1print_flags_e flags, int level) { +asn1print_crange_value(asn1cnst_edge_t *edge, int as_char) { + switch(edge->type) { + case ARE_MIN: printf("MIN"); break; + case ARE_MAX: printf("MAX"); break; + case ARE_VALUE: + if(as_char) { + printf("\"%c\"", (unsigned char)edge->value); + } else { + printf("%lld", (long long)edge->value); + } + } + return 0; +} + +static int +asn1print_constraint_explain_type(asn1p_expr_type_e expr_type, asn1p_constraint_t *ct, enum asn1p_constraint_type_e type) { + asn1cnst_range_t *range; + int as_char = (type==ACT_CT_FROM); + int i; + + range = asn1constraint_compute_PER_range(expr_type, ct, type, 0, 0); + if(!range) return -1; + + switch(type) { + case ACT_CT_FROM: printf("(FROM("); break; + case ACT_CT_SIZE: printf("(SIZE("); break; + default: printf("("); break; + } + for(i = -1; i < range->el_count; i++) { + asn1cnst_range_t *r; + if(i == -1) { + if(range->el_count) continue; + r = range; + } else { + r = range->elements[i]; + } + if(i > 0) { + printf(" | "); + } + asn1print_crange_value(&r->left, as_char); + if(r->left.type != r->right.type + || r->left.value != r->right.value) { + printf(".."); + asn1print_crange_value(&r->right, as_char); + } + } + if(range->extensible) + printf(",..."); + printf(type==ACT_EL_RANGE?")":"))"); + + if(range->empty_constraint) + printf(":Empty!"); + + asn1constraint_range_free(range); + return 0; +} + +static int +asn1print_constraint_explain(asn1p_expr_type_e expr_type, + asn1p_constraint_t *ct) { + + asn1print_constraint_explain_type(expr_type, ct, ACT_EL_RANGE); + printf(" "); + asn1print_constraint_explain_type(expr_type, ct, ACT_CT_SIZE); + printf(" "); + asn1print_constraint_explain_type(expr_type, ct, ACT_CT_FROM); + + return 0; +} + +static int +asn1print_expr(asn1p_t *asn, asn1p_module_t *mod, asn1p_expr_t *tc, enum asn1print_flags flags, int level) { if(flags & APF_LINE_COMMENTS) INDENT("-- #line %d\n", tc->_lineno); @@ -413,7 +489,7 @@ asn1print_expr(asn1p_expr_t *tc, enum asn1print_flags_e flags, int level) { /* * Print the expression as it were stand-alone type. */ - asn1print_expr(se, flags, level + 4); + asn1print_expr(asn, mod, se, flags, level + 4); switch(se->marker) { case EM_NOMARK: break; case EM_OPTIONAL: printf(" OPTIONAL"); break; @@ -440,6 +516,7 @@ asn1print_expr(asn1p_expr_t *tc, enum asn1print_flags_e flags, int level) { printf(" "); asn1print_constraint(tc->constraints, flags); } + if(tc->unique) { printf(" UNIQUE"); } @@ -455,5 +532,22 @@ asn1print_expr(asn1p_expr_t *tc, enum asn1print_flags_e flags, int level) { printf(")"); } + if(flags & APF_DEBUG_CONSTRAINTS) { + asn1p_expr_t *top_parent; + + if(tc->combined_constraints) { + printf("\n-- Combined constraints: "); + asn1print_constraint(tc->combined_constraints, flags); + } + + top_parent = asn1f_find_terminal_type_ex(asn, mod, tc, NULL); + if(top_parent) { + printf("\n-- PER-visible constraints: "); + asn1print_constraint_explain(top_parent->expr_type, + tc->combined_constraints); + } + } + return 0; } + |