add directory study
This commit is contained in:
131
study/linux-travel/MINIX-1.5/1.5/Source/commands/elvis/ref.c
Normal file
131
study/linux-travel/MINIX-1.5/1.5/Source/commands/elvis/ref.c
Normal file
@@ -0,0 +1,131 @@
|
||||
/* ref.c */
|
||||
|
||||
/* Author:
|
||||
* Steve Kirkendall
|
||||
* 16820 SW Tallac Way
|
||||
* Beaverton, OR 97006
|
||||
* kirkenda@jove.cs.pdx.edu, or ...uunet!tektronix!psueea!jove!kirkenda
|
||||
*/
|
||||
|
||||
|
||||
/* This program looks up the declarations of library functions. */
|
||||
|
||||
#include <stdio.h>
|
||||
|
||||
/* This is the list of files that are searched. */
|
||||
char *refslist[] = {
|
||||
"refs",
|
||||
"/usr/src/lib/refs",
|
||||
"../lib/refs",
|
||||
"/usr/local/lib/refs",
|
||||
};
|
||||
#define NREFS (sizeof refslist / sizeof(char *))
|
||||
|
||||
main(argc, argv)
|
||||
int argc;
|
||||
char **argv;
|
||||
{
|
||||
int i; /* used to step through the refslist */
|
||||
|
||||
/* make sure our arguments are OK */
|
||||
if (argc != 2)
|
||||
{
|
||||
fprintf(stderr, "usage: %s function_name\n", *argv);
|
||||
exit(2);
|
||||
}
|
||||
|
||||
/* check for the function in each database */
|
||||
for (i = 0; i < NREFS; i++)
|
||||
{
|
||||
if (lookinfor(refslist[i], argv[1]))
|
||||
{
|
||||
exit(0);
|
||||
}
|
||||
}
|
||||
|
||||
fprintf(stderr, "%s: don't know about %s\n", argv[0], argv[1]);
|
||||
exit(2);
|
||||
}
|
||||
|
||||
|
||||
/* This function checks a single file for the function. Returns 1 if found */
|
||||
int lookinfor(filename, func)
|
||||
char *filename; /* name of file to look in */
|
||||
char *func; /* name of function to look for */
|
||||
{
|
||||
FILE *fp; /* stream used to access the database */
|
||||
char linebuf[300];
|
||||
/* NOTE: in actual use, the first character of linebuf is */
|
||||
/* set to ' ' and then we use all EXCEPT the 1st character */
|
||||
/* everywhere in this function. This is because the func */
|
||||
/* which examines the linebuf could, in some circumstances */
|
||||
/* examine the character before the used part of linebuf; */
|
||||
/* we need to control what happens then. */
|
||||
|
||||
|
||||
/* open the database file */
|
||||
fp = fopen(filename, "r");
|
||||
if (!fp)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* find the desired entry */
|
||||
*linebuf = ' ';
|
||||
do
|
||||
{
|
||||
if (!fgets(linebuf + 1, (sizeof linebuf) - 1, fp))
|
||||
{
|
||||
fclose(fp);
|
||||
return 0;
|
||||
}
|
||||
} while (!desired(linebuf + 1, func));
|
||||
|
||||
/* print it */
|
||||
do
|
||||
{
|
||||
fputs(linebuf + 1, stdout);
|
||||
} while (fgets(linebuf + 1, sizeof linebuf, fp) && linebuf[1] == '\t');
|
||||
|
||||
/* cleanup & exit */
|
||||
fclose(fp);
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
/* This function checks to see if a given line is the first line of the */
|
||||
/* entry the user wants to see. If it is, return non-0 else return 0 */
|
||||
desired(line, word)
|
||||
char *line; /* the line buffer */
|
||||
char *word; /* the string it should contain */
|
||||
{
|
||||
static wlen = -1;/* length of the "word" variable's value */
|
||||
register char *scan;
|
||||
|
||||
/* if this line starts with a tab, it couldn't be desired */
|
||||
if (*line == '\t')
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* if we haven't found word's length yet, do so */
|
||||
if (wlen < 0)
|
||||
{
|
||||
wlen = strlen(word);
|
||||
}
|
||||
|
||||
/* search for the word in the line */
|
||||
for (scan = line; *scan != '('; scan++)
|
||||
{
|
||||
}
|
||||
while (*--scan == ' ')
|
||||
{
|
||||
}
|
||||
scan -= wlen;
|
||||
if (scan < line - 1 || *scan != ' ' && *scan != '\t' && *scan != '*')
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
scan++;
|
||||
return !strncmp(scan, word, wlen);
|
||||
}
|
||||
Reference in New Issue
Block a user