home *** CD-ROM | disk | FTP | other *** search
/ 8bitfiles.net/archives / archives.tar / archives / canada-remote-systems / cpower / globcp.arc / WILDMATCH.C < prev   
Text File  |  2019-04-13  |  3KB  |  123 lines

  1. /*
  2.  * ├OPYRIGHT (├) ┴DRIAN ╨EPPER, 1989
  3.  *
  4.  *  ┬UT ╔ (┴DRIAN ╨EPPER) CONSIDER THIS
  5.  * MATERIAL TO BE IN THE ╨UBLIC ─OMAIN.
  6.  */
  7. /*
  8.  * WILDMATCH - DO MODERATELY PRIMITIVE
  9.  *   WILD CARD MATCH
  10.  *
  11.  * RETURNS NON-ZERO AS THE FUNCTION VALUE
  12.  *   IF GIVEN PATTERN MATCHES STRING
  13.  *
  14.  * PATTERN CAN CONTAIN THE FOLLOWING
  15.  *   SPECIAL CHARACTERS:
  16.  *
  17.  *   * - MATCH ANY NUMBER OF ANY CHARACTERS
  18.  *   ? - MATCH EXACTLY ONE OF ANY CHARACTER
  19.  *   [ABC...] - MATCH EXACTLY ONE OF ANY
  20.  *       CHARACTER IN THE BRACKETS;
  21.  *       '!' OR '^' NEGATES CLASS
  22.  *       '-' CAN DESIGNATE A RANGE
  23.  *              (E.G. [┴-┼])
  24.  *
  25.  *   ALL OTHER CHARACTERS ARE MATCHED
  26.  *   LITERALLY.  '*' AND '?' CAN BE
  27.  *   MATCHED LITERALLY BY PLACING INSIDE
  28.  *   '[' AND ']'.  ╨ATTERN MUST MATCH
  29.  *   ENTIRE STRING.
  30.  */
  31. #DEFINE ╬╧ 0
  32. #DEFINE ┘┼╙ 1
  33.  
  34. WILDMATCH(P,S)
  35. CHAR *P;  /* PATTERN, AS A LITERAL STRING */
  36. CHAR *S;  /* STRING TO TEST AS MATCHING ENTIRE PATTERN */
  37.   CHAR *CLASSMATCH();
  38.   CHAR PC;
  39.   AUTO UNSIGNED MATCH;
  40.  
  41.   FOR ( ; ; ) █
  42.     /* UNTIL WE RETURN BY FAILURE OR SUCCESS */
  43.     /* SWITCH ON NEXT CHAR IN PATTERN */
  44.     SWITCH (PC = *P++)
  45.     █
  46.     CASE '[':
  47.       P = CLASSMATCH(P, *S, &MATCH);
  48.       IF (!MATCH)
  49.         RETURN ╬╧;
  50.       BREAK;
  51.  
  52.     CASE '*':   /* MATCH ANY NUMBER OF ANY CHAR */
  53.       DO █
  54.         /* CHECK ALL POSSIBLE SUFFICES */
  55.         IF (WILDMATCH(P, S))
  56.           RETURN ┘┼╙;  /* AT LEAST 1 SUFFIX WORKS */
  57.       ▌ WHILE (*S++);
  58.       RETURN ╬╧;  /* ALL SUFFICES INCONSISTENT */
  59.  
  60.     CASE '?':
  61.       IF (*S == '\0') /* MATCH ANY REAL CHAR */
  62.         RETURN ╬╧;
  63.       /* ELSE CHECK NEXT CHAR IN P AND S */
  64.       BREAK;
  65.  
  66.     CASE '\0':  /* PATTERN ENDED */
  67.       RETURN *S == '\0';  /* ┘┼╙ ONLY IF S ENDS TOO */
  68.           /* RETURNING ┘┼╙ UNCONDITIONALLY HERE WOULD */
  69.           /* CHECK IF INITIAL PORTION OF S MATCHED P */
  70.  
  71.     DEFAULT:    /* LITERAL MATCH OF CHAR IN PATTERN */
  72.       /* ┴╙╙┼╥╘: IF *S == '\0' WE RETURN (╬╧) */
  73.       IF (*S != PC)
  74.         RETURN ╬╧;
  75.  
  76.       /* ELSE CHECK NEXT CHAR IN P AND S */
  77.     ▌
  78.     ++S;  /* NEXT CHAR IN S */
  79.   ▌
  80.  
  81. STATIC CHAR *
  82. CLASSMATCH(P, C, PMATCH)
  83. CHAR *P;   /* CLASS, LESS '[' */
  84. INT C;     /* CHAR WHICH SHOULD BELONG */
  85. UNSIGNED *PMATCH;  /* RETURN MATCH SUCCESS */
  86.   UNSIGNED MATCH;
  87.   CHAR C1, C2;
  88.  
  89.   MATCH = ╬╧;  /* ASSUME FAILURE */
  90.   IF (*P == '!' ▀▀ *P == '^') █
  91.     MATCH = ┘┼╙;  /* A NEGATED CLASS */
  92.     ++P;
  93.   ▌
  94.   IF (*P != '\0') █
  95.     DO █ /* ALLOWS ']' OR '-' 1ST */
  96.       C2 = '\0';
  97.       C1 = *P++;
  98.       IF (*P == '-') █
  99.         C2 = *++P;  /* SKIP -, GET NEXT */
  100.         IF (C1 <= C && C <= C2) █
  101.           MATCH = !MATCH;
  102.           BREAK;
  103.         ▌
  104.       ▌
  105.       ELSE IF (C1 == C) █
  106.         MATCH = !MATCH;
  107.         BREAK;
  108.       ▌
  109.       IF (C2 && C2 != ']')  /* RANGE? */
  110.         ++P;  /* YES, SKIP LAST CHAR */
  111.     ▌ WHILE (*P && *P != ']');
  112.   ▌
  113.   WHILE (*P && *P++ != ']')
  114.     ;
  115.   IF (!C)        /* END OF STRING? */
  116.     MATCH = ╬╧;  /* NO CLASS MATCHES */
  117.   *PMATCH = MATCH;
  118.   RETURN P;
  119.