#include <stdio.h>
#include "asn-incl.h"
#include "asn1module.h"
#include "mem.h"
#include "define.h"
#include "lib-types.h"
#include "rules.h"
#include "type-info.h"
#include "str-util.h"
#include "snacc-util.h"
#include "util.h"
#include "tag-util.h"
#include "gen-dec.h"
static CRules *genDecCRulesG;
char *valueArgNameG = "v";
static long int *longJmpValG;
static char *decodedLenVarNameG = "totalElmtsLen";
static char *itemLenVarNameG = "elmtLen";
static char *mecVarNameG = "mandatoryElmtCount";
static char *tagIdVarNameG = "tagId";
char *bufTypeNameG = "BUF_TYPE";
char *lenTypeNameG = "AsnLen";
char *tagTypeNameG = "AsnTag";
char *envTypeNameG = "ENV_TYPE";
static void PrintCBerDecoderPrototype PROTO ((FILE *hdr, TypeDef *td));
static void PrintCBerDecoderDeclaration PROTO ((FILE *src, TypeDef *td));
static void PrintCBerDecoderDefine PROTO ((FILE *src, TypeDef *td));
static int RecCountVariableLevels PROTO ((Type *t));
static int CountVariableLevels PROTO ((Type *t));
static void PrintCBerDecoderLocals PROTO ((FILE *src, TypeDef *td));
static void PrintCBerListDecoderLocals PROTO ((FILE *src));
static void PrintCBerSetDecodeCode PROTO ((FILE *src, TypeDef *td, Type *parent, NamedTypeList *e, int elmtLevel, int totalLevel, int tagLevel, char *varName));
static void PrintCBerSeqDecodeCode PROTO ((FILE *src, TypeDef *td, Type *parent, NamedTypeList *e, int elmtLevel, int totalLevel, int tagLevel, char *varName));
static void PrintCBerListDecoderCode PROTO ((FILE *src, TypeDef *td, Type *t, int elmtLevel, int totalLevel, int tagLevel, char *varName));
static void PrintCBerChoiceDecodeCode PROTO ((FILE *src, TypeDef *td, Type *t, int elmtLevel, int totalLevel, int tagLevel, char *varName));
static void PrintCLenDecodingCode PROTO ((FILE *f));
static void PrintCBerDecoderIncludes PROTO ((FILE *src, Module *m, ModuleList *mods));
static void PrintCBerElmtDecodeCode PROTO ((FILE *src, TypeDef *td, Type *parent, Type *t, int elmtLevel, int totalLevel, int tagLevel, char *parnetVarName, char *elmtVarName, int stoleChoiceTags));
void
PrintCBerDecoder PARAMS ((src, hdr, r, m, td, longJmpVal),
FILE *src _AND_
FILE *hdr _AND_
CRules *r _AND_
Module *m _AND_
TypeDef *td _AND_
long int *longJmpVal)
{
int i;
enum BasicTypeChoiceId typeId;
int elmtLevel;
CTDI *ctdi;
Tag *tag;
char *classStr;
char *formStr;
int stoleChoiceTags;
TagList *tags;
ctdi = td->cTypeDefInfo;
if (!ctdi->genDecodeRoutine)
return;
if (!IsNewType (td->type) &&
(!IsTypeRef (td->type) ||
(IsTypeRef (td->type) &&
(td->type->basicType->a.localTypeRef->link->cTypeDefInfo->isPdu ||
((td->type->basicType->a.localTypeRef->link->anyRefs != NULL) &&
!LIST_EMPTY (td->type->basicType->a.localTypeRef->link->anyRefs))))))
{
fprintf(hdr,"#define B%s B%s\n", td->cTypeDefInfo->decodeRoutineName, td->type->cTypeRefInfo->decodeRoutineName);
return;
}
typeId = GetBuiltinType (td->type);
fprintf (hdr, "void B%s PROTO ((%s b, %s *result, %s *bytesDecoded, %s env));\n", ctdi->decodeRoutineName, bufTypeNameG, ctdi->cTypeName, lenTypeNameG, envTypeNameG);
fprintf (src,"void B%s PARAMS ((b, result, bytesDecoded, env),\n", ctdi->decodeRoutineName);
fprintf (src,"%s b _AND_\n", bufTypeNameG);
fprintf (src,"%s *result _AND_\n", ctdi->cTypeName);
fprintf (src,"%s *bytesDecoded _AND_\n", lenTypeNameG);
fprintf (src,"%s env)\n", envTypeNameG);
fprintf (src,"{\n");
fprintf (src," %s tag;\n", tagTypeNameG);
tags = GetTags (td->type, &stoleChoiceTags);
for (i = 1; !stoleChoiceTags && (i <= LIST_COUNT (tags)); i++)
fprintf (src," %s elmtLen%d;\n", lenTypeNameG, i);
if (typeId == BASICTYPE_CHOICE)
fprintf (src," %s elmtLen%d;\n", lenTypeNameG, i);
fprintf (src,"\n");
elmtLevel = 0;
if (!stoleChoiceTags)
{
FOR_EACH_LIST_ELMT (tag, tags)
{
classStr = Class2ClassStr (tag->tclass);
if (tag->form == ANY_FORM)
formStr = Form2FormStr (PRIM);
else
formStr = Form2FormStr (tag->form);
fprintf (src," if (((tag = BDecTag (b, bytesDecoded, env)) != \n");
if (tag->tclass == UNIV)
{
fprintf (src,"MAKE_TAG_ID (%s, %s, %s))", classStr, formStr, Code2UnivCodeStr (tag->code));
if (tag->form == ANY_FORM)
fprintf (src,"&&\n (tag != MAKE_TAG_ID (%s, %s, %s)))\n", classStr, Form2FormStr (CONS), Code2UnivCodeStr (tag->code));
else
fprintf (src,")\n");
}
else
{
fprintf (src,"MAKE_TAG_ID (%s, %s, %d))", classStr, formStr, tag->code);
if (tag->form == ANY_FORM)
fprintf (src,"&&\n (tag != MAKE_TAG_ID (%s, %s, %d)))\n", classStr, Form2FormStr (CONS), tag->code);
else
fprintf (src,")\n");
}
fprintf (src," {\n");
fprintf (src," Asn1Error (\"B%s: ERROR - wrong tag\\n\");\n", ctdi->decodeRoutineName);
fprintf (src," longjmp (env, %d);\n", (*longJmpVal)--);
fprintf (src," }\n");
fprintf (src," elmtLen%d = BDecLen (b, bytesDecoded, env);\n", ++elmtLevel);
}
}
if (typeId == BASICTYPE_CHOICE)
{
fprintf (src," tag = BDecTag (b, bytesDecoded, env);\n");
fprintf (src," elmtLen%d = BDecLen (b, bytesDecoded, env);\n", ++elmtLevel);
}
if ((typeId != BASICTYPE_ANY) && (typeId != BASICTYPE_ANYDEFINEDBY))
fprintf (src," B%sContent (b, tag, elmtLen%d, result, bytesDecoded, env);\n", ctdi->decodeRoutineName, elmtLevel);
else
fprintf (src," B%s (b, result, bytesDecoded, env);\n", ctdi->decodeRoutineName, elmtLevel);
for (i = elmtLevel-1; i > 0; i--)
{
fprintf (src," if (elmtLen%d == INDEFINITE_LEN)\n", i);
fprintf (src," BDecEoc (b, bytesDecoded, env);\n");
}
fprintf (src,"} /* B%s */\n\n", ctdi->decodeRoutineName);
FreeTags (tags);
}
void
PrintCBerContentDecoder PARAMS ((src, hdr, r, m, td, longJmpVal),
FILE *src _AND_
FILE *hdr _AND_
CRules *r _AND_
Module *m _AND_
TypeDef *td _AND_
long int *longJmpVal)
{
NamedType *e;
CTDI *ctdi;
CTypeId rhsTypeId;
Type *t;
BER_FORM form;
longJmpValG = longJmpVal;
genDecCRulesG = r;
ctdi = td->cTypeDefInfo;
if ((ctdi == NULL) || (td->type->cTypeRefInfo == NULL))
{
fprintf (stderr,"PrintCBerDecoder: ERROR - no type info\n");
return;
}
if (!ctdi->genDecodeRoutine)
return;
rhsTypeId = td->type->cTypeRefInfo->cTypeId;
switch (rhsTypeId)
{
case C_ANY:
fprintf (hdr, "/* ANY - Fix Me! */\n");
case C_ANYDEFINEDBY:
fprintf(hdr, "#define B%s B%s\n", td->cTypeDefInfo->decodeRoutineName, td->type->cTypeRefInfo->decodeRoutineName);
fprintf (hdr,"\n\n");
break;
case C_LIB:
case C_TYPEREF:
PrintCBerDecoderDefine (hdr, td);
fprintf (hdr,"\n\n");
break;
case C_CHOICE:
PrintCBerDecoderPrototype (hdr, td);
fprintf (hdr,"\n\n");
PrintCBerDecoderDeclaration (src, td);
fprintf (src,"{\n");
PrintCBerDecoderLocals (src, td);
fprintf (src,"\n\n");
PrintCBerChoiceDecodeCode (src, td, td->type, FIRST_LEVEL-1, FIRST_LEVEL,FIRST_LEVEL-1, valueArgNameG);
fprintf (src, " (*bytesDecoded) += totalElmtsLen1;\n");
fprintf (src,"} /* B%sContent */",td->cTypeDefInfo->decodeRoutineName);
fprintf (src,"\n\n");
break;
case C_STRUCT:
PrintCBerDecoderPrototype (hdr, td);
fprintf (hdr,"\n\n");
PrintCBerDecoderDeclaration (src, td);
fprintf (src,"{\n");
PrintCBerDecoderLocals (src, td);
fprintf (src,"\n\n");
if (td->type->basicType->choiceId == BASICTYPE_SET)
PrintCBerSetDecodeCode (src, td, td->type, td->type->basicType->a.set, FIRST_LEVEL-1, FIRST_LEVEL, FIRST_LEVEL-1, valueArgNameG);
else
PrintCBerSeqDecodeCode (src, td, td->type, td->type->basicType->a.sequence, FIRST_LEVEL-1, FIRST_LEVEL, FIRST_LEVEL-1, valueArgNameG);
fprintf (src, " (*bytesDecoded) += totalElmtsLen1;\n");
fprintf (src,"} /* B%sContent */",td->cTypeDefInfo->decodeRoutineName);
fprintf (src,"\n\n");
break;
case C_LIST:
PrintCBerDecoderPrototype (hdr, td);
fprintf (hdr,"\n\n");
PrintCBerDecoderDeclaration (src, td);
fprintf (src,"{\n");
PrintCBerDecoderLocals (src, td);
fprintf (src,"\n\n");
PrintCBerListDecoderCode (src, td, td->type, FIRST_LEVEL-1, FIRST_LEVEL, FIRST_LEVEL-1, valueArgNameG);
fprintf (src, " (*bytesDecoded) += totalElmtsLen1;\n");
fprintf (src,"} /* B%sContent */",td->cTypeDefInfo->decodeRoutineName);
fprintf (src,"\n\n");
break;
case C_NO_TYPE:
return;
break;
default:
fprintf (stderr,"PrintCBerContentDecoder: ERROR - unknown c type id\n");
return;
break;
}
}
static void
PrintCBerDecoderPrototype PARAMS ((hdr, td),
FILE *hdr _AND_
TypeDef *td)
{
CTDI *ctdi;
ctdi = td->cTypeDefInfo;
fprintf (hdr,"void B%sContent PROTO ((%s b, %s tagId%d, %s elmtLen%d, %s *v, %s *bytesDecoded, %s env));\n", ctdi->decodeRoutineName, bufTypeNameG, tagTypeNameG, FIRST_LEVEL-1, lenTypeNameG, FIRST_LEVEL-1, ctdi->cTypeName,lenTypeNameG, envTypeNameG);
}
static void
PrintCBerDecoderDeclaration PARAMS ((src,td),
FILE *src _AND_
TypeDef *td)
{
CTDI *ctdi;
ctdi = td->cTypeDefInfo;
fprintf (src,"void\n");
fprintf (src,"B%sContent PARAMS ((b, tagId%d, elmtLen%d, v, bytesDecoded, env),\n", ctdi->decodeRoutineName, FIRST_LEVEL -1, FIRST_LEVEL -1);
fprintf (src,"%s b _AND_\n", bufTypeNameG);
fprintf (src,"%s tagId%d _AND_\n", tagTypeNameG, FIRST_LEVEL -1);
fprintf (src,"%s elmtLen%d _AND_\n", lenTypeNameG, FIRST_LEVEL -1);
fprintf (src,"%s *v _AND_\n", ctdi->cTypeName);
fprintf (src,"%s *bytesDecoded _AND_\n", lenTypeNameG);
fprintf (src,"%s env)\n", envTypeNameG);
}
static void
PrintCBerDecoderDefine PARAMS ((hdr, td),
FILE *hdr _AND_
TypeDef *td)
{
fprintf(hdr, "#define B%sContent B%sContent", td->cTypeDefInfo->decodeRoutineName, td->type->cTypeRefInfo->decodeRoutineName);
}
static int
RecCountVariableLevels PARAMS ((t),
Type *t)
{
CTRI *ctri;
int maxLevels = 0;
NamedType *e;
TagList *tl;
int tagCount;
int typeCount;
void *tmp;
enum BasicTypeChoiceId typeId;
ctri = t->cTypeRefInfo;
typeId = GetBuiltinType (t);
if ((ctri->cTypeId == C_STRUCT) ||
(ctri->cTypeId == C_CHOICE))
{
maxLevels = 1;
tagCount = CountTags (t);
tmp = (void*)CURR_LIST_NODE (t->basicType->a.set);
FOR_EACH_LIST_ELMT (e, t->basicType->a.set)
{
if ((e->type == NULL) || (e->type->cTypeRefInfo == NULL))
continue;
typeCount = RecCountVariableLevels (e->type);
if (typeCount > maxLevels)
maxLevels = typeCount;
}
SET_CURR_LIST_NODE (t->basicType->a.set, tmp);
return maxLevels + tagCount;
}
else if (ctri->cTypeId == C_LIST)
{
return CountTags (t) +RecCountVariableLevels (t->basicType->a.setOf);
}
else if (typeId == BASICTYPE_CHOICE)
return CountTags (t) +1;
else if ((typeId == BASICTYPE_ANY) || (typeId == BASICTYPE_ANYDEFINEDBY))
return CountTags (t) +1;
else
return CountTags (t);
}
static int
CountVariableLevels PARAMS ((t),
Type *t)
{
CTRI *ctri;
int maxLevels = 0;
NamedType *e;
TagList *tl;
int tagCount;
int typeCount;
void *tmp;
ctri = t->cTypeRefInfo;
if ((ctri->cTypeId == C_STRUCT) ||
(ctri->cTypeId == C_CHOICE))
{
maxLevels = 1;
tmp = (void*)CURR_LIST_NODE (t->basicType->a.set);
FOR_EACH_LIST_ELMT (e, t->basicType->a.set)
{
if ((e->type == NULL) || (e->type->cTypeRefInfo == NULL))
continue;
typeCount = RecCountVariableLevels (e->type);
if (GetBuiltinType (e->type) == BASICTYPE_CHOICE)
typeCount++;
if (typeCount > maxLevels)
maxLevels = typeCount;
}
SET_CURR_LIST_NODE (t->basicType->a.set, tmp);
return maxLevels;
}
else if (ctri->cTypeId == C_LIST)
return RecCountVariableLevels (t->basicType->a.setOf);
else if ((ctri->cTypeId == C_ANY) ||
(ctri->cTypeId == C_ANYDEFINEDBY))
return 1;
else
return 0;
}
static void
PrintCBerDecoderLocals PARAMS ((src,td),
FILE *src _AND_
TypeDef *td)
{
int levels;
int i;
levels = CountVariableLevels (td->type);
fprintf (src, " int seqDone = FALSE;\n");
for (i = 0; i < levels; i++)
{
fprintf (src, " %s totalElmtsLen%d = 0;\n", lenTypeNameG, i + FIRST_LEVEL);
fprintf (src, " %s elmtLen%d;\n", lenTypeNameG, i + FIRST_LEVEL);
fprintf (src, " %s tagId%d;\n", tagTypeNameG, i + FIRST_LEVEL);
if (i == 0)
fprintf (src, " int mandatoryElmtCount%d = 0;\n", i + FIRST_LEVEL);
}
}
static void
PrintCBerElmtDecodeCode PARAMS ((src, td, parent, t, elmtLevel, totalLevel, tagLevel, parentVarName, elmtVarName, stoleChoiceTags),
FILE *src _AND_
TypeDef *td _AND_
Type *parent _AND_
Type *t _AND_
int elmtLevel _AND_
int totalLevel _AND_
int tagLevel _AND_
char *parentVarName _AND_
char *elmtVarName _AND_
int stoleChoiceTags)
{
CTRI *ctri;
Type *tmpType;
char idVarRef[MAX_VAR_REF];
NamedType *idNamedType;
enum BasicTypeChoiceId tmpTypeId;
ctri = t->cTypeRefInfo;
if (!ctri->isEncDec)
return;
tmpType = GetType (t);
if (tmpType->basicType->choiceId == BASICTYPE_ANY)
{
fprintf (src,"/* ANY - Fix Me ! */\n");
fprintf (src," SetAnyTypeBy???(%s, ???);\n", elmtVarName);
fprintf (src," B%s (b, %s, &%s%d, env);\n", ctri->decodeRoutineName, elmtVarName, decodedLenVarNameG, totalLevel);
}
else if (tmpType->basicType->choiceId == BASICTYPE_ANYDEFINEDBY)
{
idNamedType = t->basicType->a.anyDefinedBy->link;
tmpTypeId = GetBuiltinType (idNamedType->type);
if (tmpTypeId == BASICTYPE_OID)
{
MakeVarPtrRef (genDecCRulesG, td, parent, idNamedType->type, parentVarName, idVarRef);
fprintf (src, " SetAnyTypeByOid (%s, %s);\n", elmtVarName, idVarRef);
}
else
{
MakeVarValueRef (genDecCRulesG, td, parent, idNamedType->type, parentVarName, idVarRef);
fprintf (src, " SetAnyTypeByInt (%s, %s);\n", elmtVarName, idVarRef);
}
fprintf (src," B%s (b, %s, &%s%d, env);\n", ctri->decodeRoutineName, elmtVarName, decodedLenVarNameG, totalLevel);
}
else switch (ctri->cTypeId)
{
case C_LIB:
case C_TYPEREF:
if ((tmpType->basicType->choiceId == BASICTYPE_CHOICE) &&
!stoleChoiceTags)
{
fprintf (src, " %s%d = BDecTag (b, &%s%d, env);\n", tagIdVarNameG, ++tagLevel, decodedLenVarNameG, totalLevel);
fprintf (src, " %s%d = BDecLen (b, &%s%d, env);\n", itemLenVarNameG, ++elmtLevel, decodedLenVarNameG, totalLevel);
}
fprintf (src," B%sContent (b, %s%d, %s%d, %s, &%s%d, env);\n", ctri->decodeRoutineName, tagIdVarNameG, tagLevel, itemLenVarNameG, elmtLevel, elmtVarName, decodedLenVarNameG, totalLevel);
if ((tmpType->basicType->choiceId == BASICTYPE_CHOICE)
&& !stoleChoiceTags)
{
fprintf(src," if (elmtLen%d == INDEFINITE_LEN)\n", elmtLevel-1);
fprintf(src," BDecEoc(b, &totalElmtsLen%d, env);\n", totalLevel);
}
break;
case C_CHOICE:
if (!stoleChoiceTags)
{
fprintf (src, " %s%d = BDecTag (b, &%s%d, env);\n\n", tagIdVarNameG, ++tagLevel, decodedLenVarNameG, totalLevel);
fprintf (src, " %s%d = BDecLen (b, &%s%d, env);\n", itemLenVarNameG, ++elmtLevel, decodedLenVarNameG, totalLevel);
}
PrintCBerChoiceDecodeCode (src, td, t, elmtLevel, totalLevel+1, tagLevel, elmtVarName);
break;
case C_STRUCT:
if (t->basicType->choiceId == BASICTYPE_SET)
PrintCBerSetDecodeCode (src, td, t, t->basicType->a.set, elmtLevel, totalLevel+1, tagLevel, elmtVarName);
else
{
PrintCBerSeqDecodeCode (src, td, t, t->basicType->a.sequence, elmtLevel,totalLevel+1, tagLevel, elmtVarName);
fprintf (src," seqDone = FALSE;\n");
}
fprintf (src," %s%d += %s%d;\n", decodedLenVarNameG, totalLevel, decodedLenVarNameG, totalLevel+1);
break;
case C_LIST:
PrintCBerListDecoderCode (src, td, t, elmtLevel, totalLevel+1, tagLevel, elmtVarName);
fprintf (src,"\n\n");
fprintf (src," %s%d += %s%d;\n", decodedLenVarNameG, totalLevel, decodedLenVarNameG, totalLevel+1);
break;
case C_NO_TYPE:
break;
default:
fprintf (stderr,"PrintCBerElmtDecodeCode: ERROR - unknown c type id\n");
break;
}
}
static void
PrintCBerSetDecodeCode PARAMS ((src, td, parent, elmts, elmtLevel, totalLevel, tagLevel, varName),
FILE *src _AND_
TypeDef *td _AND_
Type *parent _AND_
NamedTypeList *elmts _AND_
int elmtLevel _AND_
int totalLevel _AND_
int tagLevel _AND_
char *varName)
{
NamedType *e;
CTRI *ctri;
TagList *tags;
Tag *tag;
TagList *tl;
enum BasicTypeChoiceId builtinType;
char *classStr;
char *formStr;
char *codeStr;
int mandatoryCount = 0;
int i;
char tmpVarName[MAX_VAR_REF];
int stoleChoiceTags;
char *routineName;
int initialTagLevel;
int initialElmtLevel;
initialTagLevel = tagLevel;
initialElmtLevel = elmtLevel;
routineName = td->cTypeDefInfo->decodeRoutineName;
if ((elmts == NULL) || LIST_EMPTY (elmts))
{
fprintf (src," if (elmtLen%d == INDEFINITE_LEN)\n", elmtLevel);
fprintf (src," {\n");
fprintf (src," BDecEoc (b, &totalElmtsLen%d, env);\n", totalLevel);
fprintf (src," }\n");
fprintf (src," else if (elmtLen%d != 0)\n", elmtLevel);
fprintf (src," {\n");
fprintf (src," Asn1Error (\"Expected an empty SET\\n\");\n");
fprintf (src," longjmp (env, %d);\n",(*longJmpValG)--);
fprintf (src," }\n");
return;
}
fprintf (src, "for ( ; (totalElmtsLen%d < elmtLen%d) || (elmtLen%d == INDEFINITE_LEN);)\n", totalLevel, elmtLevel, elmtLevel);
fprintf (src, "{\n");
fprintf (src, " tagId%d = BDecTag (b, &totalElmtsLen%d, env);\n\n", ++tagLevel, totalLevel);
fprintf (src, " if ((tagId%d == EOC_TAG_ID) && (elmtLen%d == INDEFINITE_LEN))\n", tagLevel, elmtLevel);
fprintf (src, " {\n");
fprintf (src, " BDEC_2ND_EOC_OCTET (b, &totalElmtsLen%d, env)\n", totalLevel);
fprintf (src, " break; /* got EOC so can exit this SET's for loop*/\n");
fprintf (src, " }\n");
fprintf (src, " elmtLen%d = BDecLen (b, &totalElmtsLen%d, env);\n", ++elmtLevel, totalLevel);
fprintf (src, " switch (tagId%d)\n", tagLevel);
fprintf (src, " {\n");
FOR_EACH_LIST_ELMT (e, elmts)
{
elmtLevel = initialElmtLevel+1;
tagLevel = initialTagLevel+1;
if ((e->type == NULL) || (e->type->cTypeRefInfo == NULL))
{
fprintf (src, "< ERROR - no c type information - prob unsuported type>\n");
continue;
}
ctri = e->type->cTypeRefInfo;
if (!ctri->isEncDec)
continue;
tags = GetTags (e->type, &stoleChoiceTags);
builtinType = GetBuiltinType (e->type);
if ((tags == NULL) || LIST_EMPTY (tags))
{
if ((builtinType != BASICTYPE_ANY) &&
(builtinType != BASICTYPE_ANYDEFINEDBY))
fprintf (src, "<What? no tag on a SetElmt?>\n");
else
{
fprintf (src," /* ANY - Fix Me ! */\n");
fprintf (src," case MAKE_TAG_ID (?,?,?):\n");
}
}
else
{
tag = (Tag*)FIRST_LIST_ELMT (tags);
classStr = Class2ClassStr (tag->tclass);
codeStr = Code2UnivCodeStr (tag->code);
formStr = Form2FormStr (tag->form);
if (tag->tclass == UNIV)
{
if (tag->form == ANY_FORM)
{
fprintf (src," case MAKE_TAG_ID (%s, %s, %s):\n", classStr, Form2FormStr (CONS), codeStr);
fprintf (src," case MAKE_TAG_ID (%s, %s, %s):\n", classStr, Form2FormStr (PRIM), codeStr);
}
else
fprintf (src," case MAKE_TAG_ID (%s, %s, %s):\n", classStr, formStr, codeStr);
}
else
{
if (tag->form == ANY_FORM)
{
fprintf (src," case MAKE_TAG_ID (%s, %s, %d):\n", classStr, Form2FormStr (CONS), tag->code);
fprintf (src," case MAKE_TAG_ID (%s, %s, %d):\n", classStr, Form2FormStr (PRIM), tag->code);
}
else
fprintf (src," case MAKE_TAG_ID (%s, %s, %d):\n", classStr, formStr, tag->code);
}
AsnListFirst (tags);
AsnListNext (tags);
FOR_REST_LIST_ELMT (tag, tags)
{
codeStr = Code2UnivCodeStr (tag->code);
classStr = Class2ClassStr (tag->tclass);
formStr = Form2FormStr (tag->form);
if (stoleChoiceTags)
{
if (tag->tclass == UNIV)
{
if (tag->form == ANY_FORM)
{
fprintf (src," case MAKE_TAG_ID (%s, %s, %d):\n", classStr, Form2FormStr (CONS), tag->code);
fprintf (src," case MAKE_TAG_ID (%s, %s, %d):\n", classStr, Form2FormStr (PRIM), tag->code);
}
fprintf (src," case MAKE_TAG_ID (%s, %s, %s):\n", classStr, formStr, codeStr);
}
else
{
if (tag->form == ANY_FORM)
{
fprintf (src," case MAKE_TAG_ID (%s, %s, %d):\n", classStr, Form2FormStr (CONS), tag->code);
fprintf (src," case MAKE_TAG_ID (%s, %s, %d):\n", classStr, Form2FormStr (PRIM), tag->code);
}
fprintf (src," case MAKE_TAG_ID (%s, %s, %d):\n", classStr, formStr, tag->code);
}
}
else
{
tagLevel = initialTagLevel+2;
if (tag->form == ANY_FORM)
{
fprintf (src," tagId%d = BDecTag (b, &totalElmtsLen%d, env);\n", tagLevel, totalLevel);
if (tag->tclass == UNIV)
{
fprintf (src,"if ((tagId%d != MAKE_TAG_ID (%s, %s, %s)) &&\n", tagLevel, classStr, Form2FormStr (PRIM), codeStr);
fprintf (src," (tagId%d != MAKE_TAG_ID (%s, %s, %s)))\n", tagLevel, classStr, Form2FormStr (CONS), codeStr);
}
else
{
fprintf (src,"if ((tagId%d != MAKE_TAG_ID (%s, %s, %d)) &&\n", tagLevel, classStr, Form2FormStr (PRIM), tag->code);
fprintf (src," (tagId%d != MAKE_TAG_ID (%s, %s, %d)))\n", tagLevel, classStr, Form2FormStr (CONS), tag->code);
}
}
else
{
if (tag->tclass == UNIV)
fprintf (src,"if (BDecTag (b, &totalElmtsLen%d, env) != MAKE_TAG_ID (%s, %s, %s))\n", totalLevel, classStr, formStr, codeStr);
else
fprintf (src,"if (BDecTag (b, &totalElmtsLen%d, env) != MAKE_TAG_ID (%s, %s, %d))\n", totalLevel, classStr, formStr, tag->code);
}
fprintf (src," {\n");
fprintf (src," Asn1Error (\"Unexpected Tag\\n\");\n");
fprintf (src," longjmp (env, %d);\n", (*longJmpValG)--);
fprintf (src," }\n\n");
fprintf (src,"elmtLen%d = BDecLen (b, &totalElmtsLen%d, env);\n", ++elmtLevel, totalLevel);
}
}
}
MakeVarPtrRef (genDecCRulesG, td, parent, e->type, varName, tmpVarName);
PrintElmtAllocCode (src, e->type, tmpVarName);
PrintCBerElmtDecodeCode (src, td, parent, e->type, elmtLevel, totalLevel, tagLevel, varName, tmpVarName, stoleChoiceTags);
if ((builtinType == BASICTYPE_ANY) ||
(builtinType == BASICTYPE_ANYDEFINEDBY))
PrintEocDecoders (src, elmtLevel, initialElmtLevel, itemLenVarNameG, totalLevel, decodedLenVarNameG);
else if ((builtinType == BASICTYPE_CHOICE) && !(stoleChoiceTags) &&
((tags != NULL) && !LIST_EMPTY (tags)))
PrintEocDecoders (src, elmtLevel, initialElmtLevel, itemLenVarNameG, totalLevel, decodedLenVarNameG);
else
PrintEocDecoders (src, elmtLevel-1, initialElmtLevel, itemLenVarNameG, totalLevel, decodedLenVarNameG);
if ((!e->type->optional) && (e->type->defaultVal == NULL))
{
mandatoryCount++;
fprintf (src, " mandatoryElmtCount%d++;\n", totalLevel);
}
FreeTags (tags);
fprintf (src," break;\n\n");
}
fprintf (src, " default:\n");
fprintf (src, " Asn1Error (\"B%sContent: ERROR - Unexpected tag in SET\\n\");\n", routineName);
fprintf (src, " longjmp (env, %d);\n",(*longJmpValG)--);
fprintf (src, " break;\n");
fprintf (src, " } /* end switch */\n");
fprintf (src, " } /* end for */\n");
fprintf (src, " if (mandatoryElmtCount%d != %d)\n", totalLevel, mandatoryCount);
fprintf (src, " {\n");
fprintf (src, " Asn1Error (\"B%sContent: ERROR - non-optional elmt missing from SET\\n\");\n", routineName);
fprintf (src, " longjmp (env, %d);\n",(*longJmpValG)--);
fprintf (src, " }\n");
}
static void
PrintCBerSeqDecodeCode PARAMS ((src, td, parent, elmts, elmtLevel, totalLevel, tagLevel, varName),
FILE *src _AND_
TypeDef *td _AND_
Type *parent _AND_
NamedTypeList *elmts _AND_
int elmtLevel _AND_
int totalLevel _AND_
int tagLevel _AND_
char *varName)
{
CTRI *ctri;
CTDI *ctdi;
NamedType *e;
NamedType *tmpElmt;
NamedType *last;
TagList *tags;
Tag *tag;
Tag *lastTag;
enum BasicTypeChoiceId builtinType;
enum BasicTypeChoiceId tmpTypeId;
char *classStr;
BER_FORM form;
char *formStr;
char *codeStr;
int i;
char tmpVarName[MAX_VAR_REF];
int stoleChoiceTags;
char *routineName;
int inTailOptElmts = FALSE;
int initialElmtLevel;
int initialTagLevel;
initialTagLevel = tagLevel;
initialElmtLevel = elmtLevel;
routineName = td->cTypeDefInfo->decodeRoutineName;
if ((elmts == NULL) || LIST_EMPTY (elmts))
{
fprintf (src," if (elmtLen%d == INDEFINITE_LEN)\n", elmtLevel);
fprintf (src," {\n");
fprintf (src," BDecEoc (b, &totalElmtsLen%d, env);\n", totalLevel);
fprintf (src," }\n");
fprintf (src," else if (elmtLen%d != 0)\n", elmtLevel);
fprintf (src," {\n");
fprintf (src," Asn1Error (\"Expected an empty SEQUENCE\\n\");\n");
fprintf (src," longjmp (env, %d);\n",(*longJmpValG)--);
fprintf (src," }\n");
return;
}
AsnListFirst (elmts);
inTailOptElmts = IsTailOptional (elmts);
e = (NamedType*)FIRST_LIST_ELMT (elmts);
tmpTypeId = GetBuiltinType (e->type);
tagLevel++;
if (!inTailOptElmts)
{
if (((tmpTypeId == BASICTYPE_ANY) ||
(tmpTypeId == BASICTYPE_ANYDEFINEDBY)) &&
(CountTags (e->type) == 0))
{
if ((e->type->optional) && (e != (NamedType*)LAST_LIST_ELMT (elmts)))
{
fprintf (src,"<untagged optional ANY - you must fix this>\n");
}
}
else
fprintf (src, " tagId%d = BDecTag (b, &totalElmtsLen%d, env);\n\n", tagLevel, totalLevel);
}
else
{
fprintf (src, " if ((elmtLen%d != INDEFINITE_LEN) && (totalElmtsLen%d == elmtLen%d))\n", elmtLevel, totalLevel, elmtLevel);
fprintf (src, " seqDone = TRUE;\n");
fprintf (src, " else\n");
fprintf (src, " {\n");
if (((tmpTypeId == BASICTYPE_ANY) ||
(tmpTypeId == BASICTYPE_ANYDEFINEDBY)) &&
(CountTags (e->type) == 0))
{
if ((e->type->optional) && (e != (NamedType*)LAST_LIST_ELMT (elmts)))
{
fprintf (src,"<untagged optional ANY - you must fix this>\n");
}
}
else
fprintf (src, " tagId%d = BDecTag (b, &totalElmtsLen%d, env);\n\n", tagLevel, totalLevel);
fprintf (src," if ((elmtLen%d == INDEFINITE_LEN) && (tagId%d == EOC_TAG_ID))\n", elmtLevel, tagLevel);
fprintf (src, " {\n");
fprintf (src, " BDEC_2ND_EOC_OCTET (b, &totalElmtsLen%d, env)\n", totalLevel);
fprintf (src, " seqDone = TRUE;\n");
fprintf (src, " }\n");
fprintf (src, " }\n\n");
}
last = (NamedType*)LAST_LIST_ELMT (elmts);
FOR_EACH_LIST_ELMT (e, elmts)
{
elmtLevel = initialElmtLevel;
tagLevel = initialTagLevel+1;
if ((e->type == NULL) || (e->type->cTypeRefInfo == NULL))
{
fprintf (src, "< ERROR - no c type information - prob unsuported type>\n");
continue;
}
ctri = e->type->cTypeRefInfo;
if (!ctri->isEncDec)
continue;
tags = GetTags (e->type, &stoleChoiceTags);
builtinType = GetBuiltinType (e->type);
if ((tags == NULL) || LIST_EMPTY (tags))
{
if ((builtinType != BASICTYPE_ANY) &&
(builtinType != BASICTYPE_ANYDEFINEDBY))
fprintf (src, "<What? no tag on a SetElmt?>\n");
if (inTailOptElmts)
{
fprintf (src," if (!seqDone)");
}
fprintf (src," {\n");
}
else
{
tag = (Tag*)FIRST_LIST_ELMT (tags);
classStr = Class2ClassStr (tag->tclass);
codeStr = Code2UnivCodeStr (tag->code);
formStr = Form2FormStr (tag->form);
if (inTailOptElmts)
fprintf (src," if ((!seqDone) && (");
else
fprintf (src," if ((");
if (tag->tclass == UNIV)
{
if (tag->form == ANY_FORM)
{
fprintf (src,"(tagId%d == MAKE_TAG_ID (%s, %s, %s)) ||\n", tagLevel, classStr, Form2FormStr (PRIM), codeStr);
fprintf (src,"(tagId%d == MAKE_TAG_ID (%s, %s, %s))", tagLevel, classStr, Form2FormStr (CONS), codeStr);
}
else
fprintf (src,"(tagId%d == MAKE_TAG_ID (%s, %s, %s))", tagLevel, classStr, formStr, codeStr);
}
else
{
if (tag->form == ANY_FORM)
{
fprintf (src,"(tagId%d == MAKE_TAG_ID (%s, %s, %d)) ||\n", tagLevel, classStr, Form2FormStr (PRIM), tag->code);
fprintf (src,"(tagId%d == MAKE_TAG_ID (%s, %s, %d))", tagLevel, classStr, Form2FormStr (CONS), tag->code);
}
else
fprintf (src,"(tagId%d == MAKE_TAG_ID (%s, %s, %d))", tagLevel, classStr, formStr, tag->code);
}
if (!stoleChoiceTags)
{
fprintf (src,"))\n");
fprintf (src, " {\n");
fprintf (src," elmtLen%d = BDecLen (b, &totalElmtsLen%d, env);\n", ++elmtLevel, totalLevel);
}
AsnListFirst (tags);
AsnListNext (tags);
FOR_REST_LIST_ELMT (tag, tags)
{
classStr = Class2ClassStr (tag->tclass);
codeStr = Code2UnivCodeStr (tag->code);
formStr = Form2FormStr (tag->form);
if (stoleChoiceTags)
{
fprintf (src," ||\n");
if (tag->tclass == UNIV)
{
if (tag->form == ANY_FORM)
{
fprintf (src," (tagId%d ==MAKE_TAG_ID (%s, %s, %s))", tagLevel, classStr, Form2FormStr (PRIM), codeStr);
fprintf (src,"||\n (tagId%d == MAKE_TAG_ID (%s, %s, %s))", tagLevel, classStr, Form2FormStr (CONS), codeStr);
}
else
fprintf (src," (tagId%d ==MAKE_TAG_ID (%s, %s, %s))", tagLevel, classStr, formStr, codeStr);
}
else
{
if (tag->form == ANY_FORM)
{
fprintf (src," (tagId%d == MAKE_TAG_ID (%s, %s, %d))", tagLevel, classStr, Form2FormStr (PRIM), tag->code);
fprintf (src,"||\n (tagId%d == MAKE_TAG_ID (%s, %s, %d))", tagLevel, classStr, Form2FormStr (CONS), tag->code);
}
else
fprintf (src," (tagId%d == MAKE_TAG_ID (%s, %s, %d))", tagLevel, classStr, formStr, tag->code);
}
}
else
{
tagLevel = initialTagLevel + 2;
fprintf (src, " tagId%d = BDecTag (b, &totalElmtsLen%d, env);\n\n", tagLevel, totalLevel);
if (tag->tclass == UNIV)
{
if (tag->form == ANY_FORM)
{
fprintf (src," if ((tagId%d != MAKE_TAG_ID (%s, %s, %s)) &&\n", tagLevel, classStr, Form2FormStr (PRIM), codeStr);
fprintf (src," (tagId%d != MAKE_TAG_ID (%s, %s, %s)))\n", tagLevel, classStr, Form2FormStr (CONS), codeStr);
}
else
fprintf (src," if (tagId%d != MAKE_TAG_ID (%s, %s, %s))\n", tagLevel, classStr, formStr, codeStr);
}
else
{
if (tag->form == ANY_FORM)
{
fprintf (src," if ((tagId%d != MAKE_TAG_ID (%s, %s, %d)) &&\n", tagLevel, classStr, Form2FormStr (PRIM), tag->code);
fprintf (src," (tagId%d != MAKE_TAG_ID (%s, %s, %d)))\n", tagLevel, classStr, Form2FormStr (CONS), tag->code);
}
else
fprintf (src," if (tagId%d != MAKE_TAG_ID (%s, %s, %d))\n", tagLevel, classStr, formStr, tag->code);
}
fprintf (src," {\n");
fprintf (src," Asn1Error (\"Unexpected Tag\\n\");\n");
fprintf (src," longjmp (env, %d);\n",(*longJmpValG)--);
fprintf (src," }\n\n");
fprintf (src," elmtLen%d = BDecLen (b, &totalElmtsLen%d, env);\n", ++elmtLevel, totalLevel);
}
}
if (stoleChoiceTags)
{
fprintf (src,"))\n");
fprintf (src, " {\n");
fprintf (src, " elmtLen%d = BDecLen (b, &totalElmtsLen%d, env);\n", ++elmtLevel, totalLevel);
}
}
MakeVarPtrRef (genDecCRulesG, td, parent, e->type, varName, tmpVarName);
PrintElmtAllocCode (src, e->type, tmpVarName);
PrintCBerElmtDecodeCode (src, td, parent, e->type, elmtLevel, totalLevel, tagLevel, varName, tmpVarName, stoleChoiceTags);
if ((builtinType == BASICTYPE_ANY) ||
(builtinType == BASICTYPE_ANYDEFINEDBY))
PrintEocDecoders (src, elmtLevel, initialElmtLevel, itemLenVarNameG, totalLevel, decodedLenVarNameG);
else if ((builtinType == BASICTYPE_CHOICE) && (!stoleChoiceTags) &&
((tags != NULL) && !LIST_EMPTY (tags)))
PrintEocDecoders (src, elmtLevel, initialElmtLevel, itemLenVarNameG, totalLevel, decodedLenVarNameG);
else
PrintEocDecoders (src, elmtLevel-1, initialElmtLevel, itemLenVarNameG, totalLevel, decodedLenVarNameG);
if (!inTailOptElmts)
{
AsnListNext (elmts);
inTailOptElmts = IsTailOptional (elmts);
AsnListPrev (elmts);
}
tmpTypeId = GetBuiltinType (e->type);
if (e != last)
{
tmpElmt = (NamedType*)NEXT_LIST_ELMT (elmts);
tmpTypeId = GetBuiltinType (tmpElmt->type);
if (!inTailOptElmts)
{
if (((tmpTypeId == BASICTYPE_ANY) ||
(tmpTypeId == BASICTYPE_ANYDEFINEDBY)) &&
(CountTags (tmpElmt->type) == 0))
{
if ((e->type->optional) ||
((tmpElmt->type->optional) && (tmpElmt != last)))
{
fprintf (src," <problems with untagged ANY that is optional or follows an optional sequence element - you must fix this>\n");
}
}
else
fprintf (src, " tagId%d = BDecTag (b, &totalElmtsLen%d, env);\n", initialTagLevel+1, totalLevel);
}
else
{
fprintf (src, " if ((elmtLen%d != INDEFINITE_LEN) && (totalElmtsLen%d == elmtLen%d))\n", initialElmtLevel, totalLevel, initialElmtLevel);
fprintf (src, " seqDone = TRUE;\n");
fprintf (src, " else\n");
fprintf (src, " {\n");
if (((tmpTypeId == BASICTYPE_ANY) ||
(tmpTypeId == BASICTYPE_ANYDEFINEDBY)) &&
(CountTags (tmpElmt->type) == 0))
{
if ((e->type->optional) ||
((tmpElmt->type->optional) && (tmpElmt != last)))
{
fprintf (src," <problems with untagged ANY that is optional or follows an optional sequence element - you must fix this>\n");
}
fprintf (src," tagId%d = BufPeekByte (b);\n", initialTagLevel+1);
fprintf (src," if ((elmtLen%d == INDEFINITE_LEN) && (tagId%d == EOC_TAG_ID))\n", initialElmtLevel, initialTagLevel+1);
fprintf (src, " {\n");
fprintf (src, " BDecEoc (b, &totalElmtsLen%d, env);\n", totalLevel);
fprintf (src, " seqDone = TRUE;\n");
fprintf (src, " }\n");
}
else
{
fprintf (src, " tagId%d = BDecTag (b, &totalElmtsLen%d, env);\n\n", initialTagLevel+1, totalLevel);
fprintf (src," if ((elmtLen%d == INDEFINITE_LEN) && (tagId%d == EOC_TAG_ID))\n", initialElmtLevel, initialTagLevel+1);
fprintf (src, " {\n");
fprintf (src, " BDEC_2ND_EOC_OCTET (b, &totalElmtsLen%d, env)\n", totalLevel);
fprintf (src, " seqDone = TRUE;\n");
fprintf (src, " }\n");
}
fprintf (src, " }\n");
}
}
else
{
fprintf (src," seqDone = TRUE;\n");
fprintf (src," if (elmtLen%d == INDEFINITE_LEN)\n", initialElmtLevel);
fprintf (src," BDecEoc (b, &totalElmtsLen%d, env);\n", totalLevel);
fprintf (src," else if (totalElmtsLen%d != elmtLen%d)\n", totalLevel, initialElmtLevel);
fprintf (src," longjmp (env, %d);\n",(*longJmpValG)--);
}
tmpTypeId = GetBuiltinType (e->type);
if (((tmpTypeId == BASICTYPE_ANYDEFINEDBY) ||
(tmpTypeId == BASICTYPE_ANY)) &&
(CountTags (e->type) == 0))
{
fprintf (src," }\n");
}
else if (!e->type->optional && (e->type->defaultVal == NULL))
{
fprintf (src, " }\n");
fprintf (src, " else\n");
fprintf (src, " longjmp (env, %d);\n", (*longJmpValG)--);
}
else
{
fprintf (src, " }\n");
}
fprintf (src,"\n\n");
FreeTags (tags);
}
fprintf (src," if (!seqDone)\n");
fprintf (src, " longjmp (env, %d);\n\n", (*longJmpValG)--);
}
static void
PrintCBerListDecoderCode PARAMS ((src, td, list, elmtLevel, totalLevel, tagLevel, varName),
FILE *src _AND_
TypeDef *td _AND_
Type *list _AND_
int elmtLevel _AND_
int totalLevel _AND_
int tagLevel _AND_
char *varName)
{
CTRI *ctri;
TagList *tags;
Tag *tag;
Tag *lastTag;
enum BasicTypeChoiceId builtinType;
char *classStr;
BER_FORM form;
char *formStr;
char *codeStr;
int mandatoryCount = 0;
int i;
char tmpVarName[MAX_VAR_REF];
int stoleChoiceTags;
char *routineName;
int initialTagLevel;
int initialElmtLevel;
int taglessAny;
initialTagLevel = tagLevel;
initialElmtLevel = elmtLevel;
routineName = td->cTypeDefInfo->decodeRoutineName;
ctri = list->basicType->a.setOf->cTypeRefInfo;
tags = GetTags (list->basicType->a.setOf, &stoleChoiceTags);
builtinType = GetBuiltinType (list->basicType->a.setOf);
taglessAny = (((tags == NULL) || LIST_EMPTY (tags)) &&
((builtinType == BASICTYPE_ANY) ||
(builtinType == BASICTYPE_ANYDEFINEDBY)));
fprintf (src, " for (totalElmtsLen%d = 0; (totalElmtsLen%d < elmtLen%d) || (elmtLen%d == INDEFINITE_LEN);)\n", totalLevel, totalLevel, elmtLevel, elmtLevel);
fprintf (src, " {\n");
fprintf (src," %s **tmpVar;\n", ctri->cTypeName);
if (taglessAny)
{
fprintf (src, " tagId%d = BufPeekByte (b);\n\n", ++tagLevel);
fprintf (src, " if ((tagId%d == EOC_TAG_ID) && (elmtLen%d == INDEFINITE_LEN))\n", tagLevel, elmtLevel);
fprintf (src, " {\n");
fprintf (src, " BDecEoc (b, &totalElmtsLen%d, env);\n", totalLevel);
fprintf (src, " break; /* got EOC so can exit this SET OF/SEQ OF's for loop*/\n");
fprintf (src, " }\n");
}
else
{
fprintf (src, " tagId%d = BDecTag (b, &totalElmtsLen%d, env);\n\n", ++tagLevel, totalLevel);
fprintf (src, " if ((tagId%d == EOC_TAG_ID) && (elmtLen%d == INDEFINITE_LEN))\n", tagLevel, elmtLevel);
fprintf (src, " {\n");
fprintf (src, " BDEC_2ND_EOC_OCTET (b, &totalElmtsLen%d, env)\n", totalLevel);
fprintf (src, " break; /* got EOC so can exit this SET OF/SEQ OF's for loop*/\n");
fprintf (src, " }\n");
}
if ((tags == NULL) || LIST_EMPTY (tags))
{
if (!taglessAny)
fprintf (src, "<What? no tag on a SET OF/SEQ OF Elmt?>\n");
}
else if (!stoleChoiceTags)
{
tag = (Tag*)FIRST_LIST_ELMT (tags);
classStr = Class2ClassStr (tag->tclass);
codeStr = Code2UnivCodeStr (tag->code);
formStr = Form2FormStr (tag->form);
if (tag->tclass == UNIV)
{
if (tag->form == ANY_FORM)
{
fprintf (src," if ((tagId%d == MAKE_TAG_ID (%s, %s, %s)) ||", tagLevel, classStr, Form2FormStr (PRIM), codeStr);
fprintf (src," (tagId%d == MAKE_TAG_ID (%s, %s, %s))", tagLevel, classStr, Form2FormStr (CONS), codeStr);
}
else
fprintf (src," if ((tagId%d == MAKE_TAG_ID (%s, %s, %s))", tagLevel, classStr, formStr, codeStr);
}
else
{
if (tag->form == ANY_FORM)
{
fprintf (src," if ((tagId%d == MAKE_TAG_ID (%s, %s, %d)) ||\n", tagLevel, classStr, Form2FormStr (PRIM), tag->code);
fprintf (src," (tagId%d == MAKE_TAG_ID (%s, %s, %d))", tagLevel, classStr, Form2FormStr (CONS), tag->code);
}
else
fprintf (src," if ((tagId%d == MAKE_TAG_ID (%s, %s, %d))", tagLevel, classStr, formStr, tag->code);
}
fprintf (src,")\n");
fprintf (src, " {\n");
fprintf (src, " elmtLen%d = BDecLen (b, &totalElmtsLen%d, env);\n", ++elmtLevel, totalLevel);
AsnListFirst (tags);
AsnListNext (tags);
FOR_REST_LIST_ELMT (tag, tags)
{
tagLevel = initialTagLevel+2;
fprintf (src, " tagId%d = BDecTag (b, &totalElmtsLen%d, env);\n\n", tagLevel, totalLevel);
classStr = Class2ClassStr (tag->tclass);
codeStr = Code2UnivCodeStr (tag->code);
formStr = Form2FormStr (tag->form);
if (tag->tclass == UNIV)
{
if (tag->form == ANY_FORM)
{
fprintf (src," if ((tagId%d != MAKE_TAG_ID (%s, %s, %s)) ||\n", tagLevel, classStr, Form2FormStr (PRIM), codeStr);
fprintf (src," (tagId%d != MAKE_TAG_ID (%s, %s, %s)))\n", tagLevel, classStr, Form2FormStr (CONS), codeStr);
}
else
fprintf (src," if (tagId%d != MAKE_TAG_ID (%s, %s, %s))\n", tagLevel, classStr, formStr, codeStr);
}
else
{
if (tag->form == ANY_FORM)
{
fprintf (src," if ((tagId%d != MAKE_TAG_ID (%s, %s, %d)) ||\n", tagLevel, classStr, Form2FormStr (PRIM), tag->code);
fprintf (src," (tagId%d != MAKE_TAG_ID (%s, %s, %d)))\n", tagLevel, classStr, Form2FormStr (CONS), tag->code);
}
else
fprintf (src," if (tagId%d != MAKE_TAG_ID (%s, %s, %d))\n", tagLevel, classStr, formStr, tag->code);
}
fprintf (src," {\n");
fprintf (src," Asn1Error (\"Unexpected Tag\\n\");\n");
fprintf (src," longjmp (env, %d);\n", (*longJmpValG)--);
fprintf (src," }\n\n");
fprintf (src," elmtLen%d = BDecLen (b, &totalElmtsLen%d, env);\n", ++elmtLevel, totalLevel);
}
}
if (stoleChoiceTags)
{
fprintf (src, " elmtLen%d = BDecLen (b, &totalElmtsLen%d, env);\n", ++elmtLevel, totalLevel);
}
strcpy (tmpVarName, "(*tmpVar)");
fprintf (src," tmpVar = (%s**) AsnListAppend (%s);\n", ctri->cTypeName, varName);
fprintf (src, " %s = (%s*) Asn1Alloc (sizeof (%s));\n", tmpVarName, ctri->cTypeName, ctri->cTypeName);
fprintf (src," CheckAsn1Alloc (%s, env);\n", tmpVarName);
PrintCBerElmtDecodeCode (src, td, list, list->basicType->a.setOf, elmtLevel, totalLevel, tagLevel, varName, tmpVarName, stoleChoiceTags);
if ((builtinType == BASICTYPE_ANY) ||
(builtinType == BASICTYPE_ANYDEFINEDBY))
PrintEocDecoders (src, elmtLevel, initialElmtLevel, itemLenVarNameG, totalLevel, decodedLenVarNameG);
else if ((builtinType == BASICTYPE_CHOICE) && (!stoleChoiceTags) &&
((tags != NULL) && !LIST_EMPTY (tags)))
PrintEocDecoders (src, elmtLevel, initialElmtLevel, itemLenVarNameG, totalLevel, decodedLenVarNameG);
else
PrintEocDecoders (src, elmtLevel-1, initialElmtLevel, itemLenVarNameG, totalLevel, decodedLenVarNameG);
if ((!stoleChoiceTags) && (!taglessAny))
{
fprintf (src, " } /* end of tag check if */\n");
fprintf (src, " else /* wrong tag */\n");
fprintf (src," {\n");
fprintf (src," Asn1Error (\"Unexpected Tag\\n\");\n");
fprintf (src," longjmp (env, %d);\n", (*longJmpValG)--);
fprintf (src," }\n");
}
fprintf (src, " } /* end of for */\n\n");
FreeTags (tags);
}
static void
PrintCBerChoiceDecodeCode PARAMS ((src, td, t, elmtLevel, totalLevel, tagLevel, varName),
FILE *src _AND_
TypeDef *td _AND_
Type *t _AND_
int elmtLevel _AND_
int totalLevel _AND_
int tagLevel _AND_
char *varName)
{
NamedType *e;
CTRI *ctri;
TagList *tags;
Tag *tag;
Tag *lastTag;
enum BasicTypeChoiceId builtinType;
char *classStr;
BER_FORM form;
char *formStr;
char *codeStr;
int mandatoryCount = 0;
int i;
char tmpVarName[MAX_VAR_REF];
char choiceIdVarName[MAX_VAR_REF];
CTRI *parentCtri;
int stoleChoiceTags;
void *tmp;
int initialTagLevel;
int initialElmtLevel;
initialTagLevel = tagLevel;
initialElmtLevel = elmtLevel;
parentCtri = t->cTypeRefInfo;
fprintf (src, " switch (tagId%d)\n", tagLevel);
fprintf (src, " {\n");
FOR_EACH_LIST_ELMT (e, t->basicType->a.choice)
{
tmp = (void*)CURR_LIST_NODE (t->basicType->a.choice);
tagLevel = initialTagLevel;
elmtLevel = initialElmtLevel;
if ((e->type == NULL) || (e->type->cTypeRefInfo == NULL))
{
fprintf (src, "< ERROR - no c type information - prob unsuported type>\n");
continue;
}
ctri = e->type->cTypeRefInfo;
tags = GetTags (e->type, &stoleChoiceTags);
builtinType = GetBuiltinType (e->type);
if ((tags == NULL) || LIST_EMPTY (tags))
{
if ((builtinType != BASICTYPE_ANY) &&
(builtinType != BASICTYPE_ANYDEFINEDBY))
fprintf (src, "<What? no tag on a CHOICE elmt?>\n");
else
{
fprintf (src, " /* You must hand code ANY type refs */\n");
fprintf (src," case MAKE_TAG_ID (?, ?, ?):\n");
}
}
else
{
tag = (Tag*)FIRST_LIST_ELMT (tags);
classStr = Class2ClassStr (tag->tclass);
codeStr = Code2UnivCodeStr (tag->code);
formStr = Form2FormStr (tag->form);
if (tag->tclass == UNIV)
{
if (tag->form == ANY_FORM)
{
fprintf (src," case MAKE_TAG_ID (%s, %s, %s):\n", classStr, Form2FormStr (PRIM), codeStr);
fprintf (src," case MAKE_TAG_ID (%s, %s, %s):\n", classStr, Form2FormStr (CONS), codeStr);
}
else
fprintf (src," case MAKE_TAG_ID (%s, %s, %s):\n", classStr, formStr, codeStr);
}
else
{
if (tag->form == ANY_FORM)
{
fprintf (src," case MAKE_TAG_ID (%s, %s, %d):\n", classStr, Form2FormStr (PRIM), tag->code);
fprintf (src," case MAKE_TAG_ID (%s, %s, %d):\n", classStr, Form2FormStr (CONS), tag->code);
}
else
fprintf (src," case MAKE_TAG_ID (%s, %s, %d):\n", classStr, formStr, tag->code);
}
AsnListFirst (tags);
AsnListNext (tags);
FOR_REST_LIST_ELMT (tag, tags)
{
classStr = Class2ClassStr (tag->tclass);
codeStr = Code2UnivCodeStr (tag->code);
formStr = Form2FormStr (tag->form);
if (stoleChoiceTags)
{
if (tag->tclass == UNIV)
{
if (tag->form == ANY_FORM)
{
fprintf (src," case MAKE_TAG_ID (%s, %s, %s):\n", classStr, Form2FormStr (PRIM), codeStr);
fprintf (src," case MAKE_TAG_ID (%s, %s, %s):\n", classStr, Form2FormStr (CONS), codeStr);
}
else
fprintf (src," case MAKE_TAG_ID (%s, %s, %s):\n", classStr, formStr, codeStr);
}
else
{
if (tag->form == ANY_FORM)
{
fprintf (src," case MAKE_TAG_ID (%s, %s, %d):\n", classStr, Form2FormStr (PRIM), tag->code);
fprintf (src," case MAKE_TAG_ID (%s, %s, %d):\n", classStr, Form2FormStr (CONS), tag->code);
}
else
fprintf (src," case MAKE_TAG_ID (%s, %s, %d):\n", classStr, formStr, tag->code);
}
}
else
{
tagLevel = initialTagLevel +1;
if (tag->form == ANY_FORM)
{
fprintf (src," tagId%d = BDecTag (b, &totalElmtsLen%d, env);\n", tagLevel, totalLevel);
if (tag->tclass == UNIV)
{
fprintf (src,"if ((tagId%d != MAKE_TAG_ID (%s, %s, %s)) &&\n", tagLevel, classStr, Form2FormStr (PRIM), codeStr);
fprintf (src," (tagId%d != MAKE_TAG_ID (%s, %s, %s)))\n", tagLevel, classStr, Form2FormStr (CONS), codeStr);
}
else
{
fprintf (src,"if ((tagId%d != MAKE_TAG_ID (%s, %s, %d)) &&\n", tagLevel, classStr, Form2FormStr (PRIM), tag->code);
fprintf (src," (tagId%d != MAKE_TAG_ID (%s, %s, %d)))\n", tagLevel, classStr, Form2FormStr (CONS), tag->code);
}
}
else
{
if (tag->tclass == UNIV)
fprintf (src,"if (BDecTag (b, &totalElmtsLen%d, env) != MAKE_TAG_ID (%s, %s, %s))\n", totalLevel, classStr, formStr, codeStr);
else
fprintf (src,"if (BDecTag (b, &totalElmtsLen%d, env) != MAKE_TAG_ID (%s, %s, %d))\n", totalLevel, classStr, formStr, tag->code);
}
fprintf (src," {\n");
fprintf (src," Asn1Error (\"Unexpected Tag\\n\");\n");
fprintf (src," longjmp (env, %d);\n", (*longJmpValG)--);
fprintf (src," }\n\n");
fprintf (src," elmtLen%d = BDecLen (b, &totalElmtsLen%d, env);\n", ++elmtLevel, totalLevel);
}
}
}
MakeChoiceIdValueRef (genDecCRulesG, td, t, e->type, varName, choiceIdVarName);
fprintf (src, " %s = %s;\n", choiceIdVarName, ctri->choiceIdSymbol);
MakeVarPtrRef (genDecCRulesG, td, t, e->type, varName, tmpVarName);
PrintElmtAllocCode (src, e->type, tmpVarName);
PrintCBerElmtDecodeCode (src, td, t, e->type, elmtLevel, totalLevel, tagLevel, varName, tmpVarName, stoleChoiceTags);
if ((builtinType == BASICTYPE_ANY) ||
(builtinType == BASICTYPE_ANYDEFINEDBY))
PrintEocDecoders (src, elmtLevel, initialElmtLevel-1, itemLenVarNameG, totalLevel, decodedLenVarNameG);
else if ((builtinType == BASICTYPE_CHOICE) && (!stoleChoiceTags) &&
((tags != NULL) && !LIST_EMPTY (tags)))
PrintEocDecoders (src, elmtLevel, initialElmtLevel-1, itemLenVarNameG, totalLevel, decodedLenVarNameG);
else
PrintEocDecoders (src, elmtLevel-1, initialElmtLevel-1, itemLenVarNameG, totalLevel, decodedLenVarNameG);
FreeTags (tags);
fprintf (src," break;\n\n");
SET_CURR_LIST_NODE (t->basicType->a.choice, tmp);
}
fprintf (src," default:\n");
fprintf (src," Asn1Error (\"ERROR - unexpected tag in CHOICE\\n\");\n");
fprintf (src," longjmp (env, %d);\n",(*longJmpValG)--);
fprintf (src," break;\n");
fprintf (src, " } /* end switch */\n");
}
static void
PrintCLenDecodingCode PARAMS ((f),
FILE *f)
{
fprintf (f, " itemLen += BDecDefLen (b, itemLen);");
}