home *** CD-ROM | disk | FTP | other *** search
/ minnie.tuhs.org / unixen.tar / unixen / PDP-11 / Distributions / ucb / spencer_2bsd.tar.gz / 2bsd.tar / src / whatis.c < prev    next >
C/C++ Source or Header  |  1980-02-17  |  2KB  |  135 lines

  1. /* Copyright (c) 1979 Regents of the University of California */
  2. #include <stdio.h>
  3. #include <ctype.h>
  4. /*
  5.  * whatis - what the heck is that file anyways
  6.  *
  7.  * Bill Joy UCB
  8.  */
  9.  
  10. char    *calloc();
  11. char    *trim();
  12. unsigned blklen();
  13.  
  14. main(argc, argv)
  15.     int argc;
  16.     char *argv[];
  17. {
  18.     register char **avp;
  19.  
  20.     argc--, argv++;
  21.     if (argc == 0) {
  22.         fprintf(stderr, "whatis name ...\n");
  23.         exit(1);
  24.     }
  25.     if (freopen("/usr/lib/whatis", "r", stdin) == NULL) {
  26.         perror("/usr/lib/whatis");
  27.         exit (1);
  28.     }
  29.     argv[argc] = 0;
  30.     for (avp = argv; *avp; avp++)
  31.         *avp = trim(*avp);
  32.     whatis(argv);
  33.     exit(0);
  34. }
  35.  
  36. whatis(argv)
  37.     char **argv;
  38. {
  39.     char buf[BUFSIZ];
  40.     register char *gotit;
  41.     register char **vp;
  42.  
  43.     gotit = calloc(1, blklen(argv));
  44.     while (fgets(buf, sizeof buf, stdin) != NULL)
  45.         for (vp = argv; *vp; vp++)
  46.             if (match(buf, *vp)) {
  47.                 printf("%s", buf);
  48.                 gotit[vp - argv] = 1;
  49.                 for (vp++; *vp; vp++)
  50.                     if (match(buf, *vp))
  51.                         gotit[vp - argv] = 1;
  52.                 break;
  53.             }
  54.     for (vp = argv; *vp; vp++)
  55.         if (gotit[vp - argv] == 0)
  56.             printf("%s: not found\n", *vp);
  57. }
  58.  
  59. match(buf, str)
  60.     char *buf, *str;
  61. {
  62.     register char *bp, *cp;
  63.  
  64.     bp = buf;
  65. again:
  66.     cp = str;
  67.     while (*bp && *cp && lmatch(*bp, *cp))
  68.         bp++, cp++;
  69.     if (*cp == 0 && (*bp == '(' || *bp == ',' || *bp == '\t' || *bp == ' '))
  70.         return (1);
  71.     while (isalpha(*bp) || isdigit(*bp))
  72.         bp++;
  73.     if (*bp != ',')
  74.         return (0);
  75.     bp++;
  76.     while (isspace(*bp))
  77.         bp++;
  78.     goto again;
  79. }
  80.  
  81. lmatch(c, d)
  82.     char c, d;
  83. {
  84.  
  85.     if (c == d)
  86.         return (1);
  87.     if (!isalpha(c) || !isalpha(d))
  88.         return (0);
  89.     if (islower(c))
  90.         c = toupper(c);
  91.     if (islower(d))
  92.         d = toupper(d);
  93.     return (c == d);
  94. }
  95.  
  96. unsigned
  97. blklen(ip)
  98.     register char **ip;
  99. {
  100.     register int i = 0;
  101.  
  102.     while (*ip++)
  103.         i++;
  104.     return (i);
  105. }
  106.  
  107. char *
  108. trim(cp)
  109.     register char *cp;
  110. {
  111.     register char *dp;
  112.  
  113.     for (dp = cp; *dp; dp++)
  114.         if (*dp == '/')
  115.             cp = dp + 1;
  116.     if (cp[0] != '.') {
  117.         if (cp + 3 <= dp && dp[-2] == '.' && any(dp[-1], "cosa12345678npP"))
  118.             dp[-2] = 0;
  119.         if (cp + 4 <= dp && dp[-3] == '.' && any(dp[-2], "13") && isalpha(dp[-1]))
  120.             dp[-3] = 0;
  121.     }
  122.     return (cp);
  123. }
  124.  
  125. any(c, cp)
  126.     register int c;
  127.     register char *cp;
  128. {
  129.  
  130.     while (*cp)
  131.         if (c == *cp++)
  132.             return (1);
  133.     return (0);
  134. }
  135.