home *** CD-ROM | disk | FTP | other *** search
/ rtsi.com / 2014.01.www.rtsi.com.tar / www.rtsi.com / OS9 / OSK / APPS / elvis_1.4.tar.Z / elvis_1.4.tar / ref.c < prev    next >
C/C++ Source or Header  |  1990-12-06  |  3KB  |  141 lines

  1. /* ref.c */
  2.  
  3. /* Author:
  4.  *    Steve Kirkendall
  5.  *    14407 SW Teal Blvd. #C
  6.  *    Beaverton, OR 97005
  7.  *    kirkenda@cs.pdx.edu
  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. }
  141.