#include <stdio.h>
#include "asn-incl.h"
#include "asn1module.h"
#include "mem.h"
#include "define.h"
#include "lib-types.h"
#include "c-gen/rules.h"
#include "c-gen/type-info.h"
#include "str-util.h"
#include "snacc-util.h"
#include "c-gen/util.h"
#include "tag-util.h"
TagList*
GetTags PARAMS ((t, stoleChoiceTags),
Type *t _AND_
int *stoleChoiceTags)
{
Tag *tag;
TagList *tl;
TagList *retVal;
Tag *last;
Tag *tagCopy;
Tag **tagHndl;
int implicitRef;
int stoleChoicesAgain;
NamedType *e;
tl = t->tags;
if (tl != NULL)
AsnListFirst (tl);
retVal = (TagList*) AsnListNew (sizeof (void*));
implicitRef = FALSE;
*stoleChoiceTags = FALSE;
for (;;)
{
FOR_REST_LIST_ELMT (tag, tl)
{
tagCopy = (Tag*)Malloc (sizeof (Tag));
memcpy (tagCopy, tag, sizeof (Tag));
tagHndl = (Tag**)AsnListAppend (retVal);
*tagHndl = tagCopy;
}
if ((t->basicType->choiceId == BASICTYPE_LOCALTYPEREF) ||
(t->basicType->choiceId == BASICTYPE_IMPORTTYPEREF))
{
if (!implicitRef)
implicitRef = t->implicit;
if (t->basicType->a.localTypeRef->link == NULL)
{
fprintf (stderr,"ERROR - unresolved type ref, cannot get tags for decoding>\n");
break;
}
t = t->basicType->a.localTypeRef->link->type;
tl = t->tags;
if (tl != NULL)
{
AsnListFirst (tl);
if ((!LIST_EMPTY (tl)) && implicitRef)
{
AsnListNext (tl);
implicitRef = FALSE;
}
}
}
else if ((t->basicType->choiceId == BASICTYPE_CHOICE) && (LIST_EMPTY (retVal)))
{
if (implicitRef)
fprintf (stderr,"ERROR - IMPLICITLY Tagged CHOICE\n");
*stoleChoiceTags = TRUE;
FOR_EACH_LIST_ELMT (e, t->basicType->a.choice)
{
stoleChoicesAgain = FALSE;
tl = GetTags (e->type, &stoleChoicesAgain);
if (tl == NULL)
break;
AsnListFirst (tl);
if (stoleChoicesAgain)
{
FOR_EACH_LIST_ELMT (tag, tl)
{
tagCopy = (Tag*)Malloc (sizeof (Tag));
memcpy (tagCopy, tag, sizeof (Tag));
tagHndl = (Tag**)AsnListAppend (retVal);
*tagHndl = tagCopy;
}
}
else
{
tag = (Tag*)FIRST_LIST_ELMT (tl);
tagCopy = (Tag*)Malloc (sizeof (Tag));
memcpy (tagCopy, tag, sizeof (Tag));
tagHndl = (Tag**)AsnListAppend (retVal);
*tagHndl = tagCopy;
}
FreeTags (tl);
}
break;
}
else
break;
}
if (!*stoleChoiceTags && (retVal != NULL) && !LIST_EMPTY (retVal))
{
last = (Tag*)LAST_LIST_ELMT (retVal);
FOR_EACH_LIST_ELMT (tag, retVal)
{
tag->form = CONS;
}
last->form = LIBTYPE_GET_TAG_FORM (GetBuiltinType (t));
}
AsnListFirst (retVal);
return retVal;
}
void
FreeTags PARAMS ((tl),
TagList *tl)
{
Tag *tag;
AsnListNode *listNode;
AsnListNode *ln;
FOR_EACH_LIST_ELMT (tag, tl)
{
Free (tag);
}
for (ln = FIRST_LIST_NODE (tl); ln != NULL; )
{
listNode = ln;
ln = ln->next;
Free (listNode);
}
Free (tl);
}
int
CountTags PARAMS ((t),
Type *t)
{
int tagCount;
Tag *tag;
TagList *tl;
int implicitRef;
int stoleChoicesAgain;
NamedType *e;
tl = t->tags;
if (tl != NULL)
AsnListFirst (tl);
tagCount = 0;
implicitRef = FALSE;
for (;;)
{
FOR_REST_LIST_ELMT (tag, tl)
{
tagCount++;
}
if ((t->basicType->choiceId == BASICTYPE_LOCALTYPEREF) ||
(t->basicType->choiceId == BASICTYPE_IMPORTTYPEREF))
{
if (!implicitRef)
implicitRef = t->implicit;
if (t->basicType->a.localTypeRef->link == NULL)
{
fprintf (stderr,"ERROR - unresolved type ref, cannot get tags for decoding>\n");
break;
}
t = t->basicType->a.localTypeRef->link->type;
tl = t->tags;
if (tl != NULL)
{
AsnListFirst (tl);
if ((!LIST_EMPTY (tl)) && implicitRef)
{
AsnListNext (tl);
implicitRef = FALSE;
}
}
}
else
break;
}
return tagCount;
}
unsigned long int
TagByteLen PARAMS ((tagCode),
unsigned long int tagCode)
{
unsigned long int tagLen;
if (tagCode < 31)
tagLen = 1;
else if (tagCode < 128)
tagLen = 2;
else if (tagCode < 16384)
tagLen = 3;
else if (tagCode < 2097152)
tagLen = 4;
else
tagLen = 5;
return tagLen;
}
char*
Class2ClassStr PARAMS ((class),
int class)
{
switch (class)
{
case UNIV:
return "UNIV";
break;
case APPL:
return "APPL";
break;
case CNTX:
return "CNTX";
break;
case PRIV:
return "PRIV";
break;
default:
return "UNKNOWN";
break;
}
}
char*
Form2FormStr PARAMS ((form),
BER_FORM form)
{
switch (form)
{
case PRIM:
return "PRIM";
break;
case CONS:
return "CONS";
break;
default:
return "UNKNOWN";
break;
}
}
char*
Code2UnivCodeStr PARAMS ((code),
BER_UNIV_CODE code)
{
switch (code)
{
case BOOLEAN_TAG_CODE:
return "BOOLEAN_TAG_CODE";
break;
case INTEGER_TAG_CODE:
return "INTEGER_TAG_CODE";
break;
case BITSTRING_TAG_CODE:
return "BITSTRING_TAG_CODE";
break;
case OCTETSTRING_TAG_CODE:
return "OCTETSTRING_TAG_CODE";
break;
case NULLTYPE_TAG_CODE:
return "NULLTYPE_TAG_CODE";
break;
case OID_TAG_CODE:
return "OID_TAG_CODE";
break;
case OD_TAG_CODE:
return "OD_TAG_CODE";
break;
case EXTERNAL_TAG_CODE:
return "EXTERNAL_TAG_CODE";
break;
case REAL_TAG_CODE:
return "REAL_TAG_CODE";
break;
case ENUM_TAG_CODE:
return "ENUM_TAG_CODE";
break;
case SEQ_TAG_CODE:
return "SEQ_TAG_CODE";
break;
case SET_TAG_CODE:
return "SET_TAG_CODE";
break;
case NUMERICSTRING_TAG_CODE:
return "NUMERICSTRING_TAG_CODE";
break;
case PRINTABLESTRING_TAG_CODE:
return "PRINTABLESTRING_TAG_CODE";
break;
case TELETEXSTRING_TAG_CODE:
return "TELETEXSTRING_TAG_CODE";
break;
case VIDEOTEXSTRING_TAG_CODE:
return "VIDEOTEXSTRING_TAG_CODE";
break;
case IA5STRING_TAG_CODE:
return "IA5STRING_TAG_CODE";
break;
case UTCTIME_TAG_CODE:
return "UTCTIME_TAG_CODE";
break;
case GENERALIZEDTIME_TAG_CODE:
return "GENERALIZEDTIME_TAG_CODE";
break;
case GRAPHICSTRING_TAG_CODE:
return "GRAPHICSTRING_TAG_CODE";
break;
case VISIBLESTRING_TAG_CODE:
return "VISIBLESTRING_TAG_CODE";
break;
case GENERALSTRING_TAG_CODE:
return "GENERALSTRING_TAG_CODE";
break;
#ifdef VDADER_RULES
case UNIVERSALSTRING_TAG_CODE:
return "UNIVERSALSTRING_TAG_CODE";
break;
case BMPSTRING_TAG_CODE:
return "BMPSTRING_TAG_CODE";
break;
default:
{
static char retstring[3];
sprintf(retstring, "%d", code);
return retstring;
}
#else
default:
return "UNKNOWN";
#endif
}
}