diff options
| author | Xin LI <delphij@FreeBSD.org> | 2007-05-25 12:44:58 +0000 | 
|---|---|---|
| committer | Xin LI <delphij@FreeBSD.org> | 2007-05-25 12:44:58 +0000 | 
| commit | eb2b3d109a5ea801c0c74ca92bdcfd6ec48a4d8d (patch) | |
| tree | 59c96a3ee8841959a73b7b53fe218a73d40ac890 /lib/libc/regex/engine.c | |
| parent | cb4e06eba8448c995a6c126f70efef9c4b5ed100 (diff) | |
Notes
Diffstat (limited to 'lib/libc/regex/engine.c')
| -rw-r--r-- | lib/libc/regex/engine.c | 209 | 
1 files changed, 100 insertions, 109 deletions
diff --git a/lib/libc/regex/engine.c b/lib/libc/regex/engine.c index da87a16f6f2c8..a44511b8d5610 100644 --- a/lib/libc/regex/engine.c +++ b/lib/libc/regex/engine.c @@ -82,11 +82,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] */ +	const char *offp;	/* offsets work from here */ +	const char *beginp;	/* start of string -- virtual NUL precedes */ +	const char *endp;	/* end of string -- virtual NUL here */ +	const char *coldp;	/* can be no match starting before here */ +	const char **lastpos;	/* [nplus+1] */  	STATEVARS;  	states st;		/* current states */  	states fresh;		/* states for a fresh start */ @@ -101,11 +101,11 @@ extern "C" {  #endif  /* === engine.c === */ -static int matcher(struct re_guts *g, char *string, size_t nmatch, regmatch_t pmatch[], int eflags); -static char *dissect(struct match *m, char *start, char *stop, sopno startst, sopno stopst); -static char *backref(struct match *m, char *start, char *stop, sopno startst, sopno stopst, sopno lev, int); -static char *fast(struct match *m, char *start, char *stop, sopno startst, sopno stopst); -static char *slow(struct match *m, char *start, char *stop, sopno startst, sopno stopst); +static int matcher(struct re_guts *g, const char *string, size_t nmatch, regmatch_t pmatch[], int eflags); +static const char *dissect(struct match *m, const char *start, const char *stop, sopno startst, sopno stopst); +static const char *backref(struct match *m, const char *start, const char *stop, sopno startst, sopno stopst, sopno lev, int); +static const char *fast(struct match *m, const char *start, const char *stop, sopno startst, sopno stopst); +static const char *slow(struct match *m, const char *start, const char *stop, sopno startst, sopno stopst);  static states step(struct re_guts *g, sopno start, sopno stop, states bef, wint_t ch, states aft);  #define MAX_RECURSION	100  #define	BOL	(OUT-1) @@ -117,13 +117,13 @@ static states step(struct re_guts *g, sopno start, sopno stop, states bef, wint_  #define	BADCHAR	(BOL-6)  #define	NONCHAR(c)	((c) <= OUT)  #ifdef REDEBUG -static void print(struct match *m, char *caption, states st, int ch, FILE *d); +static void print(struct match *m, const char *caption, states st, int ch, FILE *d);  #endif  #ifdef REDEBUG -static void at(struct match *m, char *title, char *start, char *stop, sopno startst, sopno stopst); +static void at(struct match *m, const char *title, const char *start, const char *stop, sopno startst, sopno stopst);  #endif  #ifdef REDEBUG -static char *pchar(int ch); +static const char *pchar(int ch);  #endif  #ifdef __cplusplus @@ -143,31 +143,30 @@ static char *pchar(int ch);  /*   - matcher - the actual matching engine - == static int matcher(struct re_guts *g, char *string, \ + == static int matcher(struct re_guts *g, const char *string, \   ==	size_t nmatch, regmatch_t pmatch[], int eflags);   */  static int			/* 0 success, REG_NOMATCH failure */ -matcher(g, string, nmatch, pmatch, eflags) -struct re_guts *g; -char *string; -size_t nmatch; -regmatch_t pmatch[]; -int eflags; +matcher(struct re_guts *g, +	const char *string, +	size_t nmatch, +	regmatch_t pmatch[], +	int eflags)  { -	char *endp; +	const char *endp;  	int i;  	struct match mv;  	struct match *m = &mv; -	char *dp; +	const char *dp;  	const sopno gf = g->firststate+1;	/* +1 for OEND */  	const sopno gl = g->laststate; -	char *start; -	char *stop; +	const char *start; +	const char *stop;  	/* Boyer-Moore algorithms variables */ -	char *pp; +	const char *pp;  	int cj, mj; -	char *mustfirst; -	char *mustlast; +	const char *mustfirst; +	const char *mustlast;  	int *matchjump;  	int *charjump; @@ -291,8 +290,8 @@ 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 = malloc((g->nplus+1) * +						sizeof(const char *));  			if (g->nplus > 0 && m->lastpos == NULL) {  				free(m->pmatch);  				STATETEARDOWN(m); @@ -362,30 +361,29 @@ int eflags;  /*   - dissect - figure out what matched what, no back references - == static char *dissect(struct match *m, char *start, \ - ==	char *stop, sopno startst, sopno stopst); + == static const char *dissect(struct match *m, const char *start, \ + ==	const char *stop, sopno startst, sopno stopst);   */ -static char *			/* == stop (success) always */ -dissect(m, start, stop, startst, stopst) -struct match *m; -char *start; -char *stop; -sopno startst; -sopno stopst; +static const char *		/* == stop (success) always */ +dissect(struct match *m, +	const char *start, +	const char *stop, +	sopno startst, +	sopno stopst)  {  	int i;  	sopno ss;		/* start sop of current subRE */  	sopno es;		/* end sop of current subRE */ -	char *sp;		/* start of string matched by it */ -	char *stp;		/* string matched by it cannot pass here */ -	char *rest;		/* start of rest of string */ -	char *tail;		/* string unmatched by rest of RE */ +	const char *sp;		/* start of string matched by it */ +	const char *stp;	/* string matched by it cannot pass here */ +	const char *rest;	/* start of rest of string */ +	const char *tail;	/* string unmatched by rest of RE */  	sopno ssub;		/* start sop of subsubRE */  	sopno esub;		/* end sop of subsubRE */ -	char *ssp;		/* start of string matched by subsubRE */ -	char *sep;		/* end of string matched by subsubRE */ -	char *oldssp;		/* previous ssp */ -	char *dp; +	const char *ssp;	/* start of string matched by subsubRE */ +	const char *sep;	/* end of string matched by subsubRE */ +	const char *oldssp;	/* previous ssp */ +	const char *dp;  	AT("diss", start, stop, startst, stopst);  	sp = start; @@ -550,26 +548,25 @@ sopno stopst;  /*   - backref - figure out what matched what, figuring in back references - == static char *backref(struct match *m, char *start, \ - ==	char *stop, sopno startst, sopno stopst, sopno lev); + == static const char *backref(struct match *m, const char *start, \ + ==	const char *stop, sopno startst, sopno stopst, sopno lev);   */ -static char *			/* == stop (success) or NULL (failure) */ -backref(m, start, stop, startst, stopst, lev, rec) -struct match *m; -char *start; -char *stop; -sopno startst; -sopno stopst; -sopno lev;			/* PLUS nesting level */ -int rec; +static const char *		/* == stop (success) or NULL (failure) */ +backref(struct match *m, +	const char *start, +	const char *stop, +	sopno startst, +	sopno stopst, +	sopno lev,		/* PLUS nesting level */ +	int rec)  {  	int i;  	sopno ss;		/* start sop of current subRE */ -	char *sp;		/* start of string matched by it */ +	const char *sp;		/* start of string matched by it */  	sopno ssub;		/* start sop of subsubRE */  	sopno esub;		/* end sop of subsubRE */ -	char *ssp;		/* start of string matched by subsubRE */ -	char *dp; +	const char *ssp;	/* start of string matched by subsubRE */ +	const char *dp;  	size_t len;  	int hard;  	sop s; @@ -767,26 +764,25 @@ int rec;  /*   - fast - step through the string at top speed - == static char *fast(struct match *m, char *start, \ - ==	char *stop, sopno startst, sopno stopst); + == static const char *fast(struct match *m, const char *start, \ + ==	const char *stop, sopno startst, sopno stopst);   */ -static char *			/* where tentative match ended, or NULL */ -fast(m, start, stop, startst, stopst) -struct match *m; -char *start; -char *stop; -sopno startst; -sopno stopst; +static const char *		/* where tentative match ended, or NULL */ +fast(	struct match *m, +	const char *start, +	const char *stop, +	sopno startst, +	sopno stopst)  {  	states st = m->st;  	states fresh = m->fresh;  	states tmp = m->tmp; -	char *p = start; +	const char *p = start;  	wint_t c;  	wint_t lastc;		/* previous c */  	wint_t flagch;  	int i; -	char *coldp;		/* last p after which no match was underway */ +	const char *coldp;	/* last p after which no match was underway */  	size_t clen;  	CLEAR(st); @@ -873,26 +869,25 @@ sopno stopst;  /*   - slow - step through the string more deliberately - == static char *slow(struct match *m, char *start, \ - ==	char *stop, sopno startst, sopno stopst); + == static const char *slow(struct match *m, const char *start, \ + ==	const char *stop, sopno startst, sopno stopst);   */ -static char *			/* where it ended */ -slow(m, start, stop, startst, stopst) -struct match *m; -char *start; -char *stop; -sopno startst; -sopno stopst; +static const char *		/* where it ended */ +slow(	struct match *m, +	const char *start, +	const char *stop, +	sopno startst, +	sopno stopst)  {  	states st = m->st;  	states empty = m->empty;  	states tmp = m->tmp; -	char *p = start; +	const char *p = start;  	wint_t c;  	wint_t lastc;		/* previous c */  	wint_t flagch;  	int i; -	char *matchp;		/* last p at which a match ended */ +	const char *matchp;	/* last p at which a match ended */  	size_t clen;  	AT("slow", start, stop, startst, stopst); @@ -987,13 +982,12 @@ sopno stopst;   == #define	NONCHAR(c)	((c) <= OUT)   */  static states -step(g, start, stop, bef, ch, aft) -struct re_guts *g; -sopno start;			/* start state within strip */ -sopno stop;			/* state after stop state within strip */ -states bef;			/* states reachable before */ -wint_t ch;			/* character or NONCHAR code */ -states aft;			/* states already known reachable after */ +step(struct re_guts *g, +	sopno start,		/* start state within strip */ +	sopno stop,		/* state after stop state within strip */ +	states bef,		/* states reachable before */ +	wint_t ch,		/* character or NONCHAR code */ +	states aft)		/* states already known reachable after */  {  	cset *cs;  	sop s; @@ -1104,17 +1098,16 @@ 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, const char *caption, states st, \   ==	int ch, FILE *d);   == #endif   */  static void -print(m, caption, st, ch, d) -struct match *m; -char *caption; -states st; -int ch; -FILE *d; +print(struct match *m, +	const char *caption, +	states st, +	int ch, +	FILE *d)  {  	struct re_guts *g = m->g;  	int i; @@ -1137,18 +1130,17 @@ FILE *d;  /*   - at - print current situation   == #ifdef REDEBUG - == static void at(struct match *m, char *title, char *start, char *stop, \ - ==						sopno startst, sopno stopst); + == static void at(struct match *m, const char *title, const char *start, \ + ==			 const 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; -sopno startst; -sopno stopst; +at(	struct match *m, +	const char *title, +	const char *start, +	const char *stop, +	sopno startst, +	sopno stopst)  {  	if (!(m->eflags®_TRACE))  		return; @@ -1163,7 +1155,7 @@ sopno stopst;  /*   - pchar - make a character printable   == #ifdef REDEBUG - == static char *pchar(int ch); + == static const char *pchar(int ch);   == #endif   *   * Is this identical to regchar() over in debug.c?  Well, yes.  But a @@ -1171,9 +1163,8 @@ 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 */ -pchar(ch) -int ch; +static const char *		/* -> representation */ +pchar(int ch)  {  	static char pbuf[10];  | 
