⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gen-code.c

📁 asn.1 compiler
💻 C
📖 第 1 页 / 共 5 页
字号:
	    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 + -