/* parse Field Pool */ static int parseFP(FILE *fp) { int i = 0; unsigned char short_tmp[2]; FieldInfo *ptr = &simpleFieldPool.field[simpleFieldPool.field_used]; /* access flag */ fread(short_tmp, 2, 1, fp); ptr->access_flags = short_tmp[0] << 8 | short_tmp[1]; /* name index */ fread(short_tmp, 2, 1, fp); ptr->name_index = short_tmp[0] << 8 | short_tmp[1]; /* descriptor index */ fread(short_tmp, 2, 1, fp); ptr->descriptor_index = short_tmp[0] << 8 | short_tmp[1]; /* attributes count */ fread(short_tmp, 2, 1, fp); ptr->attributes_count = short_tmp[0] << 8 | short_tmp[1]; ptr->attributes = (AttributeInfo *) malloc(sizeof(AttributeInfo) * ptr->attributes_count); memset(ptr->attributes, 0, sizeof(AttributeInfo) * ptr->attributes_count); /* parse attributes */ parseAttr(ptr, fp); simpleFieldPool.field_used++; return 0; }
static ParserObjectAttrT* parseAttrList( ParserObjectKindT objKind, ParserObjectRecordT* curSeq ) { //it should eat semicolons too ParserObjectAttrT *res = 0; ParserObjectAttrT *curAttr; int bad = 0, i, n = 0; int vis[PARSER_OBJECT_ATTRIBUTE_KINDS_COUNT]; res = AllocateArray(PARSER_OBJECT_ATTRIBUTE_KINDS_COUNT, sizeof(ParserObjectAttrT)); memset(vis, 0, sizeof(vis)); while ((curAttr = parseAttr(curSeq))) { i = attrFind(curAttr->attrName); if (vis[i]) { genParseError(E_ATTRIBUTE_ALREADY_DEFINED); attrDestructor(curAttr); curAttr = 0; bad = 1; break; } if (!g_ParserObjectAttrKindIsValidForObjectKind[objKind][i]) { genParseError(E_INVALID_ATTRIBUTE); attrDestructor(curAttr); curAttr = 0; bad = 1; break; } vis[i] = 1; n++; copyAttrToAttr(&(res[i]), curAttr); attrDestructor(curAttr); if (chkCurToken(',')) { bad = 1; moveToNextToken(); } else bad = 0; } if (ParserIsErrorRaised()) {attrListDestructor(res); return NULL;} if (n < getAttrCount(objKind)) bad = 1; if (bad) { attrListDestructor(res); genParseError(E_INVALID_ATTRIBUTE_LIST); return NULL; } if (!curToken || chkCurToken(';')) { if (curToken) moveToNextToken(); return res; } else {attrListDestructor(res); return NULL;} }