#ifdef TTBL
#include <stdio.h>
#include "tbl-incl.h"
#include "sbuf.h"
void TblLinkIndexes PROTO ((TBL *tbl));
void TblLinkTypeRefs PROTO ((TBL *tbl, TBLType *tblT));
void TblFixTags PROTO ((TBL *tbl));
void TblFixTypeTags PROTO ((TBLType *tblT));
void TblSetTagForms PROTO ((TBLType *t));
char*
LoadFile PARAMS ((fileName, size),
char *fileName _AND_
unsigned long int *size)
{
FILE *f;
unsigned long int fsize;
char *fileData;
f = fopen (fileName, "r");
if (f == NULL)
{
Asn1Error("Could not open file for reading.\n");
return NULL;
}
fseek (f, 0, 2);
fsize = ftell (f);
fseek (f, 0, 0);
*size = fsize;
fileData = (char *) malloc (fsize);
if (fileData == NULL)
{
Asn1Error("Not enough memory to read in file.\n");
return NULL;
}
if (fread (fileData, sizeof (char), fsize, f) != fsize)
{
free (fileData);
fileData = NULL;
Asn1Error("Trouble reading file.\n");
}
fclose (f);
return fileData;
}
TBL*
LoadTblFile PARAMS ((tblFileName),
char *tblFileName)
{
SBuf sb;
SBuf *sbPtr;
GenBuf gb;
TBL *tbl;
unsigned long int fsize;
char *fileData;
AsnLen decodedLen;
ENV_TYPE env;
int val;
fileData = LoadFile (tblFileName, &fsize);
if (fileData == NULL)
return NULL;
SBufInstallData (&sb, fileData, fsize);
SBufResetInReadMode (&sb);
PutSBufInGenBuf (&sb, &gb);
decodedLen = 0;
tbl = (TBL*)Asn1Alloc (sizeof (TBL));
if ((val = setjmp (env)) == 0)
BDecTBL (&gb, tbl, &decodedLen, env);
else
return NULL;
TblLinkIndexes (tbl);
TblFixTags (tbl);
free (fileData);
return tbl;
}
void
TblLinkIndexes PARAMS ((tbl),
TBL *tbl)
{
TBLModule *tblMod;
TBLTypeDef *tblTd;
FOR_EACH_LIST_ELMT (tblMod, tbl->modules)
{
FOR_EACH_LIST_ELMT (tblTd, tblMod->typeDefs)
{
TblLinkTypeRefs (tbl, tblTd->type);
}
}
}
void
TblFixTags PARAMS ((tbl),
TBL *tbl)
{
TBLModule *tblMod;
TBLTypeDef *tblTd;
FOR_EACH_LIST_ELMT (tblMod, tbl->modules)
{
FOR_EACH_LIST_ELMT (tblTd, tblMod->typeDefs)
{
TblFixTypeTags (tblTd->type);
}
}
}
void
TblLinkTypeRefs PARAMS ((tbl, tblT),
TBL *tbl _AND_
TBLType *tblT)
{
TBLType *tblElmtT;
void *tmp;
switch (tblT->typeId)
{
case TBL_BOOLEAN:
case TBL_INTEGER:
case TBL_BITSTRING:
case TBL_OCTETSTRING:
case TBL_NULL:
case TBL_OID:
case TBL_REAL:
case TBL_ENUMERATED:
break;
case TBL_SEQUENCE:
case TBL_SET:
case TBL_SEQUENCEOF:
case TBL_SETOF:
case TBL_CHOICE:
tmp = CURR_LIST_NODE (tblT->content->a.elmts);
FOR_EACH_LIST_ELMT (tblElmtT, tblT->content->a.elmts)
{
TblLinkTypeRefs (tbl, tblElmtT);
}
SET_CURR_LIST_NODE (tblT->content->a.elmts, tmp);
break;
case TBL_TYPEREF:
tblT->content->a.typeRef->typeDefPtr =
TblFindTypeDefByIndex (tbl, tblT->content->a.typeRef->typeDef);
break;
}
}
void
TblFixTypeTags PARAMS ((tblT),
TBLType *tblT)
{
void *tmp;
TBLType *tblElmtT;
TblSetTagForms (tblT);
switch (tblT->typeId)
{
case TBL_SEQUENCE:
case TBL_SET:
case TBL_SEQUENCEOF:
case TBL_SETOF:
case TBL_CHOICE:
tmp = CURR_LIST_NODE (tblT->content->a.elmts);
FOR_EACH_LIST_ELMT (tblElmtT, tblT->content->a.elmts)
{
TblFixTypeTags (tblElmtT);
}
SET_CURR_LIST_NODE (tblT->content->a.elmts, tmp);
break;
default:
break;
}
}
void
TblSetTagForms PARAMS ((tblT),
TBLType *tblT)
{
TBLTag *tblTag;
TBLType *tmpTblT;
int numTags;
TBLTypeId tid;
BER_FORM form;
if (tblT->tagList == NULL)
return;
numTags = LIST_COUNT (tblT->tagList);
for (tmpTblT = tblT; tmpTblT->typeId == TBL_TYPEREF; tmpTblT = tmpTblT->content->a.typeRef->typeDefPtr->type)
{
if (tmpTblT->tagList)
numTags += LIST_COUNT (tmpTblT->tagList);
if (tmpTblT->content->a.typeRef->implicit)
numTags--;
}
tid = tmpTblT->typeId;
FOR_EACH_LIST_ELMT (tblTag, tblT->tagList)
{
if (numTags > 1)
form = tblTag->form = CONS;
else
switch (tid)
{
case TBL_SEQUENCE:
case TBL_SET:
case TBL_SEQUENCEOF:
case TBL_SETOF:
case TBL_CHOICE:
form = tblTag->form = CONS;
break;
case TBL_OCTETSTRING:
case TBL_BITSTRING:
tblTag->form = ANY_FORM;
form = PRIM;
break;
default:
form = tblTag->form = PRIM;
break;
}
tblTag->encTag = MAKE_TAG_ID (TblTagClassToBer (tblTag->tclass), form, tblTag->code);
numTags--;
}
}
TBLTypeDef*
TblFindTypeDef PARAMS ((tbl, modName, typeName, tblModHndl),
TBL *tbl _AND_
char *modName _AND_
char *typeName _AND_
TBLModule **tblModHndl)
{
TBLModule *tblMod;
TBLTypeDef *tblTd;
void *tmp;
if (modName != NULL)
{
tblMod = TblFindModule (tbl, modName);
*tblModHndl = tblMod;
if (tblMod == NULL)
return NULL;
return TblFindTypeDefInMod (tblMod, typeName);
}
else
{
tmp = CURR_LIST_NODE (tbl->modules);
FOR_EACH_LIST_ELMT (tblMod, tbl->modules)
{
tblTd = TblFindTypeDefInMod (tblMod, typeName);
if (tblTd != NULL)
{
*tblModHndl = tblMod;
SET_CURR_LIST_NODE (tbl->modules, tmp);
return tblTd;
}
}
SET_CURR_LIST_NODE (tbl->modules, tmp);
}
return NULL;
}
TBLTypeDef*
TblFindTypeDefInMod PARAMS ((tblMod, typeName),
TBLModule *tblMod _AND_
char *typeName)
{
TBLTypeDef *tblTd;
void *tmp;
tmp = CURR_LIST_NODE (tblMod->typeDefs);
FOR_EACH_LIST_ELMT (tblTd, tblMod->typeDefs)
{
if (strcmp (tblTd->typeName.octs, typeName) == 0)
{
SET_CURR_LIST_NODE (tblMod->typeDefs, tmp);
return tblTd;
}
}
SET_CURR_LIST_NODE (tblMod->typeDefs, tmp);
return NULL;
}
TBLTypeDef*
TblFindTypeDefByIndex PARAMS ((tbl, id),
TBL *tbl _AND_
TBLTypeDefId id)
{
TBLModule *tblMod;
TBLTypeDef *tblTd;
void *tmp1;
void *tmp2;
tmp1 = CURR_LIST_NODE (tbl->modules);
FOR_EACH_LIST_ELMT (tblMod, tbl->modules)
{
tmp2 = CURR_LIST_NODE (tblMod->typeDefs);
FOR_EACH_LIST_ELMT (tblTd, tblMod->typeDefs)
{
if (tblTd->typeDefId == id)
{
SET_CURR_LIST_NODE (tblMod->typeDefs, tmp2);
SET_CURR_LIST_NODE (tbl->modules, tmp1);
return tblTd;
}
}
SET_CURR_LIST_NODE (tblMod->typeDefs, tmp2);
}
SET_CURR_LIST_NODE (tbl->modules, tmp1);
return NULL;
}
TBLModule*
TblFindModule PARAMS ((tbl, modName),
TBL *tbl _AND_
char *modName)
{
TBLModule *tblMod;
void *tmp;
tmp = CURR_LIST_NODE (tbl->modules);
FOR_EACH_LIST_ELMT (tblMod, tbl->modules)
{
if (strcmp (tblMod->name.octs, modName) == 0)
{
SET_CURR_LIST_NODE (tbl->modules, tmp);
return tblMod;
}
}
SET_CURR_LIST_NODE (tbl->modules, tmp);
return NULL;
}
#endif