📄 types.c
字号:
case BASICTYPE_CHOICE: /* * must fill field names BEFORE filling choice elmts * (allows better naming for choice ids) */ FillIDLFieldNames (r, t->basicType->a.choice); FillIDLChoiceElmts (r, m, td, t, t->basicType->a.choice); break; case BASICTYPE_SET: case BASICTYPE_SEQUENCE: FillIDLStructElmts (r, m, td, t, t->basicType->a.set); FillIDLFieldNames (r, t->basicType->a.set); break; case BASICTYPE_COMPONENTSOF: case BASICTYPE_SELECTION: fprintf (stderr, "Compiler error - COMPONENTS OF or SELECTION type slipped through normalizing phase.\n"); break; case BASICTYPE_UNKNOWN: case BASICTYPE_MACRODEF: case BASICTYPE_MACROTYPE: /* do nothing */ break; } /* * figure out whether this is a ptr based on the enclosing * type (if any) and optionality/default */ idltri->isPtr = IsIDLPtr (r, td, parent, t); /* let user overide any defaults with the --snacc attributes */ /* undefined for C++ ParseTypeRefAttribs (ctri, t->attrList); */} /* FillIDLTypeRefInfo */static voidFillIDLStructElmts PARAMS ((r, m, td, parent, elmts), IDLRules *r _AND_ Module *m _AND_ TypeDef *td _AND_ Type *parent _AND_ NamedTypeList *elmts){ NamedType *et; FOR_EACH_LIST_ELMT (et, elmts) { FillIDLTypeRefInfo (r, m, td, parent, et->type); }} /* FillIDLStructElmts *//* * Figures out non-conflicting enum names for the * choice id's */static voidFillIDLChoiceElmts PARAMS ((r, m, td, parent, elmts), IDLRules *r _AND_ Module *m _AND_ TypeDef *td _AND_ Type *parent _AND_ NamedTypeList *elmts){ NamedType *et; int idCount = 0; IDLTRI *idltri; int len; /* * fill in type info for elmt types first */ FOR_EACH_LIST_ELMT (et, elmts) FillIDLTypeRefInfo (r, m, td, parent, et->type); /* * set choiceId Symbol & value * eg * Car ::= CHOICE { enum CarChoice { * chev ChevCar, carChoice_chev, * ford FordCar, carChoice_ford, * toyota ToyotaCar carChoice_toyota * } }; * union Car switch (CarChoice) { * ChevCar *chev; * FordCar *ford; * ToyotaCar *toyota; }; * }; * NOTE that the union is anonymous */ FOR_EACH_LIST_ELMT (et, elmts) { idltri = et->type->idlTypeRefInfo; if (idltri == NULL) continue; /* wierd type */ idltri->choiceIdValue = idCount++; len = strlen (td->idlTypeDefInfo->typeName) + strlen (idltri->fieldName); idltri->choiceIdSymbol = Malloc (len + 6 + 1); strcpy (idltri->choiceIdSymbol, td->idlTypeDefInfo->typeName); strcat (idltri->choiceIdSymbol, "Choice_"); strcat (idltri->choiceIdSymbol, idltri->fieldName); if (r->capitalizeNamedElmts) Str2UCase (idltri->choiceIdSymbol, len); Str2LCase (idltri->choiceIdSymbol, 1); }} /* FillIDLChoiceElmts *//* * takes a list of "sibling" (eg same level in a structure) * ElmtTypes and fills sets up the c field names in * the IDLTRI struct */static voidFillIDLFieldNames PARAMS ((r, elmts), IDLRules *r _AND_ NamedTypeList *elmts){ NamedType *et; IDLTRI *idltri; DefinedObj *fieldNames; int len, num, digit, i, tmpLen; char *tmpName; char *asn1FieldName; char *cFieldName; /* * Initialize fieldname data * allocate (if nec) and fill in CTRI fieldname if poss * from asn1 field name. leave blank otherwise */ fieldNames = NewObjList(); FOR_EACH_LIST_ELMT (et, elmts) { idltri = et->type->idlTypeRefInfo; if (idltri == NULL) { idltri = MT (IDLTRI); et->type->idlTypeRefInfo = idltri; } if (et->fieldName != NULL) { /* * can assume that the field names are * distinct because they have passed the * error checking step. * However, still call MakeCxxStrUnique * to change any field names that * conflict with C++ keywords */ asn1FieldName = et->fieldName; tmpName = Asn1FieldName2CFieldName (asn1FieldName); idltri->fieldName = Malloc (strlen (tmpName) + 1 + r->maxDigitsToAppend); strcpy (idltri->fieldName, tmpName); Free (tmpName);/* old idltri->fieldName = Asn1FieldName2CFieldName (asn1FieldName); */ MakeCxxStrUnique (fieldNames, idltri->fieldName, r->maxDigitsToAppend, 1); DefineObj (&fieldNames, idltri->fieldName); } } FOR_EACH_LIST_ELMT (et, elmts) { idltri = et->type->idlTypeRefInfo; /* * generate field names for those without them */ if (idltri->fieldName == NULL) { if ((et->type->basicType->choiceId == BASICTYPE_LOCALTYPEREF) || (et->type->basicType->choiceId == BASICTYPE_IMPORTTYPEREF)) { /* * take ref'd type name as field name * convert first let to lower case */ tmpName = et->type->basicType->a.localTypeRef->link->idlTypeDefInfo->typeName; tmpName = Asn1TypeName2CTypeName (tmpName); cFieldName = Malloc (strlen (tmpName) + r->maxDigitsToAppend +1); strcpy (cFieldName, tmpName); Free (tmpName); if (isupper (cFieldName[0])) cFieldName[0] = tolower (cFieldName[0]); } else { /* * get default field name for this type */ tmpName = r->typeConvTbl[et->type->basicType->choiceId].defaultFieldName; cFieldName = Malloc (strlen (tmpName) + r->maxDigitsToAppend +1); strcpy (cFieldName, tmpName); if (isupper (cFieldName[0])) cFieldName[0] = tolower (cFieldName[0]); } len = strlen (cFieldName); /* * try to use just the type name (with lower case first char). * if that is already used in this type or a C++ keyword, * append ascii digits to field name until unique * in this type */ MakeCxxStrUnique (fieldNames, cFieldName, r->maxDigitsToAppend, 1); DefineObj (&fieldNames, cFieldName); idltri->fieldName = cFieldName; } } FreeDefinedObjs (&fieldNames);} /* FillIDLFieldNames *//* * returns true if this c type for this type should be * be ref'd as a ptr */static intIsIDLPtr PARAMS ((r, td, parent, t), IDLRules *r _AND_ TypeDef *td _AND_ Type *parent _AND_ Type *t){ IDLTDI *idltdi; int retVal = FALSE; /* * inherit ptr attriubutes from ref'd type if any * otherwise grab lib c type def from the IDLRules */ if ((t->basicType->choiceId == BASICTYPE_LOCALTYPEREF) || (t->basicType->choiceId == BASICTYPE_IMPORTTYPEREF)) { idltdi = t->basicType->a.localTypeRef->link->idlTypeDefInfo; } else idltdi = &r->typeConvTbl[GetBuiltinType (t)]; /* no parent means t is the root of a typedef */ if ((parent == NULL) && (idltdi->isPtrForTypeDef)) retVal = TRUE; else if ((parent != NULL) && ((parent->basicType->choiceId == BASICTYPE_SET) || (parent->basicType->choiceId == BASICTYPE_SEQUENCE)) && (idltdi->isPtrInSetAndSeq)) retVal = TRUE; else if ((parent != NULL) && ((parent->basicType->choiceId == BASICTYPE_SETOF) || (parent->basicType->choiceId == BASICTYPE_SEQUENCEOF)) && (idltdi->isPtrInList)) retVal = TRUE; else if ((parent != NULL) && (parent->basicType->choiceId == BASICTYPE_CHOICE) && (idltdi->isPtrInChoice)) retVal = TRUE; else if (((t->optional) || (t->defaultVal != NULL)) && (idltdi->isPtrForOpt)) retVal = TRUE; return retVal;} /* IsIDLPtr *//* fill given idltdi with defaults from table for given typedef */voidFillIDLTDIDefaults PARAMS ((r, idltdi, td), IDLRules *r _AND_ IDLTDI *idltdi _AND_ TypeDef *td){ IDLTDI *tblidltdi; int typeIndex; char *tmpName; typeIndex = GetBuiltinType (td->type); if (typeIndex < 0) return; tblidltdi = &r->typeConvTbl[typeIndex]; memcpy (idltdi, tblidltdi, sizeof (IDLTDI)); /* make sure class name is unique wrt to previously defined classes */ tmpName = Asn1TypeName2CTypeName (td->definedName); idltdi->typeName = Malloc (strlen (tmpName) + 2 + r->maxDigitsToAppend +1); strcpy (idltdi->typeName, tmpName); if (tblidltdi->asn1TypeId != BASICTYPE_CHOICE) strcat (idltdi->typeName, "_T"); Free (tmpName); MakeCxxStrUnique (definedNamesG, idltdi->typeName, r->maxDigitsToAppend, 1); DefineObj (&definedNamesG, idltdi->typeName);} /* FillIDLTDIDefaults */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -