diff --git a/ChangeLog b/ChangeLog index c4b1ab21..0a8030c2 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,6 +1,7 @@ -0.9.7.2: 2004-Oct-12 +0.9.8: 2004-Oct-13 + * -X command line option added to asn1c to generate XML DTD. * Empty SEQUENCE and SET clauses are now allowed. 0.9.7.1: 2004-Oct-12 diff --git a/asn1c/asn1c.1 b/asn1c/asn1c.1 index b331d440..7a6f87f5 100644 --- a/asn1c/asn1c.1 +++ b/asn1c/asn1c.1 @@ -3,18 +3,19 @@ asn1c \- ASN.1 Compiler .SH SYNOPSIS asn1c [\fB\-E\fR [\fB-F\fR] | \fB\-P\fR | \fB\-R\fR] - [\fB\-S\fR\fIdir\fR] + [\fB\-S\fR\fIdir\fR] [\fB-X\fR] [\fB\-W\fR\fIdebug-\fR...] [\fB\-f\fR\fIoption\fR...] [\fB\-p\fR\fIrint-\fR...] \fIinfile\fR... .SH DESCRIPTION asn1c compiles the ASN.1 specifications into the set of -target language (C/C++) encoders and decoders for BER, DER, +target language (C/C++) encoders and decoders for BER, DER, XER, and other encoding standards. .SH OPTIONS .TP \fIOverall Options\fR \fB\-E \-F \-P \-R\fR .BI "\-S " directory +\fB\-X .TP \fIWarning Options\fR .br @@ -50,6 +51,9 @@ omitting the usual support code. .TP \fB\-S\fR \fIdirectory\fR Use the specified directory with ASN.1 skeleton files. +.TP +.B \-X +Generate the XML DTD schema for the specified ASN.1 files. .SH WARNING OPTIONS .TP .B \-Werror diff --git a/asn1c/asn1c.c b/asn1c/asn1c.c index 98a607aa..32e6e744 100644 --- a/asn1c/asn1c.c +++ b/asn1c/asn1c.c @@ -70,7 +70,7 @@ main(int ac, char **av) { /* * Process command-line options. */ - while((ch = getopt(ac, av, "EFf:hLPp:RS:vW:")) != -1) + while((ch = getopt(ac, av, "EFf:hLPp:RS:vW:X")) != -1) switch(ch) { case 'E': print_arg__print_out = 1; @@ -146,6 +146,11 @@ main(int ac, char **av) { exit(EX_USAGE); } break; + case 'X': + print_arg__print_out = 1; /* Implicit -E */ + print_arg__fix_n_print = 1; /* Implicit -F */ + asn1_printer_flags |= APF_PRINT_XML_DTD; + break; default: usage(av[0]); } @@ -299,6 +304,7 @@ usage(const char *av0) { " -R Restrict output (tables only, no support code)\n" " -S Directory with support (skeleton?) files\n" " (Default is \"%s\")\n" +" -X Generate and print the XML DTD\n" "\n" " -Werror Treat warnings as errors; abort if any warning\n" diff --git a/configure b/configure index 78e1c9a9..75013376 100755 --- a/configure +++ b/configure @@ -1881,7 +1881,7 @@ fi # Define the identity of the package. PACKAGE=asn1c - VERSION=0.9.7.2 + VERSION=0.9.8 cat >>confdefs.h <<_ACEOF diff --git a/configure.in b/configure.in index 5c6a1e79..ce67231d 100644 --- a/configure.in +++ b/configure.in @@ -3,7 +3,7 @@ AC_INIT(libasn1parser/asn1p_y.y) AC_CANONICAL_BUILD AC_CANONICAL_TARGET AC_PREREQ(2.53) -AM_INIT_AUTOMAKE(asn1c, 0.9.7.2) +AM_INIT_AUTOMAKE(asn1c, 0.9.8) AM_MAINTAINER_MODE diff --git a/doc/asn1c-usage.html b/doc/asn1c-usage.html index fcc2980c..e9096bfc 100644 --- a/doc/asn1c-usage.html +++ b/doc/asn1c-usage.html @@ -692,6 +692,9 @@ ting the usual support code. -S <directory> Use the specified directory with ASN.1 skeleton files. +-X +Generate the XML DTD schema for the specified ASN.1 modules. + Warning Options Description diff --git a/doc/asn1c-usage.lyx b/doc/asn1c-usage.lyx index 012503c0..c6b377f9 100644 --- a/doc/asn1c-usage.lyx +++ b/doc/asn1c-usage.lyx @@ -71,7 +71,7 @@ status Open \backslash lhead{Document describes \backslash -href{http://lionet.info/soft/asn1c-0.9.6.tar.gz}{asn1c-0.9.6}} +href{http://lionet.info/asn1c}{asn1c-0.9.8}} \layout Standard \backslash @@ -1341,7 +1341,7 @@ collapsed false \begin_inset Tabular - + @@ -1452,7 +1452,7 @@ Restrict the compiler to generate only the ASN.1 tables, omit- ting the usual \end_inset - + \begin_inset Text @@ -1474,6 +1474,24 @@ Use the specified directory with ASN.1 skeleton files. \end_inset + + +\begin_inset Text + +\layout Standard + +-X +\end_inset + + +\begin_inset Text + +\layout Standard + +Generate the XML DTD for the specified ASN.1 modules. +\end_inset + + \begin_inset Text diff --git a/doc/asn1c-usage.pdf b/doc/asn1c-usage.pdf index df871b0c..bab14c44 100644 Binary files a/doc/asn1c-usage.pdf and b/doc/asn1c-usage.pdf differ 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("\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("\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("\n", expr->_lineno); + INDENT("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 */ }; /*