diff options
author | Fredrik Lundh <fredrik@pythonware.com> | 2006-05-26 18:15:38 (GMT) |
---|---|---|
committer | Fredrik Lundh <fredrik@pythonware.com> | 2006-05-26 18:15:38 (GMT) |
commit | b3167cbcd76652f9f5f64196ce371562bcd8d42c (patch) | |
tree | acf09b264580d12fa754dafd9cee44eee5ac236f /Objects/stringlib/partition.h | |
parent | be9f219e40fb0b817bd248234a0b89727b1295e3 (diff) | |
download | cpython-b3167cbcd76652f9f5f64196ce371562bcd8d42c.zip cpython-b3167cbcd76652f9f5f64196ce371562bcd8d42c.tar.gz cpython-b3167cbcd76652f9f5f64196ce371562bcd8d42c.tar.bz2 |
needforspeed: added rpartition implementation
Diffstat (limited to 'Objects/stringlib/partition.h')
-rw-r--r-- | Objects/stringlib/partition.h | 62 |
1 files changed, 61 insertions, 1 deletions
diff --git a/Objects/stringlib/partition.h b/Objects/stringlib/partition.h index 38afb33..71e80a9 100644 --- a/Objects/stringlib/partition.h +++ b/Objects/stringlib/partition.h @@ -5,7 +5,7 @@ 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) + PyObject* sep_obj, const STRINGLIB_CHAR* sep, Py_ssize_t sep_len) { PyObject* out; Py_ssize_t pos; @@ -45,4 +45,64 @@ partition(PyObject* str_obj, const STRINGLIB_CHAR* str, Py_ssize_t str_len, return out; } +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) +{ + PyObject* out; + Py_ssize_t pos; + + if (sep_len == 0) { + PyErr_SetString(PyExc_ValueError, "empty separator"); + return NULL; + } + + out = PyTuple_New(3); + if (!out) + return NULL; + + /* XXX - create reversefastsearch helper! */ + if (sep_len == 0) + pos = str_len; + else { + Py_ssize_t j; + pos = -1; + for (j = str_len - sep_len; j >= 0; --j) + if (STRINGLIB_CMP(str+j, sep, sep_len) == 0) { + pos = j; + break; + } + } + + if (pos < 0) { + Py_INCREF(str_obj); + PyTuple_SET_ITEM(out, 0, (PyObject*) str_obj); + Py_INCREF(STRINGLIB_EMPTY); + PyTuple_SET_ITEM(out, 1, (PyObject*) STRINGLIB_EMPTY); + Py_INCREF(STRINGLIB_EMPTY); + PyTuple_SET_ITEM(out, 2, (PyObject*) STRINGLIB_EMPTY); + return out; + } + + PyTuple_SET_ITEM(out, 0, STRINGLIB_NEW(str, pos)); + Py_INCREF(sep_obj); + PyTuple_SET_ITEM(out, 1, sep_obj); + pos += sep_len; + PyTuple_SET_ITEM(out, 2, STRINGLIB_NEW(str + pos, str_len - pos)); + + if (PyErr_Occurred()) { + Py_DECREF(out); + return NULL; + } + + return out; +} + #endif + +/* +Local variables: +c-basic-offset: 4 +indent-tabs-mode: nil +End: +*/ |