diff options
author | Lev Walkin <vlm@lionet.info> | 2004-10-13 09:13:56 +0000 |
---|---|---|
committer | Lev Walkin <vlm@lionet.info> | 2004-10-13 09:13:56 +0000 |
commit | f748451c7b70297b62b072b041261527f01ec847 (patch) | |
tree | c9de041837e705ddeb83402b2da3bccd86e32cd3 /libasn1print | |
parent | 144db9ba4ff5b048fa49274ef5d25d67f216deb3 (diff) |
-X for XML DTD
Diffstat (limited to 'libasn1print')
-rw-r--r-- | libasn1print/asn1print.c | 141 | ||||
-rw-r--r-- | libasn1print/asn1print.h | 1 |
2 files changed, 137 insertions, 5 deletions
diff --git a/libasn1print/asn1print.c b/libasn1print/asn1print.c index 4132204f..a6c3edb5 100644 --- a/libasn1print/asn1print.c +++ b/libasn1print/asn1print.c @@ -10,7 +10,7 @@ #include "asn1print.h" #define INDENT(fmt, args...) do { \ - int __i = level; while(__i--) putchar(' '); \ + int __i = level; while(__i--) printf(" "); \ printf(fmt, ##args); \ } while(0) @@ -22,8 +22,8 @@ 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); +static int asn1print_expr(asn1p_t *asn, asn1p_module_t *mod, asn1p_expr_t *tc, enum asn1print_flags flags, int level); +static int asn1print_expr_dtd(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. @@ -38,6 +38,9 @@ asn1print(asn1p_t *asn, enum asn1print_flags flags) { return -1; } + if(flags & APF_PRINT_XML_DTD) + printf("<!-- XML DTD generated by asn1c-" VERSION " -->\n\n"); + TQ_FOR(mod, &(asn->modules), mod_next) { if(modno++) printf("\n"); asn1print_module(asn, mod, flags); @@ -50,12 +53,28 @@ static int asn1print_module(asn1p_t *asn, asn1p_module_t *mod, enum asn1print_flags flags) { asn1p_expr_t *tc; + if(flags & APF_PRINT_XML_DTD) + printf("<!-- ASN.1 module\n"); + printf("%s ", mod->Identifier); if(mod->module_oid) { asn1print_oid(mod->module_oid, flags); printf("\n"); } + if(flags & APF_PRINT_XML_DTD) { + if(mod->source_file_name + && strcmp(mod->source_file_name, "-")) + printf("found in %s", mod->source_file_name); + printf(" -->\n\n"); + + TQ_FOR(tc, &(mod->members), next) { + asn1print_expr_dtd(asn, mod, tc, flags, 0); + } + + return 0; + } + printf("DEFINITIONS"); if(mod->module_flags & MSF_TAG_INSTRUCTIONS) @@ -442,7 +461,7 @@ asn1print_expr(asn1p_t *asn, asn1p_module_t *mod, asn1p_expr_t *tc, enum asn1pri int SEQ_OF = 0; if(flags & APF_LINE_COMMENTS) - INDENT("-- #line %d\n", tc->_lineno); + INDENT("-- #line %d\n", tc->_lineno); if(tc->Identifier) INDENT("%s", tc->Identifier); @@ -539,7 +558,7 @@ asn1print_expr(asn1p_t *asn, asn1p_module_t *mod, asn1p_expr_t *tc, enum asn1pri /* * Print the expression as it were a stand-alone type. */ - asn1print_expr(asn, mod, se, flags, level + 4); + asn1print_expr(asn, mod, se, flags, level + 1); if((se->marker.flags & EM_DEFAULT) == EM_DEFAULT) { printf(" DEFAULT "); asn1print_value(se->marker.default_value, flags); @@ -614,3 +633,115 @@ asn1print_expr(asn1p_t *asn, asn1p_module_t *mod, asn1p_expr_t *tc, enum asn1pri return 0; } + +static int +asn1print_expr_dtd(asn1p_t *asn, asn1p_module_t *mod, asn1p_expr_t *expr, enum asn1print_flags flags, int level) { + asn1p_expr_t *se; + int expr_unordered = 0; + + switch(expr->meta_type) { + case AMT_TYPE: + case AMT_TYPEREF: + break; + default: + if(expr->expr_type == A1TC_UNIVERVAL) + break; + return 0; + } + + if(!expr->Identifier) return 0; + + if(expr->expr_type == ASN_CONSTR_CHOICE + || expr->expr_type == ASN_CONSTR_SEQUENCE_OF + || expr->expr_type == ASN_CONSTR_SET_OF + || expr->expr_type == ASN_CONSTR_SET + || expr->expr_type == ASN_BASIC_INTEGER + || expr->expr_type == ASN_BASIC_ENUMERATED) { + expr_unordered = 1; + } + + if(flags & APF_LINE_COMMENTS) + INDENT("<!-- #line %d -->\n", expr->_lineno); + INDENT("<!ELEMENT %s", expr->Identifier); + + if(expr->expr_type == A1TC_REFERENCE) { + se = asn1f_find_terminal_type_ex(asn, expr); + if(!se) { + printf("(ANY)"); + return 0; + } + expr = se; + } + + if(TQ_FIRST(&expr->members)) { + int extensible = 0; + printf(" ("); + TQ_FOR(se, &(expr->members), next) { + if(se->expr_type == A1TC_EXTENSIBLE) { + extensible = 1; + continue; + } else if(!se->Identifier + && se->expr_type == A1TC_REFERENCE) { + asn1print_ref(se->reference, flags); + } else if(se->Identifier) { + printf("%s", se->Identifier); + } else { + printf("ANY"); + } + if(expr->expr_type != ASN_CONSTR_SET + && expr->expr_type != ASN_CONSTR_CHOICE + && expr->expr_type != ASN_BASIC_INTEGER + && expr->expr_type != ASN_BASIC_ENUMERATED) { + if(expr_unordered) + printf("*"); + else if(se->marker.flags) + printf("?"); + } + if(TQ_NEXT(se, next) + && TQ_NEXT(se, next)->expr_type != A1TC_EXTENSIBLE) { + printf(expr_unordered?"|":", "); + } + } + if(extensible) { + printf(expr_unordered?"|":", "); + printf("ANY"); + if(expr->expr_type != ASN_CONSTR_SET + && expr->expr_type != ASN_CONSTR_CHOICE + && expr->expr_type != ASN_BASIC_INTEGER + && expr->expr_type != ASN_BASIC_ENUMERATED) + printf("*"); + } + + printf(")"); + if(expr->expr_type == ASN_CONSTR_SET) + printf("*"); + + } else if((expr->expr_type & ASN_CONSTR_MASK) + || expr->expr_type == ASN_BASIC_NULL) { + printf(" EMPTY"); + } else if(expr->expr_type == A1TC_UNIVERVAL) { + printf(" EMPTY"); + } else if(expr->expr_type == ASN_TYPE_ANY) { + printf(" ANY"); + } else if(expr->expr_type == ASN_BASIC_BIT_STRING + || expr->expr_type == ASN_BASIC_OBJECT_IDENTIFIER + || expr->expr_type == ASN_BASIC_RELATIVE_OID + || expr->expr_type == ASN_BASIC_UTCTime + || expr->expr_type == ASN_BASIC_GeneralizedTime + ) { + printf(" (#CDATA)"); + } else { + printf(" (#PCDATA)"); + } + printf(">\n"); + + /* + * Display the descendants (children) of the current type. + */ + TQ_FOR(se, &(expr->members), next) { + if(se->expr_type == A1TC_EXTENSIBLE) continue; + asn1print_expr_dtd(asn, mod, se, flags, level + 1); + } + + return 0; +} diff --git a/libasn1print/asn1print.h b/libasn1print/asn1print.h index c24e58e8..51233e99 100644 --- a/libasn1print/asn1print.h +++ b/libasn1print/asn1print.h @@ -5,6 +5,7 @@ enum asn1print_flags { APF_NOFLAGS, APF_LINE_COMMENTS = 0x01, /* Include line comments */ APF_DEBUG_CONSTRAINTS = 0x02, /* Explain constraints */ + APF_PRINT_XML_DTD = 0x04, /* Generate XML DTD */ }; /* |