diff options
author | Moriyoshi Koizumi <moriyoshi@php.net> | 2003-09-30 00:26:03 +0000 |
---|---|---|
committer | Moriyoshi Koizumi <moriyoshi@php.net> | 2003-09-30 00:26:03 +0000 |
commit | 5d3b5cd1c2fd1026b1df0e976c598fddb6c27d7b (patch) | |
tree | dca235433e28078d1a5dd9125a81a19c79b12f40 /regex/engine.c | |
parent | 6ac36d1a00dcac81642cc0ffc8cefec88ff42c1b (diff) | |
download | php-git-5d3b5cd1c2fd1026b1df0e976c598fddb6c27d7b.tar.gz |
Fixed bug #25669 (eregi() with non-ascii characters)
Diffstat (limited to 'regex/engine.c')
-rw-r--r-- | regex/engine.c | 126 |
1 files changed, 63 insertions, 63 deletions
diff --git a/regex/engine.c b/regex/engine.c index 0b88dcf1ed..c4bdc8079f 100644 --- a/regex/engine.c +++ b/regex/engine.c @@ -33,11 +33,11 @@ struct match { struct re_guts *g; int eflags; regmatch_t *pmatch; /* [nsub+1] (0 element unused) */ - char *offp; /* offsets work from here */ - char *beginp; /* start of string -- virtual NUL precedes */ - char *endp; /* end of string -- virtual NUL here */ - char *coldp; /* can be no match starting before here */ - char **lastpos; /* [nplus+1] */ + unsigned char *offp; /* offsets work from here */ + unsigned char *beginp; /* start of string -- virtual NUL precedes */ + unsigned char *endp; /* end of string -- virtual NUL here */ + unsigned char *coldp; /* can be no match starting before here */ + unsigned char **lastpos; /* [nplus+1] */ STATEVARS; states st; /* current states */ states fresh; /* states for a fresh start */ @@ -65,20 +65,20 @@ struct match { static int /* 0 success, REG_NOMATCH failure */ matcher(g, string, nmatch, pmatch, eflags) register struct re_guts *g; -char *string; +unsigned char *string; size_t nmatch; regmatch_t pmatch[]; int eflags; { - register char *endp; + register unsigned char *endp; register size_t i; struct match mv; register struct match *m = &mv; - register char *dp; + register unsigned char *dp; const register sopno gf = g->firststate+1; /* +1 for OEND */ const register sopno gl = g->laststate; - char *start; - char *stop; + unsigned char *start; + unsigned char *stop; /* simplify the situation where possible */ if (g->cflags®_NOSUB) @@ -156,10 +156,10 @@ int eflags; dp = dissect(m, m->coldp, endp, gf, gl); } else { if (g->nplus > 0 && m->lastpos == NULL) - m->lastpos = (char **)malloc((g->nplus+1) * - sizeof(char *)); + m->lastpos = (unsigned char **)malloc((g->nplus+1) * + sizeof(unsigned char *)); if (g->nplus > 0 && m->lastpos == NULL) { - free(m->pmatch); + free((char *)m->pmatch); STATETEARDOWN(m); return(REG_ESPACE); } @@ -225,30 +225,30 @@ int eflags; /* - dissect - figure out what matched what, no back references - == static char *dissect(register struct match *m, char *start, \ - == char *stop, sopno startst, sopno stopst); + == static unsigned char *dissect(register struct match *m, unsigned char *start, \ + == unsigned char *stop, sopno startst, sopno stopst); */ -static char * /* == stop (success) always */ +static unsigned char * /* == stop (success) always */ dissect(m, start, stop, startst, stopst) register struct match *m; -char *start; -char *stop; +unsigned char *start; +unsigned char *stop; sopno startst; sopno stopst; { register int i; register sopno ss; /* start sop of current subRE */ register sopno es; /* end sop of current subRE */ - register char *sp; /* start of string matched by it */ - register char *stp; /* string matched by it cannot pass here */ - register char *rest; /* start of rest of string */ - register char *tail; /* string unmatched by rest of RE */ + register unsigned char *sp; /* start of string matched by it */ + register unsigned char *stp; /* string matched by it cannot pass here */ + register unsigned char *rest; /* start of rest of string */ + register unsigned char *tail; /* string unmatched by rest of RE */ register sopno ssub; /* start sop of subsubRE */ register sopno esub; /* end sop of subsubRE */ - register char *ssp; /* start of string matched by subsubRE */ - register char *sep; /* end of string matched by subsubRE */ - register char *oldssp; /* previous ssp */ - register char *dp; + register unsigned char *ssp; /* start of string matched by subsubRE */ + register unsigned char *sep; /* end of string matched by subsubRE */ + register unsigned char *oldssp; /* previous ssp */ + register unsigned char *dp; AT("diss", start, stop, startst, stopst); sp = start; @@ -413,25 +413,25 @@ sopno stopst; /* - backref - figure out what matched what, figuring in back references - == static char *backref(register struct match *m, char *start, \ - == char *stop, sopno startst, sopno stopst, sopno lev); + == static unsigned char *backref(register struct match *m, unsigned char *start, \ + == unsigned char *stop, sopno startst, sopno stopst, sopno lev); */ -static char * /* == stop (success) or NULL (failure) */ +static unsigned char * /* == stop (success) or NULL (failure) */ backref(m, start, stop, startst, stopst, lev) register struct match *m; -char *start; -char *stop; +unsigned char *start; +unsigned char *stop; sopno startst; sopno stopst; sopno lev; /* PLUS nesting level */ { register int i; register sopno ss; /* start sop of current subRE */ - register char *sp; /* start of string matched by it */ + register unsigned char *sp; /* start of string matched by it */ register sopno ssub; /* start sop of subsubRE */ register sopno esub; /* end sop of subsubRE */ - register char *ssp; /* start of string matched by subsubRE */ - register char *dp; + register unsigned char *ssp; /* start of string matched by subsubRE */ + register unsigned char *dp; register size_t len; register int hard; register sop s; @@ -446,7 +446,7 @@ sopno lev; /* PLUS nesting level */ for (ss = startst; !hard && ss < stopst; ss++) switch (OP(s = m->g->strip[ss])) { case OCHAR: - if (sp == stop || *sp++ != (char)OPND(s)) + if (sp == stop || *sp++ != (unsigned char)OPND(s)) return(NULL); break; case OANY: @@ -613,31 +613,31 @@ sopno lev; /* PLUS nesting level */ /* "can't happen" */ assert(nope); /* NOTREACHED */ - return((char *)NULL); /* dummy */ + return((unsigned char *)NULL); /* dummy */ } /* - fast - step through the string at top speed - == static char *fast(register struct match *m, char *start, \ - == char *stop, sopno startst, sopno stopst); + == static unsigned char *fast(register struct match *m, unsigned char *start, \ + == unsigned char *stop, sopno startst, sopno stopst); */ -static char * /* where tentative match ended, or NULL */ +static unsigned char * /* where tentative match ended, or NULL */ fast(m, start, stop, startst, stopst) register struct match *m; -char *start; -char *stop; +unsigned char *start; +unsigned char *stop; sopno startst; sopno stopst; { register states st = m->st; register states fresh = m->fresh; register states tmp = m->tmp; - register char *p = start; + register unsigned char *p = start; register int c = (start == m->beginp) ? OUT : *(start-1); register int lastc; /* previous c */ register int flagch; register int i; - register char *coldp; /* last p after which no match was underway */ + register unsigned char *coldp; /* last p after which no match was underway */ CLEAR(st); SET1(st, startst); @@ -709,26 +709,26 @@ sopno stopst; /* - slow - step through the string more deliberately - == static char *slow(register struct match *m, char *start, \ - == char *stop, sopno startst, sopno stopst); + == static unsigned char *slow(register struct match *m, unsigned char *start, \ + == unsigned char *stop, sopno startst, sopno stopst); */ -static char * /* where it ended */ +static unsigned char * /* where it ended */ slow(m, start, stop, startst, stopst) register struct match *m; -char *start; -char *stop; +unsigned char *start; +unsigned char *stop; sopno startst; sopno stopst; { register states st = m->st; register states empty = m->empty; register states tmp = m->tmp; - register char *p = start; + register unsigned char *p = start; register int c = (start == m->beginp) ? OUT : *(start-1); register int lastc; /* previous c */ register int flagch; register int i; - register char *matchp; /* last p at which a match ended */ + register unsigned char *matchp; /* last p at which a match ended */ AT("slow", start, stop, startst, stopst); CLEAR(st); @@ -805,8 +805,8 @@ sopno stopst; == #define BOW (BOL+4) == #define EOW (BOL+5) == #define CODEMAX (BOL+5) // highest code used - == #define NONCHAR(c) ((c) > CHAR_MAX) - == #define NNONCHAR (CODEMAX-CHAR_MAX) + == #define NONCHAR(c) ((c) > UCHAR_MAX) + == #define NNONCHAR (CODEMAX-UCHAR_MAX) */ static states step(g, start, stop, bef, ch, aft) @@ -832,8 +832,8 @@ register states aft; /* states already known reachable after */ break; case OCHAR: /* only characters can match */ - assert(!NONCHAR(ch) || ch != (char)OPND(s)); - if (ch == (char)OPND(s)) + assert(!NONCHAR(ch) || ch != (unsigned char)OPND(s)); + if (ch == (unsigned char)OPND(s)) FWD(aft, bef, 1); break; case OBOL: @@ -926,14 +926,14 @@ register states aft; /* states already known reachable after */ /* - print - print a set of states == #ifdef REDEBUG - == static void print(struct match *m, char *caption, states st, \ + == static void print(struct match *m, unsigned char *caption, states st, \ == int ch, FILE *d); == #endif */ static void print(m, caption, st, ch, d) struct match *m; -char *caption; +unsigned char *caption; states st; int ch; FILE *d; @@ -959,16 +959,16 @@ FILE *d; /* - at - print current situation == #ifdef REDEBUG - == static void at(struct match *m, char *title, char *start, char *stop, \ + == static void at(struct match *m, unsigned char *title, unsigned char *start, unsigned char *stop, \ == sopno startst, sopno stopst); == #endif */ static void at(m, title, start, stop, startst, stopst) struct match *m; -char *title; -char *start; -char *stop; +unsigned char *title; +unsigned char *start; +unsigned char *stop; sopno startst; sopno stopst; { @@ -985,7 +985,7 @@ sopno stopst; /* - pchar - make a character printable == #ifdef REDEBUG - == static char *pchar(int ch); + == static unsigned char *pchar(int ch); == #endif * * Is this identical to regchar() over in debug.c? Well, yes. But a @@ -993,11 +993,11 @@ sopno stopst; * a matching debug.o, and this is convenient. It all disappears in * the non-debug compilation anyway, so it doesn't matter much. */ -static char * /* -> representation */ +static unsigned char * /* -> representation */ pchar(ch) int ch; { - static char pbuf[10]; + static unsigned char pbuf[10]; if (isprint(ch) || ch == ' ') sprintf(pbuf, "%c", ch); |