home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / unix / volume17 / e2 / part01 / find_match.c < prev    next >
C/C++ Source or Header  |  1989-02-08  |  1KB  |  65 lines

  1. #include "e.h"
  2.  
  3.  
  4. /*
  5.  * find_match()
  6.  *
  7.  * Find the name in the history list that contains the 'pattern'.
  8.  * If we find one, put it into the 'arg' variable. Otherwise
  9.  * announce that a match couldn't be found and leave.
  10.  *
  11.  */
  12. void
  13. find_match(pattern)
  14. char *pattern;
  15. {
  16.     register i;
  17.     int match();
  18.  
  19.     /* 
  20.      * Try for a match with each file in turn. Note that we are working
  21.      * from most-recently-used backwards.
  22.      *
  23.      */
  24.  
  25.     for (i = hist_count - 1; i >= 0; i--){
  26.         if (match(hist[i], pattern)){
  27.             ok_sprintf(arg, "%s", hist[i]);
  28.             reconstruct(i);
  29.             return;
  30.         }
  31.     }
  32.  
  33.     /* 
  34.      * We couldn't match so get out of here. 
  35.      *
  36.      */
  37.     e_error("Unable to match with '%s'.", pattern);
  38. }
  39.  
  40.  
  41.  
  42. /*
  43.  * match()
  44.  *
  45.  * Boneheaded but easy pattern matcher. Just see if the 'pattern'
  46.  * exists anywhere in the 'argument'. Boyer-Moore who?
  47.  * In general our patterns will be so short that it wouldn't be
  48.  * worth the effort to set up a better algorithm.
  49.  *
  50.  */
  51. int
  52. match(argument, pattern)
  53. char *argument;
  54. char *pattern;
  55. {
  56.     register length = strlen(pattern);
  57.  
  58.     while (strlen(argument) >= length){
  59.         if (!strncmp(argument++, pattern, length)){
  60.             return 1;
  61.         }
  62.     }
  63.     return 0;
  64. }
  65.