Annotation of researchv10no/cmd/adb/conf/mkconf.c, revision 1.1.1.1

1.1       root        1: #include <stdio.h>
                      2: #include <ctype.h>
                      3: 
                      4: #define        NFILES  500
                      5: #define        NRULES  50
                      6: #define        NTAGS   50
                      7: #define        MAXFLDS 20
                      8: #define        MAXRULES 10
                      9: 
                     10: #define        ARB     200
                     11: 
                     12: typedef struct file {
                     13:        char *f_obj;
                     14:        char *f_src;
                     15:        char *f_type;
                     16: } File;
                     17: 
                     18: File files[NFILES];
                     19: 
                     20: typedef struct rule {
                     21:        char *r_type;
                     22:        char *r_dep;
                     23:        char *r_rules[MAXRULES];
                     24: } Rule;
                     25: 
                     26: Rule rules[NRULES];
                     27: 
                     28: char *wanted[NTAGS];
                     29: 
                     30: main(argc, argv)
                     31: int argc;
                     32: char **argv;
                     33: {
                     34:        char *templ, *flist, *out;
                     35:        register char **p;
                     36: 
                     37:        /* hack */
                     38:        templ = "templ";
                     39:        flist = "files";
                     40:        out = NULL;
                     41:        p = wanted;
                     42:        while (--argc > 0) {
                     43:                if (p >= &wanted[NTAGS-1]) {
                     44:                        fprintf(stderr, "mkconf: too many tags\n");
                     45:                        exit(1);
                     46:                }
                     47:                *p++ = *++argv;
                     48:        }
                     49:        *p = NULL;
                     50:        readlist(flist);
                     51:        putmake(templ, out);
                     52:        exit(0);
                     53: }
                     54: 
                     55: /*
                     56:  * read the list of files and stuff
                     57:  * colon-separated fields:
                     58:  *     object: sources: type: tags
                     59:  */
                     60: 
                     61: readlist(list)
                     62: char *list;
                     63: {
                     64:        FILE *fp;
                     65:        register File *f;
                     66:        char *fld[MAXFLDS];
                     67:        char buf[ARB], xbuf[ARB];
                     68:        char *save();
                     69: 
                     70:        if ((fp = fopen(list, "r")) == NULL) {
                     71:                fprintf(stderr, "mkconf: %s: cannot open\n", list);
                     72:                exit(1);
                     73:        }
                     74:        f = files;
                     75:        while (getline(buf, ARB, fp)) {
                     76:                if (buf[0] == 0 || buf[0] == '#')
                     77:                        continue;
                     78:                strcpy(xbuf, buf);
                     79:                if (crack(xbuf, ':', fld) != 4) {
                     80:                        fprintf(stderr, "bad files line: %s\n", buf);
                     81:                        continue;
                     82:                }
                     83:                if (wanttag(fld[3]) == 0)
                     84:                        continue;
                     85:                if (f >= &files[NFILES-1]) {
                     86:                        fprintf(stderr, "mkconf: too many files\n");
                     87:                        exit(1);
                     88:                }
                     89:                f->f_obj = save(fld[0]);
                     90:                f->f_src = save(fld[1]);
                     91:                f->f_type = save(fld[2]);
                     92:                f++;
                     93:        }
                     94:        f->f_obj = NULL;
                     95:        fclose(fp);
                     96: }
                     97: 
                     98: wanttag(tags)
                     99: char *tags;
                    100: {
                    101:        char *t[MAXFLDS];
                    102:        register int i, j;
                    103:        register int n;
                    104: 
                    105:        detab(tags);
                    106:        n = crack(tags, ' ', t);
                    107:        for (i = 0; wanted[i]; i++)
                    108:                for (j = 0; j < n; j++)
                    109:                        if (strcmp(wanted[i], t[j]) == 0)
                    110:                                return (1);
                    111:        return (0);
                    112: }
                    113: 
                    114: /*
                    115:  * print the makefile
                    116:  *     read the template, store the rules
                    117:  *     spit out the literal stuff
                    118:  *     spit out the rules
                    119:  */
                    120: 
                    121: putmake(templ, out)
                    122: char *templ, *out;
                    123: {
                    124:        FILE *tf, *of;
                    125:        char buf[ARB];
                    126:        register File *f;
                    127: 
                    128:        if ((tf = fopen(templ, "r")) == NULL) {
                    129:                fprintf(stderr, "mkconf: %s: cannot open\n", templ);
                    130:                exit(1);
                    131:        }
                    132:        if (out == NULL)
                    133:                of = stdout;
                    134:        else if ((of = fopen(out, "w")) == NULL) {
                    135:                fprintf(stderr, "mkconf: %s: cannot create\n", out);
                    136:                exit(1);
                    137:        }
                    138:        getrules(tf);
                    139:        fprintf(of, "FILES=");
                    140:        for (f = files; f->f_obj; f++)
                    141:                fprintf(of, " %s", f->f_obj);
                    142:        putc('\n', of);
                    143:        while (getline(buf, ARB, tf))
                    144:                fprintf(of, "%s\n", buf);
                    145:        fclose(tf);
                    146:        for (f = files; f->f_obj; f++) {
                    147:                fprintf(of, "%s: %s", f->f_obj, f->f_src);
                    148:                putrule(f, of);
                    149:        }
                    150:        fclose(of);
                    151: }
                    152: 
                    153: getrules(tf)
                    154: FILE *tf;
                    155: {
                    156:        char buf[ARB];
                    157:        register Rule *r;
                    158:        register int i;
                    159:        register char *s;
                    160:        char *strchr();
                    161:        char *save();
                    162: 
                    163:        r = NULL;
                    164:        while (getline(buf, ARB, tf)) {
                    165:                if (buf[0] == '%' && buf[1] == '%' && buf[2] == 0)
                    166:                        break;
                    167:                if (buf[0] == 0 || buf[0] == '#')
                    168:                        continue;
                    169:                if (buf[0] != '\t') {
                    170:                        if (r == NULL)
                    171:                                r = rules;
                    172:                        else if (++r >= &rules[NRULES-1]) {
                    173:                                fprintf(stderr, "mkconf: too many object types: %s\n", buf);
                    174:                                exit(1);
                    175:                        }
                    176:                        if ((s = strchr(buf, ':')) == NULL) {
                    177:                                fprintf(stderr, "mkconf: bad line in template: %s\n", buf);
                    178:                                continue;
                    179:                        }
                    180:                        if (*s)
                    181:                                *s++ = 0;
                    182:                        while (isspace(*s))
                    183:                                s++;
                    184:                        r->r_type = save(buf);
                    185:                        r->r_dep = save(s);
                    186:                        i = 0;
                    187:                        continue;
                    188:                }
                    189:                if (r == NULL) {
                    190:                        fprintf(stderr, "mkconf: bad line in template: %s\n", buf);
                    191:                        continue;
                    192:                }
                    193:                if (i >= MAXRULES - 1) {
                    194:                        fprintf(stderr, "mkconf: too many lines in template: %s\n", buf);
                    195:                        exit(1);
                    196:                }
                    197:                r->r_rules[i] = save(buf);
                    198:        }
                    199: }
                    200: 
                    201: putrule(f, of)
                    202: File *f;
                    203: FILE *of;
                    204: {
                    205:        register Rule *r;
                    206:        register int i;
                    207:        char buf[ARB];
                    208:        char *deps[MAXFLDS];
                    209:        int n;
                    210: 
                    211:        for (r = rules; r->r_type; r++)
                    212:                if (strcmp(r->r_type, f->f_type) == 0)
                    213:                        break;
                    214:        if (r->r_type == NULL) {
                    215:                putc('\n', of);
                    216:                return;
                    217:        }
                    218:        strcpy(buf, f->f_src);
                    219:        strcat(buf, " ");
                    220:        strcat(buf, r->r_dep);
                    221:        detab(buf);
                    222:        n = crack(buf, ' ', deps);
                    223:        fprintf(of, " %s\n", r->r_dep);
                    224:        for (i = 0; r->r_rules[i]; i++)
                    225:                expout(of, r->r_rules[i], deps, n);
                    226: }
                    227: 
                    228: /*
                    229:  * print a line of a rule
                    230:  * $n expands to the nth arg (source file)
                    231:  */
                    232: 
                    233: expout(fp, s, args, n)
                    234: FILE *fp;
                    235: register char *s;
                    236: register char **args;
                    237: int n;
                    238: {
                    239:        register int i;
                    240: 
                    241:        for (; *s; s++) {
                    242:                if (*s == '$' && isdigit(s[1])) {
                    243:                        for (s++, i = 0; isdigit(*s); s++)
                    244:                                i = i * 10 + *s - '0';
                    245:                        s--;
                    246:                        i--;
                    247:                        if (i >= 0 && i < n)
                    248:                                fprintf(fp, "%s", args[i]);
                    249:                        continue;
                    250:                }
                    251:                putc(*s, fp);
                    252:        }
                    253:        putc('\n', fp);
                    254: }
                    255: 
                    256: getline(buf, n, fp)
                    257: char *buf;
                    258: register int n;
                    259: FILE *fp;
                    260: {
                    261:        register int c;
                    262:        register char *p;
                    263: 
                    264:        p = buf;
                    265:        while (--n >= 0) {
                    266:                if ((c = getc(fp)) == EOF || c == '\n')
                    267:                        break;
                    268:                *p++ = c;
                    269:        }
                    270:        *p = 0;
                    271:        if (c == EOF && p == buf)
                    272:                return (0);
                    273:        return (1);
                    274: }
                    275: 
                    276: char *
                    277: save(s)
                    278: char *s;
                    279: {
                    280:        char *ss;
                    281:        char *malloc();
                    282: 
                    283:        if ((ss = malloc(strlen(s) + 1)) == NULL) {
                    284:                fprintf(stderr, "mkconf: out of mem\n");
                    285:                exit(1);
                    286:        }
                    287:        strcpy(ss, s);
                    288:        return (ss);
                    289: }
                    290: 
                    291: detab(s)
                    292: register char *s;
                    293: {
                    294: 
                    295:        for (; *s; s++)
                    296:                if (*s == '\t')
                    297:                        *s = ' ';
                    298: }
                    299: 
                    300: 
                    301: /*
                    302:  * split a line into fields
                    303:  *     s is the line; it is destroyed
                    304:  *     c is the character that marks the end of a field;
                    305:  *     it may be followed by blanks and tabs
                    306:  *     a is an array of pointers to the fields, NULL terminated
                    307:  *     the number of fields is returned
                    308:  *     there are at most MAXFLDS fields
                    309:  */
                    310: 
                    311: int
                    312: crack(s, c, a)
                    313: register char *s;
                    314: register char c;
                    315: register char **a;
                    316: {
                    317:        register int n;
                    318: 
                    319:        n = 0;
                    320:        for (;;) {
                    321:                while (*s && isspace(*s))
                    322:                        s++;
                    323:                if (*s == 0)
                    324:                        break;
                    325:                if (n >= MAXFLDS - 1)
                    326:                        break;  /* and lose the remainder.  oh well. */
                    327:                *a++ = s;
                    328:                n++;
                    329:                while (*s && *s != c)
                    330:                        s++;
                    331:                if (*s)
                    332:                        *s++ = 0;
                    333:        }
                    334:        *a = NULL;
                    335:        return (n);
                    336: }

unix.superglobalmegacorp.com

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