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