needforspeed: stringlib refactoring (in progress)
This commit is contained in:
parent
69bfaab304
commit
b947948c61
|
@ -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
|
|
@ -772,8 +772,11 @@ PyString_AsStringAndSize(register PyObject *obj,
|
||||||
#ifdef USE_FAST
|
#ifdef USE_FAST
|
||||||
|
|
||||||
#define STRINGLIB_CHAR char
|
#define STRINGLIB_CHAR char
|
||||||
|
#define STRINGLIB_NEW PyString_FromStringAndSize
|
||||||
|
#define STRINGLIB_EMPTY nullstring
|
||||||
|
|
||||||
#include "stringlib/fastsearch.h"
|
#include "stringlib/fastsearch.h"
|
||||||
|
#include "stringlib/partition.h"
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -1541,9 +1544,8 @@ found, returns S and two empty strings.");
|
||||||
static PyObject *
|
static PyObject *
|
||||||
string_partition(PyStringObject *self, PyObject *sep_obj)
|
string_partition(PyStringObject *self, PyObject *sep_obj)
|
||||||
{
|
{
|
||||||
Py_ssize_t len = PyString_GET_SIZE(self), sep_len, pos;
|
Py_ssize_t str_len = PyString_GET_SIZE(self), sep_len;
|
||||||
const char *str = PyString_AS_STRING(self), *sep;
|
const char *str = PyString_AS_STRING(self), *sep;
|
||||||
PyObject * out;
|
|
||||||
|
|
||||||
if (PyString_Check(sep_obj)) {
|
if (PyString_Check(sep_obj)) {
|
||||||
sep = PyString_AS_STRING(sep_obj);
|
sep = PyString_AS_STRING(sep_obj);
|
||||||
|
@ -1556,38 +1558,7 @@ string_partition(PyStringObject *self, PyObject *sep_obj)
|
||||||
else if (PyObject_AsCharBuffer(sep_obj, &sep, &sep_len))
|
else if (PyObject_AsCharBuffer(sep_obj, &sep, &sep_len))
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
if (sep_len == 0) {
|
return partition((PyObject*)self, str, str_len, sep_obj, sep, sep_len);
|
||||||
PyErr_SetString(PyExc_ValueError, "empty separator");
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
out = PyTuple_New(3);
|
|
||||||
if (!out)
|
|
||||||
return NULL;
|
|
||||||
|
|
||||||
pos = fastsearch(str, len, sep, sep_len, FAST_SEARCH);
|
|
||||||
if (pos < 0) {
|
|
||||||
Py_INCREF(self);
|
|
||||||
PyTuple_SET_ITEM(out, 0, (PyObject*) self);
|
|
||||||
Py_INCREF(nullstring);
|
|
||||||
PyTuple_SET_ITEM(out, 1, (PyObject*) nullstring);
|
|
||||||
Py_INCREF(nullstring);
|
|
||||||
PyTuple_SET_ITEM(out, 2, (PyObject*) nullstring);
|
|
||||||
} else {
|
|
||||||
PyObject* obj;
|
|
||||||
PyTuple_SET_ITEM(out, 0, PyString_FromStringAndSize(str, pos));
|
|
||||||
Py_INCREF(sep_obj);
|
|
||||||
PyTuple_SET_ITEM(out, 1, sep_obj);
|
|
||||||
pos += sep_len;
|
|
||||||
obj = PyString_FromStringAndSize(str + pos, len - pos);
|
|
||||||
PyTuple_SET_ITEM(out, 2, obj);
|
|
||||||
if (PyErr_Occurred()) {
|
|
||||||
Py_DECREF(out);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return out;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Py_LOCAL(PyObject *)
|
Py_LOCAL(PyObject *)
|
||||||
|
|
|
@ -3856,7 +3856,13 @@ int PyUnicode_EncodeDecimal(Py_UNICODE *s,
|
||||||
|
|
||||||
#define STRINGLIB_CHAR Py_UNICODE
|
#define STRINGLIB_CHAR Py_UNICODE
|
||||||
|
|
||||||
|
#define STRINGLIB_NEW PyUnicode_FromUnicode
|
||||||
|
|
||||||
|
#define STRINGLIB_EMPTY unicode_empty
|
||||||
|
|
||||||
#include "stringlib/fastsearch.h"
|
#include "stringlib/fastsearch.h"
|
||||||
|
#include "stringlib/partition.h"
|
||||||
|
|
||||||
|
|
||||||
Py_LOCAL(Py_ssize_t) count(PyUnicodeObject *self,
|
Py_LOCAL(Py_ssize_t) count(PyUnicodeObject *self,
|
||||||
Py_ssize_t start,
|
Py_ssize_t start,
|
||||||
|
@ -6197,59 +6203,26 @@ PyUnicode_Partition(PyObject *str_in, PyObject *sep_in)
|
||||||
{
|
{
|
||||||
PyObject* str_obj;
|
PyObject* str_obj;
|
||||||
PyObject* sep_obj;
|
PyObject* sep_obj;
|
||||||
Py_UNICODE *str, *sep;
|
|
||||||
Py_ssize_t len, sep_len, pos;
|
|
||||||
PyObject* out;
|
PyObject* out;
|
||||||
|
|
||||||
str_obj = PyUnicode_FromObject(str_in);
|
str_obj = PyUnicode_FromObject(str_in);
|
||||||
if (!str_obj)
|
if (!str_obj)
|
||||||
return NULL;
|
return NULL;
|
||||||
sep_obj = PyUnicode_FromObject(sep_in);
|
sep_obj = PyUnicode_FromObject(sep_in);
|
||||||
if (!sep_obj)
|
if (!sep_obj) {
|
||||||
goto error;
|
|
||||||
|
|
||||||
str = PyUnicode_AS_UNICODE(str_obj);
|
|
||||||
len = PyUnicode_GET_SIZE(str_obj);
|
|
||||||
|
|
||||||
sep = PyUnicode_AS_UNICODE(sep_obj);
|
|
||||||
sep_len = PyUnicode_GET_SIZE(sep_obj);
|
|
||||||
|
|
||||||
if (sep_len == 0) {
|
|
||||||
PyErr_SetString(PyExc_ValueError, "empty separator");
|
|
||||||
goto error;
|
|
||||||
}
|
|
||||||
|
|
||||||
out = PyTuple_New(3);
|
|
||||||
if (!out)
|
|
||||||
goto error;
|
|
||||||
|
|
||||||
pos = fastsearch(str, len, sep, sep_len, FAST_SEARCH);
|
|
||||||
if (pos < 0) {
|
|
||||||
Py_INCREF(str_obj);
|
|
||||||
PyTuple_SET_ITEM(out, 0, (PyObject*) str_obj);
|
|
||||||
Py_INCREF(unicode_empty);
|
|
||||||
PyTuple_SET_ITEM(out, 1, (PyObject*) unicode_empty);
|
|
||||||
Py_INCREF(unicode_empty);
|
|
||||||
PyTuple_SET_ITEM(out, 2, (PyObject*) unicode_empty);
|
|
||||||
} else {
|
|
||||||
PyObject* obj;
|
|
||||||
PyTuple_SET_ITEM(out, 0, PyUnicode_FromUnicode(str, pos));
|
|
||||||
Py_INCREF(sep_obj);
|
|
||||||
PyTuple_SET_ITEM(out, 1, sep_obj);
|
|
||||||
obj = PyUnicode_FromUnicode(str + sep_len + pos, len - sep_len - pos);
|
|
||||||
PyTuple_SET_ITEM(out, 2, obj);
|
|
||||||
if (PyErr_Occurred()) {
|
|
||||||
Py_DECREF(out);
|
|
||||||
goto error;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return out;
|
|
||||||
|
|
||||||
error:
|
|
||||||
Py_XDECREF(sep_obj);
|
|
||||||
Py_DECREF(str_obj);
|
Py_DECREF(str_obj);
|
||||||
return NULL;
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
out = 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)
|
||||||
|
);
|
||||||
|
|
||||||
|
Py_DECREF(sep_obj);
|
||||||
|
Py_DECREF(str_obj);
|
||||||
|
|
||||||
|
return out;
|
||||||
}
|
}
|
||||||
|
|
||||||
PyDoc_STRVAR(partition__doc__,
|
PyDoc_STRVAR(partition__doc__,
|
||||||
|
|
Loading…
Reference in New Issue