#include <stdio.h>
#include "asn-incl.h"
#include "asn1module.h"
#include "mem.h"
#include "define.h"
#include "rules.h"
#include "type-info.h"
#include "str-util.h"
#include "util.h"
#include "gen-print.h"
static char *returnTypeG = "void";
static char *valueArgNameG = "v";
static char *fileTypeNameG = "FILE*";
static char *indentTypeNameG = "unsigned short int";
static CRules *genPrintCRulesG;
static void PrintCPrintPrototype PROTO ((FILE *hdr, TypeDef *td));
static void PrintCPrintDeclaration PROTO ((FILE *src, TypeDef *td));
static void PrintCPrintDefine PROTO ((FILE *hdr, TypeDef *td));
static void PrintCPrintLocals PROTO ((FILE *src,TypeDef *td));
static void PrintCChoiceElmtPrint PROTO ((FILE *src, TypeDef *td, Type *parent, NamedTypeList *elmts, NamedType *e, char *varName));
static void PrintCElmtPrintWithIndent PROTO ((FILE *src, TypeDef *td, Type *parent, NamedTypeList *elmts, NamedType *e, char *varName, int allOpt));
static void PrintCChoicePrintRoutine PROTO ((FILE *src, FILE *hdr, CRules *r, ModuleList *mods, Module *m, TypeDef *td));
static void PrintCSetPrintRoutine PROTO ((FILE *src, FILE *hdr, CRules *r, ModuleList *mods, Module *m, TypeDef *td));
static void PrintCSeqPrintRoutine PROTO ((FILE *src, FILE *hdr, CRules *r, ModuleList *mods, Module *m, TypeDef *td));
static void PrintCSeqOfPrintRoutine PROTO ((FILE *src, FILE *hdr, CRules *r, ModuleList *mods, Module *m, TypeDef *td));
static void PrintCSetOfPrintRoutine PROTO ((FILE *src, FILE *hdr, CRules *r, ModuleList *mods, Module *m, TypeDef *td));
void
PrintCPrinter PARAMS ((src, hdr, r, mods, m, td),
FILE *src _AND_
FILE *hdr _AND_
CRules *r _AND_
ModuleList *mods _AND_
Module *m _AND_
TypeDef *td)
{
if ((td->cTypeDefInfo == NULL) || !(td->cTypeDefInfo->genPrintRoutine))
return;
genPrintCRulesG = r;
switch (td->type->basicType->choiceId)
{
case BASICTYPE_IMPORTTYPEREF:
case BASICTYPE_LOCALTYPEREF:
case BASICTYPE_BOOLEAN:
case BASICTYPE_REAL:
case BASICTYPE_OCTETSTRING:
case BASICTYPE_NULL:
case BASICTYPE_OID:
case BASICTYPE_INTEGER:
case BASICTYPE_BITSTRING:
case BASICTYPE_ENUMERATED:
case BASICTYPE_ANYDEFINEDBY:
case BASICTYPE_ANY:
PrintCPrintDefine (hdr, td);
fprintf (hdr, "\n\n");
break;
case BASICTYPE_SETOF:
PrintCSetOfPrintRoutine (src, hdr, r, mods, m, td);
break;
case BASICTYPE_SEQUENCEOF:
PrintCSeqOfPrintRoutine (src, hdr, r, mods, m, td);
break;
case BASICTYPE_CHOICE:
PrintCChoicePrintRoutine (src, hdr, r, mods, m, td);
break;
case BASICTYPE_SET:
PrintCSetPrintRoutine (src, hdr, r, mods, m, td);
break;
case BASICTYPE_SEQUENCE:
PrintCSeqPrintRoutine (src, hdr, r, mods, m, td);
break;
default:
break;
}
}
static void
PrintCPrintPrototype PARAMS ((hdr, td),
FILE *hdr _AND_
TypeDef *td)
{
CTDI *ctdi;
ctdi = td->cTypeDefInfo;
fprintf (hdr,"%s %s PROTO ((%s f, %s *v, %s indent));\n", returnTypeG, ctdi->printRoutineName, fileTypeNameG, ctdi->cTypeName, indentTypeNameG);
}
static void
PrintCPrintDeclaration PARAMS ((src, td),
FILE *src _AND_
TypeDef *td)
{
CTDI *ctdi;
ctdi = td->cTypeDefInfo;
fprintf (src,"%s\n%s PARAMS ((f, v, indent),\n%s f _AND_\n%s *v _AND_\n%s indent)\n", returnTypeG, ctdi->printRoutineName, fileTypeNameG, ctdi->cTypeName, indentTypeNameG);
}
static void
PrintCPrintDefine PARAMS ((hdr, td),
FILE *hdr _AND_
TypeDef *td)
{
fprintf(hdr, "#define %s %s", td->cTypeDefInfo->printRoutineName, td->type->cTypeRefInfo->printRoutineName);
}
static void
PrintCPrintLocals PARAMS ((src, td),
FILE *src _AND_
TypeDef *td)
{
}
static void
PrintCChoiceElmtPrint PARAMS ((src, td, parent, elmts, e, varName),
FILE *src _AND_
TypeDef *td _AND_
Type *parent _AND_
NamedTypeList *elmts _AND_
NamedType *e _AND_
char *varName)
{
CTRI *ctri;
char elmtVarRef[MAX_VAR_REF];
Type *tmpType;
int inTailOpts;
ctri = e->type->cTypeRefInfo;
MakeVarPtrRef (genPrintCRulesG, td, parent, e->type, varName, elmtVarRef);
if (e->fieldName != NULL)
{
fprintf (src," fprintf (f,\"%s \");\n", e->fieldName);
fprintf (src," %s (f, %s, indent + stdIndentG);\n", e->type->cTypeRefInfo->printRoutineName, elmtVarRef);
}
else
{
fprintf (src," %s (f, %s, indent + stdIndentG);\n", e->type->cTypeRefInfo->printRoutineName, elmtVarRef);
}
}
static void
PrintCElmtPrintWithIndent PARAMS ((src, td, parent, elmts, e, varName, allOpt),
FILE *src _AND_
TypeDef *td _AND_
Type *parent _AND_
NamedTypeList *elmts _AND_
NamedType *e _AND_
char *varName _AND_
int allOpt)
{
CTRI *ctri;
char elmtVarRef[MAX_VAR_REF];
Type *tmpType;
int inTailOpts;
ctri = e->type->cTypeRefInfo;
inTailOpts = IsTailOptional (elmts);
MakeVarPtrRef (genPrintCRulesG, td, parent, e->type, varName, elmtVarRef);
if (e->type->optional || (e->type->defaultVal != NULL))
fprintf (src, " if (%s (%s))\n {\n", ctri->optTestRoutineName, elmtVarRef);
if (allOpt)
{
if (e != FIRST_LIST_ELMT (elmts))
{
fprintf (src, " if (!nonePrinted)\n");
fprintf (src, " fprintf (f,\",\\n\");\n");
}
fprintf (src, " nonePrinted = FALSE;\n");
}
else if ((inTailOpts) && (e != FIRST_LIST_ELMT (elmts)))
fprintf (src, " fprintf (f,\",\\n\");\n");
fprintf (src," Indent (f, indent + stdIndentG);\n");
if (e->fieldName != NULL)
fprintf (src," fprintf (f,\"%s \");\n", e->fieldName);
fprintf (src," %s (f, %s, indent + stdIndentG);\n", e->type->cTypeRefInfo->printRoutineName, elmtVarRef);
if ((e != LAST_LIST_ELMT (elmts)) &&
(!inTailOpts) &&
(!NextIsTailOptional (elmts)))
fprintf (src," fprintf (f, \",\\n\");\n");
if (e->type->optional || (e->type->defaultVal != NULL))
fprintf (src, " }\n");
if (e == LAST_LIST_ELMT (elmts))
fprintf (src," fprintf (f,\"\\n\");\n");
}
static void
PrintCChoicePrintRoutine PARAMS ((src, hdr, r, mods, m, td),
FILE *src _AND_
FILE *hdr _AND_
CRules *r _AND_
ModuleList *mods _AND_
Module *m _AND_
TypeDef *td)
{
NamedType *e;
PrintCPrintPrototype (hdr,td);
PrintCPrintDeclaration (src, td);
fprintf (src,"{\n");
PrintCPrintLocals (src,td);
fprintf (src," switch (%s->%s)\n", valueArgNameG, td->type->cTypeRefInfo->choiceIdEnumFieldName);
fprintf (src," {\n");
FOR_EACH_LIST_ELMT (e, td->type->basicType->a.choice)
{
fprintf (src," case %s:\n",e->type->cTypeRefInfo->choiceIdSymbol);
fprintf (src," ");
PrintCChoiceElmtPrint (src, td, td->type, td->type->basicType->a.choice, e, valueArgNameG);
fprintf (src," break;\n\n");
}
fprintf (src," }\n");
fprintf (src,"} /* %s */\n\n", td->cTypeDefInfo->printRoutineName);
}
static void
PrintCSetPrintRoutine PARAMS ((src, hdr, r, mods, m, td),
FILE *src _AND_
FILE *hdr _AND_
CRules *r _AND_
ModuleList *mods _AND_
Module *m _AND_
TypeDef *td)
{
NamedType *e;
int allOpt;
PrintCPrintPrototype (hdr,td);
PrintCPrintDeclaration (src, td);
fprintf (src,"{\n");
PrintCPrintLocals (src,td);
allOpt = AllElmtsOptional (td->type->basicType->a.set);
if (allOpt)
fprintf (src," int nonePrinted = TRUE;\n\n");
fprintf (src," if (%s == NULL)\n", valueArgNameG);
fprintf (src," return;\n\n");
fprintf (src," fprintf (f,\"{ -- SET --\\n\");\n\n");
FOR_EACH_LIST_ELMT (e, td->type->basicType->a.set)
{
PrintCElmtPrintWithIndent (src, td, td->type, td->type->basicType->a.set, e, valueArgNameG, allOpt);
}
fprintf (src," Indent (f, indent);\n");
fprintf (src," fprintf (f,\"}\");\n");
fprintf (src,"} /* %s */\n\n", td->cTypeDefInfo->printRoutineName);
}
static void
PrintCSeqPrintRoutine PARAMS ((src, hdr, r, mods, m, td),
FILE *src _AND_
FILE *hdr _AND_
CRules *r _AND_
ModuleList *mods _AND_
Module *m _AND_
TypeDef *td)
{
NamedType *e;
int allOpt;
PrintCPrintPrototype (hdr,td);
PrintCPrintDeclaration (src, td);
fprintf (src,"{\n");
PrintCPrintLocals (src,td);
allOpt = AllElmtsOptional (td->type->basicType->a.set);
if (allOpt)
fprintf (src," int nonePrinted = TRUE;\n\n");
fprintf (src," if (%s == NULL)\n", valueArgNameG);
fprintf (src," return;\n\n");
fprintf (src," fprintf (f,\"{ -- SEQUENCE --\\n\");\n\n");
FOR_EACH_LIST_ELMT (e, td->type->basicType->a.sequence)
{
PrintCElmtPrintWithIndent (src, td, td->type, td->type->basicType->a.sequence, e, valueArgNameG, allOpt);
}
fprintf (src," Indent (f, indent);\n");
fprintf (src," fprintf (f,\"}\");\n");
fprintf (src,"} /* %s */\n\n", td->cTypeDefInfo->printRoutineName);
}
static void
PrintCSetOfPrintRoutine PARAMS ((src, hdr, r, mods, m, td),
FILE *src _AND_
FILE *hdr _AND_
CRules *r _AND_
ModuleList *mods _AND_
Module *m _AND_
TypeDef *td)
{
NamedType *e;
PrintCPrintPrototype (hdr,td);
PrintCPrintDeclaration (src, td);
fprintf (src,"{\n");
PrintCPrintLocals (src,td);
fprintf (src," %s *tmp;\n", td->type->basicType->a.setOf->cTypeRefInfo->cTypeName);
fprintf (src," if (%s == NULL)\n", valueArgNameG);
fprintf (src," return;\n");
fprintf (src," fprintf (f,\"{ -- SET OF -- \\n\");\n");
fprintf (src," FOR_EACH_LIST_ELMT (tmp, %s)\n", valueArgNameG);
fprintf (src," {\n");
fprintf (src," Indent (f, indent+ stdIndentG);\n");
fprintf (src," %s (f, tmp, indent + stdIndentG);\n", td->type->basicType->a.setOf->cTypeRefInfo->printRoutineName);
fprintf (src," if (tmp != (%s*)LAST_LIST_ELMT (%s))\n", td->type->basicType->a.setOf->cTypeRefInfo->cTypeName, valueArgNameG);
fprintf (src," fprintf (f,\",\\n\");\n");
fprintf (src," }\n");
fprintf (src," fprintf (f,\"\\n\");\n");
fprintf (src," Indent (f, indent);\n");
fprintf (src," fprintf (f,\"}\");\n");
fprintf (src,"} /* %s */\n\n", td->cTypeDefInfo->printRoutineName);
}
static void
PrintCSeqOfPrintRoutine PARAMS ((src, hdr, r, mods, m, td),
FILE *src _AND_
FILE *hdr _AND_
CRules *r _AND_
ModuleList *mods _AND_
Module *m _AND_
TypeDef *td)
{
NamedType *e;
PrintCPrintPrototype (hdr,td);
PrintCPrintDeclaration (src, td);
fprintf (src,"{\n");
PrintCPrintLocals (src,td);
fprintf (src," %s *tmp;\n", td->type->basicType->a.setOf->cTypeRefInfo->cTypeName);
fprintf (src," if (%s == NULL)\n", valueArgNameG);
fprintf (src," return;\n");
fprintf (src," fprintf (f,\"{ -- SEQUENCE OF -- \\n\");\n");
fprintf (src," FOR_EACH_LIST_ELMT (tmp, %s)\n", valueArgNameG);
fprintf (src," {\n");
fprintf (src," Indent (f, indent+ stdIndentG);\n");
fprintf (src," %s (f, tmp, indent + stdIndentG);\n", td->type->basicType->a.setOf->cTypeRefInfo->printRoutineName);
fprintf (src," if (tmp != (%s*)LAST_LIST_ELMT (%s))\n", td->type->basicType->a.setOf->cTypeRefInfo->cTypeName, valueArgNameG);
fprintf (src," fprintf (f,\",\\n\");\n");
fprintf (src," }\n");
fprintf (src," fprintf (f,\"\\n\");\n");
fprintf (src," Indent (f, indent);\n");
fprintf (src," fprintf (f,\"}\");\n");
fprintf (src,"} /* %s */\n\n", td->cTypeDefInfo->printRoutineName);
}