Commit | Line | Data |
---|---|---|
45964d3d BJ |
1 | #include <stdio.h> |
2 | #include <ctype.h> | |
3 | ||
4 | main(argc, argv) | |
5 | int argc; | |
6 | char *argv[]; | |
7 | { | |
8 | ||
9 | argc--, argv++; | |
10 | if (argc == 0) { | |
11 | usage: | |
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 | ||
24 | apropos(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 | ||
47 | match(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 | ||
62 | amatch(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 | ||
73 | lmatch(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 | ||
88 | blklen(ip) | |
89 | register int *ip; | |
90 | { | |
91 | register int i = 0; | |
92 | ||
93 | while (*ip++) | |
94 | i++; | |
95 | return (i); | |
96 | } |