Annotation of 43BSD/undoc/addr.c, revision 1.1.1.1

1.1       root        1: # include      <stdio.h>
                      2: # include      <ctype.h>
                      3: 
                      4: # define       reg     register
                      5: # define       bool    char
                      6: 
                      7: # define       TRUE    1
                      8: # define       FALSE   0
                      9: 
                     10: static char    *sccsid ="@(#)addr.c    1.8 (Berkeley) 4/10/81";
                     11: 
                     12: struct fd {
                     13:        char    *f_name;
                     14:        char    *f_desc;
                     15:        char    *f_value;
                     16: };
                     17: 
                     18: typedef struct fd      FDES;
                     19: 
                     20: char   *Fmtfile,
                     21:        *Addrfile,
                     22:        Fmt[BUFSIZ],
                     23:        *malloc();
                     24: 
                     25: FDES   Fmtab[BUFSIZ],
                     26:        *name();
                     27: 
                     28: main(ac, av)
                     29: int    ac;
                     30: char   **av;
                     31: {
                     32:        setbuf(stdout, 0);
                     33:        if (ac != 3) {
                     34:                printf("usage: %s fmt-file addr-file\n", av[0]);
                     35:                exit(1);
                     36:        }
                     37:        Fmtfile = av[1];
                     38:        Addrfile = av[2];
                     39:        parsefmt();
                     40:        doaddrs();
                     41: }
                     42: 
                     43: /*
                     44:  * parse the fmt file
                     45:  */
                     46: parsefmt()
                     47: {
                     48:        reg FILE        *inf;
                     49:        reg char        *sp, *fmt;
                     50:        reg FDES        *fp;
                     51:        reg bool        inquest, not;
                     52:        char            buf[80];
                     53: 
                     54:        if ((inf = fopen(Fmtfile, "r")) == NULL) {
                     55:                perror(Fmtfile);
                     56:                exit(1);
                     57:        }
                     58:        for (fp = Fmtab; fp < &Fmtab[BUFSIZ]; fp++)
                     59:                fp->f_name = NULL;
                     60: 
                     61:        inquest = FALSE;
                     62:        for (fmt = Fmt; (*fmt = getc(inf)) != EOF; fmt++)
                     63:                if (*fmt == '<' || *fmt == '?') {
                     64:                        register char   c;
                     65: 
                     66:                        if (inquest && *fmt == '?') {
                     67:                                inquest = FALSE;
                     68:                                if ((c = getc(inf)) == '\n') {
                     69:                                        *fmt++ = '\n';
                     70:                                        *fmt = '?';
                     71:                                }
                     72:                                else
                     73:                                        ungetc(c, inf);
                     74:                                continue;
                     75:                        }
                     76:                        if (*fmt == '?')
                     77:                                if ((c = getc(inf)) == '!')
                     78:                                        *fmt = '!';
                     79:                                else
                     80:                                        ungetc(c, inf);
                     81:                        sp = buf;
                     82:                        while ((*sp = getc(inf)) != '>' && *sp != ':')
                     83:                                sp++;
                     84:                        c = *sp;
                     85:                        *sp++ = '\0';
                     86:                        fp = name(buf);
                     87:                        fp->f_name = malloc(sp - buf);
                     88:                        strcpy(fp->f_name, buf);
                     89:                        if (c == ':' && *fmt == '<') {
                     90:                                for (sp = buf; (*sp = getc(inf)) != '>'; sp++)
                     91:                                        continue;
                     92:                                *sp++ = 0;
                     93:                                fp->f_desc = malloc(sp - buf);
                     94:                                strcpy(fp->f_desc, buf);
                     95:                        }
                     96:                        else if (*fmt == '?' || *fmt == '!')
                     97:                                inquest = TRUE;
                     98:                        else
                     99:                                fp->f_desc = "";
                    100:                        *++fmt = fp - Fmtab;
                    101:                }
                    102:        fclose(inf);
                    103:        *fmt = '\0';
                    104: # ifdef DEBUG
                    105:        printf("---\n");
                    106:        inquest = FALSE;
                    107:        for (fmt = Fmt; *fmt; fmt++) {
                    108:                putchar(*fmt);
                    109:                if (*fmt == '?' || *fmt == '!') {
                    110:                        if (!inquest)
                    111:                                printf("%d", *++fmt);
                    112:                        inquest = !inquest;
                    113:                }
                    114:                else if (*fmt == '<')
                    115:                        printf("%d", *++fmt);
                    116:        }
                    117:        printf("---\n");
                    118:        inquest = FALSE;
                    119:        for (fmt = Fmt; *fmt; fmt++)
                    120:                if (*fmt == '<') {
                    121:                        fp = &Fmtab[*++fmt];
                    122:                        printf("<%s", fp->f_name);
                    123:                        if (strlen(fp->f_desc))
                    124:                                printf(":%s", fp->f_desc);
                    125:                        putchar('>');
                    126:                }
                    127:                else if (*fmt == '?' || *fmt == '!')
                    128:                        if (!inquest) {
                    129:                                fp = &Fmtab[*++fmt];
                    130:                                printf("%c%s:", *fmt, fp->f_name);
                    131:                                inquest = TRUE;
                    132:                        }
                    133:                        else
                    134:                                inquest = FALSE;
                    135:                else
                    136:                        putchar(*fmt);
                    137:        printf("---\n");
                    138: # endif
                    139: }
                    140: 
                    141: doaddrs()
                    142: {
                    143:        reg FILE        *inf;
                    144:        reg char        *sp;
                    145:        reg FDES        *fp;
                    146:        reg int         len;
                    147:        reg bool        justprinted;
                    148:        char            buf[BUFSIZ];
                    149: 
                    150:        if ((inf = fopen(Addrfile, "r")) == NULL) {
                    151:                perror(Addrfile);
                    152:                exit(1);
                    153:        }
                    154: 
                    155:        for (fp = Fmtab; fp->f_name != NULL; fp++)
                    156:                fp->f_value = NULL;
                    157: 
                    158:        while (fgets(buf, BUFSIZ, inf) != NULL) {
                    159:                justprinted = FALSE;
                    160:                buf[strlen(buf)-1] = '\0';
                    161:                if (strcmp(buf, "$") == 0) {
                    162:                        printaddr();
                    163:                        for (fp = Fmtab; fp->f_name != NULL; fp++)
                    164:                                if (fp->f_value != NULL) {
                    165:                                        cfree(fp->f_value);
                    166:                                        fp->f_value = NULL;
                    167:                                }
                    168:                        justprinted = TRUE;
                    169:                        continue;
                    170:                }
                    171:                for (sp = buf; !isspace(*sp) && *sp != '\0'; sp++)
                    172:                        continue;
                    173:                len = sp - buf;
                    174:                for (fp = Fmtab; fp->f_name != NULL; fp++)
                    175:                        if (strncmp(fp->f_name, buf, len) == 0) {
                    176:                                while (isspace(*sp))
                    177:                                        sp++;
                    178:                                if ((len = strlen(sp)) == 0)
                    179:                                        fp->f_value = NULL;
                    180:                                else {
                    181:                                        fp->f_value = malloc(len + 1);
                    182:                                        strcpy(fp->f_value, sp);
                    183:                                }
                    184:                                break;
                    185:                        }
                    186:        }
                    187:        if (!justprinted)
                    188:                printaddr();
                    189: }
                    190: 
                    191: printaddr()
                    192: {
                    193:        reg char        *sp;
                    194:        reg FDES        *fp;
                    195:        reg bool        printout, inquest;
                    196:        char            buf[80];
                    197: 
                    198:        printout = TRUE;
                    199:        inquest = FALSE;
                    200:        for (sp = Fmt; *sp; sp++)
                    201:                if (*sp == '<' || *sp == '?' || *sp == '!') {
                    202:                        register char   c;
                    203: 
                    204:                        if (*sp == '?' && inquest) {
                    205:                                inquest = FALSE;
                    206:                                printout = TRUE;
                    207:                                continue;
                    208:                        }
                    209:                        c = *sp++;
                    210:                        fp = &Fmtab[*sp];
                    211:                        if (c == '<' && printout) {
                    212:                                sprintf(buf, "%%%ss", fp->f_desc);
                    213:                                printf(buf, fp->f_value);
                    214:                        }
                    215:                        else if (c == '?' || c == '!') {
                    216:                                inquest = TRUE;
                    217:                                printout = (fp->f_value != NULL);
                    218:                                if (c == '!')
                    219:                                        printout = !printout;
                    220:                        }
                    221:                }
                    222:                else if (printout == TRUE)
                    223:                        putchar(*sp);
                    224: }
                    225: 
                    226: FDES *
                    227: name(str)
                    228: reg char       *str; {
                    229: 
                    230:        reg FDES        *fp;
                    231: 
                    232:        for (fp = Fmtab; fp->f_name != NULL; fp++)
                    233:                if (strcmp(str, fp->f_name) == 0)
                    234:                        return fp;
                    235:        return fp;
                    236: }

unix.superglobalmegacorp.com

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