diff options
author | Fredrik Lundh <fredrik@pythonware.com> | 2006-05-26 19:24:53 (GMT) |
---|---|---|
committer | Fredrik Lundh <fredrik@pythonware.com> | 2006-05-26 19:24:53 (GMT) |
commit | 58b5e84d52bc15ff1cae26ecff36e5a99d6715b6 (patch) | |
tree | 0884631f9ac8578ce1c94c6fa372494265524ba8 | |
parent | a26de2a80fce5070155b3facb126c176988f4513 (diff) | |
download | cpython-58b5e84d52bc15ff1cae26ecff36e5a99d6715b6.zip cpython-58b5e84d52bc15ff1cae26ecff36e5a99d6715b6.tar.gz cpython-58b5e84d52bc15ff1cae26ecff36e5a99d6715b6.tar.bz2 |
needforspeed: stringlib refactoring, continued. added count and
find helpers; updated unicodeobject to use stringlib_count
-rw-r--r-- | Objects/stringlib/count.h | 34 | ||||
-rw-r--r-- | Objects/stringlib/find.h | 49 | ||||
-rw-r--r-- | Objects/stringlib/partition.h | 16 | ||||
-rw-r--r-- | Objects/stringobject.c | 4 | ||||
-rw-r--r-- | Objects/unicodeobject.c | 82 |
5 files changed, 132 insertions, 53 deletions
diff --git a/Objects/stringlib/count.h b/Objects/stringlib/count.h new file mode 100644 index 0000000..0036f63 --- /dev/null +++ b/Objects/stringlib/count.h @@ -0,0 +1,34 @@ +/* stringlib: count implementation */ + +#ifndef STRINGLIB_COUNT_H +#define STRINGLIB_COUNT_H + +#ifndef STRINGLIB_FASTSEARCH_H +#error must include "stringlib/fastsearch.h" before including this module +#endif + +Py_LOCAL(Py_ssize_t) +stringlib_count(const STRINGLIB_CHAR* str, Py_ssize_t str_len, + const STRINGLIB_CHAR* sub, Py_ssize_t sub_len) +{ + Py_ssize_t count; + + if (sub_len == 0) + return str_len + 1; + + count = fastsearch(str, str_len, sub, sub_len, FAST_COUNT); + + if (count < 0) + count = 0; /* no match */ + + return count; +} + +#endif + +/* +Local variables: +c-basic-offset: 4 +indent-tabs-mode: nil +End: +*/ diff --git a/Objects/stringlib/find.h b/Objects/stringlib/find.h new file mode 100644 index 0000000..c2399ad --- /dev/null +++ b/Objects/stringlib/find.h @@ -0,0 +1,49 @@ +/* stringlib: find/index implementation */ + +#ifndef STRINGLIB_FIND_H +#define STRINGLIB_FIND_H + +#ifndef STRINGLIB_FASTSEARCH_H +#error must include "stringlib/fastsearch.h" before including this module +#endif + +Py_LOCAL(Py_ssize_t) +stringlib_find(const STRINGLIB_CHAR* str, Py_ssize_t str_len, + const STRINGLIB_CHAR* sub, Py_ssize_t sub_len) +{ + if (sub_len == 0) + return 0; + + return fastsearch(str, str_len, sub, sub_len, FAST_SEARCH); +} + +Py_LOCAL(Py_ssize_t) +stringlib_rfind(const STRINGLIB_CHAR* str, Py_ssize_t str_len, + const STRINGLIB_CHAR* sub, Py_ssize_t sub_len) +{ + Py_ssize_t pos; + + /* XXX - create reversefastsearch helper! */ + if (sub_len == 0) + pos = str_len; + else { + Py_ssize_t j; + pos = -1; + for (j = str_len - sub_len; j >= 0; --j) + if (STRINGLIB_CMP(str+j, sub, sub_len) == 0) { + pos = j; + break; + } + } + + return pos; +} + +#endif + +/* +Local variables: +c-basic-offset: 4 +indent-tabs-mode: nil +End: +*/ diff --git a/Objects/stringlib/partition.h b/Objects/stringlib/partition.h index 71e80a9..8cc7abe 100644 --- a/Objects/stringlib/partition.h +++ b/Objects/stringlib/partition.h @@ -3,9 +3,15 @@ #ifndef STRINGLIB_PARTITION_H #define STRINGLIB_PARTITION_H +#ifndef STRINGLIB_FASTSEARCH_H +#error must include "stringlib/fastsearch.h" before including this module +#endif + Py_LOCAL(PyObject*) -partition(PyObject* str_obj, const STRINGLIB_CHAR* str, Py_ssize_t str_len, - PyObject* sep_obj, const STRINGLIB_CHAR* sep, Py_ssize_t sep_len) +stringlib_partition( + PyObject* str_obj, const STRINGLIB_CHAR* str, Py_ssize_t str_len, + PyObject* sep_obj, const STRINGLIB_CHAR* sep, Py_ssize_t sep_len + ) { PyObject* out; Py_ssize_t pos; @@ -46,8 +52,10 @@ partition(PyObject* str_obj, const STRINGLIB_CHAR* str, Py_ssize_t str_len, } Py_LOCAL(PyObject*) -rpartition(PyObject* str_obj, const STRINGLIB_CHAR* str, Py_ssize_t str_len, - PyObject* sep_obj, const STRINGLIB_CHAR* sep, Py_ssize_t sep_len) +stringlib_rpartition( + PyObject* str_obj, const STRINGLIB_CHAR* str, Py_ssize_t str_len, + PyObject* sep_obj, const STRINGLIB_CHAR* sep, Py_ssize_t sep_len + ) { PyObject* out; Py_ssize_t pos; diff --git a/Objects/stringobject.c b/Objects/stringobject.c index 5d57f15..75325ab 100644 --- a/Objects/stringobject.c +++ b/Objects/stringobject.c @@ -1548,7 +1548,7 @@ string_partition(PyStringObject *self, PyObject *sep_obj) else if (PyObject_AsCharBuffer(sep_obj, &sep, &sep_len)) return NULL; - return partition( + return stringlib_partition( (PyObject*) self, PyString_AS_STRING(self), PyString_GET_SIZE(self), sep_obj, sep, sep_len @@ -1579,7 +1579,7 @@ string_rpartition(PyStringObject *self, PyObject *sep_obj) else if (PyObject_AsCharBuffer(sep_obj, &sep, &sep_len)) return NULL; - return rpartition( + return stringlib_rpartition( (PyObject*) self, PyString_AS_STRING(self), PyString_GET_SIZE(self), sep_obj, sep, sep_len diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c index 7d644d3..596bd10 100644 --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -3869,63 +3869,47 @@ STRINGLIB_CMP(const Py_UNICODE* str, const Py_UNICODE* other, Py_ssize_t len) #define STRINGLIB_EMPTY unicode_empty #include "stringlib/fastsearch.h" -#include "stringlib/partition.h" +#include "stringlib/count.h" +#include "stringlib/find.h" +#include "stringlib/partition.h" -Py_LOCAL(Py_ssize_t) count(PyUnicodeObject *self, +Py_ssize_t PyUnicode_Count(PyObject *str, + PyObject *substr, Py_ssize_t start, - Py_ssize_t end, - PyUnicodeObject *substring) + Py_ssize_t end) { - Py_ssize_t count = 0; + Py_ssize_t result; + PyUnicodeObject* str_obj; + PyUnicodeObject* sub_obj; + + str_obj = (PyUnicodeObject*) PyUnicode_FromObject(str); + if (!str_obj) + return -1; + sub_obj = (PyUnicodeObject*) PyUnicode_FromObject(substr); + if (!sub_obj) { + Py_DECREF(str_obj); + return -1; + } if (start < 0) - start += self->length; + start += str_obj->length; if (start < 0) start = 0; - if (end > self->length) - end = self->length; + if (end > str_obj->length) + end = str_obj->length; if (end < 0) - end += self->length; + end += str_obj->length; if (end < 0) end = 0; - if (substring->length == 0) - return (end - start + 1); - - count = fastsearch( - PyUnicode_AS_UNICODE(self) + start, end - start, - substring->str, substring->length, FAST_COUNT + result = stringlib_count( + str_obj->str + start, end - start, sub_obj->str, sub_obj->length ); - if (count < 0) - count = 0; /* no match */ - - return count; -} - -Py_ssize_t PyUnicode_Count(PyObject *str, - PyObject *substr, - Py_ssize_t start, - Py_ssize_t end) -{ - Py_ssize_t result; - - str = PyUnicode_FromObject(str); - if (str == NULL) - return -1; - substr = PyUnicode_FromObject(substr); - if (substr == NULL) { - Py_DECREF(str); - return -1; - } - - result = count((PyUnicodeObject *)str, - start, end, - (PyUnicodeObject *)substr); + Py_DECREF(sub_obj); + Py_DECREF(str_obj); - Py_DECREF(str); - Py_DECREF(substr); return result; } @@ -4767,7 +4751,7 @@ PyObject *replace(PyUnicodeObject *self, Py_UNICODE *p; /* replace strings */ - n = count(self, 0, self->length, str1); + n = stringlib_count(self->str, self->length, str1->str, str1->length); if (n > maxcount) n = maxcount; if (n == 0) @@ -5162,7 +5146,7 @@ unicode_count(PyUnicodeObject *self, PyObject *args) return NULL; substring = (PyUnicodeObject *)PyUnicode_FromObject( - (PyObject *)substring); + (PyObject *)substring); if (substring == NULL) return NULL; @@ -5177,9 +5161,13 @@ unicode_count(PyUnicodeObject *self, PyObject *args) if (end < 0) end = 0; - result = PyInt_FromSsize_t(count(self, start, end, substring)); + result = PyInt_FromSsize_t( + stringlib_count(self->str + start, end - start, + substring->str, substring->length) + ); Py_DECREF(substring); + return result; } @@ -6222,7 +6210,7 @@ PyUnicode_Partition(PyObject *str_in, PyObject *sep_in) return NULL; } - out = partition( + out = stringlib_partition( str_obj, PyUnicode_AS_UNICODE(str_obj), PyUnicode_GET_SIZE(str_obj), sep_obj, PyUnicode_AS_UNICODE(sep_obj), PyUnicode_GET_SIZE(sep_obj) ); @@ -6250,7 +6238,7 @@ PyUnicode_RPartition(PyObject *str_in, PyObject *sep_in) return NULL; } - out = rpartition( + out = stringlib_rpartition( str_obj, PyUnicode_AS_UNICODE(str_obj), PyUnicode_GET_SIZE(str_obj), sep_obj, PyUnicode_AS_UNICODE(sep_obj), PyUnicode_GET_SIZE(sep_obj) ); |