📄 gen-code.c
字号:
fprintf (src, " &%s::_desc\n);\n\n", td->type->cxxTypeRefInfo->className); fprintf (src, "const AsnTypeDesc *%s::_getdesc() const\n", td->cxxTypeDefInfo->className); fprintf (src, "{\n"); fprintf (src, " return &_desc;\n"); fprintf (src, "}\n\n"); fprintf (hdr, "};\n\n"); fprintf (hdr, "#else // META\n\n"); fprintf (src, "#endif // META\n\n"); }#endif /* META */ fprintf (hdr, "typedef %s %s;\n\n", td->type->cxxTypeRefInfo->className, td->cxxTypeDefInfo->className);#if META if (printMetaG) fprintf (hdr, "#endif // META\n\n");#endif /* META */ }} /* PrintCxxSimpleDef */static voidPrintCxxChoiceDefCode PARAMS ((src, hdr, if_IBM_ENC (srcdb COMMA hdrdb COMMA) mods, m, r, td, parent, choice, novolatilefuncs), FILE *src _AND_ FILE *hdr _AND_ if_IBM_ENC (FILE *srcdb _AND_) if_IBM_ENC (FILE *hdrdb _AND_) ModuleList *mods _AND_ Module *m _AND_ CxxRules *r _AND_ TypeDef *td _AND_ Type *parent _AND_ Type *choice _AND_ int novolatilefuncs){ NamedType *e; char *classStr; char *formStr; char *codeStr; int tagLen, i; Tag *tag; TagList *tags; char *varName; CxxTRI *cxxtri; int elmtLevel; int varCount, tmpVarCount; int stoleChoiceTags; enum BasicTypeChoiceId tmpTypeId; NamedType *defByNamedType;#ifdef _IBM_ENC_#include "./ibm_editor/print_cxx_choice_def_code.h"#endif /* _IBM_ENC_ */ /* put class spec in hdr file */ fprintf (hdr, "class %s%s\n", td->cxxTypeDefInfo->className, baseClassesG); fprintf (hdr, "{\n"); fprintf (hdr, "public:\n"); /* write out choiceId enum type */ fprintf (hdr, " enum %s\n", r->choiceIdEnumName); fprintf (hdr, " {\n"); FOR_EACH_LIST_ELMT (e, choice->basicType->a.choice) { fprintf (hdr, " %s = %d", e->type->cxxTypeRefInfo->choiceIdSymbol, e->type->cxxTypeRefInfo->choiceIdValue); if (e != (NamedType*)LAST_LIST_ELMT (choice->basicType->a.choice)) fprintf (hdr, ",\n"); else fprintf (hdr, "\n"); } fprintf (hdr, " };\n\n"); /* write out the choice Id field */ /* fprintf (hdr, "protected:\n"); */ fprintf (hdr, " enum %s %s;\n", r->choiceIdEnumName, r->choiceIdFieldName); /* write out the choice element anonymous union */ fprintf (hdr, " union\n"); fprintf (hdr, " {\n"); FOR_EACH_LIST_ELMT (e, choice->basicType->a.choice) { fprintf (hdr, " "); PrintCxxType (hdr, mods, m, r, td, choice, e->type); fprintf (hdr, "%s;\n", e->type->cxxTypeRefInfo->fieldName); } fprintf (hdr, " };\n\n");#if META if (printMetaG) { fprintf (hdr, "#if META\n"); fprintf (src, "#if META\n\n"); fprintf (hdr, " static const AsnChoiceTypeDesc _desc;\n"); fprintf (hdr, " static const AsnChoiceMemberDesc _mdescs[];\n\n"); fprintf (hdr, " const AsnTypeDesc *_getdesc() const;\n"); fprintf (hdr, " AsnType *_getref (const char *membername, bool create = false);\n\n"); fprintf (src, "static AsnType *create%s()\n", td->cxxTypeDefInfo->className); fprintf (src, "{\n"); fprintf (src, " return new %s;\n", td->cxxTypeDefInfo->className); fprintf (src, "}\n\n"); fprintf (src, "const AsnChoiceMemberDesc %s::_mdescs[] =\n", td->cxxTypeDefInfo->className); fprintf (src, "{\n"); FOR_EACH_LIST_ELMT (e, choice->basicType->a.choice) if (printMetaG == META_backend_names) fprintf (src, " AsnChoiceMemberDesc (\"%s\", &%s::_desc), // `%s'\n", e->type->cxxTypeRefInfo->fieldName, e->type->cxxTypeRefInfo->className, e->fieldName ? e->fieldName : ""); else /* META_asn1_names */ fprintf (src, " AsnChoiceMemberDesc (\"%s\", &%s::_desc), // `%s'\n", e->fieldName ? e->fieldName : e->type->cxxTypeRefInfo->fieldName, e->type->cxxTypeRefInfo->className, e->type->cxxTypeRefInfo->fieldName); fprintf (src, " AsnChoiceMemberDesc()\n"); fprintf (src, "};\n\n"); fprintf (src, "const AsnChoiceTypeDesc %s::_desc\n", td->cxxTypeDefInfo->className); fprintf (src, "(\n"); fprintf (src, " &%sModuleDesc,\n", m->cxxname); if (printMetaG == META_backend_names) fprintf (src, " \"%s\", // `%s'\n", td->cxxTypeDefInfo->className, td->definedName); else /* META_asn1_names */ fprintf (src, " \"%s\", // `%s'\n", td->definedName, td->cxxTypeDefInfo->className); fprintf (src, " %s,\n", isMetaPDU (m->modId->name, td->definedName, meta_pdus_G) ? "true" : "false"); fprintf (src, " AsnTypeDesc::CHOICE,\n"); fprintf (src, " create%s,\n", td->cxxTypeDefInfo->className); fprintf (src, " _mdescs\n"); fprintf (src, ");\n\n"); fprintf (src, "const AsnTypeDesc *%s::_getdesc() const\n", td->cxxTypeDefInfo->className); fprintf (src, "{\n"); fprintf (src, " return &_desc;\n"); fprintf (src, "}\n\n"); fprintf (src, "AsnType *%s::_getref (const char *membername, bool create)\n", td->cxxTypeDefInfo->className); fprintf (src, "{\n"); fprintf (src, " ChoiceIdEnum newCid = (ChoiceIdEnum)_desc.choicebyname (membername);\n"); fprintf (src, " if (newCid == -1)\n"); fprintf (src, " return NULL;\n"); fprintf (src, " if (newCid == choiceId)\n"); fprintf (src, " {\n"); fprintf (src, " switch (choiceId)\n"); fprintf (src, " {\n"); FOR_EACH_LIST_ELMT (e, choice->basicType->a.choice) { fprintf (src, " case %sCid:\n", e->type->cxxTypeRefInfo->fieldName); fprintf (src, " return %s;\n", e->type->cxxTypeRefInfo->fieldName); } fprintf (src, " default:\n"); fprintf (src, " return NULL;\n"); fprintf (src, " }\n"); fprintf (src, " }\n"); fprintf (src, " else\n"); fprintf (src, " {\n"); fprintf (src, " if (create)\n"); fprintf (src, " {\n"); fprintf (src, "// switch (choiceId)\n"); fprintf (src, "// {\n"); FOR_EACH_LIST_ELMT (e, choice->basicType->a.choice) { fprintf (src, "// case %sCid:\n", e->type->cxxTypeRefInfo->fieldName); fprintf (src, "// delete %s;\n", e->type->cxxTypeRefInfo->fieldName); fprintf (src, "// %s = NULL;\n", e->type->cxxTypeRefInfo->fieldName); fprintf (src, "// break;\n"); } fprintf (src, "// default:\n"); fprintf (src, "// return NULL;\n"); fprintf (src, "// }\n"); e = FIRST_LIST_ELMT (choice->basicType->a.choice); fprintf (src, " // simply delete any member, the virtual function table takes care of the rest:\n"); fprintf (src, " delete %s;\n", e->type->cxxTypeRefInfo->fieldName); fprintf (src, " %s = NULL;\n", e->type->cxxTypeRefInfo->fieldName); fprintf (src, " switch (choiceId = newCid)\n"); fprintf (src, " {\n"); FOR_EACH_LIST_ELMT (e, choice->basicType->a.choice) { fprintf (src, " case %sCid:\n", e->type->cxxTypeRefInfo->fieldName); fprintf (src, " return %s = new %s;\n", e->type->cxxTypeRefInfo->fieldName, e->type->cxxTypeRefInfo->className); } fprintf (src, " default: // internal error!\n"); fprintf (src, " return NULL;\n"); fprintf (src, " }\n"); fprintf (src, " }\n"); fprintf (src, " else\n"); fprintf (src, " return NULL;\n"); fprintf (src, " }\n"); fprintf (src, "}\n\n");#if TCL if (printTclG) { fprintf (hdr, "#if TCL\n"); fprintf (src, "#if TCL\n\n"); fprintf (hdr, " int TclGetDesc (Tcl_DString *) const;\n"); fprintf (hdr, " int TclGetVal (Tcl_Interp *) const;\n"); fprintf (hdr, " int TclSetVal (Tcl_Interp *, const char *valstr);\n\n"); fprintf (src, "int %s::TclGetDesc (Tcl_DString *valstr) const\n", td->cxxTypeDefInfo->className); fprintf (src, "{\n"); fprintf (src, " Tcl_DStringAppendElement (valstr, (char*)_desc.choicebyvalue (choiceId));\n"); fprintf (src, " // hack: since all members are pointers, we don't have to check for its type via choiceId, because all we want to know is whether it's NULL or not:\n"); e = FIRST_LIST_ELMT (choice->basicType->a.choice); fprintf (src, " Tcl_DStringAppendElement (valstr, %s ? \"valid\" : \"void\");\n", e->type->cxxTypeRefInfo->fieldName); fprintf (src, " return TCL_OK;\n"); fprintf (src, "}\n\n"); fprintf (src, "int %s::TclGetVal (Tcl_Interp *interp) const\n", td->cxxTypeDefInfo->className); fprintf (src, "{\n"); fprintf (src, " switch (choiceId)\n"); fprintf (src, " {\n"); FOR_EACH_LIST_ELMT (e, choice->basicType->a.choice) { fprintf (src, " case %sCid:\n", e->type->cxxTypeRefInfo->fieldName); fprintf (src, " if (%s)\n", e->type->cxxTypeRefInfo->fieldName); fprintf (src, " if (%s->TclGetVal (interp) != TCL_OK)\n", e->type->cxxTypeRefInfo->fieldName); fprintf (src, " return TCL_ERROR;\n"); fprintf (src, " break;\n"); } fprintf (src, " default:\n"); fprintf (src, " Tcl_SetResult (interp, \"illegal choiceId in %s\", TCL_STATIC);\n", td->cxxTypeDefInfo->className); fprintf (src, " Tcl_SetErrorCode (interp, \"SNACC\", \"ILLCHOICE\", NULL);\n"); fprintf (src, " return TCL_ERROR;\n"); fprintf (src, " }\n"); fprintf (src, " Tcl_DString valstr;\n"); fprintf (src, " Tcl_DStringInit (&valstr);\n"); fprintf (src, " Tcl_DStringAppendElement (&valstr, (char*)_desc.choicebyvalue (choiceId));\n"); fprintf (src, " Tcl_DStringAppendElement (&valstr, interp->result);\n"); fprintf (src, " Tcl_ResetResult (interp);\n"); fprintf (src, " Tcl_DStringResult (interp, &valstr);\n"); fprintf (src, " return TCL_OK;\n"); fprintf (src, "}\n\n"); fprintf (src, "int %s::TclSetVal (Tcl_Interp *interp, const char *valstr)\n", td->cxxTypeDefInfo->className); fprintf (src, "{\n"); fprintf (src, " Args elem;\n"); fprintf (src, " if (Tcl_SplitList (interp, (char*)valstr, &elem.c, &elem.v) != TCL_OK)\n"); fprintf (src, " return TCL_ERROR;\n"); fprintf (src, " if (elem.c != 2)\n"); fprintf (src, " {\n"); fprintf (src, " sprintf (interp->result, \"syntax error: expected a pair, but it's got %%d element(s)\", elem.c);\n"); fprintf (src, " return TCL_ERROR;\n"); fprintf (src, " }\n"); fprintf (src, " AsnType *member = _getref (elem.v[0], true);\n"); fprintf (src, " if (!member)\n"); fprintf (src, " {\n"); fprintf (src, " Tcl_AppendResult (interp, \"illegal choice \", elem.v[0], \" for %s\", NULL);\n", td->cxxTypeDefInfo->className); fprintf (src, " Tcl_SetErrorCode (interp, \"SNACC\", \"ILLCHOICE\", NULL);\n"); fprintf (src, " return TCL_ERROR;\n"); fprintf (src, " }\n"); fprintf (src, " return member->TclSetVal (interp, elem.v[1]);\n"); fprintf (src, "}\n\n"); fprintf (hdr, "#endif // TCL\n"); fprintf (src, "#endif // TCL\n\n"); }#endif /* TCL */ fprintf (hdr, "#endif // META\n"); fprintf (src, "#endif // META\n\n"); }#endif /* META */ fprintf (hdr, "\n"); /* constructors and destructor */ fprintf (hdr, " %s();\n", td->cxxTypeDefInfo->className); fprintf (src, "%s::%s()\n", td->cxxTypeDefInfo->className, td->cxxTypeDefInfo->className); fprintf (src, "{\n"); e = FIRST_LIST_ELMT (choice->basicType->a.choice); fprintf (src, " choiceId = %sCid;\n", e->type->cxxTypeRefInfo->fieldName); fprintf (src, "#if TCL\n"); fprintf (src, " %s = new %s;\n", e->type->cxxTypeRefInfo->fieldName, e->type->cxxTypeRefInfo->className); fprintf (src, "#else\n"); fprintf (src, " %s = NULL; // incomplete initialization of mandatory element!\n", e->type->cxxTypeRefInfo->fieldName); fprintf (src, "#endif // TCL\n"); fprintf (src, "}\n\n"); fprintf (hdr, " %s (const %s &);\n", td->cxxTypeDefInfo->className, td->cxxTypeDefInfo->className); fprintf (src, "%s::%s (const %s &)\n", td->cxxTypeDefInfo->className, td->cxxTypeDefInfo->className, td->cxxTypeDefInfo->className); fprintf (src, "{\n"); fprintf (src, " Asn1Error << \"use of incompletely defined %s::%s (const %s &)\" << endl;\n", td->cxxTypeDefInfo->className, td->cxxTypeDefInfo->className, td->cxxTypeDefInfo->className); fprintf (src, " abort();\n"); fprintf (src, "}\n\n"); fprintf (hdr, " ~%s();\n\n", td->cxxTypeDefInfo->className); fprintf (src, "%s::~%s()\n", td->cxxTypeDefInfo->className, td->cxxTypeDefInfo->className); fprintf (src, "{\n"); fprintf (src, " switch (choiceId)\n"); fprintf (src, " {\n"); FOR_EACH_LIST_ELMT (e, choice->basicType->a.choice) { fprintf (src, " case %s:\n", e->type->cxxTypeRefInfo->choiceIdSymbol); if (e->type->cxxTypeRefInfo->isPtr) fprintf (src, " delete %s;\n", e->type->cxxTypeRefInfo->fieldName); fprintf (src, " break;\n"); } fprintf (src, " } // end of switch\n"); fprintf (src, "} // end of destructor\n"); fprintf (src, "\n"); /* print clone routine for ANY mgmt */ PrintCloneMethod (hdr, src, td); fprintf (hdr, " %s &operator = (const %s &);\n", td->cxxTypeDefInfo->className, td->cxxTypeDefInfo->className); fprintf (src, "#if SNACC_DEEP_COPY\n"); fprintf (src, "%s &%s::operator = (const %s &that)\n", td->cxxTypeDefInfo->className, td->cxxTypeDefInfo->className, td->cxxTypeDefInfo->className); fprintf (src, "#else // SNACC_DEEP_COPY\n"); fprintf (src, "%s &%s::operator = (const %s &)\n", td->cxxTypeDefInfo->className, td->cxxTypeDefInfo->className, td->cxxTypeDefInfo->className); fprintf (src, "#endif // SNACC_DEEP_COPY\n"); fprintf (src, "{\n"); fprintf (src, "#if SNACC_DEEP_COPY\n"); fprintf (src, " if (this != &that)\n"); fprintf (src, " {\n"); fprintf (src, " switch (choiceId)\n"); fprintf (src, " {\n"); FOR_EACH_LIST_ELMT (e, choice->basicType->a.choice) { if (e->type->cxxTypeRefInfo->isPtr) { fprintf (src, " case %s:\n", e->type->cxxTypeRefInfo->choiceIdSymbol); fprintf (src, " delete %s;\n", e->type->cxxTypeRefInfo->fieldName); fprintf (src, " break;\n"); } } fprintf (src, " }\n"); fprintf (src, " switch (choiceId = that.choiceId)\n"); fprintf (src, " {\n"); FOR_EACH_LIST_ELMT (e, choice->basicType->a.choice) { fprintf (src, " case %s:\n", e->type->cxxTypeRefInfo->choiceIdSymbol); if (e->type->cxxTypeRefInfo->isPtr) { fprintf (src, " %s = new %s;\n", e->type->cxxTypeRefInfo->fieldName, e->type->cxxTypeRefInfo->className); fprintf (src, " *%s = *that.%s;\n", e->type->cxxTypeRefInfo->fieldName, e->type->cxxTypeRefInfo->fieldName); } else fprintf (src, " %s = that.%s;\n", e->type->cxxTypeRefInfo->fieldName, e->type->cxxTypeRefInfo->fieldName); fprintf (src, " break;\n"); } fprintf (src, " }\n"); fprintf (src, " }\n"); fprintf (src, "\n"); fprintf (src, " return *this;\n"); fprintf (src, "#else // SNACC_DEEP_COPY\n"); fprintf (src, " Asn1Error << \"use of incompletely defined %s &%s::operator = (const %s &)\" << endl;\n", td->cxxTypeDefInfo->className, td->cxxTypeDefInfo->className, td->cxxTypeDefInfo->className); fprintf (src, " abort();\n"); fprintf (src, " // if your compiler complains here, check the -novolat option\n"); if (novolatilefuncs) { fprintf (src, " return *this;\n"); }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -