#include <stdio.h>
#include "asn-incl.h"
#include "asn1module.h"
#include "oid.h"
#include "mem.h"
#include "define.h"
#include "lib-types.h"
#include "str-util.h"
#include "snacc-util.h"
#include "rules.h"
#include "gen-vals.h"
static void PrintCxxValueDefsName PROTO ((FILE *f, CxxRules *r, ValueDef *v));
void
PrintCxxValueDef PARAMS ((src, r, v),
FILE *src _AND_
CxxRules *r _AND_
ValueDef *v)
{
if (
#if !SNACC_OIDS_AS_DEFINES
(v->value->basicValue->choiceId != BASICVALUE_OID) &&
#endif
#if !SNACC_INTS_AS_DEFINES
(v->value->basicValue->choiceId != BASICVALUE_INTEGER) &&
#endif
(v->value->basicValue->choiceId != BASICVALUE_BOOLEAN))
return;
fprintf (src, "const ");
PrintCxxValuesClass (src, r, v->value);
fprintf (src, " ");
PrintCxxValueDefsName (src, r, v);
fprintf (src, " ");
PrintCxxValueInstatiation (src, r, v->value);
fprintf (src, ";\n\n");
}
void
PrintCxxValueExtern PARAMS ((hdr, r, v),
FILE *hdr _AND_
CxxRules *r _AND_
ValueDef *v)
{
if ((v->value->basicValue->choiceId != BASICVALUE_OID) &&
(v->value->basicValue->choiceId != BASICVALUE_INTEGER) &&
(v->value->basicValue->choiceId != BASICVALUE_BOOLEAN))
return;
#if SNACC_OIDS_AS_DEFINES
if (v->value->basicValue->choiceId == BASICVALUE_OID) {
fprintf (hdr, "#define ");
PrintCxxValueDefsName (hdr, r, v);
fprintf (hdr, "_arc ");
PrintCxxValueInstatiation (hdr, r, v->value);
fprintf (hdr, "\n");
fprintf (hdr, "#define ");
PrintCxxValueDefsName (hdr, r, v);
fprintf (hdr, " ");
PrintCxxValuesClass (hdr, r, v->value);
fprintf (hdr, "(");
PrintCxxValueDefsName (hdr, r, v);
fprintf (hdr, "_arc)\n");
return;
}
#endif
#if SNACC_INTS_AS_DEFINES
if (v->value->basicValue->choiceId == BASICVALUE_INTEGER) {
fprintf (hdr, "#define ");
PrintCxxValueDefsName (hdr, r, v);
fprintf (hdr, "_val %d\n", v->value->basicValue->a.integer);
fprintf (hdr, "#define ");
PrintCxxValueDefsName (hdr, r, v);
fprintf (hdr, " ");
PrintCxxValuesClass (hdr, r, v->value);
fprintf (hdr, "(");
PrintCxxValueDefsName (hdr, r, v);
fprintf (hdr, "_val)\n");
return;
}
#endif
fprintf (hdr, "extern const ");
PrintCxxValuesClass (hdr, r, v->value);
fprintf (hdr, " ");
PrintCxxValueDefsName (hdr, r, v);
fprintf (hdr, ";\n");
}
static void
PrintCxxValueDefsName PARAMS ((f, r, v),
FILE *f _AND_
CxxRules *r _AND_
ValueDef *v)
{
char *cName;
cName = Asn1ValueName2CValueName (v->definedName);
fprintf (f, "%s", cName);
Free (cName);
}
void
PrintCxxValuesClass PARAMS ((f, r, v),
FILE *f _AND_
CxxRules *r _AND_
Value *v)
{
switch (v->basicValue->choiceId)
{
case BASICVALUE_OID:
fprintf (f, "%s", r->typeConvTbl[BASICTYPE_OID].className);
break;
case BASICVALUE_INTEGER:
fprintf (f, "%s", r->typeConvTbl[BASICTYPE_INTEGER].className);
break;
case BASICVALUE_BOOLEAN:
fprintf (f, "%s", r->typeConvTbl[BASICTYPE_BOOLEAN].className);
break;
default:
break;
}
}
void
PrintCxxValueInstatiation PARAMS ((f, r, v),
FILE *f _AND_
CxxRules *r _AND_
Value *v)
{
switch (v->basicValue->choiceId)
{
case BASICVALUE_OID:
PrintCxxOidValue (f, r, v->basicValue->a.oid);
break;
case BASICVALUE_INTEGER:
PrintCxxIntValue (f, r, v->basicValue->a.integer);
break;
case BASICVALUE_BOOLEAN:
fprintf (f, "(%s)", v->basicValue->a.boolean ? "true" : "false");
break;
default:
break;
}
}
void
PrintCxxOidValue PARAMS ((f, r, v),
FILE *f _AND_
CxxRules *r _AND_
AsnOid *v)
{
unsigned short int firstArcNum;
unsigned long int arcNum;
int i;
#if !SNACC_OIDS_AS_DEFINES
fprintf (f, "(");
#endif
for (arcNum = 0, i=0; (i < v->octetLen) && (v->octs[i] & 0x80);i++)
arcNum = (arcNum << 7) + (v->octs[i] & 0x7f);
arcNum = (arcNum << 7) + (v->octs[i] & 0x7f);
i++;
firstArcNum = arcNum/40;
if (firstArcNum > 2)
firstArcNum = 2;
fprintf (f, "%u, %u", firstArcNum, arcNum - (firstArcNum * 40));
for (; i < v->octetLen; )
{
for (arcNum = 0; (i < v->octetLen) && (v->octs[i] & 0x80);i++)
arcNum = (arcNum << 7) + (v->octs[i] & 0x7f);
arcNum = (arcNum << 7) + (v->octs[i] & 0x7f);
i++;
fprintf (f, ", %u", arcNum);
}
#if !SNACC_OIDS_AS_DEFINES
fprintf (f, ")");
#endif
}
void
PrintCxxIntValue PARAMS ((f, r, v),
FILE *f _AND_
CxxRules *r _AND_
AsnInt v)
{
fprintf (f, "(%d)", v);
}