예제 #1
0
/* 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;
}
예제 #2
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;}
}