Annotation of researchv9/X11/src/X.V11R1/util/makedepend/parse.c, revision 1.1.1.1

1.1       root        1: /*
                      2:  * $Header: parse.c,v 1.1 87/09/11 08:13:35 toddb Exp $
                      3:  *
                      4:  * $Log:       parse.c,v $
                      5:  * Revision 1.1  87/09/11  08:13:35  toddb
                      6:  * Initial revision
                      7:  * 
                      8:  * Revision 1.1  87/04/08  16:40:53  rich
                      9:  * Initial revision
                     10:  * 
                     11:  * Revision 1.3  86/09/13  10:14:25  toddb
                     12:  * Previous fix could cause problems if the number of defines in a
                     13:  * file was an integral multiple of SYMTABINC: there would be no
                     14:  * s_name = NULL at the end.
                     15:  * 
                     16:  * Revision 1.2  86/09/04  12:45:35  toddb
                     17:  * The way that define() allocated new define slots, every tenth entry had
                     18:  * a null s_name and s_value.  The effect was that slookup() only checked
                     19:  * the first ten defines in any file.
                     20:  * 
                     21:  * Revision 1.1  86/04/15  08:34:40  toddb
                     22:  * Initial revision
                     23:  * 
                     24:  */
                     25: #include "def.h"
                     26: #include       <sys/signal.h>
                     27: 
                     28: extern char    *directives[];
                     29: extern struct symtab   deflist[];
                     30: 
                     31: find_includes(filep, file, file_red, recursion)
                     32:        struct filepointer      *filep;
                     33:        struct inclist          *file, *file_red;
                     34:        int                     recursion;
                     35: {
                     36:        register char   *line;
                     37:        register int    type;
                     38: 
                     39:        while (line = getline(filep)) {
                     40:                switch(type = deftype(line, filep, file_red, file, TRUE)) {
                     41:                case IF:
                     42:                        type = find_includes(filep, file,
                     43:                                file_red, recursion+1);
                     44:                        if (type == ELSE)
                     45:                                gobble(filep, file, file_red);
                     46:                        break;
                     47:                case IFFALSE:
                     48:                        type = gobble(filep, file, file_red);
                     49:                        if (type == ELSE)
                     50:                                find_includes(filep, file,
                     51:                                        file_red, recursion+1);
                     52:                        break;
                     53:                case IFDEF:
                     54:                case IFNDEF:
                     55:                        if ((type == IFDEF && defined(line, file_red))
                     56:                         || (type == IFNDEF && !defined(line, file_red))) {
                     57:                                debug1(type == IFNDEF ?
                     58:                                    "line %d: %s !def'd in %s via %s%s\n" : "",
                     59:                                    filep->f_line, line,
                     60:                                    file->i_file, file_red->i_file, ": doit");
                     61:                                type = find_includes(filep, file,
                     62:                                        file_red, recursion+1);
                     63:                                if (type == ELSE)
                     64:                                        gobble(filep, file, file_red);
                     65:                        }
                     66:                        else {
                     67:                                debug1(type == IFDEF ?
                     68:                                    "line %d: %s !def'd in %s via %s%s\n" : "",
                     69:                                    filep->f_line, line,
                     70:                                    file->i_file, file_red->i_file, ": gobble");
                     71:                                type = gobble(filep, file, file_red);
                     72:                                if (type == ELSE)
                     73:                                        find_includes(filep, file,
                     74:                                                file_red, recursion+1);
                     75:                        }
                     76:                        break;
                     77:                case ELSE:
                     78:                        if (!recursion)
                     79:                                gobble(filep, file, file_red);
                     80:                case ENDIF:
                     81:                        if (recursion)
                     82:                                return(type);
                     83:                case DEFINE:
                     84:                        define(line, file);
                     85:                        break;
                     86:                case UNDEF:
                     87:                        break;
                     88:                case INCLUDE:
                     89:                        add_include(file, file_red, line, FALSE);
                     90:                        break;
                     91:                case INCLUDEDOT:
                     92:                        add_include(file, file_red, line, TRUE);
                     93:                        break;
                     94:                case -1:
                     95:                        log("%s, line %d: unknown directive == \"%s\"\n",
                     96:                                file_red->i_file, filep->f_line, line);
                     97:                        break;
                     98:                case -2:
                     99:                        log("%s, line %d: incomplete include == \"%s\"\n",
                    100:                                file_red->i_file, filep->f_line, line);
                    101:                        break;
                    102:                }
                    103:        }
                    104:        return(-1);
                    105: }
                    106: 
                    107: gobble(filep, file, file_red)
                    108:        register struct filepointer *filep;
                    109:        struct inclist          *file, *file_red;
                    110: {
                    111:        register char   *line;
                    112:        register int    type;
                    113: 
                    114:        while (line = getline(filep)) {
                    115:                switch(type = deftype(line, filep, file_red, file, FALSE)) {
                    116:                case IF:
                    117:                case IFFALSE:
                    118:                case IFDEF:
                    119:                case IFNDEF:
                    120:                        type = gobble(filep, file, file_red);
                    121:                        if (type == ELSE)
                    122:                                type = gobble(filep, file, file_red);
                    123:                        break;
                    124:                case ELSE:
                    125:                case ENDIF:
                    126:                        debug0("%s, line %d: #%s\n",
                    127:                                file->i_file, filep->f_line,
                    128:                                directives[type]);
                    129:                        return(type);
                    130:                case DEFINE:
                    131:                case UNDEF:
                    132:                case INCLUDE:
                    133:                case INCLUDEDOT:
                    134:                        break;
                    135:                case -1:
                    136:                        log("%s, line %d: unknown directive == \"%s\"\n",
                    137:                                file_red->i_file, filep->f_line, line);
                    138:                        break;
                    139:                }
                    140:        }
                    141:        return(-1);
                    142: }
                    143: 
                    144: /*
                    145:  * Decide what type of # directive this line is.
                    146:  */
                    147: deftype(line, filep, file_red, file, parse_it)
                    148:        register char   *line;
                    149:        register struct filepointer *filep;
                    150:        register struct inclist *file_red, *file;
                    151:        int     parse_it;
                    152: {
                    153:        register char   *p;
                    154:        char    *directive, savechar;
                    155:        register int    ret;
                    156: 
                    157:        /*
                    158:         * Parse the directive...
                    159:         */
                    160:        directive=line+1;
                    161:        while (*directive == ' ' || *directive == '\t')
                    162:                directive++;
                    163: 
                    164:        p = directive;
                    165:        while (*p >= 'a' && *p <= 'z')
                    166:                p++;
                    167:        savechar = *p;
                    168:        *p = '\0';
                    169:        ret = match(directive, directives);
                    170:        *p = savechar;
                    171: 
                    172:        /*
                    173:         * If we don't recognize this compiler directive or we happen
                    174:         * to just be gobbling up text while waiting for an #endif or
                    175:         * a #else, then we don't need to parse this line.
                    176:         */
                    177:        if (ret < 0 || ! parse_it)
                    178:                return(ret);
                    179: 
                    180:        /*
                    181:         * now decide how to parse the directive, and do it.
                    182:         */
                    183:        while (*p == ' ' || *p == '\t')
                    184:                p++;
                    185:        switch (ret) {
                    186:        case IF:
                    187:                /*
                    188:                 * parse an expression.
                    189:                 */
                    190:                debug0("%s, line %d: #if %s\n",
                    191:                        file->i_file, filep->f_line, p);
                    192:                if (zero_value(p, filep, file_red))
                    193:                        ret = IFFALSE;
                    194:                break;
                    195:        case IFDEF:
                    196:        case IFNDEF:
                    197:                debug0("%s, line %d: #%s %s\n",
                    198:                        file->i_file, filep->f_line, directives[ret], p);
                    199:        case UNDEF:
                    200:                /*
                    201:                 * separate the name of a single symbol.
                    202:                 */
                    203:                while (isalnum(*p) || *p == '_')
                    204:                        *line++ = *p++;
                    205:                *line = '\0';
                    206:                break;
                    207:        case INCLUDE:
                    208:                debug2("%s, line %d: #include %s\n",
                    209:                        file->i_file, filep->f_line, p);
                    210:                /*
                    211:                 * Separate the name of the include file.
                    212:                 */
                    213:                while (*p && *p != '"' && *p != '<')
                    214:                        p++;
                    215:                if (! *p)
                    216:                        return(-2);
                    217:                if (*p++ == '"') {
                    218:                        ret = INCLUDEDOT;
                    219:                        while (*p && *p != '"')
                    220:                                *line++ = *p++;
                    221:                } else
                    222:                        while (*p && *p != '>')
                    223:                                *line++ = *p++;
                    224:                *line = '\0';
                    225:                break;
                    226:        case DEFINE:
                    227:                /*
                    228:                 * copy the definition back to the beginning of the line.
                    229:                 */
                    230:                strcpy (line, p);
                    231:                break;
                    232:        case ELSE:
                    233:        case ENDIF:
                    234:                debug0("%s, line %d: #%s\n",
                    235:                        file->i_file, filep->f_line, directives[ret]);
                    236:                /*
                    237:                 * nothing to do.
                    238:                 */
                    239:                break;
                    240:        }
                    241:        return(ret);
                    242: }
                    243: 
                    244: struct symtab *defined(symbol, file)
                    245:        register char   *symbol;
                    246:        struct inclist  *file;
                    247: {
                    248:        register struct symtab  *val;
                    249: 
                    250:        if (val = slookup(symbol, deflist)) {
                    251:                debug1("%s defined on command line\n", symbol);
                    252:                return(val);
                    253:        }
                    254:        if (val = fdefined(symbol, file))
                    255:                return(val);
                    256:        debug1("%s not defined in %s\n", symbol, file->i_file);
                    257:        return(NULL);
                    258: }
                    259: 
                    260: struct symtab *fdefined(symbol, file)
                    261:        register char   *symbol;
                    262:        struct inclist  *file;
                    263: {
                    264:        register struct inclist **ip;
                    265:        register struct symtab  *val;
                    266:        register int    i;
                    267:        static int      recurse_lvl = 0;
                    268: 
                    269:        if (file->i_defchecked)
                    270:                return(NULL);
                    271:        file->i_defchecked = TRUE;
                    272:        if (val = slookup(symbol, file->i_defs))
                    273:                debug1("%s defined in %s\n", symbol, file->i_file);
                    274:        if (val == NULL && file->i_list)
                    275:                for (ip = file->i_list, i=0; i < file->i_listlen; i++, ip++)
                    276:                        if (val = fdefined(symbol, *ip)) {
                    277:                                debug1("%s defined in %s\n",
                    278:                                        symbol, (*ip)->i_file);
                    279:                                break;
                    280:                        }
                    281:        recurse_lvl--;
                    282:        file->i_defchecked = FALSE;
                    283: 
                    284:        return(val);
                    285: }
                    286: 
                    287: struct symtab *slookup(symbol, stab)
                    288:        register char   *symbol;
                    289:        register struct symtab  *stab;
                    290: {
                    291:        if (stab)
                    292:                for (; stab->s_name; stab++)
                    293:                        if (strcmp(symbol, stab->s_name) == 0)
                    294:                                return(stab);
                    295:        return(NULL);
                    296: }
                    297: 
                    298: /*
                    299:  * Return true if the #if expression evaluates to 0
                    300:  */
                    301: zero_value(exp, filep, file_red)
                    302:        register char   *exp;
                    303:        register struct filepointer *filep;
                    304:        register struct inclist *file_red;
                    305: {
                    306: #ifdef CPP
                    307:        return (cppsetup(exp, filep, file_red) == 0);
                    308: #else  CPP
                    309:        return(TRUE);
                    310: #endif CPP
                    311: }
                    312: 
                    313: define(def, file)
                    314:        register char   *def;
                    315:        register struct inclist *file;
                    316: {
                    317:        register char   *p;
                    318:        struct symtab   *sp = file->i_lastdef++;
                    319:        register int    i;
                    320: 
                    321:        /*
                    322:         * If we are out of space, allocate some more.
                    323:         */
                    324:        if (file->i_defs == NULL
                    325:        || file->i_lastdef == file->i_defs + file->i_deflen) {
                    326:                if (file->i_defs)
                    327:                        file->i_defs = (struct symtab *) realloc(file->i_defs,
                    328:                            sizeof(struct symtab)*(file->i_deflen+SYMTABINC));
                    329:                else
                    330:                        file->i_defs = (struct symtab *)
                    331:                                malloc(sizeof (struct symtab) * SYMTABINC);
                    332:                i=file->i_deflen;
                    333:                file->i_deflen += SYMTABINC;
                    334:                while (i < file->i_deflen)
                    335:                        file->i_defs[ i++ ].s_name = NULL;
                    336:                file->i_lastdef = file->i_defs + file->i_deflen - SYMTABINC;
                    337:                if (sp) /* be sure we use last cell in previous group */
                    338:                        file->i_lastdef--;
                    339:                sp = file->i_lastdef++;
                    340:        }
                    341:        else if (file->i_lastdef > file->i_defs + file->i_deflen)
                    342:                log_fatal("define() botch\n");
                    343: 
                    344:        /*
                    345:         * copy the symbol being defined.
                    346:         */
                    347:        p = def;
                    348:        while (isalnum(*p) || *p == '_')
                    349:                p++;
                    350:        if (*p)
                    351:                *p++ = '\0';
                    352:        sp->s_name = copy(def);
                    353: 
                    354:        /*
                    355:         * And copy its value.
                    356:         */
                    357:        while (*p == ' ' && *p == '\t')
                    358:                p++;
                    359:        sp->s_value = copy(p);
                    360: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.