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

📄 gen-dec.c

📁 asn to c编译器 源代码
💻 C
📖 第 1 页 / 共 5 页
字号:
            }            fprintf (src,"             %s%d += %s%d;\n", decodedLenVarNameG, totalLevel, decodedLenVarNameG, totalLevel+1);        break;        case C_LIST:            PrintCListDecoderCode (src, td, t,  elmtLevel, totalLevel+1, tagLevel, elmtVarName);            fprintf (src,"\n\n");            fprintf (src,"             %s%d += %s%d;\n", decodedLenVarNameG, totalLevel, decodedLenVarNameG, totalLevel+1);        break;        case C_NO_TYPE:            break;        default:            fprintf (stderr,"PrintCElmtDecodeCode: ERROR - unknown c type id\n");        break;    }   }} /* PrintCElmtDecodeCode *//* * Prints code for decoding the elmts of SET */static voidPrintCSetDecodeCode 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){    NamedType *e;    CTRI *ctri;    TagList *tags;    Tag *tag;    enum BasicTypeChoiceId builtinType;    char *classStr;    char *formStr;    char *codeStr;    int   mandatoryCount = 0;    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,"        %sDecEoc (b, &totalElmtsLen%d, env);\n", 		 GetEncRulePrefix(), 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", (int)(*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 = %sDecTag (b, &totalElmtsLen%d, env);\n\n", 	++tagLevel, GetEncRulePrefix(),  totalLevel);        fprintf (src,"        if (tagId%d == EOC_TAG_ID)\n", tagLevel);        fprintf (src,"            %sDEC_2ND_EOC_OCTET (b, &totalElmtsLen%d, env)\n", 	GetEncRulePrefix(), 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 = %sDecTag (b, &totalElmtsLen%d, env);\n\n", 	     ++tagLevel, GetEncRulePrefix(), totalLevel);    fprintf (src, "    if ((tagId%d == EOC_TAG_ID) && (elmtLen%d == INDEFINITE_LEN))\n", tagLevel, elmtLevel);    fprintf (src, "    {\n");    fprintf (src, "        %sDEC_2ND_EOC_OCTET (b, &totalElmtsLen%d, env)\n", 	     GetEncRulePrefix(), totalLevel);    fprintf (src, "        break; /* got EOC so can exit this SET's for loop*/\n");    fprintf (src, "    }\n");    fprintf (src, "    elmtLen%d = %sDecLen (b, &totalElmtsLen%d, env);\n", 	     ++elmtLevel, GetEncRulePrefix(), totalLevel);    fprintf (src, "    switch (tagId%d)\n", tagLevel);    fprintf (src, "    {\n");    FOR_EACH_LIST_ELMT (e, elmts)    {      if(!e->type->extensionAddition)      {        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))            {                if(e->type->extensionAddition)                {                    fprintf (src, "<Extensibility not supported in c-library>\n");                    fprintf (src, "<--Suggest removing extension marker and making all respective extension additions optional>\n");                }                else                {                       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 = DetermineCode(tag, NULL, 0);//RWC;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, %s):\n", classStr, Form2FormStr (CONS), DetermineCode(tag, NULL, 1));//RWC;tag->code);                    fprintf (src,"       case MAKE_TAG_ID (%s, %s, %s):\n", classStr, Form2FormStr (PRIM), DetermineCode(tag, NULL, 1));//RWC;tag->code);                }                else                    fprintf (src,"       case MAKE_TAG_ID (%s, %s, %s):\n", classStr, formStr, DetermineCode(tag, NULL, 1));//RWC;tag->code);            }            AsnListFirst (tags);            AsnListNext (tags); /* set curr to 2nd tag */            FOR_REST_LIST_ELMT (tag, tags)            {                codeStr = DetermineCode(tag, NULL, 0);//RWC;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, %s):\n", classStr, Form2FormStr (CONS), DetermineCode(tag, NULL, 1));//RWC;tag->code);                            fprintf (src,"       case MAKE_TAG_ID (%s, %s, %s):\n", classStr, Form2FormStr (PRIM), DetermineCode(tag, NULL, 1));//RWC;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, %s):\n", classStr, Form2FormStr (CONS), DetermineCode(tag, NULL, 1));//RWC;tag->code);                            fprintf (src,"       case MAKE_TAG_ID (%s, %s, %s):\n", classStr, Form2FormStr (PRIM), DetermineCode(tag, NULL, 1));//RWC;tag->code);                        }                        fprintf (src,"       case MAKE_TAG_ID (%s, %s, %s):\n", classStr, formStr, DetermineCode(tag, NULL, 1));//RWC;tag->code);                    }                }                else                {                    tagLevel = initialTagLevel+2;                    if (tag->form == ANY_FORM)                    {                        fprintf (src,"    tagId%d = %sDecTag (b, &totalElmtsLen%d, env);\n", 				 tagLevel, GetEncRulePrefix(), 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, %s)) &&\n", tagLevel, classStr, Form2FormStr (PRIM), DetermineCode(tag, NULL, 1));//RWC;tag->code);                            fprintf (src,"   (tagId%d != MAKE_TAG_ID (%s, %s, %s)))\n", tagLevel, classStr, Form2FormStr (CONS), DetermineCode(tag, NULL, 1));//RWC;tag->code);                        }                    }                    else                    {                        if (tag->tclass == UNIV)                            fprintf (src,"if (%sDecTag (b, &totalElmtsLen%d, env) != MAKE_TAG_ID (%s, %s, %s))\n", GetEncRulePrefix(),  totalLevel, classStr, formStr, codeStr);                        else                            fprintf (src,"if (%sDecTag (b, &totalElmtsLen%d, env) != MAKE_TAG_ID (%s, %s, %s))\n", GetEncRulePrefix(),  totalLevel, classStr, formStr, DetermineCode(tag, NULL, 1));//RWC;tag->code);                    }                    fprintf (src,"    {\n");                    fprintf (src,"         Asn1Error (\"Unexpected Tag\\n\");\n");                    fprintf (src,"         longjmp (env, %d);\n", (int)(*longJmpValG)--);                    fprintf (src,"    }\n\n");                    fprintf (src,"elmtLen%d = %sDecLen (b, &totalElmtsLen%d, env);\n", ++elmtLevel, GetEncRulePrefix(),  totalLevel);                }            }                  }        MakeVarPtrRef (genDecCRulesG, td, parent, e->type, varName, tmpVarName);        /*         * allocate mem for decoding result         */        PrintElmtAllocCode (src, e->type, tmpVarName);        PrintCElmtDecodeCode (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 (\"%s%sContent: ERROR - Unexpected tag in SET\\n\");\n", GetEncRulePrefix(), routineName);    fprintf (src, "        longjmp (env, %d);\n", (int)(*longJmpValG)--);    fprintf (src, "        break;\n");/*    fprintf (src, "        Asn1Warning (\"%s%sContent: Warning - unexpected tag in SET, discarding elmt\\n\");\n", GetEncRulePrefix(), 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 (\"%s%sContent: ERROR - non-optional elmt missing from SET\\n\");\n", GetEncRulePrefix(), routineName);    fprintf (src, "        longjmp (env, %d);\n", (int)(*longJmpValG)--);    fprintf (src, "    }\n");}  /*  PrintCSetDecodeCode *//* * Prints code for decoding the elmts of a SEQUENCE */static voidPrintCSeqDecodeCode 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;    NamedType *e;    NamedType *tmpElmt;    NamedType *last;    TagList *tags;    Tag *tag;    enum BasicTypeChoiceId builtinType;    enum BasicTypeChoiceId tmpTypeId;    char *classStr;    char *formStr;    char *codeStr;    char  tmpVarName[MAX_VAR_REF];    int   stoleChoiceTags;    char *routineName;    int   inTailOptElmts = FALSE;    int   initialElmtLevel;    int   initialTagLevel;

⌨️ 快捷键说明

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