diff Objects/stringobject.c @ 38381:b32f9bb2e077 legacy-trunk

needforspeed: stringlib refactoring (in progress)
author Fredrik Lundh <fredrik@pythonware.com>
date Fri, 26 May 2006 17:04:58 +0000
parents a16948e9915e
children 05744917b7c3
line wrap: on
line diff
--- a/Objects/stringobject.c	Fri May 26 16:53:04 2006 +0000
+++ b/Objects/stringobject.c	Fri May 26 17:04:58 2006 +0000
@@ -765,102 +765,17 @@
 }
 
 /* -------------------------------------------------------------------- */
-/* Helpers */
-
-#define USE_FAST /* experimental fast search implementation */
-
-/* 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;
-
-	/* 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;
-	}
-
-	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;
-		}
-	}
-
-	if (mode != FAST_COUNT)
-		return -1;
-	return count;
-}
+/* stringlib components */
+
+#define USE_FAST
+
+#ifdef USE_FAST
+
+#define STRINGLIB_CHAR char
+
+#include "stringlib/fastsearch.h"
+
+#endif
 
 /* -------------------------------------------------------------------- */
 /* Methods */
@@ -2416,7 +2331,7 @@
 #else
 	r = 0;
 	while (i < m) {
-		const char *t
+		const char *t;
 		if (!memcmp(s+i, sub, n)) {
 			r++;
 			i += n;