📄 gen-free.c
字号:
/* * compiler/back-ends/c-gen/gen-free.c - routines for printing C hierachical free routines * * Mike Sample * 92/04 * 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: /baseline/SNACC/compiler/back-ends/c-gen/gen-free.c,v 1.8 2004/03/25 19:20:16 gronej Exp $ * $Log: gen-free.c,v $ * Revision 1.8 2004/03/25 19:20:16 gronej * fixed some linux warnings * * Revision 1.7 2003/07/07 14:53:38 nicholar * Eliminated headers and cleaned up include references * * Revision 1.6 2003/04/29 21:02:57 leonberp * integerated Deepak's changes for IOB support * * Revision 1.5 2002/11/01 15:05:34 mcphersc * fixed compiler warnings and errors not caught by windows compiler * * Revision 1.4 2002/10/01 13:51:39 mcphersc * Modified snacc to accept either the -I import option or the original way to list the * asn modules on the command line * * Revision 1.3 2002/09/04 18:02:11 vracarl * got rid of c++ comments * * Revision 1.2 2000/10/24 14:54:47 rwc * Updated to remove high-level warnings (level 4 on MSVC++) for an easier build. * SOME warnings persist due to difficulty in modifying the SNACC compiler to * properly build clean source; also some files are built by Lex/Yacc. * * Revision 1.1.1.1 2000/08/21 20:36:05 leonberp * First CVS Version of SNACC. * * Revision 1.3 1995/07/25 18:42:47 rj * file name has been shortened for redundant part: c-gen/gen-c-free -> c-gen/gen-free. * * changed `_' to `-' in file names. * * Revision 1.2 1994/09/01 00:23:29 rj * snacc_config.h and other superfluous .h files removed. * * Revision 1.1 1994/08/28 09:48:26 rj * first check-in. for a list of changes to the snacc-1.1 distribution please refer to the ChangeLog. * *//* Deepak: Formatting improved as required on 11/Feb/2003*/#include <stdio.h>#include "asn-incl.h"#include "asn1module.h"#include "mem.h"#include "define.h"#include "rules.h"#include "str-util.h"#include "util.h"#ifdef WIN32//#pragma warning( disable : 4706 ) /* IGNORE assign w/in conditional expression. */#endifextern FILE* errFileG; // Defined in snacc.cstatic char *returnTypeG = "void";static char *valueArgNameG = "v";static CRules *genFreeCRulesG;/* non-exported prototypes */static void PrintCFreePrototype PROTO ((FILE *hdr, TypeDef *td));static void PrintCFreeDeclaration PROTO ((FILE *src, TypeDef *td));static void PrintCFreeDefine PROTO ((FILE *hdr, TypeDef *td));static void PrintCFreeLocals PROTO ((FILE *src,TypeDef *td));static void PrintCFreeElmts PROTO ((FILE *src, TypeDef *td, Type *parent, NamedTypeList *elmts, char *varName));static void PrintCElmtFree PROTO ((FILE *src, TypeDef *td, Type *parent, Type *e, char *varName));static void PrintCFreeListElmts PROTO ((FILE *src, TypeDef *td, Type *t, char *varName));static void PrintCFreeListRoutineBody PROTO ((FILE *src, TypeDef *td, Type *t,char *varName));/*static void PrintCFreeListDefine PROTO ((FILE *hdr,TypeDef *td));*/static void PrintCFreeChoiceElmts PROTO ((FILE *src, TypeDef *td, Type *t, char *varName));//Deepak: 18/Apr/2003static void PrintCFreeMacroElmts PROTO ((FILE *src, TypeDef *td, Type *parent, MacroType *mt, char *varName));static void PrintCRosOperationElmtsFree PROTO ((FILE *src, TypeDef *td, Type *parent, MacroType *elmts, RosOperationMacroType *op, char *varName));voidPrintCFree PARAMS ((src, hdr, r, mods, m, td), FILE *src _AND_ FILE *hdr _AND_ CRules *r _AND_ ModuleList *mods _AND_ Module *m _AND_ TypeDef *td){ CTDI *ctdi; CTypeId rhsTypeId; /* cTypeId of the type that defined this typedef */ genFreeCRulesG = r; ctdi = td->cTypeDefInfo; if((ctdi == NULL) || (td->type->cTypeRefInfo == NULL)) { fprintf (errFileG, "PrintCFree: ERROR - no type info\n"); return; } if(!ctdi->genFreeRoutine) return; rhsTypeId = td->type->cTypeRefInfo->cTypeId; switch(rhsTypeId) { case C_ANY: case C_ANYDEFINEDBY: case C_LIB: case C_TYPEREF: PrintCFreeDefine (hdr, td); fprintf (hdr,"\n"); break; case C_CHOICE: PrintCFreePrototype (hdr, td); PrintCFreeDeclaration (src, td); fprintf (src,"{\n"); PrintCFreeLocals (src, td); fprintf (src,"\tif(%s == NULL)\n", valueArgNameG); fprintf (src,"\t\treturn;\n"); PrintCFreeChoiceElmts (src, td, td->type, valueArgNameG); fprintf (src,"} /* %s */",td->cTypeDefInfo->freeRoutineName); fprintf (hdr,"\n\n"); fprintf (src,"\n\n"); break; case C_STRUCT: PrintCFreePrototype (hdr, td); PrintCFreeDeclaration (src, td); fprintf (src,"{\n"); PrintCFreeLocals (src, td); fprintf (src,"\tif(%s == NULL)\n", valueArgNameG); fprintf (src,"\t\treturn;\n"); PrintCFreeElmts (src, td, td->type, td->type->basicType->a.set, valueArgNameG); fprintf (src,"} /* %s */", td->cTypeDefInfo->freeRoutineName); fprintf (hdr,"\n\n"); fprintf (src,"\n\n"); break; case C_LIST: PrintCFreePrototype (hdr, td); PrintCFreeDeclaration (src, td); fprintf (src,"{\n"); PrintCFreeLocals (src, td); fprintf (src,"\tif(%s == NULL)\n", valueArgNameG); fprintf (src,"\t\treturn;\n"); PrintCFreeListRoutineBody (src, td, td->type, valueArgNameG); fprintf (src,"} /* %s */", td->cTypeDefInfo->freeRoutineName); fprintf (hdr,"\n\n"); fprintf (src,"\n\n"); break; case C_MACROTYPE: PrintCFreePrototype (hdr, td); PrintCFreeDeclaration (src, td); fprintf (src,"{\n"); PrintCFreeLocals (src, td); fprintf (src,"\tif(%s == NULL)\n", valueArgNameG); fprintf (src,"\t\treturn;\n"); PrintCFreeMacroElmts (src, td, td->type, td->type->basicType->a.macroType, valueArgNameG); fprintf (src,"} /* %s */", td->cTypeDefInfo->freeRoutineName); fprintf (hdr,"\n\n"); fprintf (src,"\n\n"); break; case C_NO_TYPE: break; default: fprintf (errFileG, "PrintCFree: ERROR - unknown c type id\n"); break; } m=m; mods=mods; /*AVOIDS warning*/} /* PrintCFree */static voidPrintCFreeMacroElmts PARAMS ((src, td, parent, mt, varName), FILE *src _AND_ TypeDef *td _AND_ Type *parent _AND_ MacroType *mt _AND_ char *varName){ if(mt == NULL) { fprintf (src,"/* ERROR? - expected macroType for this type*/\n"); return; } switch (mt->choiceId) { // This switch case copied from do-macros.c case MACROTYPE_ASNABSTRACTOPERATION: case MACROTYPE_ROSOPERATION: PrintCRosOperationElmtsFree (src, td, parent, mt, mt->a.rosOperation, varName); break; // Add code for other macro types here default: // Unsupported Macro Type break; } //PrintCElmtFree (src, td, parent, e->type, varName);} /* PrintCFreeMacroElmts */static voidPrintCRosOperationElmtsFree PARAMS ((src, td, parent, mt, varName), FILE *src _AND_ TypeDef *td _AND_ Type *parent _AND_ MacroType *mt _AND_ RosOperationMacroType *op _AND_ char *varName){ if(op->arguments != NULL) { PrintCElmtFree (src, td, parent, op->arguments->type, varName); } if(op->result != NULL) { PrintCElmtFree (src, td, parent, op->result->type, varName); } mt=mt;} /* PrintCRosOperationElmtsFree *//* * Prints prototype for encode routine in hdr file */static voidPrintCFreePrototype PARAMS ((hdr, td), FILE *hdr _AND_ TypeDef *td){ CTDI *ctdi; ctdi = td->cTypeDefInfo; //fprintf (hdr,"%s %s PROTO ((%s *v));\n", returnTypeG, ctdi->freeRoutineName, ctdi->cTypeName); fprintf (hdr,"%s %s(%s *v);\n", returnTypeG, ctdi->freeRoutineName, ctdi->cTypeName);} /* PrintCFreePrototype *//* * Prints declarations of encode routine for the given type def */static voidPrintCFreeDeclaration PARAMS ((src, td), FILE *src _AND_ TypeDef *td){ CTDI *ctdi; ctdi = td->cTypeDefInfo;// fprintf (src,"%s\n%s PARAMS ((v),\n%s *v)\n", returnTypeG, ctdi->freeRoutineName, ctdi->cTypeName); fprintf (src,"%s %s(%s *v)\n", returnTypeG, ctdi->freeRoutineName, ctdi->cTypeName);} /* PrintCFreeDeclaration */static voidPrintCFreeDefine PARAMS ((hdr, td), FILE *hdr _AND_ TypeDef *td){ fprintf(hdr, "#define %s %s ", td->cTypeDefInfo->freeRoutineName, td->type->cTypeRefInfo->freeRoutineName);/* fprintf(hdr, "#define %s(v) ", td->cTypeDefInfo->freeRoutineName); fprintf (hdr, "%s (v)", td->type->cTypeRefInfo->freeRoutineName);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -