home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
8bitfiles.net/archives
/
archives.tar
/
archives
/
canada-remote-systems
/
cpower
/
globcp.arc
/
WILDMATCH.C
< prev
Wrap
Text File
|
2019-04-13
|
3KB
|
123 lines
/*
* ├OPYRIGHT (├) ┴DRIAN ╨EPPER, 1989
*
* ┬UT ╔ (┴DRIAN ╨EPPER) CONSIDER THIS
* MATERIAL TO BE IN THE ╨UBLIC ─OMAIN.
*/
/*
* WILDMATCH - DO MODERATELY PRIMITIVE
* WILD CARD MATCH
*
* RETURNS NON-ZERO AS THE FUNCTION VALUE
* IF GIVEN PATTERN MATCHES STRING
*
* PATTERN CAN CONTAIN THE FOLLOWING
* SPECIAL CHARACTERS:
*
* * - MATCH ANY NUMBER OF ANY CHARACTERS
* ? - MATCH EXACTLY ONE OF ANY CHARACTER
* [ABC...] - MATCH EXACTLY ONE OF ANY
* CHARACTER IN THE BRACKETS;
* '!' OR '^' NEGATES CLASS
* '-' CAN DESIGNATE A RANGE
* (E.G. [┴-┼])
*
* ALL OTHER CHARACTERS ARE MATCHED
* LITERALLY. '*' AND '?' CAN BE
* MATCHED LITERALLY BY PLACING INSIDE
* '[' AND ']'. ╨ATTERN MUST MATCH
* ENTIRE STRING.
*/
#DEFINE ╬╧ 0
#DEFINE ┘┼╙ 1
WILDMATCH(P,S)
CHAR *P; /* PATTERN, AS A LITERAL STRING */
CHAR *S; /* STRING TO TEST AS MATCHING ENTIRE PATTERN */
█
CHAR *CLASSMATCH();
CHAR PC;
AUTO UNSIGNED MATCH;
FOR ( ; ; ) █
/* UNTIL WE RETURN BY FAILURE OR SUCCESS */
/* SWITCH ON NEXT CHAR IN PATTERN */
SWITCH (PC = *P++)
█
CASE '[':
P = CLASSMATCH(P, *S, &MATCH);
IF (!MATCH)
RETURN ╬╧;
BREAK;
CASE '*': /* MATCH ANY NUMBER OF ANY CHAR */
DO █
/* CHECK ALL POSSIBLE SUFFICES */
IF (WILDMATCH(P, S))
RETURN ┘┼╙; /* AT LEAST 1 SUFFIX WORKS */
▌ WHILE (*S++);
RETURN ╬╧; /* ALL SUFFICES INCONSISTENT */
CASE '?':
IF (*S == '\0') /* MATCH ANY REAL CHAR */
RETURN ╬╧;
/* ELSE CHECK NEXT CHAR IN P AND S */
BREAK;
CASE '\0': /* PATTERN ENDED */
RETURN *S == '\0'; /* ┘┼╙ ONLY IF S ENDS TOO */
/* RETURNING ┘┼╙ UNCONDITIONALLY HERE WOULD */
/* CHECK IF INITIAL PORTION OF S MATCHED P */
DEFAULT: /* LITERAL MATCH OF CHAR IN PATTERN */
/* ┴╙╙┼╥╘: IF *S == '\0' WE RETURN (╬╧) */
IF (*S != PC)
RETURN ╬╧;
/* ELSE CHECK NEXT CHAR IN P AND S */
▌
++S; /* NEXT CHAR IN S */
▌
▌
STATIC CHAR *
CLASSMATCH(P, C, PMATCH)
CHAR *P; /* CLASS, LESS '[' */
INT C; /* CHAR WHICH SHOULD BELONG */
UNSIGNED *PMATCH; /* RETURN MATCH SUCCESS */
█
UNSIGNED MATCH;
CHAR C1, C2;
MATCH = ╬╧; /* ASSUME FAILURE */
IF (*P == '!' ▀▀ *P == '^') █
MATCH = ┘┼╙; /* A NEGATED CLASS */
++P;
▌
IF (*P != '\0') █
DO █ /* ALLOWS ']' OR '-' 1ST */
C2 = '\0';
C1 = *P++;
IF (*P == '-') █
C2 = *++P; /* SKIP -, GET NEXT */
IF (C1 <= C && C <= C2) █
MATCH = !MATCH;
BREAK;
▌
▌
ELSE IF (C1 == C) █
MATCH = !MATCH;
BREAK;
▌
IF (C2 && C2 != ']') /* RANGE? */
++P; /* YES, SKIP LAST CHAR */
▌ WHILE (*P && *P != ']');
▌
WHILE (*P && *P++ != ']')
;
IF (!C) /* END OF STRING? */
MATCH = ╬╧; /* NO CLASS MATCHES */
*PMATCH = MATCH;
RETURN P;
▌