diff options
Diffstat (limited to 'Objects/stringobject.c')
| -rw-r--r-- | Objects/stringobject.c | 99 | 
1 files changed, 7 insertions, 92 deletions
diff --git a/Objects/stringobject.c b/Objects/stringobject.c index fcd50cd..138ebfe 100644 --- a/Objects/stringobject.c +++ b/Objects/stringobject.c @@ -765,102 +765,17 @@ PyString_AsStringAndSize(register PyObject *obj,  }  /* -------------------------------------------------------------------- */ -/* Helpers */ +/* stringlib components */ -#define USE_FAST /* experimental fast search implementation */ +#define USE_FAST -/* XXX - this code is copied from unicodeobject.c.  we really should -   refactor the core implementations (see _sre.c for how this can be -   done), but that'll have to wait -- fredrik */ - -/* fast search/count implementation, based on a mix between boyer- -   moore and horspool, with a few more bells and whistles on the top. -   for some more background, see: http://effbot.org/stringlib */ - -/* note: fastsearch may access s[n], which isn't a problem when using -   Python's ordinary string types, but may cause problems if you're -   using this code in other contexts.  also, the count mode returns -1 -   if there cannot possibly be a match in the target string, and 0 if -   it has actually checked for matches, but didn't find any.  callers -   beware! */ - -#define FAST_COUNT 0 -#define FAST_SEARCH 1 - -Py_LOCAL(Py_ssize_t) -fastsearch(const char* s, Py_ssize_t n, const char* p, Py_ssize_t m, int mode) -{ -	long mask; -	Py_ssize_t skip, count = 0; -	Py_ssize_t i, j, mlast, w; - -	w = n - m; - -	if (w < 0) -		return -1; +#ifdef USE_FAST -	/* look for special cases */ -	if (m <= 1) { -		if (m <= 0) -			return -1; -		/* use special case for 1-character strings */ -		if (mode == FAST_COUNT) { -			for (i = 0; i < n; i++) -				if (s[i] == p[0]) -					count++; -			return count; -		} else { -			for (i = 0; i < n; i++) -				if (s[i] == p[0]) -					return i; -		} -		return -1; -	} +#define STRINGLIB_CHAR char -	mlast = m - 1; - -	/* create compressed boyer-moore delta 1 table */ -	skip = mlast - 1; -	/* process pattern[:-1] */ -	for (mask = i = 0; i < mlast; i++) { -		mask |= (1 << (p[i] & 0x1F)); -		if (p[i] == p[mlast]) -			skip = mlast - i - 1; -	} -	/* process pattern[-1] outside the loop */ -	mask |= (1 << (p[mlast] & 0x1F)); - -	for (i = 0; i <= w; i++) { -		/* note: using mlast in the skip path slows things down on x86 */ -		if (s[i+m-1] == p[m-1]) { -			/* candidate match */ -			for (j = 0; j < mlast; j++) -				if (s[i+j] != p[j]) -					break; -			if (j == mlast) { -				/* got a match! */ -				if (mode != FAST_COUNT) -					return i; -				count++; -				i = i + mlast; -				continue; -			} -			/* miss: check if next character is part of pattern */ -			if (!(mask & (1 << (s[i+m] & 0x1F)))) -				i = i + m; -			else -				i = i + skip; -		} else { -			/* skip: check if next character is part of pattern */ -			if (!(mask & (1 << (s[i+m] & 0x1F)))) -				i = i + m; -		} -	} +#include "stringlib/fastsearch.h" -	if (mode != FAST_COUNT) -		return -1; -	return count; -} +#endif  /* -------------------------------------------------------------------- */  /* Methods */ @@ -2416,7 +2331,7 @@ string_count(PyStringObject *self, PyObject *args)  #else  	r = 0;  	while (i < m) { -		const char *t +		const char *t;  		if (!memcmp(s+i, sub, n)) {  			r++;  			i += n;  | 
