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