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

📄 gen-type.c

📁 asn.1 compiler
💻 C
字号:
/* * compiler/back-ends/c-gen/gen-type.c - routines for printing c types from  ASN.1 from type trees * * Mike Sample * 91/09/26 * 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-type.c,v 1.3 1995/07/25 18:43:44 rj Exp $ * $Log: gen-type.c,v $ * Revision 1.3  1995/07/25 18:43:44  rj * file name has been shortened for redundant part: c-gen/gen-c-type -> c-gen/gen-type. * * changed `_' to `-' in file names. * * Revision 1.2  1994/09/01  00:23:58  rj * snacc_config.h and other superfluous .h files removed. * * Revision 1.1  1994/08/28  09:48:31  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 "asn1module.h"#include "mem.h"#include "print.h"#include "rules.h"#include "type-info.h"#include "util.h"#include "gen-type.h"/* non-exported prototypes */static void PrintCType PROTO ((FILE *f,  CRules *r, Module *m, TypeDef *td, Type *parent, Type *t));static void PrintCStructElmts PROTO ((FILE *f, CRules *r, Module *m, TypeDef *td, Type *parent, Type *t));static void PrintCChoiceIdEnum PROTO ((FILE *f, CRules *r, Module *m, TypeDef *td, Type *parent, Type *t));static void PrintCChoiceUnion  PROTO ((FILE *f, CRules *r, Module *m, TypeDef *td, Type *parent, Type *t));static void PrintCChoiceTypeDef PROTO ((FILE *f, CRules *r, Module *m, TypeDef *td));static void PrintTypeComment PROTO ((FILE *f, TypeDef *head, Type *t));static void PrintPreTypeDefStuff PROTO ((FILE *f, CRules *r, Module *m, TypeDef *td, Type *parent, Type *t));voidPrintCTypeDef PARAMS ((f, r, m, td),    FILE *f _AND_    CRules *r _AND_    Module *m _AND_    TypeDef *td){    CTRI *ctri;    CTDI *ctdi;    Type *t;    ctdi = td->cTypeDefInfo;    if ((ctdi == NULL) || (!ctdi->genTypeDef))        return;    t = td->type;    ctri = t->cTypeRefInfo;    PrintPreTypeDefStuff (f, r, m, td, NULL, t);    switch (ctri->cTypeId)    {        case C_TYPEREF:        case C_LIB:        case C_ANY:        case C_ANYDEFINEDBY:        case C_LIST:            fprintf (f, "typedef ");            PrintCType (f, r, m, td, NULL, t);            fprintf (f, " %s;", ctdi->cTypeName);            PrintTypeComment (f, td, t);            fprintf (f, "\n\n");            break;        case C_CHOICE:            PrintCChoiceTypeDef (f, r,  m, td);            break;        case C_STRUCT:            fprintf (f, "typedef ");            fprintf (f,"%s %s", "struct", t->cTypeRefInfo->cTypeName);            PrintTypeComment (f, td, t);            fprintf (f,"\n{\n");            PrintCStructElmts (f, r, m, td, NULL, t);            fprintf (f, "} %s;", ctdi->cTypeName);            fprintf (f, "\n\n");            break;        default:            break;        /* else do nothing - some unprocessed or unknown type (macros etc) */    }}  /* PrintCTypeDef */static voidPrintCType PARAMS ((f, r, m, td, parent, t),    FILE *f _AND_    CRules *r _AND_    Module *m _AND_    TypeDef *td _AND_    Type *parent _AND_    Type *t){    CTRI *ctri;    CNamedElmt *n;    ctri = t->cTypeRefInfo;    if (ctri == NULL)        return;    switch (ctri->cTypeId)    {        case C_TYPEREF:            /*             * put struct in front of def if             * defined from a struct type (set/seq/choice)             * but only if not a ref of a ref             */            if ((t->basicType->a.localTypeRef->link->type->cTypeRefInfo->cTypeId == C_STRUCT)||                 (t->basicType->a.localTypeRef->link->type->cTypeRefInfo->cTypeId == C_CHOICE))            {                fprintf (f,"struct ");            }            fprintf (f,"%s", ctri->cTypeName);            if (ctri->isPtr)                fprintf (f,"*");            break;        case C_ANY:            fprintf (f,"/* ANY- Fix Me ! */\n");        case C_ANYDEFINEDBY:        case C_LIST:        case C_LIB:            fprintf (f,"%s", ctri->cTypeName);            /*             * print enum constant defs             */            if ((ctri->cNamedElmts != NULL) &&                (t->basicType->choiceId  == BASICTYPE_ENUMERATED))            {                fprintf (f, "\n    {\n");                FOR_EACH_LIST_ELMT (n, ctri->cNamedElmts)                {                    fprintf (f,"        %s = %d", n->name, n->value);                    if (n != (CNamedElmt*)LAST_LIST_ELMT (ctri->cNamedElmts))                        fprintf (f,",");                    fprintf (f,"\n");                }                fprintf (f, "    }");            }            if (ctri->isPtr)               fprintf (f,"*");            break;       default:           break;             /* nothing */    }}  /* PrintCType */static voidPrintCStructElmts PARAMS ((f, r, m, td, parent, t),    FILE *f _AND_    CRules *r _AND_    Module *m _AND_    TypeDef *td _AND_    Type *parent _AND_    Type *t){    CTRI *ctri;    NamedType *et;    NamedTypeList *elmts;    elmts = t->basicType->a.sequence;    if ((elmts == NULL) || (LIST_EMPTY (elmts)))    {        fprintf (f, "    char unused; /* empty ASN1 SET/SEQ - not used */\n");    }    FOR_EACH_LIST_ELMT (et, elmts)    {        ctri =  et->type->cTypeRefInfo;        fprintf (f,"    ");  /* cheap, fixed indent */        PrintCType (f, r, m, td, t, et->type);        fprintf (f, " %s;", ctri->cFieldName);        PrintTypeComment (f, td, et->type);        fprintf (f, "\n");    }}  /* PrintCStructElmts */static voidPrintCChoiceIdEnum PARAMS ((f, r, m, td, parent, t),    FILE *f _AND_    CRules *r _AND_    Module *m _AND_    TypeDef *td _AND_    Type *parent _AND_    Type *t){    NamedType *et;    NamedType *last;    CTRI *ctri;    ctri =  t->cTypeRefInfo;    fprintf (f, "    enum %s\n    {\n", ctri->choiceIdEnumName);    if ((t->basicType->a.choice != NULL) &&        !(LIST_EMPTY (t->basicType->a.choice)))        last = (NamedType*)LAST_LIST_ELMT (t->basicType->a.choice);    FOR_EACH_LIST_ELMT (et, t->basicType->a.choice)    {        ctri =  et->type->cTypeRefInfo;        fprintf (f,"        %s", ctri->choiceIdSymbol);        if (et == last)            fprintf (f, "\n");        else            fprintf (f, ",\n");    }    ctri =  t->cTypeRefInfo;    fprintf (f, "    } %s;", ctri->choiceIdEnumFieldName);}  /* PrintCChoiceIdEnum */static voidPrintCChoiceUnion PARAMS ((f, r, m, td, parent, t),    FILE *f _AND_    CRules *r _AND_    Module *m _AND_    TypeDef *td _AND_    Type *parent _AND_    Type *t){    CTRI *ctri;    ctri = t->cTypeRefInfo;    fprintf (f,"    union %s\n    {\n",  ctri->cTypeName);    PrintCStructElmts (f, r, m, td, parent, t);    fprintf (f, "    }");}  /* PrintCChoiceUnion */static voidPrintCChoiceTypeDef PARAMS ((f, r, m, td),    FILE *f _AND_    CRules *r _AND_    Module *m _AND_    TypeDef *td){    CTRI *ctri;    char *choiceName;    Type *t;    t = td->type;    ctri =  t->cTypeRefInfo;    choiceName = td->cTypeDefInfo->cTypeName;    fprintf (f, "typedef ");    fprintf (f, "struct %s", choiceName);    PrintTypeComment (f, td, t);    fprintf (f,"\n{\n");    PrintCChoiceIdEnum (f, r, m, td, NULL, t);    fprintf (f,"\n");    PrintCChoiceUnion (f, r, m, td, NULL, t);    fprintf (f, " %s;", ctri->cFieldName);    fprintf (f,"\n} %s;\n\n", choiceName);}  /* PrintCChoiceDef *//* * used to print snippet of the defining ASN.1  after the * C type. */static voidPrintTypeComment PARAMS ((f, td, t),    FILE *f _AND_    TypeDef *td _AND_    Type *t){    fprintf (f," /* ");    SpecialPrintType (f, td, t);    fprintf (f," */");}/* * print any #defines for integers/bits with named elements * (currenly only the first option will fire due to the *  steps taken in normalize.c) */static voidPrintPreTypeDefStuff PARAMS ((f, r, m, td, parent, t),    FILE *f _AND_    CRules *r _AND_    Module *m _AND_    TypeDef *td _AND_    Type *parent _AND_    Type *t){    CTRI *ctri;    NamedType *et;    CNamedElmt *n;    ctri = td->type->cTypeRefInfo;    /*     * print defined stmts for non enumerated type with named elmts     */    if ((ctri->cNamedElmts != NULL) &&        (t->basicType->choiceId  != BASICTYPE_ENUMERATED))    {        FOR_EACH_LIST_ELMT (n, ctri->cNamedElmts)        {            fprintf(f, "\n#define %s %d", n->name, n->value);        }        fprintf (f, "\n\n");    }    else if ((t->basicType->choiceId == BASICTYPE_SET) ||             (t->basicType->choiceId == BASICTYPE_SEQUENCE) ||             (t->basicType->choiceId == BASICTYPE_CHOICE))    {        FOR_EACH_LIST_ELMT (et, t->basicType->a.set)            PrintPreTypeDefStuff (f, r, m, td, t, et->type);    }    else if ((t->basicType->choiceId == BASICTYPE_SETOF) ||             (t->basicType->choiceId == BASICTYPE_SEQUENCEOF))    {        PrintPreTypeDefStuff (f, r,  m, td, t, t->basicType->a.setOf);    }}  /* PrintPreTypeDefStuff */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -