BSD 2 development
[unix-history] / src / whatis.c
CommitLineData
01995545
BJ
1/* Copyright (c) 1979 Regents of the University of California */
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
10char *calloc();
11char *trim();
12unsigned blklen();
13
14main(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
36whatis(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
59match(buf, str)
60 char *buf, *str;
61{
62 register char *bp, *cp;
63
64 bp = buf;
65again:
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
81lmatch(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
96unsigned
97blklen(ip)
98 register char **ip;
99{
100 register int i = 0;
101
102 while (*ip++)
103 i++;
104 return (i);
105}
106
107char *
108trim(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
125any(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}