NAME¶
snacc - ASN.1 to C, C++ or type table Compiler
SYNOPSIS¶
snacc [-h] [-P] [-t] [-e] [-d] [-p] [-f]
[-c | -C | -idl | -T <table output file>]
[-u <useful types ASN.1 file>]
[-mf <max file name len>]
[-l <neg number>]
[-meta] [-tcl <module.type>]
[-novolat]
<ASN.1 file list>
For complete and current documentation, refer to the snacc manual.¶
DESCRIPTION¶
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
.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.
OPTIONS¶
- -h
- Help. Prints a synopsis of snacc and exits.
- -c
- Generate C source code. This is the default behaviour of snacc. Only one
of -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 fileThis causes snacc to generate type tables and write
them to the given
- 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 fileRead the useful types definitions from the ASN.1
module in file
- file for linking purposes. For some ASN.1 specifications, such as
SNMP, 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 numberThis causes the generated source files to have
a
- maximum length of number characters, including their suffix. The
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 numberThis is fairly obscure but may be useful. Each
error that the
- decoders can report is given an id number. The number 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.
FILES¶
- 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
BUGS¶
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
<rj@rainbow.in-berlin.de>. See the documentation about reporting
bugs and (lack of) support.
COPYING¶
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.
AUTHOR¶
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.
ACKNOWLEDGEMENTS¶
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).