parse.c

来自「eCos操作系统源码」· C语言 代码 · 共 2,108 行 · 第 1/5 页

C
2,108
字号
	 */    for ( mp = module_head ; mp ; mp = mp->next )         if ( mp->modid == modid )             break;    if ( mp )         for ( i=0, mip=mp->imports ; i < mp->no_imports ; ++i, ++mip ) {             if ( !label_compare( mip->label, descriptor )) {				/* Found it - so amend the module ID */                  modid = mip->modid;                  break;             }         }    for(i=0, tcp=tclist; i < MAXTC; i++, tcp++){      if (tcp->type == 0)          break;      if (!label_compare(descriptor, tcp->descriptor) &&		((modid == tcp->modid) || (modid == -1))){          return i;      }    }    return -1;}/* translate integer tc_index to string identifier from tclist * * Returns pointer to string in table (should not be modified) or NULL */const char *get_tc_descriptor(int tc_index){  if (tc_index < 0 || tc_index >= MAXTC) return NULL;  return (tclist[tc_index].descriptor);}/* * Parses an enumeration list of the form: *        { label(value) label(value) ... } * The initial { has already been parsed. * Returns NULL on error. */static struct enum_list *parse_enumlist(FILE *fp, struct enum_list **retp){    register int type;    char token [MAXTOKEN];    struct enum_list *ep = NULL, **epp = &ep;    free_enums(retp);    while((type = get_token(fp, token, MAXTOKEN)) != ENDOFFILE){        if (type == RIGHTBRACKET)            break;        if (type == LABEL){            /* this is an enumerated label */            *epp = (struct enum_list *) calloc(1, sizeof(struct enum_list));            if (*epp == NULL) return(NULL);            /* a reasonable approximation for the length */            (*epp)->label = strdup(token);            type = get_token(fp, token, MAXTOKEN);            if (type != LEFTPAREN) {                print_error("Expected \"(\"", token, type);                return NULL;            }            type = get_token(fp, token, MAXTOKEN);            if (type != NUMBER) {                print_error("Expected integer", token, type);                return NULL;            }            (*epp)->value = atoi(token);            type = get_token(fp, token, MAXTOKEN);            if (type != RIGHTPAREN) {                print_error("Expected \")\"", token, type);                return NULL;            }            epp = &(*epp)->next;        }    }    if (type == ENDOFFILE){        print_error("Expected \"}\"", token, type);        return NULL;    }    *retp = ep;    return ep;}static struct range_list *parse_ranges(FILE *fp, struct range_list **retp){   int low, high;    char nexttoken[MAXTOKEN];    int nexttype;    struct range_list *rp = NULL, **rpp = &rp;    int size = 0, taken = 1;    free_ranges(retp);    nexttype = get_token(fp, nexttoken, MAXTOKEN);    if (nexttype == SIZE) {	size = 1;	taken = 0;	nexttype = get_token(fp, nexttoken, MAXTOKEN);	if (nexttype != LEFTPAREN)	    print_error("Expected \"(\" after SIZE", nexttoken, nexttype);    }    do {	if (!taken) nexttype = get_token(fp, nexttoken, MAXTOKEN);	else taken = 0;	high = low = atol(nexttoken);	nexttype = get_token(fp, nexttoken, MAXTOKEN);	if (nexttype == RANGE) {	    nexttype = get_token(fp, nexttoken, MAXTOKEN);	    high = atol(nexttoken);	    nexttype = get_token(fp, nexttoken, MAXTOKEN);	}	*rpp = (struct range_list *)calloc (1, sizeof(struct range_list));	if (*rpp == NULL) break;	(*rpp)->low = low;	(*rpp)->high = high;	rpp = &(*rpp)->next;    } while (nexttype == BAR);    if (size) {	if (nexttype != RIGHTPAREN)	    print_error ("Expected \")\" after SIZE", nexttoken, nexttype);	nexttype = get_token(fp, nexttoken, nexttype);    }    if (nexttype != RIGHTPAREN)	print_error ("Expected \")\"", nexttoken, nexttype);    *retp = rp;    return rp;}/* * Parses an asn type.  Structures are ignored by this parser. * Returns NULL on error. */static struct node *parse_asntype(FILE *fp,	      char *name,	      int *ntype,	      char *ntoken){    int type, i;    char token[MAXTOKEN];    char quoted_string_buffer[MAXQUOTESTR];    char *hint = NULL;    struct tc *tcp;    int level;    type = get_token(fp, token, MAXTOKEN);    if (type == SEQUENCE){        level = 0;        while((type = get_token(fp, token, MAXTOKEN)) != ENDOFFILE){            if (type == LEFTBRACKET){                level++;            }            else if (type == RIGHTBRACKET && --level == 0){                *ntype = get_token(fp, ntoken, MAXTOKEN);                return NULL;            }        }        print_error("Expected \"}\"", token, type);        return NULL;    } else if (type == LEFTBRACKET) {        struct node *np;        int ch_next = '{';        ungetc(ch_next, fp);        np = parse_objectid (fp, name);        if (np != NULL) {            *ntype = get_token(fp, ntoken, MAXTOKEN);            return np;        }        return NULL;    } else {        if (type == CONVENTION) {            while (type != SYNTAX && type != ENDOFFILE) {                if (type == DISPLAYHINT) {                    type = get_token(fp, token, MAXTOKEN);                    if (type != QUOTESTRING) print_error("DISPLAY-HINT must be string", token, type);                    else hint = strdup (token);                }                else		    type = get_token(fp, quoted_string_buffer, MAXQUOTESTR);            }            type = get_token(fp, token, MAXTOKEN);        }        if (type == LABEL)        {            type = get_tc(token, current_module, NULL, NULL, NULL, NULL);        }        /* textual convention */        for(i = 0; i < MAXTC; i++){            if (tclist[i].type == 0)                break;        }        if (i == MAXTC){            print_error("Too many textual conventions", token, type);            SNMP_FREE(hint);            return NULL;        }        if (!(type & SYNTAX_MASK)){            print_error("Textual convention doesn't map to real type", token,                        type);            SNMP_FREE(hint);            return NULL;        }        tcp = &tclist[i];        tcp->modid = current_module;        tcp->descriptor = strdup(name);        tcp->hint = hint;        tcp->type = type;        *ntype = get_token(fp, ntoken, MAXTOKEN);        if (*ntype == LEFTPAREN){	    tcp->ranges = parse_ranges(fp, &tcp->ranges);            *ntype = get_token(fp, ntoken, MAXTOKEN);        } else if (*ntype == LEFTBRACKET) {            /* if there is an enumeration list, parse it */            tcp->enums = parse_enumlist(fp, &tcp->enums);            *ntype = get_token(fp, ntoken, MAXTOKEN);        }        return NULL;    }}/* * Parses an OBJECT TYPE macro. * Returns 0 on error. */static struct node *parse_objecttype(FILE *fp,		 char *name){    register int type;    char token[MAXTOKEN];    char nexttoken[MAXTOKEN];    char quoted_string_buffer[MAXQUOTESTR];    int nexttype, tctype;    register struct node *np;    type = get_token(fp, token, MAXTOKEN);    if (type != SYNTAX){        print_error("Bad format for OBJECT-TYPE", token, type);        return NULL;    }    np = alloc_node(current_module);    if (np == NULL) return(NULL);    type = get_token(fp, token, MAXTOKEN);    if (type == LABEL){        int tmp_index;        tctype = get_tc(token, current_module, &tmp_index,                        &np->enums, &np->ranges, &np->hint);        if (tctype == LABEL &&            ds_get_int(DS_LIBRARY_ID, DS_LIB_MIB_WARNINGS) > 1){            print_error("Warning: No known translation for type", token, type);        }        type = tctype;        np->tc_index = tmp_index; /* store TC for later reference */    }    np->type = type;    nexttype = get_token(fp, nexttoken, MAXTOKEN);    switch(type){        case SEQUENCE:            if (nexttype == OF){                nexttype = get_token(fp, nexttoken, MAXTOKEN);                nexttype = get_token(fp, nexttoken, MAXTOKEN);            }            break;        case INTEGER:        case UINTEGER32:        case COUNTER:        case GAUGE:        case BITSTRING:        case LABEL:            if (nexttype == LEFTBRACKET) {                /* if there is an enumeration list, parse it */                np->enums = parse_enumlist(fp, &np->enums);                nexttype = get_token(fp, nexttoken, MAXTOKEN);            } else if (nexttype == LEFTPAREN){                /* if there is a range list, parse it */		np->ranges = parse_ranges(fp, &np->ranges);                nexttype = get_token(fp, nexttoken, MAXTOKEN);            }            break;        case OCTETSTR:        case KW_OPAQUE:            /* parse any SIZE specification */            if (nexttype == LEFTPAREN) {                nexttype = get_token(fp, nexttoken, MAXTOKEN);                if (nexttype == SIZE) {                    nexttype = get_token(fp, nexttoken, MAXTOKEN);                    if (nexttype == LEFTPAREN) {			np->ranges = parse_ranges(fp, &np->ranges);                        nexttype = get_token(fp, nexttoken, MAXTOKEN); /* ) */                        if (nexttype == RIGHTPAREN)                        {                            nexttype = get_token(fp, nexttoken, MAXTOKEN);                            break;                        }                    }                }                print_error("Bad SIZE syntax", token, type);                free_node(np);                return NULL;            }            break;        case OBJID:        case NETADDR:        case IPADDR:        case TIMETICKS:        case NUL:        case NSAPADDRESS:        case COUNTER64:            break;        default:            print_error("Bad syntax", token, type);            free_node(np);            return NULL;    }    if (nexttype == UNITS){        type = get_token(fp, quoted_string_buffer, MAXQUOTESTR);        if (type != QUOTESTRING) {            print_error("Bad UNITS", quoted_string_buffer, type);            free_node(np);            return NULL;        }	np->units = strdup (quoted_string_buffer);        nexttype = get_token(fp, nexttoken, MAXTOKEN);    }    if (nexttype != ACCESS){        print_error("Should be ACCESS", nexttoken, nexttype);        free_node(np);        return NULL;    }    type = get_token(fp, token, MAXTOKEN);    if (type != READONLY && type != READWRITE && type != WRITEONLY        && type != NOACCESS && type != READCREATE && type != ACCNOTIFY){        print_error("Bad ACCESS type", token, type);        free_node(np);        return NULL;    }    np->access = type;    type = get_token(fp, token, MAXTOKEN);    if (type != STATUS){        print_error("Should be STATUS", token, type);        free_node(np);        return NULL;    }    type = get_token(fp, token, MAXTOKEN);    if (type != MANDATORY && type != CURRENT && type != KW_OPTIONAL &&        type != OBSOLETE && type != DEPRECATED){        print_error("Bad STATUS", token, type);        free_node(np);        return NULL;    }    np->status = type;    /*     * Optional parts of the OBJECT-TYPE macro     */    type = get_token(fp, token, MAXTOKEN);    while (type != EQUALS && type != ENDOFFILE) {      switch (type) {        case DESCRIPTION:          type = get_token(fp, quoted_string_buffer, MAXQUOTESTR);          if (type != QUOTESTRING) {              print_error("Bad DESCRIPTION", quoted_string_buffer, type);              free_node(np);              return NULL;          }          if (ds_get_boolean(DS_LIBRARY_ID, DS_LIB_SAVE_MIB_DESCRS)) {              np->description = strdup (quoted_string_buffer);          }          break;        case REFERENCE:          type = get_token(fp, quoted_string_buffer, MAXQUOTESTR);          if (type != QUOTESTRING) {              print_error("Bad REFERENCE", quoted_string_buffer, type);              free_node(np);              return NULL;          }          break;        case INDEX:          np->indexes = getIndexes(fp, &np->indexes);          if (np->indexes == NULL) {            print_error("Bad Index List",token,type);            free_node(np);            return NULL;          }          break;        case DEFVAL:        case AUGMENTS:        case NUM_ENTRIES:          if (tossObjectIdentifier(fp) != OBJID) {              print_error("Bad Object Identifier", token, type);              free_node(np);              return NULL;          }          break;        default:          print_error("Bad format of optional clauses", token, type);          free_node(np);          return NULL;      }      type = get_token(fp, token, MAXTOKEN);    }    if (type != EQUALS){        print_error("Bad format", token, type);        free_node(np);

⌨️ 快捷键说明

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