📄 gen-any.c
字号:
/* * compiler/back_ends/c++_gen/gen_any.c * * prints Routine to initialize the ANY Hash table. The * ANY Hash table maps the OBJECT IDENTIFIERS or INTEGERS * to the correct decoding routines. * * Also prints an enum to identify each ANY mapping. * * MS 92 * Copyright (C) 1991, 1992 Michael Sample * and the University of British Columbia * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * $Header: /usr/app/odstb/CVS/snacc/compiler/back-ends/c++-gen/gen-any.c,v 1.4 1995/07/25 18:19:11 rj Exp $ * $Log: gen-any.c,v $ * Revision 1.4 1995/07/25 18:19:11 rj * changed `_' to `-' in file names. * * Revision 1.3 1994/10/08 03:47:53 rj * since i was still irritated by cpp standing for c++ and not the C preprocessor, i renamed them to cxx (which is one known suffix for C++ source files). since the standard #define is __cplusplus, cplusplus would have been the more obvious choice, but it is a little too long. * * Revision 1.2 1994/09/01 01:06:31 rj * snacc_config.h removed. * * Revision 1.1 1994/08/28 09:47:58 rj * first check-in. for a list of changes to the snacc-1.1 distribution please refer to the ChangeLog. * */#include <stdio.h>#include "asn-incl.h"#include "mem.h"#include "asn1module.h"#include "define.h"#include "str-util.h"#include "rules.h"#include "gen-vals.h"#include "lib-types.h"#include "gen-any.h"static int anyEnumValG = 0;void PrintCxxAnyEnum PROTO ((FILE *hdr, Module *m, CxxRules *r));void PrintCxxAnyHashInitRoutine PROTO ((FILE *src, FILE *hdr, ModuleList *mods, Module *m, CxxRules *r));voidPrintCxxAnyCode PARAMS ((src, hdr, r, mods, m), FILE *src _AND_ FILE *hdr _AND_ CxxRules *r _AND_ ModuleList *mods _AND_ Module *m){ if (!m->hasAnys) return; PrintCxxAnyEnum (hdr, m, r); PrintCxxAnyHashInitRoutine (src, hdr, mods, m, r);} /* PrintAnyCode */voidPrintCxxAnyEnum PARAMS ((hdr, m, r), FILE *hdr _AND_ Module *m _AND_ CxxRules *r){ TypeDef *td; AnyRef *ar; AnyRefList *arl; int firstPrinted = TRUE; int i; char *modName; modName = Asn1TypeName2CTypeName (m->modId->name); fprintf (hdr,"typedef enum %sAnyId\n", modName); fprintf (hdr,"{\n"); /* do any lib types */ for (i = BASICTYPE_BOOLEAN; i < BASICTYPE_MACRODEF; i++) { arl = LIBTYPE_GET_ANY_REFS (i); if (arl != NULL) { FOR_EACH_LIST_ELMT (ar, arl) { if (!firstPrinted) fprintf (hdr,",\n"); fprintf (hdr," %s = %d", ar->anyIdName, anyEnumValG++); firstPrinted = FALSE; } } } FOR_EACH_LIST_ELMT (td, m->typeDefs) { if (td->anyRefs != NULL) { FOR_EACH_LIST_ELMT (ar, td->anyRefs) { if (!firstPrinted) fprintf (hdr,",\n"); fprintf (hdr," %s = %d", ar->anyIdName, anyEnumValG++); firstPrinted = FALSE; } } } if (firstPrinted) /* none have been printed */ fprintf (hdr,"/* NO INTEGER or OBJECT IDENTIFIER to ANY type relationships were defined (via MACROs or other mechanism) */\n ??? \n"); fprintf (hdr,"\n} %sAnyId;\n\n\n", modName); Free (modName);} /* PrintAnyEnum */voidPrintCxxAnyHashInitRoutine PARAMS ((src, hdr, mods, m, r), FILE *src _AND_ FILE *hdr _AND_ ModuleList *mods _AND_ Module *m _AND_ CxxRules *r){ TypeDef *td; AnyRefList *arl; AnyRef *ar; CxxTDI *cxxtdi; int i; int j; enum BasicTypeChoiceId typeId; int installedSomeHashes = FALSE; /* print InitAny class src file */ fprintf (src,"// this class will automatically intialize the any hash tbl\n"); fprintf (src,"class InitAny\n"); fprintf (src,"{\n"); fprintf (src," public:\n"); fprintf (src," InitAny();\n"); fprintf (src,"};\n\n"); fprintf (src,"static InitAny anyInitalizer;\n"); /* print constructor method that build hash tbl to src file*/ fprintf (src,"InitAny::InitAny()\n"); fprintf (src,"{\n"); /* first print value for OID's */ /* do any lib types first */ i = 0; for (j = BASICTYPE_BOOLEAN; j < BASICTYPE_MACRODEF; j++) { arl = LIBTYPE_GET_ANY_REFS (j); if (arl != NULL) { FOR_EACH_LIST_ELMT (ar, arl) { installedSomeHashes = TRUE; if (ar->id->choiceId == OIDORINT_OID) { fprintf (src," %s oid%d", r->typeConvTbl[BASICTYPE_OID].className, i++); PrintCxxOidValue (src, r, ar->id->a.oid); fprintf (src,";\n"); } else if (ar->id->choiceId == OIDORINT_INTID) { fprintf (src," %s int%d", r->typeConvTbl[BASICTYPE_INTEGER].className, i++); PrintCxxIntValue (src, r, ar->id->a.intId); fprintf (src,";\n"); } } } } FOR_EACH_LIST_ELMT (td, m->typeDefs) { if (td->anyRefs != NULL) { cxxtdi = td->cxxTypeDefInfo; FOR_EACH_LIST_ELMT (ar, td->anyRefs) { installedSomeHashes = TRUE; if (ar->id->choiceId == OIDORINT_OID) { fprintf (src," %s oid%d", r->typeConvTbl[BASICTYPE_OID].className, i++); PrintCxxOidValue (src, r, ar->id->a.oid); fprintf (src,";\n"); } else if (ar->id->choiceId == OIDORINT_INTID) { fprintf (src," %s int%d", r->typeConvTbl[BASICTYPE_INTEGER].className, i++); PrintCxxIntValue (src, r, ar->id->a.intId); fprintf (src,";\n"); } } } } /* now print hash init calls */ i = 0; for (j = BASICTYPE_BOOLEAN; j < BASICTYPE_MACRODEF; j++) { arl = LIBTYPE_GET_ANY_REFS (j); if (arl != NULL) { FOR_EACH_LIST_ELMT (ar, arl) { if (ar->id->choiceId == OIDORINT_OID) fprintf (src," AsnAny::InstallAnyByOid (oid%d, %s, new %s);\n", i++, ar->anyIdName, r->typeConvTbl[j].className); else fprintf (src," AsnAny::InstallAnyByInt (int%d, %s, new %s);\n", i++, ar->anyIdName, r->typeConvTbl[j].className); } } } FOR_EACH_LIST_ELMT (td, m->typeDefs) { if (td->anyRefs != NULL) { FOR_EACH_LIST_ELMT (ar, td->anyRefs) { cxxtdi = td->cxxTypeDefInfo; if (ar->id->choiceId == OIDORINT_OID) fprintf (src," AsnAny::InstallAnyByOid (oid%d, %s, new %s);\n", i++, ar->anyIdName, cxxtdi->className); else fprintf (src," AsnAny::InstallAnyByInt (int%d, %s, new %s);\n", i++, ar->anyIdName, cxxtdi->className); } } } if (!installedSomeHashes) { fprintf (src," /* Since no INTEGER/OID to ANY type relations were defined\n"); fprintf (src," * (usually done via MACROs) you must manually do the code\n"); fprintf (src," * to fill the hash tbl.\n"); fprintf (src," * if the ids are INTEGER use the following:\n"); fprintf (src," * AsnAny::InstallAnyByInt (3, ??_ANY_ID, new <className>);\n"); fprintf (src," * if the ids are OBJECT IDENTIFIERs use the following:\n"); fprintf (src," * AsnAny::InstallAnyByOid (OidValue, ??_ANY_ID, new <className>);\n"); fprintf (src," * put the ??_ANY_IDs in the AnyId enum.\n\n"); fprintf (src," * For example if you have some thing like\n"); fprintf (src," * T1 ::= SEQUENCE { id INTEGER, ANY DEFINED BY id }\n"); fprintf (src," * and the id 1 maps to the type BOOLEAN use the following:\n"); fprintf (src," * AsnAny::InstallAnyByInt (1, SOMEBOOL_ANY_ID, new AsnBool);\n"); fprintf (src," */\n ???????\n"); /* generate compile error */ } fprintf (src,"} /* InitAny::InitAny */\n\n\n");} /* PrintAnyHashInitRoutine */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -