(RCS control information is at the end of this file.)


C Simple Example README
-----------------------

This directory should have 8 files in it:

README       - this file
genber.c     - C source code for a program that creates and encodes
               a PersonnelRecord value to a file.
expbuf_ex.c  - C source code for a program that calls the generated
               PersonnelRecord encoder and decoder routines
               using the ExpBuf buffer type
minbuf_ex.c  - C source code for program that calls the generated
               PersonnelRecord encoder and decoder routines
               using the MinBuf buffer type
sbuf_ex.c    - C source code for a program that calls the generated
               PersonnelRecord encoder and decoder routines
               using the MinBuf buffer type
makefile     - compiles the example programs
good_pr.ber  - BER encoding of a Personnel Record (all definite lengths)



Type "make" to generate the 7 example programs:
        genber
        expbuf_def
        expbuf_indef
        minbuf_def
        minbuf_indef
        sbuf_def
        sbuf_indef


snacc is called from the makefile on snacc/asn1specs/p_rec.asn1 to
generate the following files:

p_rec.h  - C data structs for PersonnelRecord and prototypes for
           the generated encode, decode, print and free routines.
p_rec.c  - C source code for the PersonnelRecord encode, decode,
           print, and free routines.

These source files are then compiled with *_ex.c and genber.c files to
make 7 programs.  Each program takes 1 argument (except genber), the
name of a file containing an BER encoded PersonnelRecord value.


Try the following: (or use the makefile's `check' phony target)

eg% ./genber				# create a file called pr.ber
eg% ./sbuf_indef good_pr.ber > indef_pr.ber
eg% ./sbuf_def indef_pr.ber > def_pr.ber
eg% diff good_pr.ber def_pr.ber		# should be no differences


The above commands decode the BER value in "good_pr.ber" and
indef_pr.ber respectively and then re-encode then to stdout.
Both programs will decode any valid BER representation of a
PersonnelRecord value but, the sbuf_def program will re-encode the
given data using only the definite length BER format and the
sbuf_indef program will re-encode the given data using only the
indefinite length BER format.

Compare the lengths of the def_pr.ber and indef_pr.ber files,
indefinite length encodings are usually larger.



Things to Note
--------------


Look at genber.c to see how to build a C value and then encode it.
look at the *_ex.c files to see the different types of buffer
manipulation.  Read the comments in the code.

It should be relatively simple to change the memory and buffer
management to fit your target environment.
(see snacc/c_include/asn_config.h.)


Snacc ASN.1 comment commands

Notice the special "--snacc" ASN.1 comment in snacc/asn1specs/p_rec.asn1.

PersonnelRecord ::= --snacc isPdu:"TRUE" -- [APPLICATION 0] IMPLICIT SET
 { ... etc. ... }

The "isPdu" flag tells snacc that the PersonnelRecord is a PDU type
that you will be calling the encoding and decoding routines directly
from your code.  This causes snacc to generate the
"BEncPersonnelRecord" and "BDecPersonnelRecord" routines in addition
to the standard "BEncPersonnelRecordContent" and
"BDecPersonnelRecordContent".

The Content encoding and decoding routines only deal with the content
of the type, ignoring all of the tag and length pairs on the given
type (in this case the APPLICATION (CONSTRUCTED) 0 tag and the length
for the SET).  The "BEncPersonnelRecord" and "BDecPersonnelRecord"
routines do encode the APPLICATION tag and the SET's length.  This
design is motivated by IMPLICIT tagging.

The compiler generated routines generally only call the content
oriented routines except in the case of ANY and ANY DEFINED BY types.
For ANY and ANY DEFINED BY types the PDU form of the rouine is called
since the tags are not known by the containing type.


Length formats

Each pair of *_def and *_indef programs were generated from the same
source file, *_ex.c.  Indefinite length encoders can be created by
giving the -DUSE_INDEF_LEN flag to the C compiler when compiling.
Currently the indefinite/definite length encoder choice is made a
compile time.  To change this to a run-time decision, a simple
solution would be to modify BerEncodeConsLen and BerEncodeEocIfNec
macros in snacc/c_lib/asn_len.h to check a global flag.

#-------------------------------------------------------------------------------
# $Header: /cvs/Darwin/src/live/Security/SecuritySNACCRuntime/c-examples/simple/README,v 1.1.1.1 2001/05/18 23:14:07 mb Exp $
# $Log: README,v $
# Revision 1.1.1.1  2001/05/18 23:14:07  mb
# Move from private repository to open source repository
#
# Revision 1.1.1.1  1999/03/16 18:06:09  aram
# Originals from SMIME Free Library.
#
# Revision 1.2  1995/02/17 16:17:24  rj
# reflect the test script's integration into the makefile.
#
# Revision 1.1  1994/08/31  08:46:22  rj
# first check-in. for a list of changes to the snacc-1.1 distribution please refer to the ChangeLog.
#
