diff options
author | Lev Walkin <vlm@lionet.info> | 2010-11-09 03:10:36 -0800 |
---|---|---|
committer | Lev Walkin <vlm@lionet.info> | 2010-11-09 03:26:07 -0800 |
commit | e7c4b9665540dc6d3f09f5efd1a6e13bb8f477f3 (patch) | |
tree | 82c7af80da5897addfa859ae4bcf53bb19d25414 /doc | |
parent | 978eb142d488f6a908faeab33d24ab4cf9fe2374 (diff) |
update automake and move doc -> docsrc
Diffstat (limited to 'doc')
-rw-r--r-- | doc/Makefile.am | 15 | ||||
-rw-r--r-- | doc/Makefile.in | 267 | ||||
-rw-r--r-- | doc/asn1c-quick.pdf | bin | 160679 -> 150028 bytes | |||
-rw-r--r-- | doc/asn1c-usage.html | 1811 | ||||
-rw-r--r-- | doc/docsrc/Makefile.am | 10 | ||||
-rw-r--r-- | doc/docsrc/Makefile.in | 340 | ||||
-rw-r--r-- | doc/docsrc/asn1c-usage.tex (renamed from doc/asn1c-usage.tex) | 0 |
7 files changed, 559 insertions, 1884 deletions
diff --git a/doc/Makefile.am b/doc/Makefile.am index 781acbf8..a714512c 100644 --- a/doc/Makefile.am +++ b/doc/Makefile.am @@ -1,16 +1,9 @@ -docsdir = $(datadir)/doc/asn1c +SUBDIRS = docsrc -docs_DATA = $(srcdir)/*.pdf \ - $(srcdir)/*.html +docsdir = $(datadir)/doc/asn1c -EXTRA_DIST = $(srcdir)/*.pdf \ - $(srcdir)/*.html +docs_DATA = $(srcdir)/*.pdf -regen: - pdflatex --output-format=dvi asn1c-usage - pdflatex --output-format=dvi asn1c-usage - pdflatex --output-format=dvi asn1c-usage - dvipdf asn1c-usage +EXTRA_DIST = $(srcdir)/*.pdf -CLEANFILES = *.*~ *.aux *.dvi *.log *.out *.toc diff --git a/doc/Makefile.in b/doc/Makefile.in index 513c6b32..07cb4058 100644 --- a/doc/Makefile.in +++ b/doc/Makefile.in @@ -32,11 +32,13 @@ PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ -target_triplet = @target@ subdir = doc DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 -am__aclocal_m4_deps = $(top_srcdir)/configure.in +am__aclocal_m4_deps = $(top_srcdir)/m4/libtool.m4 \ + $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ + $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ + $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs @@ -44,6 +46,13 @@ CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = SOURCES = DIST_SOURCES = +RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ + html-recursive info-recursive install-data-recursive \ + install-dvi-recursive install-exec-recursive \ + install-html-recursive install-info-recursive \ + install-pdf-recursive install-ps-recursive install-recursive \ + installcheck-recursive installdirs-recursive pdf-recursive \ + ps-recursive uninstall-recursive am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ @@ -53,6 +62,11 @@ am__strip_dir = `echo $$p | sed -e 's|^.*/||'`; am__installdirs = "$(DESTDIR)$(docsdir)" docsDATA_INSTALL = $(INSTALL_DATA) DATA = $(docs_DATA) +RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ + distclean-recursive maintainer-clean-recursive +ETAGS = etags +CTAGS = ctags +DIST_SUBDIRS = $(SUBDIRS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ADD_CFLAGS = @ADD_CFLAGS@ @@ -65,7 +79,6 @@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ -CONFIGURE_DEPENDS = @CONFIGURE_DEPENDS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ @@ -96,7 +109,6 @@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ -MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ NM = @NM@ @@ -167,25 +179,17 @@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ -target = @target@ target_alias = @target_alias@ -target_cpu = @target_cpu@ -target_os = @target_os@ -target_vendor = @target_vendor@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ +SUBDIRS = docsrc docsdir = $(datadir)/doc/asn1c -docs_DATA = $(srcdir)/*.pdf \ - $(srcdir)/*.html - -EXTRA_DIST = $(srcdir)/*.pdf \ - $(srcdir)/*.html - -CLEANFILES = *.*~ *.aux *.dvi *.log *.out *.toc -all: all-am +docs_DATA = $(srcdir)/*.pdf +EXTRA_DIST = $(srcdir)/*.pdf +all: all-recursive .SUFFIXES: -$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ @@ -210,9 +214,9 @@ Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh -$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) +$(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh -$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) +$(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh mostlyclean-libtool: @@ -237,12 +241,137 @@ uninstall-docsDATA: echo " rm -f '$(DESTDIR)$(docsdir)/$$f'"; \ rm -f "$(DESTDIR)$(docsdir)/$$f"; \ done + +# This directory's subdirectories are mostly independent; you can cd +# into them and run `make' without going through this Makefile. +# To change the values of `make' variables: instead of editing Makefiles, +# (1) if the variable is set in `config.status', edit `config.status' +# (which will cause the Makefiles to be regenerated when you run `make'); +# (2) otherwise, pass the desired values on the `make' command line. +$(RECURSIVE_TARGETS): + @failcom='exit 1'; \ + for f in x $$MAKEFLAGS; do \ + case $$f in \ + *=* | --[!k]*);; \ + *k*) failcom='fail=yes';; \ + esac; \ + done; \ + dot_seen=no; \ + target=`echo $@ | sed s/-recursive//`; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + echo "Making $$target in $$subdir"; \ + if test "$$subdir" = "."; then \ + dot_seen=yes; \ + local_target="$$target-am"; \ + else \ + local_target="$$target"; \ + fi; \ + (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + || eval $$failcom; \ + done; \ + if test "$$dot_seen" = "no"; then \ + $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ + fi; test -z "$$fail" + +$(RECURSIVE_CLEAN_TARGETS): + @failcom='exit 1'; \ + for f in x $$MAKEFLAGS; do \ + case $$f in \ + *=* | --[!k]*);; \ + *k*) failcom='fail=yes';; \ + esac; \ + done; \ + dot_seen=no; \ + case "$@" in \ + distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ + *) list='$(SUBDIRS)' ;; \ + esac; \ + rev=''; for subdir in $$list; do \ + if test "$$subdir" = "."; then :; else \ + rev="$$subdir $$rev"; \ + fi; \ + done; \ + rev="$$rev ."; \ + target=`echo $@ | sed s/-recursive//`; \ + for subdir in $$rev; do \ + echo "Making $$target in $$subdir"; \ + if test "$$subdir" = "."; then \ + local_target="$$target-am"; \ + else \ + local_target="$$target"; \ + fi; \ + (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + || eval $$failcom; \ + done && test -z "$$fail" +tags-recursive: + list='$(SUBDIRS)'; for subdir in $$list; do \ + test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ + done +ctags-recursive: + list='$(SUBDIRS)'; for subdir in $$list; do \ + test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ + done + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + mkid -fID $$unique tags: TAGS -TAGS: +TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + here=`pwd`; \ + if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ + include_option=--etags-include; \ + empty_fix=.; \ + else \ + include_option=--include; \ + empty_fix=; \ + fi; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + test ! -f $$subdir/TAGS || \ + tags="$$tags $$include_option=$$here/$$subdir/TAGS"; \ + fi; \ + done; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$tags $$unique; \ + fi ctags: CTAGS -CTAGS: - +CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + test -z "$(CTAGS_ARGS)$$tags$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$tags $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && cd $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) $$here + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ @@ -270,22 +399,40 @@ distdir: $(DISTFILES) || exit 1; \ fi; \ done + list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + test -d "$(distdir)/$$subdir" \ + || $(MKDIR_P) "$(distdir)/$$subdir" \ + || exit 1; \ + distdir=`$(am__cd) $(distdir) && pwd`; \ + top_distdir=`$(am__cd) $(top_distdir) && pwd`; \ + (cd $$subdir && \ + $(MAKE) $(AM_MAKEFLAGS) \ + top_distdir="$$top_distdir" \ + distdir="$$distdir/$$subdir" \ + am__remove_distdir=: \ + am__skip_length_check=: \ + distdir) \ + || exit 1; \ + fi; \ + done check-am: all-am -check: check-am +check: check-recursive all-am: Makefile $(DATA) -installdirs: +installdirs: installdirs-recursive +installdirs-am: for dir in "$(DESTDIR)$(docsdir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done -install: install-am -install-exec: install-exec-am -install-data: install-data-am -uninstall: uninstall-am +install: install-recursive +install-exec: install-exec-recursive +install-data: install-data-recursive +uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am -installcheck: installcheck-am +installcheck: installcheck-recursive install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ @@ -294,7 +441,6 @@ install-strip: mostlyclean-generic: clean-generic: - -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) @@ -302,80 +448,77 @@ distclean-generic: maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -clean: clean-am +clean: clean-recursive clean-am: clean-generic clean-libtool mostlyclean-am -distclean: distclean-am +distclean: distclean-recursive -rm -f Makefile -distclean-am: clean-am distclean-generic +distclean-am: clean-am distclean-generic distclean-tags -dvi: dvi-am +dvi: dvi-recursive dvi-am: -html: html-am +html: html-recursive -info: info-am +info: info-recursive info-am: install-data-am: install-docsDATA -install-dvi: install-dvi-am +install-dvi: install-dvi-recursive install-exec-am: -install-html: install-html-am +install-html: install-html-recursive -install-info: install-info-am +install-info: install-info-recursive install-man: -install-pdf: install-pdf-am +install-pdf: install-pdf-recursive -install-ps: install-ps-am +install-ps: install-ps-recursive installcheck-am: -maintainer-clean: maintainer-clean-am +maintainer-clean: maintainer-clean-recursive -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic -mostlyclean: mostlyclean-am +mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-generic mostlyclean-libtool -pdf: pdf-am +pdf: pdf-recursive pdf-am: -ps: ps-am +ps: ps-recursive ps-am: uninstall-am: uninstall-docsDATA -.MAKE: install-am install-strip - -.PHONY: all all-am check check-am clean clean-generic clean-libtool \ - distclean distclean-generic distclean-libtool distdir dvi \ - dvi-am html html-am info info-am install install-am \ - install-data install-data-am install-docsDATA install-dvi \ - install-dvi-am install-exec install-exec-am install-html \ - install-html-am install-info install-info-am install-man \ - install-pdf install-pdf-am install-ps install-ps-am \ - install-strip installcheck installcheck-am installdirs \ +.MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) install-am \ + install-strip + +.PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \ + all all-am check check-am clean clean-generic clean-libtool \ + ctags ctags-recursive distclean distclean-generic \ + distclean-libtool distclean-tags distdir dvi dvi-am html \ + html-am info info-am install install-am install-data \ + install-data-am install-docsDATA install-dvi install-dvi-am \ + install-exec install-exec-am install-html install-html-am \ + install-info install-info-am install-man install-pdf \ + install-pdf-am install-ps install-ps-am install-strip \ + installcheck installcheck-am installdirs installdirs-am \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ - uninstall uninstall-am uninstall-docsDATA - + tags tags-recursive uninstall uninstall-am uninstall-docsDATA -regen: - pdflatex --output-format=dvi asn1c-usage - pdflatex --output-format=dvi asn1c-usage - pdflatex --output-format=dvi asn1c-usage - dvipdf asn1c-usage # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: diff --git a/doc/asn1c-quick.pdf b/doc/asn1c-quick.pdf Binary files differindex dc64f320..5081540e 100644 --- a/doc/asn1c-quick.pdf +++ b/doc/asn1c-quick.pdf diff --git a/doc/asn1c-usage.html b/doc/asn1c-usage.html deleted file mode 100644 index b6b484b0..00000000 --- a/doc/asn1c-usage.html +++ /dev/null @@ -1,1811 +0,0 @@ - -<!--Converted with LaTeX2HTML 2002-2-1 (1.70) -original version by: Nikos Drakos, CBLU, University of Leeds -* revised and updated by: Marcus Hennecke, Ross Moore, Herb Swan -* with significant contributions from: - Jens Lippmann, Marek Rouchal, Martin Wilck and others --> -<HTML> -<HEAD> -<TITLE>Using the Open Source ASN.1 Compiler</TITLE> -<META NAME="description" CONTENT="Using the Open Source ASN.1 Compiler"> -<META NAME="keywords" CONTENT="ASN.1, asn1c, compiler, BER, DER, XER"> - - - -</HEAD> - -<BODY > - -<P> - -<P> - -<P> -<H1 ALIGN="CENTER">Using the Open Source ASN.1 Compiler</H1><DIV> - -<P ALIGN="CENTER"><STRONG>Lev Walkin <<A HREF=mailto:vlm@lionet.info?Subject=asn1c>vlm@lionet.info</A>></STRONG></P> -</DIV> - -<P> -<!-- MATH - $Revision$ - --> -<FONT COLOR=red><B>Download the <A HREF=asn1c-usage.pdf>PDF</A> version</B></FONT> - -<P> -<BR> - -<H2><A NAME="SECTION01000000000000000000"> -Contents</A> -</H2> -<!--Table of Contents--> - -<UL> -<LI><A NAME="tex2html51" - HREF="asn1c-usage.html#SECTION02000000000000000000">Using the ASN.1 Compiler</A> -<UL> -<LI><A NAME="tex2html52" - HREF="asn1c-usage.html#SECTION02100000000000000000">Introduction to the ASN.1 Compiler</A> -<UL> -<LI><A NAME="tex2html53" - HREF="asn1c-usage.html#SECTION02110000000000000000">Quick start with asn1c</A> -<LI><A NAME="tex2html54" - HREF="asn1c-usage.html#SECTION02120000000000000000">Recognizing compiler output</A> -<LI><A NAME="tex2html55" - HREF="asn1c-usage.html#SECTION02130000000000000000">Command line options</A> -</UL> -<LI><A NAME="tex2html56" - HREF="asn1c-usage.html#SECTION02200000000000000000">Using the ASN.1 Compiler</A> -<UL> -<LI><A NAME="tex2html57" - HREF="asn1c-usage.html#SECTION02210000000000000000">Invoking the ASN.1 helper code</A> -<UL> -<LI><A NAME="tex2html58" - HREF="asn1c-usage.html#SECTION02211000000000000000">Decoding BER</A> -<LI><A NAME="tex2html59" - HREF="asn1c-usage.html#SECTION02212000000000000000">Encoding DER</A> -<LI><A NAME="tex2html60" - HREF="asn1c-usage.html#SECTION02213000000000000000">Encoding XER</A> -<LI><A NAME="tex2html61" - HREF="asn1c-usage.html#SECTION02214000000000000000">Decoding XER</A> -<LI><A NAME="tex2html62" - HREF="asn1c-usage.html#SECTION02215000000000000000">Validating the target structure</A> -<LI><A NAME="tex2html63" - HREF="asn1c-usage.html#SECTION02216000000000000000">Printing the target structure</A> -<LI><A NAME="tex2html64" - HREF="asn1c-usage.html#SECTION02217000000000000000">Freeing the target structure</A> -</UL> -</UL> -<LI><A NAME="tex2html65" - HREF="asn1c-usage.html#SECTION02300000000000000000">Step by step examples</A> -<UL> -<LI><A NAME="tex2html66" - HREF="asn1c-usage.html#SECTION02310000000000000000">A ''Rectangle'' Encoder</A> -<LI><A NAME="tex2html67" - HREF="asn1c-usage.html#SECTION02320000000000000000">A ''Rectangle'' Decoder</A> -</UL> -<LI><A NAME="tex2html68" - HREF="asn1c-usage.html#SECTION02400000000000000000">Constraint validation examples</A> -<UL> -<LI><A NAME="tex2html69" - HREF="asn1c-usage.html#SECTION02410000000000000000">Adding constraints into ''Rectangle'' type</A> -</UL> -</UL><BR> -<LI><A NAME="tex2html70" - HREF="asn1c-usage.html#SECTION03000000000000000000">ASN.1 Basics</A> -<UL> -<LI><A NAME="tex2html71" - HREF="asn1c-usage.html#SECTION03100000000000000000">Abstract Syntax Notation: ASN.1</A> -<UL> -<LI><A NAME="tex2html72" - HREF="asn1c-usage.html#SECTION03110000000000000000">Some of the ASN.1 Basic Types</A> -<UL> -<LI><A NAME="tex2html73" - HREF="asn1c-usage.html#SECTION03111000000000000000">The BOOLEAN type</A> -<LI><A NAME="tex2html74" - HREF="asn1c-usage.html#SECTION03112000000000000000">The INTEGER type</A> -<LI><A NAME="tex2html75" - HREF="asn1c-usage.html#SECTION03113000000000000000">The ENUMERATED type</A> -<LI><A NAME="tex2html76" - HREF="asn1c-usage.html#SECTION03114000000000000000">The OCTET STRING type</A> -<LI><A NAME="tex2html77" - HREF="asn1c-usage.html#SECTION03115000000000000000">The OBJECT IDENTIFIER type</A> -<LI><A NAME="tex2html78" - HREF="asn1c-usage.html#SECTION03116000000000000000">The RELATIVE-OID type</A> -</UL> -<LI><A NAME="tex2html79" - HREF="asn1c-usage.html#SECTION03120000000000000000">Some of the ASN.1 String Types</A> -<UL> -<LI><A NAME="tex2html80" - HREF="asn1c-usage.html#SECTION03121000000000000000">The IA5String type</A> -<LI><A NAME="tex2html81" - HREF="asn1c-usage.html#SECTION03122000000000000000">The UTF8String type</A> -<LI><A NAME="tex2html82" - HREF="asn1c-usage.html#SECTION03123000000000000000">The NumericString type</A> -<LI><A NAME="tex2html83" - HREF="asn1c-usage.html#SECTION03124000000000000000">The PrintableString type</A> -<LI><A NAME="tex2html84" - HREF="asn1c-usage.html#SECTION03125000000000000000">The VisibleString type</A> -</UL> -<LI><A NAME="tex2html85" - HREF="asn1c-usage.html#SECTION03130000000000000000">ASN.1 Constructed Types</A> -<UL> -<LI><A NAME="tex2html86" - HREF="asn1c-usage.html#SECTION03131000000000000000">The SEQUENCE type</A> -<LI><A NAME="tex2html87" - HREF="asn1c-usage.html#SECTION03132000000000000000">The SET type</A> -<LI><A NAME="tex2html88" - HREF="asn1c-usage.html#SECTION03133000000000000000">The CHOICE type</A> -<LI><A NAME="tex2html89" - HREF="asn1c-usage.html#SECTION03134000000000000000">The SEQUENCE OF type</A> -<LI><A NAME="tex2html90" - HREF="asn1c-usage.html#SECTION03135000000000000000">The SET OF type</A> -</UL> -</UL> -</UL><BR> -<LI><A NAME="tex2html91" - HREF="asn1c-usage.html#SECTION04000000000000000000">Bibliography</A> -</UL> -<!--End of Table of Contents--> - -<P> - -<P> - -<H1><A NAME="SECTION02000000000000000000"> -Using the ASN.1 Compiler</A> -</H1> - -<P> - -<H1><A NAME="SECTION02100000000000000000"> -Introduction to the ASN.1 Compiler</A> -</H1> - -<P> -The purpose of the ASN.1 compiler, of which this document is part, -is to convert the specifications in ASN.1 notation into some other -language. At this moment, only C and C++ target languages are supported, -the latter is in upward compatibility mode. - -<P> -The compiler reads the specification and emits a series of target -language structures (C's structs, unions, enums) describing the corresponding -ASN.1 types. The compiler also creates the code which allows automatic -serialization and deserialization of these structures using several -standardized encoding rules (BER, DER, XER). - -<P> -For example, suppose the following ASN.1 module is given<A NAME="tex2html1" - HREF="#foot843"><SUP>1.1</SUP></A>: - -<P> - -<BLOCKQUOTE><PRE> -RectangleTest DEFINITIONS ::= -BEGIN - -Rectangle ::= SEQUENCE { - height INTEGER, -- Height of the rectangle - width INTEGER -- Width of the rectangle -} - -END -</PRE> -</BLOCKQUOTE> -The compiler would read this ASN.1 definition and produce the following -C type<A NAME="tex2html2" - HREF="#foot844"><SUP>1.2</SUP></A>: - -<P> - -<BLOCKQUOTE><PRE> -typedef struct Rectangle_s { - int height; - int width; -} Rectangle_t; -</PRE> -</BLOCKQUOTE> -It would also create the code for converting this structure into platform-independent -wire representation (a serializer API) and the decoder of such wire -representation back into local, machine-specific type (a deserializer -API). - -<P> - -<H1><A NAME="SECTION02110000000000000000"> -Quick start with asn1c</A> -</H1> - -<P> -After building and installing the compiler, the <I>asn1c</I><A NAME="tex2html3" - HREF="#foot845"><SUP>1.3</SUP></A> command may be used to compile the ASN.1 module<A NAME="tex2html4" - HREF="#foot846"><SUP>1.4</SUP></A>: - -<P> - -<BLOCKQUOTE><PRE> -asn1c <I><module.asn1></I> -</PRE> -</BLOCKQUOTE> -If several ASN.1 modules contain interdependencies, all of the files -must be specified altogether: - -<P> - -<BLOCKQUOTE><PRE> -asn1c <I><module1.asn1> <module2.asn1> ...</I> -</PRE> -</BLOCKQUOTE> -The compiler <B>-E</B> and <B>-EF</B> options are used for testing -the parser and the semantic fixer, respectively. These options will -instruct the compiler to dump out the parsed (and fixed, if <B>-F</B> -is involved) ASN.1 specification as it was "understood" -by the compiler. It might be useful to check whether a particular -syntactic construction is properly supported by the compiler. - -<P> - -<BLOCKQUOTE><PRE> -asn1c <B>-EF</B> <I><module-to-test.asn1></I> -</PRE> -</BLOCKQUOTE> -The <B>-P</B> option is used to dump the compiled output on the -screen instead of creating a bunch of .c and .h files on disk in the -current directory. You would probably want to start with <B>-P</B> -option instead of creating a mess in your current directory. Another -option, <B>-R</B>, asks compiler to only generate the files which -need to be generated, and supress linking in the numerous support -files. - -<P> -Print the compiled output instead of creating multiple source files: - -<P> - -<BLOCKQUOTE><PRE> -asn1c <B>-P</B> <I><module-to-compile-and-print.asn1></I> -</PRE> -</BLOCKQUOTE> - -<P> - -<H1><A NAME="SECTION02120000000000000000"> -Recognizing compiler output</A> -</H1> - -<P> -After compiling, the following entities will be created in your current -directory: - -<P> - -<UL> -<LI>A set of .c and .h files, generally a single pair for each type defined -in the ASN.1 specifications. These files will be named similarly to -the ASN.1 types (<I>Rectangle.c</I> and <I>Rectangle.h</I> for the -RectangleTest ASN.1 module defined in the beginning of this document). -</LI> -<LI>A set of helper .c and .h files which contain generic encoders, decoders -and other useful routines. There will be quite a few of them, some -of them even are not always necessary, but the overall amount of code -after compilation will be rather small anyway. -</LI> -<LI>A <I>Makefile.am.sample</I> file mentioning all the files created -at the earlier steps. This file is suitable for either automake suite -or the plain `make` utility. -</LI> -</UL> -It is your responsibility to create .c file with the <I>int main()</I> -routine. - -<P> -In other words, after compiling the Rectangle module, you have the -following set of files: { Makefile.am.sample, Rectangle.c, Rectangle.h, -<B>...</B> }, where <B>''...''</B> stands for the -set of additional ''helper'' files created by the compiler. If you -add a simple file with the <I>int main()</I> routine, it would even -be possible to compile everything with the single instruction: - -<P> - -<BLOCKQUOTE><PRE> -cc -I. -o rectangle.exe *.c # It could be <I>that</I> simple -</PRE> -</BLOCKQUOTE> -Refer to the Chapter cha:Step-by-step-examples for a sample -<I>int main()</I> routine. - -<P> - -<H1><A NAME="SECTION02130000000000000000"> -Command line options</A> -</H1> - -<P> -The <A HREF=#Table1>Table 1</A> summarizes various options affecting -the compiler's behavior. - -<P> -<BR><P></P> -<DIV ALIGN="CENTER"><A NAME="851"></A> -<TABLE> -<CAPTION><STRONG><A NAME=Table1>Table 1:</A></STRONG> -The list of asn1c command line options</CAPTION> -<TR><TD><TABLE COLS=2 BORDER FRAME=BOX RULES=GROUPS> -<COLGROUP><COL ALIGN=LEFT><COLGROUP><COL ALIGN=JUSTIFY WIDTH="3in"> -<TBODY> -<TR><TD VALIGN=BASELINE ALIGN=LEFT NOWRAP> -<B><FONT SIZE="-1">Overall Options</FONT></B></TD><TD VALIGN=BASELINE ALIGN=LEFT WIDTH="216"> -<B><FONT SIZE="-1">Description</FONT></B></TD></TR> -</TBODY><TBODY> -<TR><TD VALIGN=BASELINE ALIGN=LEFT NOWRAP><FONT SIZE="-1">-E</FONT></TD><TD VALIGN=BASELINE ALIGN=LEFT WIDTH="216"> -<FONT SIZE="-1">Stop after the parsing stage and print the reconstructed ASN.1 -specification code to the standard output.</FONT></TD></TR> -</TBODY><TBODY> -<TR><TD VALIGN=BASELINE ALIGN=LEFT NOWRAP><FONT SIZE="-1">-F</FONT></TD><TD VALIGN=BASELINE ALIGN=LEFT WIDTH="216"> -<FONT SIZE="-1">Used together with -E, instructs the compiler to stop after -the ASN.1 syntax tree fixing stage and dump the reconstructed ASN.1 -specification to the standard output.</FONT></TD></TR> -</TBODY><TBODY> -<TR><TD VALIGN=BASELINE ALIGN=LEFT NOWRAP><FONT SIZE="-1">-P</FONT></TD><TD VALIGN=BASELINE ALIGN=LEFT WIDTH="216"> -<FONT SIZE="-1">Dump the compiled output to the standard output instead of -cre- ating the target language files on disk.</FONT></TD></TR> -</TBODY><TBODY> -<TR><TD VALIGN=BASELINE ALIGN=LEFT NOWRAP><FONT SIZE="-1">-R</FONT></TD><TD VALIGN=BASELINE ALIGN=LEFT WIDTH="216"> -<FONT SIZE="-1">Restrict the compiler to generate only the ASN.1 tables, omit- -ting the usual support code.</FONT></TD></TR> -</TBODY><TBODY> -<TR><TD VALIGN=BASELINE ALIGN=LEFT NOWRAP><FONT SIZE="-1">-S</FONT> <I><FONT SIZE="-1"><directory></FONT></I></TD><TD VALIGN=BASELINE ALIGN=LEFT WIDTH="216"> -<FONT SIZE="-1">Use the specified directory with ASN.1 skeleton files.</FONT></TD></TR> -</TBODY><TBODY> -<TR><TD VALIGN=BASELINE ALIGN=LEFT NOWRAP><FONT SIZE="-1">-X</FONT></TD><TD VALIGN=BASELINE ALIGN=LEFT WIDTH="216"> -<FONT SIZE="-1">Generate the XML DTD for the specified ASN.1 modules.</FONT></TD></TR> -</TBODY><TBODY> -<TR><TD VALIGN=BASELINE ALIGN=LEFT NOWRAP><B><FONT SIZE="-1">Warning Options</FONT></B></TD><TD VALIGN=BASELINE ALIGN=LEFT WIDTH="216"> -<B><FONT SIZE="-1">Description</FONT></B></TD></TR> -</TBODY><TBODY> -<TR><TD VALIGN=BASELINE ALIGN=LEFT NOWRAP><FONT SIZE="-1">-Werror</FONT></TD><TD VALIGN=BASELINE ALIGN=LEFT WIDTH="216"> -<FONT SIZE="-1">Treat warnings as errors; abort if any warning is produced.</FONT></TD></TR> -</TBODY><TBODY> -<TR><TD VALIGN=BASELINE ALIGN=LEFT NOWRAP><FONT SIZE="-1">-Wdebug-lexer</FONT></TD><TD VALIGN=BASELINE ALIGN=LEFT WIDTH="216"> -<FONT SIZE="-1">Enable lexer debugging during the ASN.1 parsing stage.</FONT></TD></TR> -</TBODY><TBODY> -<TR><TD VALIGN=BASELINE ALIGN=LEFT NOWRAP><FONT SIZE="-1">-Wdebug-fixer</FONT></TD><TD VALIGN=BASELINE ALIGN=LEFT WIDTH="216"> - <FONT SIZE="-1">Enable ASN.1 syntax tree fixer debugging during the - fixing stage.</FONT></TD></TR> -</TBODY><TBODY> -<TR><TD VALIGN=BASELINE ALIGN=LEFT NOWRAP><FONT SIZE="-1">-Wdebug-compiler</FONT></TD><TD VALIGN=BASELINE ALIGN=LEFT WIDTH="216"> -<FONT SIZE="-1">Enable debugging during the actual compile time.</FONT></TD></TR> -</TBODY><TBODY> -<TR><TD VALIGN=BASELINE ALIGN=LEFT NOWRAP><B><FONT SIZE="-1">Language Options</FONT></B></TD><TD VALIGN=BASELINE ALIGN=LEFT WIDTH="216"> -<B><FONT SIZE="-1">Description</FONT></B></TD></TR> -</TBODY><TBODY> -<TR><TD VALIGN=BASELINE ALIGN=LEFT NOWRAP><FONT SIZE="-1">-fall-defs-global</FONT></TD><TD VALIGN=BASELINE ALIGN=LEFT WIDTH="216"> -<FONT SIZE="-1">Normally the compiler hides the definitions (asn_DEF_xxx) -of the inner structure elements (members of SEQUENCE, SET and other -types). This option makes all such definitions global. Enabling this -option may pollute the namespace by making lots of asn_DEF_xxx structures -globally visible, but will allow you to manipulate (encode and decode) -the individual members of any complex ASN.1 structure.</FONT></TD></TR> -</TBODY><TBODY> -<TR><TD VALIGN=BASELINE ALIGN=LEFT NOWRAP><FONT SIZE="-1">-fbless-SIZE</FONT></TD><TD VALIGN=BASELINE ALIGN=LEFT WIDTH="216"> -<FONT SIZE="-1">Allow SIZE() constraint for INTEGER, ENUMERATED, and other -types for which this constraint is normally prohibited by the standard. -This is a violation of an ASN.1 standard and compiler may fail to -produce the meaningful code.</FONT></TD></TR> -</TBODY><TBODY> -<TR><TD VALIGN=BASELINE ALIGN=LEFT NOWRAP><FONT SIZE="-1">-fcompound-names</FONT></TD><TD VALIGN=BASELINE ALIGN=LEFT WIDTH="216"> -<FONT SIZE="-1">Use complex names for C structures. Using complex names prevents -name clashes in case the module reuses the same identifiers in multiple -contexts.</FONT></TD></TR> -</TBODY><TBODY> -<TR><TD VALIGN=BASELINE ALIGN=LEFT NOWRAP><FONT SIZE="-1">-findirect-choice</FONT></TD><TD VALIGN=BASELINE ALIGN=LEFT WIDTH="216"> -<FONT SIZE="-1">When generating code for a CHOICE type, compile -the CHOICE members as indirect pointers instead of -declaring them inline. Consider using this option -together with <B>-fno-include-deps</B> to prevent circular references. -</FONT></TD></TR> -</TBODY><TBODY> -<TR><TD VALIGN=BASELINE ALIGN=LEFT NOWRAP><FONT SIZE="-1">-fknown-extern-type=<I><name></I></FONT></TD><TD VALIGN=BASELINE ALIGN=LEFT WIDTH="216"> -<FONT SIZE="-1">Pretend the specified type is known. The compiler will -assume the target language source files for the given -type have been provided manually. -</FONT></TD></TR> -</TBODY><TBODY> -<TR><TD VALIGN=BASELINE ALIGN=LEFT NOWRAP><FONT SIZE="-1">-fnative-types</FONT></TD><TD VALIGN=BASELINE ALIGN=LEFT WIDTH="216"> -<FONT SIZE="-1">Use the native machine's data types (int, double) whenever -possible, instead of the compound INTEGER_t, ENUMERATED_t and REAL_t -types. </FONT></TD></TR> -</TBODY><TBODY> -<TR><TD VALIGN=BASELINE ALIGN=LEFT NOWRAP><FONT SIZE="-1">-fno-constraints</FONT></TD><TD VALIGN=BASELINE ALIGN=LEFT WIDTH="216"> -<FONT SIZE="-1">Do not generate ASN.1 subtype constraint checking code. This -may produce a shorter executable.</FONT></TD></TR> -</TBODY><TBODY> -<TR><TD VALIGN=BASELINE ALIGN=LEFT NOWRAP><FONT SIZE="-1">-fno-include-deps</FONT></TD><TD VALIGN=BASELINE ALIGN=LEFT WIDTH="216"> -<FONT SIZE="-1">Do not generate courtesy #include lines for non-critical -dependencies.</FONT></TD></TR> -</TBODY><TBODY> -<TR><TD VALIGN=BASELINE ALIGN=LEFT NOWRAP><FONT SIZE="-1">-funnamed-unions</FONT></TD><TD VALIGN=BASELINE ALIGN=LEFT WIDTH="216"> -<FONT SIZE="-1">Enable unnamed unions in the definitions of target language's -structures.</FONT></TD></TR> -</TBODY><TBODY> -<TR><TD VALIGN=BASELINE ALIGN=LEFT NOWRAP><FONT SIZE="-1">-fskeletons-copy</FONT></TD><TD VALIGN=BASELINE ALIGN=LEFT WIDTH="216"> -<FONT SIZE="-1">Copy support files rather than symlink them.</FONT></TD></TR> -</TBODY><TBODY> - -<TR><TD VALIGN=BASELINE ALIGN=LEFT NOWRAP><B><FONT SIZE="-1">Output Options</FONT></B></TD><TD VALIGN=BASELINE ALIGN=LEFT WIDTH="216"> -<B><FONT SIZE="-1">Description</FONT></B></TD></TR> -<TR><TD VALIGN=BASELINE ALIGN=LEFT NOWRAP> - -<FONT SIZE="-1">-print-constraints</FONT></TD><TD VALIGN=BASELINE ALIGN=LEFT WIDTH="216"> -<FONT SIZE="-1">When -EF are also specified, this option forces the compiler -to explain its internal understanding of subtype constraints.</FONT></TD></TR> -</TBODY><TBODY> -<TR><TD VALIGN=BASELINE ALIGN=LEFT NOWRAP><FONT SIZE="-1">-print-lines</FONT></TD><TD VALIGN=BASELINE ALIGN=LEFT WIDTH="216"> -<FONT SIZE="-1">Generate "- #line" comments in -E output.</FONT></TD></TR> -</TBODY> -</TABLE> - -<P> -</TD></TR> -</TABLE> -</DIV><P></P><BR> - -<P> - -<H1><A NAME="SECTION02200000000000000000"> -Using the ASN.1 Compiler</A> -</H1> - -<P> - -<H1><A NAME="SECTION02210000000000000000"> -Invoking the ASN.1 helper code</A> -</H1> - -<P> -First of all, you should include one or more header files into your -application. Typically, it is enough to include the header file of -the main PDU type. For our Rectangle module, including the Rectangle.h -file is sufficient: - -<P> - -<BLOCKQUOTE><PRE> -#include <Rectangle.h> -</PRE> -</BLOCKQUOTE> -The header files defines the C structure corresponding to the ASN.1 -definition of a rectangle and the declaration of the ASN.1 type descriptor, -which is used as an argument to most of the functions provided by -the ASN.1 module. For example, here is the code which frees the Rectangle_t -structure: - -<P> - -<BLOCKQUOTE><PRE> -Rectangle_t *rect = ...; - -asn_DEF_Rectangle.free_struct(&asn_DEF_Rectangle, - rect, 0); -</PRE> -</BLOCKQUOTE> -This code defines a <I>rect</I> pointer which points to the Rectangle_t -structure which needs to be freed. The second line invokes the generic -<I>free_struct()</I> routine created specifically for this Rectangle_t -structure. The <I>asn_DEF_Rectangle</I> is the type descriptor, -which holds a collection of routines to deal with the Rectangle_t -structure. - -<P> -The following member functions of the asn_DEF_Rectangle type descriptor -are of interest: - -<P> -<DL> -<DT><STRONG>ber_decoder</STRONG></DT> -<DD>This is the generic <I>restartable</I><A NAME="tex2html6" - HREF="#foot181"><SUP>2.1</SUP></A> BER decoder (Basic Encoding Rules). This decoder would create -and/or fill the target structure for you. Please refer to Section -sub:Decoding-BER. -</DD> -<DT><STRONG>der_encoder</STRONG></DT> -<DD>This is the generic DER encoder (Distinguished Encoding -Rules). This encoder will take the target structure and encode it -into a series of bytes. Please refer to Section <A HREF="#sub:Encoding-DER">Encoding DER</A>. -</DD> -<DT><STRONG>xer_encoder</STRONG></DT> -<DD>This is the XER encoder (XML Encoding Rules). This -encoder will take the target structure and represent it as an XML -(text) document using either BASIC-XER or CANONICAL-XER encoding rules. -Please refer to Section <A HREF="#sub:Encoding-XER">Encoding XER</A>. -</DD> -<DT><STRONG>xer_decoder</STRONG></DT> -<DD>This is the generic XER decoder. It takes both BASIC-XER -or CANONICAL-XER encodings and deserializes the data into a local, -machine-dependent representation. Please refer to Section <A HREF="#sub:Decoding-XER">Decoding XER</A>. -</DD> -<DT><STRONG>check_constraints</STRONG></DT> -<DD>Check that the contents of the target structure -are semantically valid and constrained to appropriate implicit or -explicit subtype constraints. Please refer to Section <A HREF="#sub:Validating-the-target">Validating the target</A>. -</DD> -<DT><STRONG>print_struct</STRONG></DT> -<DD>This function convert the contents of the passed target -structure into human readable form. This form is not formal and cannot -be converted back into the structure, but it may turn out to be useful -for debugging or quick-n-dirty printing. Please refer to Section <A HREF="#sub:Printing-the-target">Printing the target</A>. -</DD> -<DT><STRONG>free_struct</STRONG></DT> -<DD>This is a generic disposal which frees the target structure. -Please refer to Section <A HREF="#sub:Freeing-the-target">Freeing the target</A>. -</DD> -</DL> -Each of the above function takes the type descriptor (<I>asn_DEF_...</I>) -and the target structure (<I>rect</I>, in the above example). - -<P> - -<H2><A NAME="SECTION02211000000000000000"></A><A NAME="sub:Decoding-BER"></A><BR> -Decoding BER -</H2> - -<P> -The Basic Encoding Rules describe the most widely used (by the ASN.1 -community) way to encode and decode a given structure in a machine-independent -way. Several other encoding rules (CER, DER) define a more restrictive -versions of BER, so the generic BER parser is also capable of decoding -the data encoded by CER and DER encoders. The opposite is not true. - -<P> -<I>The ASN.1 compiler provides the generic BER decoder which is -implicitly capable of decoding BER, CER and DER encoded data.</I> - -<P> -The decoder is restartable (stream-oriented), which means that in -case the buffer has less data than it is expected, the decoder will -process whatever there is available and ask for more data to be provided. -Please note that the decoder may actually process less data than it -was given in the buffer, which means that you must be able to make -the next buffer contain the unprocessed part of the previous buffer. - -<P> -Suppose, you have two buffers of encoded data: 100 bytes and 200 bytes. - -<P> - -<UL> -<LI>You may concatenate these buffers and feed the BER decoder with 300 -bytes of data, or -</LI> -<LI>You may feed it the first buffer of 100 bytes of data, realize that -the ber_decoder consumed only 95 bytes from it and later feed the -decoder with 205 bytes buffer which consists of 5 unprocessed bytes -from the first buffer and the additional 200 bytes from the second -buffer. -</LI> -</UL> -This is not as convenient as it could be (like, the BER encoder could -consume the whole 100 bytes and keep these 5 bytes in some temporary -storage), but in case of existing stream based processing it might -actually fit well into existing algorithm. Suggestions are welcome. - -<P> -Here is the simplest example of BER decoding. - -<P> - -<BLOCKQUOTE><PRE> -Rectangle_t * -simple_deserializer(const void *buffer, size_t buf_size) { - Rectangle_t *rect = 0; /* Note this 0! */ - asn_dec_rval_t rval; - - rval = <B>asn_DEF_Rectangle.ber_decoder</B>(0, - &asn_DEF_Rectangle, - (void **)&rect, - buffer, buf_size, - 0); - - if(rval<B>.code</B> == RC_OK) { - return rect; /* Decoding succeeded */ - } else { - /* Free partially decoded rect */ - asn_DEF_Rectangle.free_struct( - &asn_DEF_Rectangle, rect, 0); - return 0; - } -} -</PRE> -</BLOCKQUOTE> -The code above defines a function, <I>simple_deserializer</I>, which -takes a buffer and its length and is expected to return a pointer -to the Rectangle_t structure. Inside, it tries to convert the bytes -passed into the target structure (rect) using the BER decoder and -returns the rect pointer afterwards. If the structure cannot be deserialized, -it frees the memory which might be left allocated by the unfinished -<I>ber_decoder</I> routine and returns 0 (no data). (This <B>freeing -is necessary</B> because the ber_decoder is a restartable procedure, -and may fail just because there is more data needs to be provided -before decoding could be finalized). The code above obviously does -not take into account the way the <I>ber_decoder()</I> failed, so -the freeing is necessary because the part of the buffer may already -be decoded into the structure by the time something goes wrong. - -<P> -A little less wordy would be to invoke a globally available <I>ber_decode()</I> -function instead of dereferencing the asn_DEF_Rectangle type descriptor: - -<P> - -<BLOCKQUOTE><PRE> -rval = ber_decode(0, &asn_DEF_Rectangle, (void **)&rect, - buffer, buf_size); -</PRE> -</BLOCKQUOTE> -Note that the initial (asn_DEF_Rectangle.ber_decoder) reference -is gone, and also the last argument (0) is no longer necessary. - -<P> -These two ways of BER decoder invocations are fully equivalent. - -<P> -The BER de<I>coder</I> may fail because of (<I>the following RC_... -codes are defined in ber_decoder.h</I>): - -<P> - -<UL> -<LI>RC_WMORE: There is more data expected than it is provided (stream -mode continuation feature); -</LI> -<LI>RC_FAIL: General failure to decode the buffer; -</LI> -<LI>... other codes may be defined as well. -</LI> -</UL> -Together with the return code (.code) the asn_dec_rval_t type contains -the number of bytes which is consumed from the buffer. In the previous -hypothetical example of two buffers (of 100 and 200 bytes), the first -call to ber_decode() would return with .code = RC_WMORE and .consumed -= 95. The .consumed field of the BER decoder return value is <B>always</B> -valid, even if the decoder succeeds or fails with any other return -code. - -<P> -Please look into ber_decoder.h for the precise definition of ber_decode() -and related types. - -<P> - -<H2><A NAME="SECTION02212000000000000000"></A><A NAME="sub:Encoding-DER"></A><BR> -Encoding DER -</H2> - -<P> -The Distinguished Encoding Rules is the <I>canonical</I> variant of -BER encoding rules. The DER is best suited to encode the structures -where all the lengths are known beforehand. This is probably exactly -how you want to encode: either after a BER decoding or after a manual -fill-up, the target structure contains the data which size is implicitly -known before encoding. Among other uses, the DER encoding is used -to encode X.509 certificates. - -<P> -As with BER decoder, the DER encoder may be invoked either directly -from the ASN.1 type descriptor (asn_DEF_Rectangle) or from the stand-alone -function, which is somewhat simpler: - -<P> - -<BLOCKQUOTE><PRE> - -/* - * This is the serializer itself, - * it supplies the DER encoder with the - * pointer to the custom output function. - */ -ssize_t -simple_serializer(FILE *ostream, Rectangle_t *rect) { - asn_enc_rval_t er; /* Encoder return value */ - - er = der_encode(&asn_DEF_Rect, rect, - write_stream, ostream); - if(er.<B>encoded</B> == -1) { - /* - * Failed to encode the rectangle data. - */ - fprintf(stderr, ''Cannot encode %s: %s\n'', - er.<B>failed_type</B>->name, - strerror(errno)); - return -1; - } else { - /* Return the number of bytes */ - return er.encoded; - } -} -</PRE> -</BLOCKQUOTE> -As you see, the DER encoder does not write into some sort of buffer -or something. It just invokes the custom function (possible, multiple -times) which would save the data into appropriate storage. The optional -argument <I>app_key</I> is opaque for the DER encoder code and just -used by <I>_write_stream()</I> as the pointer to the appropriate -output stream to be used. - -<P> -If the custom write function is not given (passed as 0), then the -DER encoder will essentially do the same thing (i.e., encode the data) -but no callbacks will be invoked (so the data goes nowhere). It may -prove useful to determine the size of the structure's encoding before -actually doing the encoding<A NAME="tex2html7" - HREF="#foot250"><SUP>2.2</SUP></A>. - -<P> -Please look into der_encoder.h for the precise definition of der_encode() -and related types. - -<P> - -<H2><A NAME="SECTION02213000000000000000"></A><A NAME="sub:Encoding-XER"></A><BR> -Encoding XER -</H2> - -<P> -The XER stands for XML Encoding Rules, where XML, in turn, is eXtensible -Markup Language, a text-based format for information exchange. The -encoder routine API comes in two flavors: stdio-based and callback-based. -With the callback-based encoder, the encoding process is very similar -to the DER one, described in Section <A HREF="#sub:Encoding-DER">Encoding DER</A>. The -following example uses the definition of write_stream() from up there. - -<P> - -<BLOCKQUOTE><PRE> -/* - * This procedure generates the XML document - * by invoking the XER encoder. - * NOTE: Do not copy this code verbatim! - * If the stdio output is necessary, - * use the xer_fprint() procedure instead. - * See Section <A HREF="#sub:Printing-the-target">Printing the target</A>. - */ -int -print_as_XML(FILE *ostream, Rectangle_t *rect) { - asn_enc_rval_t er; /* Encoder return value */ - - er = xer_encode(&asn_DEF_Rectangle, rect, - XER_F_BASIC, /* BASIC-XER or CANONICAL-XER */ - write_stream, ostream); - - return (er.encoded == -1) ? -1 : 0; -} -</PRE> -</BLOCKQUOTE> -Please look into xer_encoder.h for the precise definition of xer_encode() -and related types. - -<P> -See Section [<A HREF="#sub:Printing-the-target">Printing the target</A>] for the example of stdio-based -XML encoder and other pretty-printing suggestions. - -<P> - -<H2><A NAME="SECTION02214000000000000000"></A><A NAME="sub:Decoding-XER"></A><BR> -Decoding XER -</H2> - -<P> -The data encoded using the XER rules can be subsequently decoded using -the xer_decode() API call: - -<P> - -<BLOCKQUOTE><PRE> -Rectangle_t * -XML_to_Rectangle(const void *buffer, size_t buf_size) { - Rectangle_t *rect = 0; /* Note this 0! */ - asn_dec_rval_t rval; - - rval = xer_decode(0, &asn_DEF_Rectangle, (void **)&rect, - buffer, buf_size); - if(rval<B>.code</B> == RC_OK) { - return rect; /* Decoding succeeded */ - } else { - /* Free partially decoded rect */ - asn_DEF_Rectangle.free_struct( - &asn_DEF_Rectangle, rect, 0); - return 0; - } -} -</PRE> -</BLOCKQUOTE> -The decoder takes both BASIC-XER and CANONICAL-XER encodings. - -<P> -The decoder shares its data consumption properties with BER decoder; -please read the Section <A HREF="#sub:Decoding-BER">Decoding BER</A> to know more. - -<P> -Please look into xer_decoder.h for the precise definition of xer_decode() -and related types. - -<P> - -<H2><A NAME="SECTION02215000000000000000"></A><A NAME="sub:Validating-the-target"></A><BR> -Validating the target structure -</H2> - -<P> -Sometimes the target structure needs to be validated. For example, -if the structure was created by the application (as opposed to being -decoded from some external source), some important information required -by the ASN.1 specification might be missing. On the other hand, the -successful decoding of the data from some external source does not -necessarily mean that the data is fully valid either. It might well -be the case that the specification describes some subtype constraints -that were not taken into account during decoding, and it would actually -be useful to perform the last check when the data is ready to be encoded -or when the data has just been decoded to ensure its validity according -to some stricter rules. - -<P> -The asn_check_constraints() function checks the type for various -implicit and explicit constraints. It is recommended to use asn_check_constraints() -function after each decoding and before each encoding. - -<P> -Please look into constraints.h for the precise definition of asn_check_constraints() -and related types. - -<P> - -<H2><A NAME="SECTION02216000000000000000"></A><A NAME="sub:Printing-the-target"></A><BR> -Printing the target structure -</H2> - -<P> -There are two ways to print the target structure: either invoke the -print_struct member of the ASN.1 type descriptor, or using the asn_fprint() -function, which is a simpler wrapper of the former: - -<P> - -<BLOCKQUOTE><PRE> -asn_fprint(stdout, &asn_DEF_Rectangle, rect); -</PRE> -</BLOCKQUOTE> -Please look into constr_TYPE.h for the precise definition of asn_fprint() -and related types. - -<P> -Another practical alternative to this custom format printing would -be to invoke XER encoder. The default BASIC-XER encoder performs reasonable -formatting for the output to be useful and human readable. To invoke -the XER decoder in a manner similar to asn_fprint(), use the xer_fprint() -call: - -<P> - -<BLOCKQUOTE><PRE> -xer_fprint(stdout, &asn_DEF_Rectangle, rect); -</PRE> -</BLOCKQUOTE> -See Section <A HREF="#sub:Encoding-XER">Encoding XER</A> for XML-related details. - -<P> - -<H2><A NAME="SECTION02217000000000000000"></A><A NAME="sub:Freeing-the-target"></A><BR> -Freeing the target structure -</H2> - -<P> -Freeing the structure is slightly more complex than it may seem to. -When the ASN.1 structure is freed, all the members of the structure -and their submembers etc etc are recursively freed too. But it might -not be feasible to free the structure itself. Consider the following -case: - -<P> - -<BLOCKQUOTE><PRE> -struct my_figure { /* The custom structure */ - int flags; /* <some custom member> */ - /* The type is generated by the ASN.1 compiler */ - <I>Rectangle_t rect;</I> - /* other members of the structure */ -}; -</PRE> -</BLOCKQUOTE> -In this example, the application programmer defined a custom structure -with one ASN.1-derived member (rect). This member is not a reference -to the Rectangle_t, but an in-place inclusion of the Rectangle_t -structure. If the freeing is necessary, the usual procedure of freeing -everything must not be applied to the &rect pointer itself, because -it does not point to the memory block directly allocated by the memory -allocation routine, but instead lies within a block allocated for -the my_figure structure. - -<P> -To solve this problem, the free_struct routine has the additional -argument (besides the obvious type descriptor and target structure -pointers), which is the flag specifying whether the outer pointer -itself must be freed (0, default) or it should be left intact (non-zero -value). - -<P> - -<BLOCKQUOTE><PRE> -<B>/* 1. Rectangle_t is defined within my_figure */</B> -struct my_figure { - Rectangle_t rect; -} *mf = <B>...</B>; -/* - * Freeing the Rectangle_t - * without freeing the mf->rect area - */ -asn_DEF_Rectangle.free_struct( - &asn_DEF_Rectangle, &mf->rect, <B>1</B> <B>/* !free */</B>); - - -<B>/* 2. Rectangle_t is a stand-alone pointer */</B> -Rectangle_t *rect = <B>...</B>; -/* - * Freeing the Rectangle_t - * and freeing the rect pointer - */ -asn_DEF_Rectangle.free_struct( - &asn_DEF_Rectangle, rect, <B>0</B> <B>/* free the pointer too */</B>); -</PRE> -</BLOCKQUOTE> -It is safe to invoke the <I>free_struct</I> function with the target -structure pointer set to 0 (NULL), the function will do nothing. - -<P> - -<H1><A NAME="SECTION02300000000000000000"></A><A NAME="cha:Step-by-step-examples"></A><BR> -Step by step examples -</H1> - -<P> - -<H1><A NAME="SECTION02310000000000000000"> -A ''Rectangle'' Encoder</A> -</H1> - -<P> -This example will help you to create a simple BER and XER encoder -of a ''Rectangle'' type used throughout this document. - -<P> - -<OL> -<LI>Create a file named <B>rectangle.asn1</B> with the following contents: - -<P> - -<BLOCKQUOTE><PRE> -RectangleModule1 DEFINITIONS ::= -BEGIN - -Rectangle ::= SEQUENCE { - height INTEGER, - width INTEGER -} - -END -</PRE> -</BLOCKQUOTE> - -</LI> -<LI>Compile it into the set of .c and .h files using asn1c compiler [<A - HREF="asn1c-usage.html#ASN1C">ASN1C</A>]: - -<P> - -<BLOCKQUOTE><PRE> -<I>asn1c -fnative-types</I> <B>rectangle.asn1</B> -</PRE> -</BLOCKQUOTE> - -</LI> -<LI>Alternatively, use the Online ASN.1 compiler [<A - HREF="asn1c-usage.html#AONL">AONL</A>] by uploading -the <B>rectangle.asn1</B> file into the Web form and unpacking the -produced archive on your computer. -</LI> -<LI>By this time, you should have gotten multiple files in the current -directory, including the <B>Rectangle.c</B> and <B>Rectangle.h</B>. -</LI> -<LI>Create a main() routine which creates the Rectangle_t structure in -memory and encodes it using BER and XER encoding rules. Let's name -the file <B>main.c</B>: - -<P> - -<BLOCKQUOTE><PRE> -<FONT SIZE="-1">#include <stdio.h></FONT> -<FONT SIZE="-1">#include <sys/types.h></FONT> -<FONT SIZE="-1">#include <Rectangle.h> /* Rectangle ASN.1 type */</FONT> - -<FONT SIZE="-1">/*</FONT> - <FONT SIZE="-1">* This is a custom function which writes the</FONT> - <FONT SIZE="-1">* encoded output into some FILE stream.</FONT> - <FONT SIZE="-1">*/</FONT> -<FONT SIZE="-1">static int</FONT> -<FONT SIZE="-1">write_out(const void *buffer, size_t size, void *app_key) {</FONT> - <FONT SIZE="-1"> FILE *out_fp = app_key;</FONT> - <FONT SIZE="-1"> size_t wrote;</FONT> - - <FONT SIZE="-1"> wrote = fwrite(buffer, 1, size, out_fp);</FONT> - - <FONT SIZE="-1"> return (wrote == size) ? 0 : -1;</FONT> -<FONT SIZE="-1">}</FONT> - -<FONT SIZE="-1">int main(int ac, char **av) {</FONT> - <FONT SIZE="-1"> Rectangle_t *rectangle; /* Type to encode */</FONT> - <FONT SIZE="-1"> asn_enc_rval_t ec; /* Encoder return value */</FONT> - - <FONT SIZE="-1"> /* Allocate the Rectangle_t */</FONT> - <FONT SIZE="-1"> rectangle = calloc(1, sizeof(Rectangle_t)); /* not malloc! */</FONT> - <FONT SIZE="-1"> if(!rectangle) {</FONT> - <FONT SIZE="-1"> perror(''calloc() failed'');</FONT> - <FONT SIZE="-1"> exit(71); /* better, EX_OSERR */</FONT> - <FONT SIZE="-1"> }</FONT> - - <FONT SIZE="-1"> /* Initialize the Rectangle members */</FONT> - <FONT SIZE="-1"> rectangle->height = 42; /* any random value */</FONT> - <FONT SIZE="-1"> rectangle->width = 23; /* any random value */</FONT> - <FONT SIZE="-1"> </FONT> - <FONT SIZE="-1"> /* BER encode the data if filename is given */</FONT> - <FONT SIZE="-1"> if(ac < 2) {</FONT> - <FONT SIZE="-1"> fprintf(stderr, ''Specify filename for BER output\n'');</FONT> - <FONT SIZE="-1"> } else {</FONT> - <FONT SIZE="-1"> const char *filename = av[1];</FONT> - <FONT SIZE="-1"> FILE *fp = fopen(filename, ''wb''); /* for BER output */</FONT> - - <FONT SIZE="-1"> if(!fp) {</FONT> - <FONT SIZE="-1"> perror(filename);</FONT> - <FONT SIZE="-1"> exit(71); /* better, EX_OSERR */</FONT> - <FONT SIZE="-1"> }</FONT> - <FONT SIZE="-1"> </FONT> - <FONT SIZE="-1"> /* Encode the Rectangle type as BER (DER) */</FONT> - <FONT SIZE="-1"> ec = der_encode(&asn_DEF_Rectangle,</FONT> - <FONT SIZE="-1"> rectangle, write_out, fp);</FONT> - <FONT SIZE="-1"> fclose(fp);</FONT> - <FONT SIZE="-1"> if(ec.encoded == -1) {</FONT> - <FONT SIZE="-1"> fprintf(stderr,</FONT> - <FONT SIZE="-1"> ''Could not encode Rectangle (at %s)\n'',</FONT> - <FONT SIZE="-1"> ec.failed_type ? ec.failed_type->name : ''unknown'');</FONT> - <FONT SIZE="-1"> exit(65); /* better, EX_DATAERR */</FONT> - <FONT SIZE="-1"> } else {</FONT> - <FONT SIZE="-1"> fprintf(stderr, ''Created %s with BER encoded Rectangle\n'',</FONT> - <FONT SIZE="-1"> filename);</FONT> - <FONT SIZE="-1"> }</FONT> - <FONT SIZE="-1"> }</FONT> - - <FONT SIZE="-1"> /* Also print the constructed Rectangle XER encoded (XML) */</FONT> - <FONT SIZE="-1"> xer_fprint(stdout, &asn_DEF_Rectangle, rectangle);</FONT> - - <FONT SIZE="-1"> return 0; /* Encoding finished successfully */</FONT> -<FONT SIZE="-1">}</FONT> -</PRE> -</BLOCKQUOTE> - -</LI> -<LI>Compile all files together using C compiler (varies by platform): - -<P> - -<BLOCKQUOTE><PRE> -<I>cc -I. -o</I> <B><I>rencode</I></B> <I>*.c</I> -</PRE> -</BLOCKQUOTE> - -</LI> -<LI>Voila! You have just created the BER and XER encoder of a Rectangle -type, named <B>rencode</B>! -</LI> -</OL> - - -<P> - -<H1><A NAME="SECTION02320000000000000000"></A><A NAME="sec:A-Rectangle-Decoder"></A><BR> -A ''Rectangle'' Decoder -</H1> - -<P> -This example will help you to create a simple BER decoder of a simple -''Rectangle'' type used throughout this document. - -<P> - -<OL> -<LI>Create a file named <B>rectangle.asn1</B> with the following contents: - -<P> - -<BLOCKQUOTE><PRE> -RectangleModule1 DEFINITIONS ::= -BEGIN - -Rectangle ::= SEQUENCE { - height INTEGER, - width INTEGER -} - -END -</PRE> -</BLOCKQUOTE> - -</LI> -<LI>Compile it into the set of .c and .h files using asn1c compiler [<A - HREF="asn1c-usage.html#ASN1C">ASN1C</A>]: - -<P> - -<BLOCKQUOTE><PRE> -<I>asn1c -fnative-types</I> <B>rectangle.asn1</B> -</PRE> -</BLOCKQUOTE> - -</LI> -<LI>Alternatively, use the Online ASN.1 compiler [<A - HREF="asn1c-usage.html#AONL">AONL</A>] by uploading -the <B>rectangle.asn1</B> file into the Web form and unpacking the -produced archive on your computer. -</LI> -<LI>By this time, you should have gotten multiple files in the current -directory, including the <B>Rectangle.c</B> and <B>Rectangle.h</B>. -</LI> -<LI>Create a main() routine which takes the binary input file, decodes -it as it were a BER-encoded Rectangle type, and prints out the text -(XML) representation of the Rectangle type. Let's name the file <B>main.c</B>: - -<P> - -<BLOCKQUOTE><PRE> -<FONT SIZE="-1">#include <stdio.h></FONT> -<FONT SIZE="-1">#include <sys/types.h></FONT> -<FONT SIZE="-1">#include <Rectangle.h> /* Rectangle ASN.1 type */</FONT> - -<FONT SIZE="-1">int main(int ac, char **av) {</FONT> - <FONT SIZE="-1"> char buf[1024]; /* Temporary buffer */</FONT> - <FONT SIZE="-1"> Rectangle_t *rectangle = 0; /* Type to decode */</FONT> - <FONT SIZE="-1"> asn_dec_rval_t rval; /* Decoder return value */</FONT> - <FONT SIZE="-1"> FILE *fp; /* Input file handler */</FONT> - <FONT SIZE="-1"> size_t size; /* Number of bytes read */</FONT> - <FONT SIZE="-1"> char *filename; /* Input file name */</FONT> - - <FONT SIZE="-1"> /* Require a single filename argument */</FONT> - <FONT SIZE="-1"> if(ac != 2) {</FONT> - <FONT SIZE="-1"> fprintf(stderr, ''Usage: %s <file.ber>\n'', av[0]);</FONT> - <FONT SIZE="-1"> exit(64); /* better, EX_USAGE */</FONT> - <FONT SIZE="-1"> } else {</FONT> - <FONT SIZE="-1"> filename = av[1];</FONT> - <FONT SIZE="-1"> }</FONT> - - <FONT SIZE="-1"> /* Open input file as read-only binary */</FONT> - <FONT SIZE="-1"> fp = fopen(filename, ''rb'');</FONT> - <FONT SIZE="-1"> if(!fp) {</FONT> - <FONT SIZE="-1"> perror(filename);</FONT> - <FONT SIZE="-1"> exit(66); /* better, EX_NOINPUT */</FONT> - <FONT SIZE="-1"> }</FONT> - <FONT SIZE="-1"> </FONT> - <FONT SIZE="-1"> /* Read up to the buffer size */</FONT> - <FONT SIZE="-1"> size = fread(buf, 1, sizeof(buf), fp);</FONT> - <FONT SIZE="-1"> fclose(fp);</FONT> - <FONT SIZE="-1"> if(!size) {</FONT> - <FONT SIZE="-1"> fprintf(stderr, ''%s: Empty or broken\n'', filename);</FONT> - <FONT SIZE="-1"> exit(65); /* better, EX_DATAERR */</FONT> - <FONT SIZE="-1"> }</FONT> - - <FONT SIZE="-1"> /* Decode the input buffer as Rectangle type */</FONT> - <FONT SIZE="-1"> rval = ber_decode(0, &asn_DEF_Rectangle,</FONT> - <FONT SIZE="-1"> (void **)&rectangle, buf, size);</FONT> - <FONT SIZE="-1"> if(rval.code != RC_OK) {</FONT> - <FONT SIZE="-1"> fprintf(stderr,</FONT> - <FONT SIZE="-1"> ''%s: Broken Rectangle encoding at byte %ld\n'',</FONT> - <FONT SIZE="-1"> filename, (long)rval.consumed);</FONT> - <FONT SIZE="-1"> exit(65); /* better, EX_DATAERR */</FONT> - <FONT SIZE="-1"> }</FONT> - - <FONT SIZE="-1"> /* Print the decoded Rectangle type as XML */</FONT> - <FONT SIZE="-1"> xer_fprint(stdout, &asn_DEF_Rectangle, rectangle);</FONT> - - <FONT SIZE="-1"> return 0; /* Decoding finished successfully */</FONT> -<FONT SIZE="-1">}</FONT> -</PRE> -</BLOCKQUOTE> - -</LI> -<LI>Compile all files together using C compiler (varies by platform): - -<P> - -<BLOCKQUOTE><PRE> -<I>cc -I. -o</I> <B><I>rdecode</I></B> <I>*.c</I> -</PRE> -</BLOCKQUOTE> - -</LI> -<LI>Voila! You have just created the BER decoder of a Rectangle type, -named <B>rdecode</B>! -</LI> -</OL> - -<P> - -<H1><A NAME="SECTION02400000000000000000"> -Constraint validation examples</A> -</H1> - -<P> -This chapter shows how to define ASN.1 constraints and use the generated -validation code. - -<P> - -<H1><A NAME="SECTION02410000000000000000"> -Adding constraints into ''Rectangle'' type</A> -</H1> - -<P> -This example shows how to add basic constraints to the ASN.1 specification -and how to invoke the constraints validation code in your application. - -<P> - -<OL> -<LI>Create a file named <B>rectangle.asn1</B> with the following contents: - -<P> - -<BLOCKQUOTE><PRE> -RectangleModuleWithConstraints DEFINITIONS ::= -BEGIN - -Rectangle ::= SEQUENCE { - height INTEGER (0..100), -- Value range constraint - width INTEGER (0..MAX) -- Makes width non-negative -} - -END -</PRE> -</BLOCKQUOTE> - -</LI> -<LI>Compile the file according to procedures shown in the previous chapter. -</LI> -<LI>Modify the Rectangle type processing routine (you can start with the -main() routine shown in the Section <A HREF="#sec:A-Rectangle-Decoder">A Rectangle Decoder</A>) -by placing the following snippet of code <I>before</I> encoding and/or -<I>after</I> decoding the Rectangle type<A NAME="tex2html8" - HREF="#foot923"><SUP>4.1</SUP></A>: - -<P> - -<BLOCKQUOTE><PRE> -<FONT SIZE="-1">int ret; /* Return value */</FONT> -<FONT SIZE="-1">char errbuf[128]; /* Buffer for error message */</FONT> -<FONT SIZE="-1">size_t errlen = sizeof(errbuf); /* Size of the buffer */</FONT> - <FONT SIZE="-1"> </FONT> -<FONT SIZE="-1">/* ... here may go Rectangle decoding code ... */</FONT> - -<FONT SIZE="-1">ret = asn_check_constraints(&asn_DEF_Rectangle,</FONT> - <FONT SIZE="-1"> rectangle, errbuf, &errlen);</FONT> -<FONT SIZE="-1">/* assert(errlen < sizeof(errbuf)); // you may rely on that */</FONT> -<FONT SIZE="-1">if(ret) {</FONT> - <FONT SIZE="-1"> fprintf(stderr, ''Constraint validation failed: %s\n'',</FONT> - <FONT SIZE="-1"> errbuf /* errbuf is properly nul-terminated */</FONT> - <FONT SIZE="-1"> );</FONT> - <FONT SIZE="-1"> /* exit(...); // Replace with appropriate action */</FONT> -<FONT SIZE="-1">}</FONT> - -<FONT SIZE="-1">/* ... here may go Rectangle encoding code ... */</FONT> -</PRE> -</BLOCKQUOTE> - -</LI> -<LI>Compile the resulting C code as shown in the previous chapters. -</LI> -<LI>Try to test the constraints checking code by assigning integer value -101 to the <B>.height</B> member of the Rectangle structure, or -a negative value to the <B>.width</B> member. In either case, the -program should print ''Constraint validation failed'' message, followed -by the short explanation why validation did not succeed. -</LI> -<LI>Done. -</LI> -</OL> - -<P> - -<H1><A NAME="SECTION03000000000000000000"></A><A NAME="par:ASN.1-Basics"></A><BR> -ASN.1 Basics -</H1> - -<P> - -<H1><A NAME="SECTION03100000000000000000"></A><A NAME="cha:Abstract-Syntax-Notation:"></A><BR> -Abstract Syntax Notation: ASN.1 -</H1> - -<P> -<I>This chapter defines some basic ASN.1 concepts and describes -several most widely used types. It is by no means an authoritative -or complete reference. For more complete ASN.1 description, please -refer to Olivier Dubuisson's book [<A - HREF="asn1c-usage.html#Dub00">Dub00</A>] or the ASN.1 body -of standards itself [<A - HREF="asn1c-usage.html#ITU-T_ASN.1">ITU-T/ASN.1</A>].</I> - -<P> -The Abstract Syntax Notation One is used to formally describe the -semantics of data transmitted across the network. Two communicating -parties may have different formats of their native data types (i.e. -number of bits in the integer type), thus it is important to have -a way to describe the data in a manner which is independent from the -particular machine's representation. The ASN.1 specifications are -used to achieve the following: - -<P> - -<UL> -<LI>The specification expressed in the ASN.1 notation is a formal and -precise way to communicate the data semantics to human readers; -</LI> -<LI>The ASN.1 specifications may be used as input for automatic compilers -which produce the code for some target language (C, C++, Java, etc) -to encode and decode the data according to some encoding rules (which -are also defined by the ASN.1 standard). -</LI> -</UL> -Consider the following example: - -<P> - -<BLOCKQUOTE><PRE> -Rectangle ::= SEQUENCE { - height INTEGER, - width INTEGER -} -</PRE> -</BLOCKQUOTE> -This ASN.1 specification describes a constructed type, <I>Rectangle</I>, -containing two integer fields. This specification may tell the reader -that there exists this kind of data structure and that some entity -may be prepared to send or receive it. The question on <I>how</I> -that entity is going to send or receive the <I>encoded data</I> is -outside the scope of ASN.1. For example, this data structure may be -encoded according to some encoding rules and sent to the destination -using the TCP protocol. The ASN.1 specifies several ways of encoding -(or ''serializing'', or ''marshaling'') the data: BER, PER, XER -and others, including CER and DER derivatives from BER. - -<P> -The complete specification must be wrapped in a module, which looks -like this: - -<P> - -<BLOCKQUOTE><PRE> -RectangleModule1 - { iso org(3) dod(6) internet(1) private(4) - enterprise(1) spelio(9363) software(1) - asn1c(5) docs(2) rectangle(1) 1 } - DEFINITIONS AUTOMATIC TAGS ::= -BEGIN - --- This is a comment which describes nothing. -Rectangle ::= SEQUENCE { - height INTEGER, -- Height of the rectangle - width INTEGER -- Width of the rectangle -} - -END -</PRE> -</BLOCKQUOTE> -The module header consists of module name (RectangleModule1), the -module object identifier ({...}), a keyword ''DEFINITIONS'', a -set of module flags (AUTOMATIC TAGS) and ''::= BEGIN''. The module -ends with an ''END'' statement. - -<P> - -<H1><A NAME="SECTION03110000000000000000"> -Some of the ASN.1 Basic Types</A> -</H1> - -<P> - -<H2><A NAME="SECTION03111000000000000000"> -The BOOLEAN type</A> -</H2> - -<P> -The BOOLEAN type models the simple binary TRUE/FALSE, YES/NO, ON/OFF -or a similar kind of two-way choice. - -<P> - -<H2><A NAME="SECTION03112000000000000000"> -The INTEGER type</A> -</H2> - -<P> -The INTEGER type is a signed natural number type without any restrictions -on its size. If the automatic checking on INTEGER value bounds are -necessary, the subtype constraints must be used. - -<P> - -<BLOCKQUOTE><PRE> -SimpleInteger ::= INTEGER - --- An integer with a very limited range -SmallPositiveInt ::= INTEGER (0..127) - --- Integer, negative -NegativeInt ::= INTEGER (MIN..0) -</PRE> -</BLOCKQUOTE> - -<P> - -<H2><A NAME="SECTION03113000000000000000"> -The ENUMERATED type</A> -</H2> - -<P> -The ENUMERATED type is semantically equivalent to the INTEGER type -with some integer values explicitly named. - -<P> - -<BLOCKQUOTE><PRE> -FruitId ::= ENUMERATED { apple(1), orange(2) } - --- The numbers in braces are optional, --- the enumeration can be performed --- automatically by the compiler -ComputerOSType ::= ENUMERATED { - FreeBSD, -- acquires value 0 - Windows, -- acquires value 1 - Solaris(5), -- remains 5 - Linux, -- becomes 6 - MacOS -- becomes 7 -} -</PRE> -</BLOCKQUOTE> - -<P> - -<H2><A NAME="SECTION03114000000000000000"> -The OCTET STRING type</A> -</H2> - -<P> -This type models the sequence of 8-bit bytes. This may be used to -transmit some opaque data or data serialized by other types of encoders -(i.e. video file, photo picture, etc). - -<P> - -<H2><A NAME="SECTION03115000000000000000"> -The OBJECT IDENTIFIER type</A> -</H2> - -<P> -The OBJECT IDENTIFIER is used to represent the unique identifier of -any object, starting from the very root of the registration tree. -If your organization needs to uniquely identify something (a router, -a room, a person, a standard, or whatever), you are encouraged to -get your own identification subtree at <A HREF=http://www.iana.org/protocols/forms.htm>http://www.iana.org/protocols/forms.htm</A>. - -<P> -For example, the very first ASN.1 module in this Chapter (RectangleModule1) -has the following OBJECT IDENTIFIER: 1 3 6 1 4 1 9363 1 5 2 1 1. - -<P> - -<BLOCKQUOTE><PRE> -ExampleOID ::= OBJECT IDENTIFIER - -rectangleModule1-oid ExampleOID - ::= { 1 3 6 1 4 1 9363 1 5 2 1 1 } - --- An identifier of the Internet. -internet-id OBJECT IDENTIFIER - ::= { iso(1) identified-organization(3) - dod(6) internet(1) } -</PRE> -</BLOCKQUOTE> -As you see, names are optional. - -<P> - -<H2><A NAME="SECTION03116000000000000000"> -The RELATIVE-OID type</A> -</H2> - -<P> -The RELATIVE-OID type has the semantics of a subtree of an OBJECT -IDENTIFIER. There may be no need to repeat the whole sequence of numbers -from the root of the registration tree where the only thing of interest -is some of the tree's subsequence. - -<P> - -<BLOCKQUOTE><PRE> -this-document RELATIVE-OID ::= { docs(2) usage(1) } - -this-example RELATIVE-OID ::= { - this-document assorted-examples(0) this-example(1) } -</PRE> -</BLOCKQUOTE> - -<P> - -<H1><A NAME="SECTION03120000000000000000"> -Some of the ASN.1 String Types</A> -</H1> - -<P> - -<H2><A NAME="SECTION03121000000000000000"> -The IA5String type</A> -</H2> - -<P> -This is essentially the ASCII, with 128 character codes available -(7 lower bits of an 8-bit byte). - -<P> - -<H2><A NAME="SECTION03122000000000000000"> -The UTF8String type</A> -</H2> - -<P> -This is the character string which encodes the full Unicode range -(4 bytes) using multibyte character sequences. - -<P> - -<H2><A NAME="SECTION03123000000000000000"> -The NumericString type</A> -</H2> - -<P> -This type represents the character string with the alphabet consisting -of numbers (''0'' to ''9'') and a space. - -<P> - -<H2><A NAME="SECTION03124000000000000000"> -The PrintableString type</A> -</H2> - -<P> -The character string with the following alphabet: space, ''<B>'</B>'' -(single quote), ''<B>(</B>'', ''<B>)</B>'', ''<B>+</B>'', -''<B>,</B>'' (comma), ''<B>-</B>'', ''<B>.</B>'', ''<B>/</B>'', -digits (''0'' to ''9''), ''<B>:</B>'', ''<B>=</B>'', ''<B>?</B>'', -upper-case and lower-case letters (''A'' to ''Z'' and ''a'' -to ''z''). - -<P> - -<H2><A NAME="SECTION03125000000000000000"> -The VisibleString type</A> -</H2> - -<P> -The character string with the alphabet which is more or less a subset -of ASCII between the space and the ''<B>~</B>'' -symbol (tilde). - -<P> -Alternatively, the alphabet may be described as the PrintableString -alphabet presented earlier, plus the following characters: ''<B>!</B>'', -''<B>''</B>'', ''<B>#</B>'', ''<B>$</B>'', ''<B>%</B>'', -''<B>&</B>'', ''<B>*</B>'', ''<B>;</B>'', ''<B><</B>'', -''<B>></B>'', ''<B>[</B>'', ''<B>\</B>'', -''<B>]</B>'', ''<B>^</B>'', ''<B>_</B>'', -''<B>`</B>'' (single left quote), ''<B>{</B>'', ''<B>|</B>'', -''<B>}</B>'', ''<B>~</B>''. - -<P> - -<H1><A NAME="SECTION03130000000000000000"> -ASN.1 Constructed Types</A> -</H1> - -<P> - -<H2><A NAME="SECTION03131000000000000000"> -The SEQUENCE type</A> -</H2> - -<P> -This is an ordered collection of other simple or constructed types. -The SEQUENCE constructed type resembles the C ''struct'' statement. - -<P> - -<BLOCKQUOTE><PRE> -Address ::= SEQUENCE { - -- The apartment number may be omitted - apartmentNumber NumericString OPTIONAL, - streetName PrintableString, - cityName PrintableString, - stateName PrintableString, - -- This one may be omitted too - zipNo NumericString OPTIONAL -} -</PRE> -</BLOCKQUOTE> - -<P> - -<H2><A NAME="SECTION03132000000000000000"> -The SET type</A> -</H2> - -<P> -This is a collection of other simple or constructed types. Ordering -is not important. The data may arrive in the order which is different -from the order of specification. Data is encoded in the order not -necessarily corresponding to the order of specification. - -<P> - -<H2><A NAME="SECTION03133000000000000000"> -The CHOICE type</A> -</H2> - -<P> -This type is just a choice between the subtypes specified in it. The -CHOICE type contains at most one of the subtypes specified, and it -is always implicitly known which choice is being decoded or encoded. -This one resembles the C ''union'' statement. - -<P> -The following type defines a response code, which may be either an -integer code or a boolean ''true''/''false'' code. - -<P> - -<BLOCKQUOTE><PRE> -ResponseCode ::= CHOICE { - intCode INTEGER, - boolCode BOOLEAN -} -</PRE> -</BLOCKQUOTE> - -<P> - -<H2><A NAME="SECTION03134000000000000000"> -The SEQUENCE OF type</A> -</H2> - -<P> -This one is the list (array) of simple or constructed types: - -<P> - -<BLOCKQUOTE><PRE> --- Example 1 -ManyIntegers ::= SEQUENCE OF INTEGER - --- Example 2 -ManyRectangles ::= SEQUENCE OF Rectangle - --- More complex example: --- an array of structures defined in place. -ManyCircles ::= SEQUENCE OF SEQUENCE { - radius INTEGER - } -</PRE> -</BLOCKQUOTE> - -<P> - -<H2><A NAME="SECTION03135000000000000000"> -The SET OF type</A> -</H2> - -<P> -The SET OF type models the bag of structures. It resembles the SEQUENCE -OF type, but the order is not important: i.e. the elements may arrive -in the order which is not necessarily the same as the in-memory order -on the remote machines. - -<P> - -<BLOCKQUOTE><PRE> --- A set of structures defined elsewhere -SetOfApples :: SET OF Apple - --- Set of integers encoding the kind of a fruit -FruitBag ::= SET OF ENUMERATED { apple, orange } -</PRE> -</BLOCKQUOTE> - -<H2><A NAME="SECTION04000000000000000000"> -Bibliography</A> -</H2><DL COMPACT><DD><P></P><DT><A NAME="ASN1C">ASN1C</A> -<DD>The Open Source ASN.1 Compiler. <A HREF=http://lionet.info/asn1c>http://lionet.info/asn1c</A> -<P></P><DT><A NAME="AONL">AONL</A> -<DD>Online ASN.1 Compiler. <A HREF=http://lionet.info/asn1c/asn1c.cgi>http://lionet.info/asn1c/asn1c.cgi</A> -<P></P><DT><A NAME="Dub00">Dub00</A> -<DD>Olivier Dubuisson -- <I>ASN.1 Communication between heterogeneous -systems</I> -- Morgan Kaufmann Publishers, 2000. <A HREF=http://asn1.elibel.tm.fr/en/book/>http://asn1.elibel.tm.fr/en/book/</A>. -ISBN:0-12-6333361-0. -<P></P><DT><A NAME="ITU-T_ASN.1">ITU-T/ASN.1</A> -<DD>ITU-T Study Group 17 - Languages for Telecommunication Systems <A HREF=http://www.itu.int/ITU-T/studygroups/com17/languages/>http://www.itu.int/ITU-T/studygroups/com17/languages/</A> -</DL> - -<P> -<BR><HR><H4>Footnotes</H4> -<DL> -<DT><A NAME="foot843">... given</A><A - HREF="asn1c-usage.html#tex2html1"><SUP>1.1</SUP></A></DT> -<DD>Please look into Part par:ASN.1-Basics for a quick reference -on how to understand the ASN.1 notation. - -</DD> -<DT><A NAME="foot844">... type</A><A - HREF="asn1c-usage.html#tex2html2"><SUP>1.2</SUP></A></DT> -<DD><I>-fnative-types</I> compiler option is used to produce basic C <I>int</I> -types instead of infinite width INTEGER_t structures. See <A HREF=#Table1>Table 1</A>. - -</DD> -<DT><A NAME="foot845">...asn1c</A><A - HREF="asn1c-usage.html#tex2html3"><SUP>1.3</SUP></A></DT> -<DD>The 1 symbol in asn<B>1</B>c is a digit, not an ''ell'' letter. - -</DD> -<DT><A NAME="foot846">... module</A><A - HREF="asn1c-usage.html#tex2html4"><SUP>1.4</SUP></A></DT> -<DD>This is probably <B>not</B> what you want to try out right now - -read through the rest of this chapter and check the <A HREF=#Table1>Table 1</A> -to find out about <B>-P</B> and <B>-R</B> options. - -</DD> -<DT><A NAME="foot181">...restartable</A><A - HREF="asn1c-usage.html#tex2html6"><SUP>2.1</SUP></A></DT> -<DD>Restartable means that if the decoder encounters the end of the buffer, -it will fail, but may later be invoked again with the rest of the -buffer to continue decoding. - -</DD> -<DT><A NAME="foot250">... encoding</A><A - HREF="asn1c-usage.html#tex2html7"><SUP>2.2</SUP></A></DT> -<DD>It is actually faster too: the encoder might skip over some computations -which aren't important for the size determination. - -</DD> -<DT><A NAME="foot923">... type</A><A - HREF="asn1c-usage.html#tex2html8"><SUP>4.1</SUP></A></DT> -<DD>Placing the constraint checking code <I>before</I> encoding helps -to make sure you know the data is correct and within constraints before -sharing the data with anyone else. - -<P> -Placing the constraint checking code <I>after</I> decoding, but before -any further action depending on the decoded data, helps to make sure -the application got the valid contents before making use of it. - -</DD> -</DL><BR><HR> -<ADDRESS> -Lev Walkin -2005-03-04 -</ADDRESS> -</BODY> -</HTML> diff --git a/doc/docsrc/Makefile.am b/doc/docsrc/Makefile.am new file mode 100644 index 00000000..1fe24198 --- /dev/null +++ b/doc/docsrc/Makefile.am @@ -0,0 +1,10 @@ + +regen: + pdflatex --output-format=dvi asn1c-usage + pdflatex --output-format=dvi asn1c-usage + pdflatex --output-format=dvi asn1c-usage + dvipdf asn1c-usage + +EXTRA_DIST = $(srcdir)/*.tex + +CLEANFILES = *.*~ *.aux *.dvi *.log *.out *.toc diff --git a/doc/docsrc/Makefile.in b/doc/docsrc/Makefile.in new file mode 100644 index 00000000..1a42eed3 --- /dev/null +++ b/doc/docsrc/Makefile.in @@ -0,0 +1,340 @@ +# Makefile.in generated by automake 1.10 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006 Free Software Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +subdir = doc/docsrc +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/libtool.m4 \ + $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ + $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +SOURCES = +DIST_SOURCES = +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +ADD_CFLAGS = @ADD_CFLAGS@ +AMTAR = @AMTAR@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +GREP = @GREP@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LEX = @LEX@ +LEXLIB = @LEXLIB@ +LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +MAKEINFO = @MAKEINFO@ +MKDIR_P = @MKDIR_P@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +VERSION = @VERSION@ +YACC = @YACC@ +YFLAGS = @YFLAGS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +lt_ECHO = @lt_ECHO@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +EXTRA_DIST = $(srcdir)/*.tex +CLEANFILES = *.*~ *.aux *.dvi *.log *.out *.toc +all: all-am + +.SUFFIXES: +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ + && exit 0; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign doc/docsrc/Makefile'; \ + cd $(top_srcdir) && \ + $(AUTOMAKE) --foreign doc/docsrc/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs +tags: TAGS +TAGS: + +ctags: CTAGS +CTAGS: + + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ + fi; \ + cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ + else \ + test -f $(distdir)/$$file \ + || cp -p $$d/$$file $(distdir)/$$file \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile +installdirs: +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool mostlyclean-am + +distclean: distclean-am + -rm -f Makefile +distclean-am: clean-am distclean-generic + +dvi: dvi-am + +dvi-am: + +html: html-am + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-exec-am: + +install-html: install-html-am + +install-info: install-info-am + +install-man: + +install-pdf: install-pdf-am + +install-ps: install-ps-am + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-generic mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: + +.MAKE: install-am install-strip + +.PHONY: all all-am check check-am clean clean-generic clean-libtool \ + distclean distclean-generic distclean-libtool distdir dvi \ + dvi-am html html-am info info-am install install-am \ + install-data install-data-am install-dvi install-dvi-am \ + install-exec install-exec-am install-html install-html-am \ + install-info install-info-am install-man install-pdf \ + install-pdf-am install-ps install-ps-am install-strip \ + installcheck installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-generic \ + mostlyclean-libtool pdf pdf-am ps ps-am uninstall uninstall-am + + +regen: + pdflatex --output-format=dvi asn1c-usage + pdflatex --output-format=dvi asn1c-usage + pdflatex --output-format=dvi asn1c-usage + dvipdf asn1c-usage +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/doc/asn1c-usage.tex b/doc/docsrc/asn1c-usage.tex index c65b256a..c65b256a 100644 --- a/doc/asn1c-usage.tex +++ b/doc/docsrc/asn1c-usage.tex |