123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233 |
- #include "regexp.h"
- enum {
- MATCH_VALID = 1,
- MATCH_END,
- MATCH_ABORT,
- MATCH_RANGE,
- MATCH_LITERAL,
- MATCH_PATTERN,
- };
- enum {
- PATTERN_VALID = 0,
- PATTERN_ESC = -1,
- PATTERN_RANGE = -2,
- PATTERN_CLOSE = -3,
- PATTERN_EMPTY = -4,
- };
- int Matche(const regchar_t *p, const regchar_t *t);
- int matche_after_star(const regchar_t *p, const regchar_t *t)
- {
- register int match = 0;
- register regchar_t nextp;
-
- while ( *p == '?' || *p == '*' )
- {
-
- if (*p == '?')
- {
-
- if (!*t++) return MATCH_ABORT;
- }
-
- p++;
- }
-
- if (!*p) return MATCH_VALID;
-
- nextp = *p;
- if (nextp == '\\')
- {
- nextp = p[1];
-
- if (!nextp) return MATCH_PATTERN;
- }
-
- do
- {
-
- if (nextp == *t || nextp == '[') match = Matche(p, t);
-
- if (!*t++) match = MATCH_ABORT;
- }
- while ( match != MATCH_VALID && match != MATCH_ABORT && match != MATCH_PATTERN);
-
- return match;
- }
- int Matche(const regchar_t *p, const regchar_t *t)
- {
- regchar_t range_start, range_end;
- bool invert;
- bool member_match;
- bool loop;
- for ( ; *p; p++, t++)
- {
-
- if (!*t)
- {
- return (*p == '*' && *++p == '\0') ? MATCH_VALID : MATCH_ABORT;
- }
-
- switch (*p)
- {
- case '?':
- break;
- case '*':
- return matche_after_star (p, t);
-
- case '[':
- {
-
- p++;
-
- invert = false;
- if (*p == '!' || *p == '^')
- {
- invert = true;
- p++;
- }
-
- if (*p == ']')
- return MATCH_PATTERN;
- member_match = false;
- loop = true;
- while (loop)
- {
-
- if (*p == ']')
- {
- loop = false;
- continue;
- }
-
- if (*p == '\\')
- range_start = range_end = *++p;
- else
- range_start = range_end = *p;
-
- if (!*p)
- return MATCH_PATTERN;
-
- if (*++p == '-')
- {
-
- range_end = *++p;
-
- if (range_end == '\0' || range_end == ']') return MATCH_PATTERN;
-
- if (range_end == '\\')
- {
- range_end = *++p;
-
- if (!range_end) return MATCH_PATTERN;
- }
-
- p++;
- }
-
- if (range_start < range_end)
- {
- if (*t >= range_start && *t <= range_end)
- {
- member_match = true;
- loop = false;
- }
- }
- else
- {
- if (*t >= range_end && *t <= range_start)
- {
- member_match = true;
- loop = false;
- }
- }
- }
-
-
- if ((invert && member_match) || !(invert || member_match))
- return MATCH_RANGE;
-
- if (member_match)
- {
- while (p && *p != ']')
- {
-
- if (!*p)
- return MATCH_PATTERN;
-
- if (*p == '\\')
- {
- p++;
-
- if (!*p)
- return MATCH_PATTERN;
- }
-
- p++;
- }
- }
- break;
- }
- case '\\':
-
- p++;
-
- if (!*p)
- return MATCH_PATTERN;
-
- default:
- if (*p != *t)
- return MATCH_LITERAL;
- }
- }
-
- if (*t)
- return MATCH_END;
- else return MATCH_VALID;
- }
- bool Match(const regchar_t *match, const regchar_t *string)
- {
- if (!match)
- return true;
- int error_type;
-
- error_type = Matche(match, string);
- return (error_type == MATCH_VALID);
- }
|