Example: Building an Application

The following sample application illustrates the use of the OSS ASN.1 Compiler to compile a simple ASN.1 module, and the use of the OSS API to invoke the encoder/decoder. By following these steps you can produce and run an executable program that encodes and then decodes a message.

The C application program in this example is tbcas.c and the associated ASN.1 source file is bcas.asn . Both of these files can be found in the SAMPLES subdirectory of the OSS ASN.1 Tools shipment.

< View Example >

< View XER Example >

< View E-XER Example >

 

 

Step 1: Invoking the OSS ASN.1 Compiler

The following describes how to compile the abstract syntax defined in bcas.asn:

INPUT


-- Baseball Card Abstract Syntax (BCAS)
BCAS DEFINITIONS ::= BEGIN
   BBCard ::= SEQUENCE {
        name IA5String (SIZE (1..60)),
        team IA5String (SIZE (1..60)),
        age INTEGER (1..100),
        position IA5String (SIZE (1..60)),
        handedness ENUMERATED
                {left-handed(0), right-handed(1), ambidextrous(2)},
        batting-average REAL
   }
   myCard BBCard ::= {
        name "Casey",
        team "Mudville Nine",
        age 32,
        position "left field",
        handedness ambidextrous,
        batting-average {mantissa 250, base 10, exponent -3}
   }
END



COMMAND

You enter the following command:

        asn1 bcas.asn


or equivalently:

        asn1 bcas



The OSS command line syntax allows the compiler-generated filenames to be selectively overridden. In this example, we let the names default, yielding file names bcas.c, and bcas.h.

 

OUTPUT

Header file, bcas.h:


/*************************************************************/
/* Copyright (C) 2004 OSS Nokalva, Inc. All rights reserved.*/
/*************************************************************/ /* Generated for: OSS Nokalva */ /* Abstract syntax: bcas */ /* Created: Fri Feb 6 10:02:17 2004 */
/* ASN.1 compiler version: 7.0 Beta A */
/* Code generated for runtime version 7.0 Beta A or later */
/* Target operating system: Solaris 2.3 or later */
/* Target machine type: SPARC */
/* C compiler options required: -O -Xa */
/* ASN.1 compiler options and file names specified:
* bcas.asn
*/
#ifndef OSS_bcas
#define OSS_bcas
/* Baseball Card Abstract Syntax (BCAS) */
#include "asn1hdr.h"
           #include "asn1code.h"
#define BBCard_PDU 1
typedef struct BBCard {
    char name[61];
    char team[61];
    unsigned short age;
    char position[61];
    enum {
           left_handed = 0,
           right_handed = 1,
           ambidextrous = 2
    } handedness;
    double batting_average;
} BBCard;
extern BBCard myCard;
extern void * const bcas; /* encoder-decoder control table */
#endif /* OSS_bcas */
         

 

When compiling the ASN.1 specifications for use with the SOED (Space Optimized Encoder Decoder), the .c file contains OSS internals information and is not shown here.

Step 2: Compiling and linking the sample application

The following is a copy of the C program in tbcas.c. This program encodes the PDU described by the bcas.asn abstract syntax, then decodes it. Note that bcas.h (generated by the compiler) has been #included into the application program. The header file contains the generated declarations for the application.

(The function calls to the OSS Encoder/Decoder functions are in bold font.)

After the application program is compiled, the OSS Encoder/Decoder object library must be linked into the resulting executable file.

INPUT

C File, tbcas.c:


/* Application Program: tbcas.c                     */

/* Encodes a sample baseball card                   */

/* using BCAS (Baseball Card Abstract Syntax)       */



#include <stdio.h>

#include "bcas.h"  /* compiler-generated header file */

/* Encodes a card.  If the card is successfully encoded, decodes it. */
int main()
{
    OssBuf encodedData;        /* length and address of encoded data */
    BBCard *myCardPtr = NULL;  /* address of decoded data            */
    int  pdu_num = 0;
    struct ossGlobal w, *world = &w;
    unsigned char *buf;        /* saves address of encoded data */
    int retcode;               /* return code                   */

    if ((retcode = ossinit(world, bcas)))
        return retcode;

    ossSetFlags(world, DEBUGPDU);

    /* Print the input to the encoder */
    ossPrint(world, "\nThe input to the encoder ...\n\n");
ossPrintPDU(world, BBCard_PDU, &myCard); /* Encode a card, Return non-zero for failure. */ encodedData.value = NULL; encodedData.length = 0; ossPrint(world, "\nThe encoder's trace messages...\n\n");
if (ossEncode(world, BBCard_PDU, &myCard, &encodedData)) { /* an error occurred, print errmsg */ ossPrint(world, "%s\n", ossGetErrMsg(world)); retcode = 1; } else { /* card was successfully encoded; print encoded data */ ossPrint(world, "\nEncoded message...\n\n");
ossPrintHex(world, (char *)encodedData.value, encodedData.length); /* Save the address of the buffer with the encoded data. */ buf = encodedData.value; /* Decode the card whose encoding is in encodedData. */ ossPrint(world, "\nThe decoder's trace messages...\n\n");
if (ossDecode(world, &pdu_num,&encodedData,(void **)&myCardPtr)){ /* an error occurred, print errmsg */ ossPrint(world, "%s\n", ossGetErrMsg(world)); retcode = 1; } else { /* Successfully decoded. Print decoder's output, then free it */ ossPrint(world, "\nCasey of the Mudville Nine has a batting average of %0.3f\n\n", myCardPtr->batting_average); // where x should print as 0.250
ossPrint(world, "\nOutput from the decoder...\n\n");
ossPrintPDU(world, pdu_num, myCardPtr); ossFreePDU(world, pdu_num, myCardPtr); retcode = 0; } /* Free the encoder's output buffer */ ossFreeBuf(world, buf); /* Free all globally allocated resources */ ossterm(world); return retcode; } }

COMMAND

Next, compile and link the sample application program as follows:

gcc -c bcas.c tbcas.c
gcc -o tbcas bcas.o tbcas.o -lasn1code -lm

OUTPUT

The above command C-compiles the compiler‚generated .cfile ( bcas.c ) and the sample application program (tbcas.c) , and links them with the space-optimized encoder/decoder and the default memory manager (all contained in libasn1code.a ). The resulting executable file is tbcas.exe.

Step 3: Invoking the encoder/decoder

INPUT

(None. For this example, the encoder input is generated by the ASN.1 compiler as C initialized variables that are set from the ASN.1 value notation.)

COMMAND


        tbcas



This command simply runs tbcas. Note that debugging output is generated because the DEBUGPDU encoder/decoder flag was set before the encoder/decoder was called.

OUTPUT

Encoder/decoder debugging output, and completion message.


The input to the encoder ...


value BBCard ::=

{

  name "Casey",
  team "Mudville Nine",
  age 32,
  position "left field",
  handedness ambidextrous,
  batting-average {mantissa 2.500, base 10, exponent -1}
}

The encoder's trace messages...

BBCard SEQUENCE: tag = [UNIVERSAL 16] constructed; length = 45
  name IA5String: tag = [UNIVERSAL 22] primitive; length = 5
    "Casey"

  team IA5String: tag = [UNIVERSAL 22] primitive; length = 13
    "Mudville Nine"
  age INTEGER: tag = [UNIVERSAL 2] primitive; length = 1
    32
  position IA5String: tag = [UNIVERSAL 22] primitive; length = 10
    "left field"
  handedness ENUMERATED: tag = [UNIVERSAL 10] primitive; length = 1
    2
  batting-average REAL: tag = [UNIVERSAL 9] primitive; length = 3
    1 * 2^-2

Encoded message...
302D1605 43617365 79160D4D 75647669 6C6C6520 4E696E65 02012016 0A6C6566
74206669 656C640A 01020903 80FE01


The decoder's trace messages...
BBCard SEQUENCE: tag = [UNIVERSAL 16] constructed; length = 45
  name IA5String: tag = [UNIVERSAL 22] primitive; length = 5
    "Casey"
  team IA5String: tag = [UNIVERSAL 22] primitive; length = 13
    "Mudville Nine"
  age INTEGER: tag = [UNIVERSAL 2] primitive; length = 1
    32
  position IA5String: tag = [UNIVERSAL 22] primitive; length = 10
    "left field"
  handedness ENUMERATED: tag = [UNIVERSAL 10] primitive; length = 1
    2
  batting-average REAL: tag = [UNIVERSAL 9] primitive; length = 3
    1 * 2^-2
Card decoded

Casey of the Mudville Nine has a batting average of 0.250

Output from the decoder...

value BBCard ::=
{
  name "Casey",
  team "Mudville Nine",
  age 32,
  position "left field",
  handedness ambidextrous,
  batting-average {mantissa 1, base 2, exponent -2}
}


.:. Top

 

 

 

Copyright © 2008 OSS Nokalva, Inc.   All Rights Reserved.

OSS ASN.1 Tools for C

ASN.1 Protocols

Platform Information

E-XER

FAQs

Purchase

Free Trial Download