📄 gen-dec.c
字号:
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 + -