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

📄 gen-dec.c

📁 asn.1 compiler
💻 C
📖 第 1 页 / 共 5 页
字号:
    TagList *tags;    Tag *tag;    TagList *tl;    enum BasicTypeChoiceId builtinType;    char *classStr;    char *formStr;    char *codeStr;    int   mandatoryCount = 0;    int   i;    char  tmpVarName[MAX_VAR_REF];    int   stoleChoiceTags;    char *routineName;    int initialTagLevel;    int initialElmtLevel;    initialTagLevel = tagLevel;    initialElmtLevel = elmtLevel;    routineName = td->cTypeDefInfo->decodeRoutineName;    if ((elmts == NULL) || LIST_EMPTY (elmts)) /* empty set */    {        fprintf (src,"    if (elmtLen%d == INDEFINITE_LEN)\n", elmtLevel);        fprintf (src,"    {\n");        fprintf (src,"        BDecEoc (b, &totalElmtsLen%d, env);\n", totalLevel);        fprintf (src,"    }\n");        fprintf (src,"    else if (elmtLen%d != 0)\n", elmtLevel);        fprintf (src,"    {\n");        fprintf (src,"         Asn1Error (\"Expected an empty SET\\n\");\n");        fprintf (src,"         longjmp (env, %d);\n",(*longJmpValG)--);        fprintf (src,"    }\n");/* forget about possible extension types for now        fprintf (src,"    if (elmtLen%d == INDEFINITE_LEN)\n", elmtLevel);        fprintf (src,"    {\n");        fprintf (src,"        tagId%d = BDecTag (b, &totalElmtsLen%d, env);\n\n", ++tagLevel, totalLevel);        fprintf (src,"        if (tagId%d == EOC_TAG_ID)\n", tagLevel);        fprintf (src,"            BDEC_2ND_EOC_OCTET (b, &totalElmtsLen%d, env)\n", totalLevel);        fprintf (src,"        else\n");        fprintf (src,"            BerDiscardElmt (b, &totalElmtsLen%d, env);\n\n",totalLevel);        fprintf (src,"    }\n");        fprintf (src,"    else\n");        fprintf (src,"    {\n");        fprintf (src,"        BufSkip (b, elmtLen%d);\n", elmtLevel);        fprintf (src,"        totalElmtsLen%d += elmtLen%d;\n", totalLevel, elmtLevel);        fprintf (src,"    }\n");*/        return;    }    fprintf (src, "for ( ; (totalElmtsLen%d < elmtLen%d) || (elmtLen%d == INDEFINITE_LEN);)\n", totalLevel, elmtLevel, elmtLevel);    fprintf (src, "{\n");    fprintf (src, "    tagId%d = BDecTag (b, &totalElmtsLen%d, env);\n\n", ++tagLevel, totalLevel);    fprintf (src, "    if ((tagId%d == EOC_TAG_ID) && (elmtLen%d == INDEFINITE_LEN))\n", tagLevel, elmtLevel);    fprintf (src, "    {\n");    fprintf (src, "        BDEC_2ND_EOC_OCTET (b, &totalElmtsLen%d, env)\n", totalLevel);    fprintf (src, "        break; /* got EOC so can exit this SET's for loop*/\n");    fprintf (src, "    }\n");    fprintf (src, "    elmtLen%d = BDecLen (b, &totalElmtsLen%d, env);\n", ++elmtLevel, totalLevel);    fprintf (src, "    switch (tagId%d)\n", tagLevel);    fprintf (src, "    {\n");    FOR_EACH_LIST_ELMT (e, elmts)    {        elmtLevel = initialElmtLevel+1;        tagLevel = initialTagLevel+1;        if ((e->type == NULL) || (e->type->cTypeRefInfo == NULL))        {            fprintf (src, "< ERROR - no c type information - prob unsuported type>\n");            continue;        }        ctri = e->type->cTypeRefInfo;        /* check if meant to be encoded */        if (!ctri->isEncDec)            continue;        tags  = GetTags (e->type, &stoleChoiceTags);        builtinType = GetBuiltinType (e->type);        if ((tags == NULL) || LIST_EMPTY (tags))        {            if ((builtinType != BASICTYPE_ANY) &&                (builtinType != BASICTYPE_ANYDEFINEDBY))                fprintf (src, "<What? no tag on a SetElmt?>\n");            else            {                fprintf (src,"       /* ANY - Fix Me ! */\n");                fprintf (src,"       case MAKE_TAG_ID (?,?,?):\n");            }        }        else        {            tag = (Tag*)FIRST_LIST_ELMT (tags);            classStr = Class2ClassStr (tag->tclass);            codeStr = Code2UnivCodeStr (tag->code);            formStr = Form2FormStr (tag->form);            if (tag->tclass == UNIV)            {                if (tag->form == ANY_FORM)                {                    fprintf (src,"       case MAKE_TAG_ID (%s, %s, %s):\n", classStr, Form2FormStr (CONS), codeStr);                    fprintf (src,"       case MAKE_TAG_ID (%s, %s, %s):\n", classStr, Form2FormStr (PRIM), codeStr);                }                else                    fprintf (src,"       case MAKE_TAG_ID (%s, %s, %s):\n", classStr, formStr, codeStr);            }            else            {                if (tag->form == ANY_FORM)                {                    fprintf (src,"       case MAKE_TAG_ID (%s, %s, %d):\n", classStr, Form2FormStr (CONS), tag->code);                    fprintf (src,"       case MAKE_TAG_ID (%s, %s, %d):\n", classStr, Form2FormStr (PRIM), tag->code);                }                else                    fprintf (src,"       case MAKE_TAG_ID (%s, %s, %d):\n", classStr, formStr, tag->code);            }            AsnListFirst (tags);            AsnListNext (tags); /* set curr to 2nd tag */            FOR_REST_LIST_ELMT (tag, tags)            {                codeStr = Code2UnivCodeStr (tag->code);                classStr = Class2ClassStr (tag->tclass);                formStr = Form2FormStr (tag->form);                if (stoleChoiceTags)                {                    if (tag->tclass == UNIV)                    {                        if (tag->form == ANY_FORM)                        {                            fprintf (src,"       case MAKE_TAG_ID (%s, %s, %d):\n", classStr, Form2FormStr (CONS), tag->code);                            fprintf (src,"       case MAKE_TAG_ID (%s, %s, %d):\n", classStr, Form2FormStr (PRIM), tag->code);                        }                        fprintf (src,"       case MAKE_TAG_ID (%s, %s, %s):\n", classStr, formStr, codeStr);                    }                    else                    {                        if (tag->form == ANY_FORM)                        {                            fprintf (src,"       case MAKE_TAG_ID (%s, %s, %d):\n", classStr, Form2FormStr (CONS), tag->code);                            fprintf (src,"       case MAKE_TAG_ID (%s, %s, %d):\n", classStr, Form2FormStr (PRIM), tag->code);                        }                        fprintf (src,"       case MAKE_TAG_ID (%s, %s, %d):\n", classStr, formStr, tag->code);                    }                }                else                {                    tagLevel = initialTagLevel+2;                    if (tag->form == ANY_FORM)                    {                        fprintf (src,"    tagId%d = BDecTag (b, &totalElmtsLen%d, env);\n", tagLevel, totalLevel);                        if (tag->tclass == UNIV)                        {                            fprintf (src,"if ((tagId%d != MAKE_TAG_ID (%s, %s, %s)) &&\n", tagLevel, classStr, Form2FormStr (PRIM), codeStr);                            fprintf (src,"   (tagId%d != MAKE_TAG_ID (%s, %s, %s)))\n", tagLevel, classStr, Form2FormStr (CONS), codeStr);                        }                        else                        {                            fprintf (src,"if ((tagId%d != MAKE_TAG_ID (%s, %s, %d)) &&\n", tagLevel, classStr, Form2FormStr (PRIM), tag->code);                            fprintf (src,"   (tagId%d != MAKE_TAG_ID (%s, %s, %d)))\n", tagLevel, classStr, Form2FormStr (CONS), tag->code);                        }                    }                    else                    {                        if (tag->tclass == UNIV)                            fprintf (src,"if (BDecTag (b, &totalElmtsLen%d, env) != MAKE_TAG_ID (%s, %s, %s))\n", totalLevel, classStr, formStr, codeStr);                        else                            fprintf (src,"if (BDecTag (b, &totalElmtsLen%d, env) != MAKE_TAG_ID (%s, %s, %d))\n", totalLevel, classStr, formStr, tag->code);                    }                    fprintf (src,"    {\n");                    fprintf (src,"         Asn1Error (\"Unexpected Tag\\n\");\n");                    fprintf (src,"         longjmp (env, %d);\n", (*longJmpValG)--);                    fprintf (src,"    }\n\n");                    fprintf (src,"elmtLen%d = BDecLen (b, &totalElmtsLen%d, env);\n", ++elmtLevel, totalLevel);                }            }        }        MakeVarPtrRef (genDecCRulesG, td, parent, e->type, varName, tmpVarName);        /*         * allocate mem for decoding result         */        PrintElmtAllocCode (src, e->type, tmpVarName);        PrintCBerElmtDecodeCode (src, td, parent, e->type, elmtLevel, totalLevel, tagLevel, varName, tmpVarName, stoleChoiceTags);        /*         * must check for another EOC for ANYs         * Since the any decode routines         * decode their own first tag/len pair         */        if ((builtinType == BASICTYPE_ANY) ||            (builtinType == BASICTYPE_ANYDEFINEDBY))            PrintEocDecoders (src, elmtLevel, initialElmtLevel, itemLenVarNameG, totalLevel, decodedLenVarNameG);        /*         * must check for another EOC for tagged CHOICEs         * since the choice decoder routines do not check         * for an EOC on the choice's overall length -         * they are only passed the tag/len of the choice's         * component.         */        else if ((builtinType == BASICTYPE_CHOICE) && !(stoleChoiceTags) &&                ((tags != NULL) && !LIST_EMPTY (tags)))            PrintEocDecoders (src, elmtLevel, initialElmtLevel, itemLenVarNameG, totalLevel, decodedLenVarNameG);        else            PrintEocDecoders (src, elmtLevel-1, initialElmtLevel, itemLenVarNameG, totalLevel, decodedLenVarNameG);        if ((!e->type->optional) && (e->type->defaultVal == NULL))        {            mandatoryCount++;            fprintf (src, "    mandatoryElmtCount%d++;\n", totalLevel);        }        FreeTags (tags);        fprintf (src,"    break;\n\n");    }  /* end for */    fprintf (src, "    default:\n");    fprintf (src, "        Asn1Error (\"B%sContent: ERROR - Unexpected tag in SET\\n\");\n", routineName);    fprintf (src, "        longjmp (env, %d);\n",(*longJmpValG)--);    fprintf (src, "        break;\n");/*    fprintf (src, "        Asn1Warning (\"B%sContent: Warning - unexpected tag in SET, discarding elmt\\n\");\n", routineName);    fprintf (src, "        BerDiscardElmt (b, &totalElmtsLen%d, env);\n\n", totalLevel);*/    fprintf (src, "        } /* end switch */\n");    fprintf (src, "    } /* end for */\n");    fprintf (src, "    if (mandatoryElmtCount%d != %d)\n", totalLevel, mandatoryCount);    fprintf (src, "    {\n");    fprintf (src, "        Asn1Error (\"B%sContent: ERROR - non-optional elmt missing from SET\\n\");\n", routineName);    fprintf (src, "        longjmp (env, %d);\n",(*longJmpValG)--);    fprintf (src, "    }\n");}  /*  PrintCBerSetDecodeCode *//* * Prints code for decoding the elmts of a SEQUENCE */static voidPrintCBerSeqDecodeCode PARAMS ((src, td, parent, elmts, elmtLevel, totalLevel, tagLevel, varName),    FILE *src _AND_    TypeDef *td _AND_    Type *parent _AND_    NamedTypeList *elmts _AND_    int elmtLevel _AND_    int totalLevel _AND_    int tagLevel _AND_    char *varName){    CTRI *ctri;    CTDI *ctdi;    NamedType *e;    NamedType *tmpElmt;    NamedType *last;    TagList *tags;    Tag *tag;    Tag *lastTag;    enum BasicTypeChoiceId builtinType;    enum BasicTypeChoiceId tmpTypeId;    char *classStr;    BER_FORM form;    char *formStr;    char *codeStr;    int   i;    char  tmpVarName[MAX_VAR_REF];    int   stoleChoiceTags;    char *routineName;    int   inTailOptElmts = FALSE;    int   initialElmtLevel;    int   initialTagLevel;    initialTagLevel = tagLevel;    initialElmtLevel = elmtLevel;    routineName = td->cTypeDefInfo->decodeRoutineName;    if ((elmts == NULL) || LIST_EMPTY (elmts)) /* empty seq */    {        fprintf (src,"    if (elmtLen%d == INDEFINITE_LEN)\n", elmtLevel);        fprintf (src,"    {\n");        fprintf (src,"        BDecEoc (b, &totalElmtsLen%d, env);\n", totalLevel);        fprintf (src,"    }\n");        fprintf (src,"    else if (elmtLen%d != 0)\n", elmtLevel);        fprintf (src,"    {\n");        fprintf (src,"         Asn1Error (\"Expected an empty SEQUENCE\\n\");\n");        fprintf (src,"         longjmp (env, %d);\n",(*longJmpValG)--);        fprintf (src,"    }\n");/*        forget about extended types for now        fprintf (src,"        tagId%d = BDecTag (b, &totalElmtsLen%d, env);\n\n", tagLevel+1, totalLevel);        fprintf (src,"    {\n");        fprintf (src,"        if (tagId%d == EOC_TAG_ID)\n", tagLevel+1);        fprintf (src,"            BDEC_2ND_EOC_OCTET (b, &totalElmtsLen%d, env)\n", totalLevel);        fprintf (src,"        else\n");        fprintf (src,"            BerDiscardElmt (b, &totalElmtsLen%d, env);\n\n",totalLevel);        fprintf (src,"    }\n");        fprintf (src,"    else \n");        fprintf (src,"    {\n");        fprintf (src,"        BufSkip (b, elmtLen%d);\n", elmtLevel);        fprintf (src,"        totalElmtsLen%d += elmtLen%d\n", totalLevel, elmtLevel);        fprintf (src,"    }\n");*/        return;    }    /*     * must set list curr since IsTailOptional checks from curr pt     * onward     */    AsnListFirst (elmts);    inTailOptElmts = IsTailOptional (elmts);    e = (NamedType*)FIRST_LIST_ELMT (elmts);    tmpTypeId = GetBuiltinType (e->type);    /*     * print code to decode the first tag     */    tagLevel++;    if (!inTailOptElmts)    {        if (((tmpTypeId == BASICTYPE_ANY) ||             (tmpTypeId == BASICTYPE_ANYDEFINEDBY)) &&            (CountTags (e->type) == 0))

⌨️ 快捷键说明

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