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 /Objects/stringlib | |
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
Diffstat (limited to 'Objects/stringlib')
-rw-r--r-- | Objects/stringlib/count.h | 34 | ||||
-rw-r--r-- | Objects/stringlib/find.h | 49 | ||||
-rw-r--r-- | Objects/stringlib/partition.h | 16 |
3 files changed, 95 insertions, 4 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; |