diff options
author | Fredrik Lundh <fredrik@pythonware.com> | 2006-05-26 17:22:38 (GMT) |
---|---|---|
committer | Fredrik Lundh <fredrik@pythonware.com> | 2006-05-26 17:22:38 (GMT) |
commit | b947948c6148cdb5ebd75fb5f9ff66b598c4ead0 (patch) | |
tree | bb82671273b2c79c04c005b6aa8cc3a65a00a796 /Objects/stringlib/partition.h | |
parent | 69bfaab304e112f8f54b256d15753c308dec478f (diff) | |
download | cpython-b947948c6148cdb5ebd75fb5f9ff66b598c4ead0.zip cpython-b947948c6148cdb5ebd75fb5f9ff66b598c4ead0.tar.gz cpython-b947948c6148cdb5ebd75fb5f9ff66b598c4ead0.tar.bz2 |
needforspeed: stringlib refactoring (in progress)
Diffstat (limited to 'Objects/stringlib/partition.h')
-rw-r--r-- | Objects/stringlib/partition.h | 50 |
1 files changed, 50 insertions, 0 deletions
diff --git a/Objects/stringlib/partition.h b/Objects/stringlib/partition.h new file mode 100644 index 0000000..498bc19 --- /dev/null +++ b/Objects/stringlib/partition.h @@ -0,0 +1,50 @@ +/* stringlib: partition implementation */ + +#ifndef STRINGLIB_PARTITION_H +#define STRINGLIB_PARTITION_H + +#include "stringlib/fastsearch.h" + +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* 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; + + pos = fastsearch(str, str_len, sep, sep_len, FAST_SEARCH); + + 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 |