BSD 3 development
[unix-history] / usr / src / cmd / apropos.c
CommitLineData
45964d3d
BJ
1#include <stdio.h>
2#include <ctype.h>
3
4main(argc, argv)
5 int argc;
6 char *argv[];
7{
8
9 argc--, argv++;
10 if (argc == 0) {
11usage:
12 fprintf(stderr, "apropos word ...\n");
13 exit(1);
14 }
15 if (freopen("/usr/lib/whatis", "r", stdin) == NULL) {
16 perror("/usr/lib/whatis");
17 exit (1);
18 }
19 argv[argc] = 0;
20 apropos(argv);
21 exit(0);
22}
23
24apropos(argv)
25 char **argv;
26{
27 char buf[BUFSIZ];
28 char *gotit;
29 register char **vp;
30
31 gotit = (char *) calloc(1, blklen(argv));
32 while (fgets(buf, sizeof buf, stdin) != NULL)
33 for (vp = argv; *vp; vp++)
34 if (match(buf, *vp)) {
35 printf("%s", buf);
36 gotit[vp - argv] = 1;
37 for (vp++; *vp; vp++)
38 if (match(buf, *vp))
39 gotit[vp - argv] = 1;
40 break;
41 }
42 for (vp = argv; *vp; vp++)
43 if (gotit[vp - argv] == 0)
44 printf("%s: nothing apropriate\n", *vp);
45}
46
47match(buf, str)
48 char *buf, *str;
49{
50 register char *bp, *cp;
51
52 bp = buf;
53 for (;;) {
54 if (*bp == 0)
55 return (0);
56 if (amatch(bp, str))
57 return (1);
58 bp++;
59 }
60}
61
62amatch(cp, dp)
63 register char *cp, *dp;
64{
65
66 while (*cp && *dp && lmatch(*cp, *dp))
67 cp++, dp++;
68 if (*dp == 0)
69 return (1);
70 return (0);
71}
72
73lmatch(c, d)
74 char c, d;
75{
76
77 if (c == d)
78 return (1);
79 if (!isalpha(c) || !isalpha(d))
80 return (0);
81 if (islower(c))
82 c = toupper(c);
83 if (islower(d))
84 d = toupper(d);
85 return (c == d);
86}
87
88blklen(ip)
89 register int *ip;
90{
91 register int i = 0;
92
93 while (*ip++)
94 i++;
95 return (i);
96}