Annotation of 3BSD/cmd/whatis.c, revision 1.1.1.1

1.1       root        1: #include <stdio.h>
                      2: #include <ctype.h>
                      3: /*
                      4:  * whatis - what the heck is that file anyways
                      5:  *
                      6:  * Bill Joy UCB
                      7:  */
                      8: 
                      9: char   *calloc();
                     10: char   *trim();
                     11: unsigned blklen();
                     12: 
                     13: main(argc, argv)
                     14:        int argc;
                     15:        char *argv[];
                     16: {
                     17:        register char **avp;
                     18: 
                     19:        argc--, argv++;
                     20:        if (argc == 0) {
                     21:                fprintf(stderr, "whatis name ...\n");
                     22:                exit(1);
                     23:        }
                     24:        if (freopen("/usr/lib/whatis", "r", stdin) == NULL) {
                     25:                perror("/usr/lib/whatis");
                     26:                exit (1);
                     27:        }
                     28:        argv[argc] = 0;
                     29:        for (avp = argv; *avp; avp++)
                     30:                *avp = trim(*avp);
                     31:        whatis(argv);
                     32:        exit(0);
                     33: }
                     34: 
                     35: whatis(argv)
                     36:        char **argv;
                     37: {
                     38:        char buf[BUFSIZ];
                     39:        register char *gotit;
                     40:        register char **vp;
                     41: 
                     42:        gotit = calloc(1, blklen(argv));
                     43:        while (fgets(buf, sizeof buf, stdin) != NULL)
                     44:                for (vp = argv; *vp; vp++)
                     45:                        if (match(buf, *vp)) {
                     46:                                printf("%s", buf);
                     47:                                gotit[vp - argv] = 1;
                     48:                                for (vp++; *vp; vp++)
                     49:                                        if (match(buf, *vp))
                     50:                                                gotit[vp - argv] = 1;
                     51:                                break;
                     52:                        }
                     53:        for (vp = argv; *vp; vp++)
                     54:                if (gotit[vp - argv] == 0)
                     55:                        printf("%s: not found\n", *vp);
                     56: }
                     57: 
                     58: match(buf, str)
                     59:        char *buf, *str;
                     60: {
                     61:        register char *bp, *cp;
                     62: 
                     63:        bp = buf;
                     64: again:
                     65:        cp = str;
                     66:        while (*bp && *cp && lmatch(*bp, *cp))
                     67:                bp++, cp++;
                     68:        if (*cp == 0 && (*bp == '(' || *bp == ',' || *bp == '\t' || *bp == ' '))
                     69:                return (1);
                     70:        while (isalpha(*bp) || isdigit(*bp))
                     71:                bp++;
                     72:        if (*bp != ',')
                     73:                return (0);
                     74:        bp++;
                     75:        while (isspace(*bp))
                     76:                bp++;
                     77:        goto again;
                     78: }
                     79: 
                     80: lmatch(c, d)
                     81:        char c, d;
                     82: {
                     83: 
                     84:        if (c == d)
                     85:                return (1);
                     86:        if (!isalpha(c) || !isalpha(d))
                     87:                return (0);
                     88:        if (islower(c))
                     89:                c = toupper(c);
                     90:        if (islower(d))
                     91:                d = toupper(d);
                     92:        return (c == d);
                     93: }
                     94: 
                     95: unsigned
                     96: blklen(ip)
                     97:        register char **ip;
                     98: {
                     99:        register int i = 0;
                    100: 
                    101:        while (*ip++)
                    102:                i++;
                    103:        return (i);
                    104: }
                    105: 
                    106: char *
                    107: trim(cp)
                    108:        register char *cp;
                    109: {
                    110:        register char *dp;
                    111: 
                    112:        for (dp = cp; *dp; dp++)
                    113:                if (*dp == '/')
                    114:                        cp = dp + 1;
                    115:        if (cp[0] != '.') {
                    116:                if (cp + 3 <= dp && dp[-2] == '.' && any(dp[-1], "cosa12345678npP"))
                    117:                        dp[-2] = 0;
                    118:                if (cp + 4 <= dp && dp[-3] == '.' && any(dp[-2], "13") && isalpha(dp[-1]))
                    119:                        dp[-3] = 0;
                    120:        }
                    121:        return (cp);
                    122: }
                    123: 
                    124: any(c, cp)
                    125:        register int c;
                    126:        register char *cp;
                    127: {
                    128: 
                    129:        while (*cp)
                    130:                if (c == *cp++)
                    131:                        return (1);
                    132:        return (0);
                    133: }

unix.superglobalmegacorp.com

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