1 /* ref.c */
2
3 /* Author:
4 * Steve Kirkendall
5 * 16820 SW Tallac Way
6 * Beaverton, OR 97006
7 * kirkenda@jove.cs.pdx.edu, or ...uunet!tektronix!psueea!jove!kirkenda
8 */
9
10
11 /* This program looks up the declarations of library functions. */
12
13 #include <stdio.h>
14
15 /* This is the list of files that are searched. */
16 char *refslist[] = {
17 "refs",
18 "/usr/src/lib/refs",
19 "../lib/refs",
20 "/usr/local/lib/refs",
21 };
22 #define NREFS (sizeof refslist / sizeof(char *))
23
main(argc,argv)24 main(argc, argv)
25 int argc;
26 char **argv;
27 {
28 int i; /* used to step through the refslist */
29
30 /* make sure our arguments are OK */
31 if (argc != 2)
32 {
33 fprintf(stderr, "usage: %s function_name\n", *argv);
34 abort(2);
35 }
36
37 /* check for the function in each database */
38 for (i = 0; i < NREFS; i++)
39 {
40 if (lookinfor(refslist[i], argv[1]))
41 {
42 exit(0);
43 }
44 }
45
46 fprintf(stderr, "%s: don't know about %s\n", argv[0], argv[1]);
47 abort(2);
48 }
49
50
51 /* This function checks a single file for the function. Returns 1 if found */
lookinfor(filename,func)52 int lookinfor(filename, func)
53 char *filename; /* name of file to look in */
54 char *func; /* name of function to look for */
55 {
56 FILE *fp; /* stream used to access the database */
57 char linebuf[300];
58 /* NOTE: in actual use, the first character of linebuf is */
59 /* set to ' ' and then we use all EXCEPT the 1st character */
60 /* everywhere in this function. This is because the func */
61 /* which examines the linebuf could, in some circumstances */
62 /* examine the character before the used part of linebuf; */
63 /* we need to control what happens then. */
64
65
66 /* open the database file */
67 fp = fopen(filename, "r");
68 if (!fp)
69 {
70 return 0;
71 }
72
73 /* find the desired entry */
74 *linebuf = ' ';
75 do
76 {
77 if (!fgets(linebuf + 1, (sizeof linebuf) - 1, fp))
78 {
79 fclose(fp);
80 return 0;
81 }
82 } while (!desired(linebuf + 1, func));
83
84 /* print it */
85 do
86 {
87 fputs(linebuf + 1, stdout);
88 } while (fgets(linebuf + 1, sizeof linebuf, fp) && linebuf[1] == '\t');
89
90 /* cleanup & exit */
91 fclose(fp);
92 return 1;
93 }
94
95
96 /* This function checks to see if a given line is the first line of the */
97 /* entry the user wants to see. If it is, return non-0 else return 0 */
desired(line,word)98 desired(line, word)
99 char *line; /* the line buffer */
100 char *word; /* the string it should contain */
101 {
102 static wlen = -1;/* length of the "word" variable's value */
103 register char *scan;
104
105 /* if this line starts with a tab, it couldn't be desired */
106 if (*line == '\t')
107 {
108 return 0;
109 }
110
111 /* if we haven't found word's length yet, do so */
112 if (wlen < 0)
113 {
114 wlen = strlen(word);
115 }
116
117 /* search for the word in the line */
118 for (scan = line; *scan != '('; scan++)
119 {
120 }
121 while (*--scan == ' ')
122 {
123 }
124 scan -= wlen;
125 if (scan < line - 1 || *scan != ' ' && *scan != '\t' && *scan != '*')
126 {
127 return 0;
128 }
129 scan++;
130 return !strncmp(scan, word, wlen);
131 }
132