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

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

unix.superglobalmegacorp.com

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