aboutsummaryrefslogtreecommitdiffstats
path: root/libasn1print
diff options
context:
space:
mode:
authorLev Walkin <vlm@lionet.info>2004-10-13 09:13:56 +0000
committerLev Walkin <vlm@lionet.info>2004-10-13 09:13:56 +0000
commitf748451c7b70297b62b072b041261527f01ec847 (patch)
treec9de041837e705ddeb83402b2da3bccd86e32cd3 /libasn1print
parent144db9ba4ff5b048fa49274ef5d25d67f216deb3 (diff)
-X for XML DTD
Diffstat (limited to 'libasn1print')
-rw-r--r--libasn1print/asn1print.c141
-rw-r--r--libasn1print/asn1print.h1
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 */
};
/*