home *** CD-ROM | disk | FTP | other *** search
/ rtsi.com / 2014.01.www.rtsi.com.tar / www.rtsi.com / OS9 / OSK / SRC / msdos_diskaccess.lzh / MS_DISK_ACCESS / match.c < prev    next >
Text File  |  1990-05-10  |  2KB  |  100 lines

  1. /*
  2.  * Do shell-style pattern matching for '?', '\', '[..]', and '*' wildcards.
  3.  * Not idiot proof!  Returns 1 if match, 0 if not.
  4.  *
  5.  * Ideas for this routine were taken from a program by Rich Salz, mirror!rs
  6.  */
  7.  
  8. #include <stdio.h>
  9.  
  10. int
  11. match(s, p)
  12. char *s;                /* string to match */
  13. char *p;                /* pattern */
  14. {
  15.     int matched, reverse;
  16.     char first, last;
  17.  
  18.     for ( ; *p != '\0'; s++, p++) {
  19.         switch (*p) {
  20.                     /* Literal match with next character */
  21.         case '\\':
  22.             p++;
  23.         default:
  24.             if (*s != *p)
  25.                 return(0);
  26.             break;
  27.                     /* match any one character */
  28.         case '?':
  29.             if (*s == '\0')
  30.                 return(0);
  31.             break;
  32.                     /* match everything */
  33.         case '*':
  34.                     /* if last char in pattern */
  35.             if (*++p == '\0')
  36.                 return(1);
  37.                     /* search for next char in pattern */
  38.             matched = 0;
  39.             while (*s != '\0') {
  40.                 if (*s == *p) {
  41.                     matched = 1;
  42.                     if (!strcmp(s+1,p+1))
  43.                         break;
  44.                 }
  45.                 s++;
  46.             }
  47.             if (!matched)
  48.                 return(0);
  49.             s--;
  50.             p--;
  51.             break;
  52.                     /* match range of characters */
  53.         case '[':
  54.             first = '\0';
  55.             matched = 0;
  56.             reverse = 0;
  57.             while (*++p != ']') {
  58.                 if (*p == '^') {
  59.                     reverse = 1;
  60.                     p++;
  61.                 }
  62.                 first = *p;
  63.                 if (first == ']' || first == '\0') {
  64.                     fprintf(stderr, "match: Malformed regular expression\n");
  65.                     return(0);
  66.                 }
  67.                     /* if 2nd char is '-' */
  68.                 if (*(p+1) == '-') {
  69.                     p++;
  70.                     /* set last to 3rd char ... */
  71.                     last = *++p;
  72.                     if (last == ']' || last == '\0') {
  73.                         fprintf(stderr, "match: Malformed regular expression\n");
  74.                         return(0);
  75.                     }
  76.                     /* test the range of values */
  77.                     if (*s>=first && *s<=last) {
  78.                         matched = 1;
  79.                         p++;
  80.                         break;
  81.                     }
  82.                     return(0);
  83.                 }
  84.                 if (*s == *p)
  85.                     matched = 1;
  86.             }
  87.             if (matched && reverse)
  88.                 return(0);
  89.             if (!matched)
  90.                 return(0);
  91.             break;
  92.         }
  93.     }
  94.                     /* string ended prematurely ? */
  95.     if (*s != '\0')
  96.         return(0);
  97.     else
  98.         return(1);
  99. }
  100.