Asn.1 to c, c++ or type table compiler
snacc [-h] [-P] [-t] [-e] [-d] [-p] [-f]\p [-c | -C | -idl | -T <table output file>]\p [-u <useful types ASN.1 file>]\p [-mf <max file name len>]\p [-l <neg number>]\p [-meta] [-tcl <module.type>]\p [-novolat]\p <ASN.1 file list>
For complete and current documentation, refer to the snacc manual.
Snacc (Sample Neufeld Asn.1 to C/C++ Compiler) generates C or C++ source code for BER encode and decode routines as well as print and free routines for each type in the given ASN.1 modules. Alternatively, snacc can produce type tables that can be used for table based/interpreted encoding and decoding. The type table based methods tend to be slower than their C or C++ counterparts but they usually use less memory (table size vs. C/C++ object code).
Most of the 1990 ASN.1 features are parsed although some do not affect the generated code. Fairly rigourous error checking is performed on the ASN.1 source; any errors detected will be reported (printed to stderr).
Each file in the ASN.1 file list should contain a complete ASN.1 module. ASN.1 modules that use the IMPORTS feature must be compiled together (specify all necessary modules in the ASN.1 file list). The generated source files will include each module's header file in the command line order. This makes it important to order the modules from least dependent to most dependent on the command line to avoid type ordering problems. Currently, snacc assumes that each ASN.1 file given on the command line depends on all of the others on the command line. No attempt is made to only include the header files from modules referenced in the import list for that module.
If the target language is C, snacc will generate a .B .h and .c file for each specified ASN.1 module. If the target language is C++, snacc will generate a .h and .C file for each module. The generated file names will be derived from the module names.
-h
Help. Prints a synopsis of snacc and exits.
-c
Generate C source code. This is the default behaviour of snacc. Only one of .B -c , -C or -T should be specified.
-C
Generate C++ source code.
-novolat
Generate ``return *this'' after calling ``abort()''. (Some broken compilers don't know about volatile functions, or their abort() isn't correctly typed.)
-meta
Generate meta code that describes the generated types. Implies -C.
-tcl
module.type[,module.type] Generate code for a Tcl interpreter where module.type are the top level PDUs. Implies -meta.
-T fileThiscausessnacctogeneratetypetablesandwritethemtothegiven
file.
-P
This causes snacc to print the parsed ASN.1 modules to stdout after the types have been linked, sorted, and processed. This option is useful for debugging snacc and observing the modifications snacc performs on the types to make code generation simpler.
-t
Generate type definitions in the target language for each ASN.1 type.
-v
Generate value definitions in the target language for each ASN.1 value. Currently value definitions are limited to INTEGERs, BOOLEANs and OBJECT IDENTIFIERs.
-e
Generate encode routines in the target language for each ASN.1 type.
-d
Generate decode routines in the target language for each ASN.1 type.
-p
Generate print routines in the target language for each ASN.1 type.
-f
Generate free routines in the target language for each ASN.1 type. This option only works when the target language is C.
If none of the -t, -v, -e, -d, -p, or -f options are given on the command line, snacc assumes that all of them are in effect. They do not affect type table generation.
-u fileReadtheusefultypesdefinitionsfromtheASN.1moduleinfile.Ifileforlinkingpurposes.ForsomeASN.1specifications,suchasSNMP,
the useful types are not needed. The types in the given useful types file are globally available to all modules; a useful type definition is overridden by a local or explicitly imported type with the same name. The current list of useful types is:
ObjectDecscriptor
NumericString
PrintableString
TeletexString
T61String
VideoTexString
IA5String
GraphicString
ISO646String
GeneralString
UTCTime
GeneralizedTime
EXTERNAL
-mf numberThiscausesthegeneratedsourcefilestohavea
maximum length of .I number characters, including their suffix. The .I number must be at least 3. This option is useful for supporting operating systems that only support short file names. A better solution is to shorten the module name of each ASN.1 module.
-l numberThisisfairlyobscurebutmaybeuseful.Eacherrorthatthe
decoders can report is given an id number. The number .I number is where the error ids start decreasing from as they are assigned to errors . The default is -100 if this option is not given. Avoid using a number in the range -100 to 0 since they may conflict with the library routines' error ids. If you are re-compiling the useful types for the library use -50. Another use of this option is to integrate newly generated code with older code; if done correctly, the error ids will not conflict.
snacc/asn1specs/asn-useful.asn1
ASN.1 useful types module (use with -u option)
snacc/c-lib/inc/
C runtime library include files
snacc/c-lib/libasn1csbuf.a
C SBuf runtime library
snacc/c-lib/libasn1cmbuf.a
C MinBuf runtime library
snacc/c-lib/libasn1cebuf.a
C ExpBuf runtime library
snacc/c++-lib/inc/
C++ runtime library include files
snacc/c++-lib/libasn1c++.a
C++ runtime library
snacc/c-lib/inc/tbl*/
Type table runtime library include files
snacc/c-lib/libasn1ctbl.a
Type table runtime library
snacc/tbl-tools/
Source code for table based tools (mkchdr, ptbl, pval)
snacc/c-examples/
directory with ASN.1 to C examples
snacc/c++-examples/
directory with ASN.1 to C++ examples
snacc/tbl-example
directory with an ASN.1 to type table example
snacc/doc
directory with snacc documentation and this man page
Snacc has problems with the following case:
Foo ::= SEQUENCE { id IdType, val ANY DEFINED BY id } IdType ::= CHOICE { a INTEGER, b OBJECT IDENTIFIER }
The error checking pass will print an error to the effect that the id type must be INTEGER or OBJECT IDENTIFER. To fix this you must modify the error checking pass as well as the code generation pass. To be cheap about it, disable/fix the error checking and hand modify the generated code.
The hashing code used for handling ANY DEFINED BY id to type mappings will encounter problems if the hash table goes more than four levels deep (I think this is unlikely). To fix this just add linear chaining at fourth level.
Please send bug reports or comments to Robert Joop <[email protected]>. See the documentation about reporting bugs and (lack of) support.
Copyright (c) 1993 Mike Sample and the University of British Columbia
Copyright (c) 1994 1995 Robert Joop and GMD Fokus.
Permission is granted to make and distribute verbatim copies of this manual provided the copyright notice and this permission notice are preserved on all copies.
Permission is granted to copy and distribute modified versions of this manual under the conditions for verbatim copying, provided that the entire resulting derived work is distributed under the terms of a permission notice identical to this one.
The snacc compiler is released under the GNU General Public License. The runtime libraries are no longer under the GNU Library General Public License. The generated code is yours.
Snacc was written by Mike Sample at the University of British Columbia (UBC). He used it as a tool to do encoding/decoding performance research.
It was augmented by Robert Joop at GMD Fokus with the help of some of its project partners.
This work was made possible by grants from the Canadian Institute for Telecommunications Research (CITR) and Natural Sciences and Engineering Research Council of Canada (NSERC).