#include "snacc.h"
#if STDC_HEADERS || HAVE_STRING_H
#include <string.h>
#else
#include <strings.h>
#endif
#include <stdio.h>
#include "asn-incl.h"
#include "asn1module.h"
#include "define.h"
#include "mem.h"
#include "lib-types.h"
#include "rules.h"
#include "types.h"
#include "cond.h"
#include "str-util.h"
#include "snacc-util.h"
#include "print.h"
#include "tag-util.h"
#include "gen-vals.h"
#include "gen-any.h"
#include "gen-code.h"
static long int longJmpValG = -100;
static void
PrintComment PARAMS ((idl, m),
FILE *idl _AND_
Module *m)
{
long int t;
t = time (0);
fprintf (idl, "// NOTE: this is a machine generated file -- editing not recommended\n");
fprintf (idl, "//\n");
fprintf (idl, "// %s -- IDL for ASN.1 module %s\n", m->idlFileName, m->modId->name);
fprintf (idl, "//\n");
fprintf (idl, "// This file was generated by snacc on %s", ctime (&t));
fprintf (idl, "// UBC snacc written by Mike Sample\n");
fprintf (idl, "// IDL generator written by Robert Joop\n");
fprintf (idl, "\n");
}
static void
PrintIncludes PARAMS ((idl, mods, m),
FILE *idl _AND_
ModuleList *mods _AND_
Module *m)
{
void *tmp;
Module *currMod;
fprintf (idl, "#include \"ASN1Types.idl\"\n");
fprintf (idl, "#include \"BitString.idl\"\n");
tmp = (void *)CURR_LIST_NODE (mods);
FOR_EACH_LIST_ELMT (currMod, mods)
fprintf (idl, "#include \"%s\"\n", currMod->idlFileName);
SET_CURR_LIST_NODE (mods, tmp);
}
static void
PrintTypeDecl PARAMS ((f, td),
FILE *f _AND_
TypeDef *td)
{
switch (td->type->basicType->choiceId)
{
case BASICTYPE_COMPONENTSOF:
case BASICTYPE_SELECTION:
case BASICTYPE_UNKNOWN:
case BASICTYPE_MACRODEF:
case BASICTYPE_MACROTYPE:
return;
case BASICTYPE_ENUMERATED:
if (IsNewType (td->type))
fprintf (f, " enum %s;\n", td->idlTypeDefInfo->typeName);
break;
default:
if (IsNewType (td->type))
fprintf (f, " struct %s;\n", td->idlTypeDefInfo->typeName);
}
}
static void
PrintIDLTypeAndName PARAMS ((idl, mods, m, r, td, parent, t),
FILE *idl _AND_
ModuleList *mods _AND_
Module *m _AND_
IDLRules *r _AND_
TypeDef *td _AND_
Type *parent _AND_
Type *t)
{
if (t->optional)
fprintf (idl, "union %sOptional switch (boolean) { case True: %s %s; };\n", t->idlTypeRefInfo->typeName, t->idlTypeRefInfo->typeName, t->idlTypeRefInfo->fieldName);
else
fprintf (idl, "%s %s;\n", t->idlTypeRefInfo->typeName, t->idlTypeRefInfo->fieldName);
#if 0
if (t->idlTypeRefInfo->isPtr)
fprintf (idl, "*");
#endif
}
static void
PrintIDLSimpleDef PARAMS ((idl, r, td),
FILE *idl _AND_
IDLRules *r _AND_
TypeDef *td)
{
int hasNamedElmts;
CNamedElmt *n;
fprintf (idl, " /* ");
SpecialPrintType (idl, td, td->type);
fprintf (idl, " */\n");
if (hasNamedElmts = HasNamedElmts (td->type))
{
int tlen = strlen (td->idlTypeDefInfo->typeName) - strlen (r->typeSuffix);
switch (GetBuiltinType (td->type))
{
case BASICTYPE_INTEGER:
fprintf (idl, " typedef %s %s;\n", td->type->idlTypeRefInfo->typeName, td->idlTypeDefInfo->typeName);
FOR_EACH_LIST_ELMT (n, td->type->idlTypeRefInfo->namedElmts)
fprintf (idl, " const %s %.*s_%s = %d;\n", td->idlTypeDefInfo->typeName, tlen, td->idlTypeDefInfo->typeName, n->name, n->value);
break;
case BASICTYPE_ENUMERATED:
fprintf (idl, " enum %s\n", td->idlTypeDefInfo->typeName);
fprintf (idl, " {\n");
FOR_EACH_LIST_ELMT (n, td->type->idlTypeRefInfo->namedElmts)
{
char comma = (n != (CNamedElmt *)LAST_LIST_ELMT (td->type->idlTypeRefInfo->namedElmts)) ? ',' : ' ';
fprintf (idl, " %s%c // (original value = %d)\n", n->name, comma, n->value);
}
fprintf (idl, " };\n");
break;
case BASICTYPE_BITSTRING:
fprintf (idl, " typedef %s %s;\n", td->type->idlTypeRefInfo->typeName, td->idlTypeDefInfo->typeName);
FOR_EACH_LIST_ELMT (n, td->type->idlTypeRefInfo->namedElmts)
fprintf (idl, " const unsigned long %.*s_%s = %d;\n", tlen, td->idlTypeDefInfo->typeName, n->name, n->value);
break;
default:
fprintf (idl, " ???!\n");
}
}
else
fprintf (idl, " typedef %s %s;\n\n", td->type->idlTypeRefInfo->typeName, td->idlTypeDefInfo->typeName);
}
static void
PrintIDLChoiceDefCode PARAMS ((idl, mods, m, r, td, parent, choice),
FILE *idl _AND_
ModuleList *mods _AND_
Module *m _AND_
IDLRules *r _AND_
TypeDef *td _AND_
Type *parent _AND_
Type *choice)
{
NamedType *e;
fprintf (idl, " enum %s%s\n", td->idlTypeDefInfo->typeName, r->choiceEnumSuffix);
fprintf (idl, " {\n");
FOR_EACH_LIST_ELMT (e, choice->basicType->a.choice)
{
fprintf (idl, " %s", e->type->idlTypeRefInfo->choiceIdSymbol);
if (e != (NamedType *)LAST_LIST_ELMT (choice->basicType->a.choice))
fprintf (idl, ",\n");
else
fprintf (idl, "\n");
}
fprintf (idl, " };\n\n");
fprintf (idl, " union %s switch (%s%s)\n", td->idlTypeDefInfo->typeName, td->idlTypeDefInfo->typeName, r->choiceEnumSuffix);
fprintf (idl, " {\n");
FOR_EACH_LIST_ELMT (e, choice->basicType->a.choice)
{
#if 0
fprintf (idl, " case %s: %s %s;\n", e->type->idlTypeRefInfo->choiceIdSymbol, e->type->idlTypeRefInfo->typeName, e->type->idlTypeRefInfo->fieldName);
#else
fprintf (idl, " case %s: ", e->type->idlTypeRefInfo->choiceIdSymbol);
PrintIDLTypeAndName (idl, mods, m, r, td, choice, e->type);
#endif
}
fprintf (idl, " };\n\n");
}
static void
PrintIDLSeqDefCode PARAMS ((idl, mods, m, r, td, parent, seq),
FILE *idl _AND_
ModuleList *mods _AND_
Module *m _AND_
IDLRules *r _AND_
TypeDef *td _AND_
Type *parent _AND_
Type *seq)
{
NamedType *e;
fprintf (idl, " struct %s\n", td->idlTypeDefInfo->typeName);
fprintf (idl, " {\n");
FOR_EACH_LIST_ELMT (e, seq->basicType->a.sequence)
{
fprintf (idl, " ");
PrintIDLTypeAndName (idl, mods, m, r, td, seq, e->type);
}
fprintf (idl, " };\n\n\n");
}
static void
PrintIDLSetDefCode PARAMS ((idl, mods, m, r, td, parent, set),
FILE *idl _AND_
ModuleList *mods _AND_
Module *m _AND_
IDLRules *r _AND_
TypeDef *td _AND_
Type *parent _AND_
Type *set)
{
NamedType *e;
fprintf (idl, " struct %s\n", td->idlTypeDefInfo->typeName);
fprintf (idl, " {\n");
FOR_EACH_LIST_ELMT (e, set->basicType->a.set)
{
fprintf (idl, " ");
PrintIDLTypeAndName (idl, mods, m, r, td, set, e->type);
}
fprintf (idl, " };\n\n");
}
static void
PrintCxxSetOfDefCode PARAMS ((idl, mods, m, r, td, parent, setOf),
FILE *idl _AND_
ModuleList *mods _AND_
Module *m _AND_
IDLRules *r _AND_
TypeDef *td _AND_
Type *parent _AND_
Type *setOf)
{
char *lcn;
char *ecn;
lcn = td->idlTypeDefInfo->typeName;
ecn = setOf->basicType->a.setOf->idlTypeRefInfo->typeName;
fprintf (idl, " typedef sequence<%s> %s;\n", ecn, lcn);
}
static void
PrintCxxAnyDefCode PARAMS ((idl, mods, m, r, td, parent, any),
FILE *idl _AND_
ModuleList *mods _AND_
Module *m _AND_
IDLRules *r _AND_
TypeDef *td _AND_
Type *parent _AND_
Type *any)
{
fprintf (idl, " /* ");
SpecialPrintType (idl, td, td->type);
fprintf (idl, " */\n");
fprintf (idl, " typedef %s %s;\n\n", td->type->idlTypeRefInfo->typeName, td->idlTypeDefInfo->typeName);
}
static void
PrintIDLTypeDefCode PARAMS ((idl, mods, m, r, td),
FILE *idl _AND_
ModuleList *mods _AND_
Module *m _AND_
IDLRules *r _AND_
TypeDef *td)
{
switch (td->type->basicType->choiceId)
{
case BASICTYPE_BOOLEAN:
case BASICTYPE_REAL:
case BASICTYPE_OCTETSTRING:
case BASICTYPE_NULL:
case BASICTYPE_OID:
case BASICTYPE_INTEGER:
case BASICTYPE_BITSTRING:
case BASICTYPE_ENUMERATED:
PrintIDLSimpleDef (idl, r, td);
break;
case BASICTYPE_SEQUENCEOF:
case BASICTYPE_SETOF:
PrintCxxSetOfDefCode (idl, mods, m, r, td, NULL, td->type);
break;
case BASICTYPE_IMPORTTYPEREF:
case BASICTYPE_LOCALTYPEREF:
PrintIDLSimpleDef (idl, r, td);
break;
case BASICTYPE_ANYDEFINEDBY:
case BASICTYPE_ANY:
PrintCxxAnyDefCode (idl, mods, m, r, td, NULL, td->type);
break;
case BASICTYPE_CHOICE:
PrintIDLChoiceDefCode (idl, mods, m, r, td, NULL, td->type);
break;
case BASICTYPE_SET:
PrintIDLSetDefCode (idl, mods, m, r, td, NULL, td->type);
break;
case BASICTYPE_SEQUENCE:
PrintIDLSeqDefCode (idl, mods, m, r, td, NULL, td->type);
break;
case BASICTYPE_COMPONENTSOF:
case BASICTYPE_SELECTION:
case BASICTYPE_UNKNOWN:
case BASICTYPE_MACRODEF:
case BASICTYPE_MACROTYPE:
break;
}
}
void
PrintIDLCode PARAMS ((idl, mods, m, r, longJmpVal),
FILE *idl _AND_
ModuleList *mods _AND_
Module *m _AND_
IDLRules *r _AND_
long int longJmpVal _AND_
int printValues)
{
TypeDef *td;
ValueDef *vd;
longJmpValG = longJmpVal;
PrintComment (idl, m);
PrintConditionalIncludeOpen (idl, m->idlFileName);
PrintIncludes (idl, mods, m);
fprintf (idl, "\n");
fprintf (idl, "module %s\n{\n\n", m->idlname);
fprintf (idl, " //----------------------------------------------------------------------------\n");
fprintf (idl, " // type declarations:\n\n");
FOR_EACH_LIST_ELMT (td, m->typeDefs)
PrintTypeDecl (idl, td);
fprintf (idl, "\n");
if (printValues)
{
fprintf (idl, " //----------------------------------------------------------------------------\n");
fprintf (idl, " // value definitions:\n\n");
FOR_EACH_LIST_ELMT (vd, m->valueDefs)
PrintIDLValueDef (idl, r, vd);
fprintf (idl, "\n");
}
fprintf (idl, " //----------------------------------------------------------------------------\n");
fprintf (idl, " // type definitions:\n\n");
#if 0
PrintIDLAnyCode (idl, r, mods, m);
#endif
FOR_EACH_LIST_ELMT (td, m->typeDefs)
{
PrintIDLTypeDefCode (idl, mods, m, r, td);
fputc ('\n', idl);
}
fprintf (idl, "}; // end of module %s\n", m->idlname);
PrintConditionalIncludeClose (idl, m->idlFileName);
}