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

  1. /* Copyright (c) 1979 Regents of the University of California */
  2. #include <stdio.h>
  3. #include <ctype.h>
  4.  
  5. main(argc, argv)
  6.     int argc;
  7.     char *argv[];
  8. {
  9.  
  10.     argc--, argv++;
  11.     if (argc == 0) {
  12. usage:
  13.         fprintf(stderr, "apropos word ...\n");
  14.         exit(1);
  15.     }
  16.     if (freopen("/usr/lib/whatis", "r", stdin) == NULL) {
  17.         perror("/usr/lib/whatis");
  18.         exit (1);
  19.     }
  20.     argv[argc] = 0;
  21.     apropos(argv);
  22.     exit(0);
  23. }
  24.  
  25. apropos(argv)
  26.     char **argv;
  27. {
  28.     char buf[BUFSIZ];
  29.     char *gotit;
  30.     register char **vp;
  31.  
  32.     gotit = (char *) calloc(1, blklen(argv));
  33.     while (fgets(buf, sizeof buf, stdin) != NULL)
  34.         for (vp = argv; *vp; vp++)
  35.             if (match(buf, *vp)) {
  36.                 printf("%s", buf);
  37.                 gotit[vp - argv] = 1;
  38.                 for (vp++; *vp; vp++)
  39.                     if (match(buf, *vp))
  40.                         gotit[vp - argv] = 1;
  41.                 break;
  42.             }
  43.     for (vp = argv; *vp; vp++)
  44.         if (gotit[vp - argv] == 0)
  45.             printf("%s: nothing apropriate\n", *vp);
  46. }
  47.  
  48. match(buf, str)
  49.     char *buf, *str;
  50. {
  51.     register char *bp, *cp;
  52.  
  53.     bp = buf;
  54.     for (;;) {
  55.         if (*bp == 0)
  56.             return (0);
  57.         if (amatch(bp, str))
  58.             return (1);
  59.         bp++;
  60.     }
  61. }
  62.  
  63. amatch(cp, dp)
  64.     register char *cp, *dp;
  65. {
  66.  
  67.     while (*cp && *dp && lmatch(*cp, *dp))
  68.         cp++, dp++;
  69.     if (*dp == 0)
  70.         return (1);
  71.     return (0);
  72. }
  73.  
  74. lmatch(c, d)
  75.     char c, d;
  76. {
  77.  
  78.     if (c == d)
  79.         return (1);
  80.     if (!isalpha(c) || !isalpha(d))
  81.         return (0);
  82.     if (islower(c))
  83.         c = toupper(c);
  84.     if (islower(d))
  85.         d = toupper(d);
  86.     return (c == d);
  87. }
  88.  
  89. blklen(ip)
  90.     register int *ip;
  91. {
  92.     register int i = 0;
  93.  
  94.     while (*ip++)
  95.         i++;
  96.     return (i);
  97. }
  98.