1 /* stringlib: partition implementation */
3 #ifndef STRINGLIB_PARTITION_H
4 #define STRINGLIB_PARTITION_H
6 #ifndef STRINGLIB_FASTSEARCH_H
7 #error must include "stringlib/fastsearch.h" before including this module
10 Py_LOCAL_INLINE(PyObject
*)
12 PyObject
* str_obj
, const STRINGLIB_CHAR
* str
, Py_ssize_t str_len
,
13 PyObject
* sep_obj
, const STRINGLIB_CHAR
* sep
, Py_ssize_t sep_len
20 PyErr_SetString(PyExc_ValueError
, "empty separator");
28 pos
= fastsearch(str
, str_len
, sep
, sep_len
, FAST_SEARCH
);
32 PyTuple_SET_ITEM(out
, 0, (PyObject
*) str_obj
);
33 Py_INCREF(STRINGLIB_EMPTY
);
34 PyTuple_SET_ITEM(out
, 1, (PyObject
*) STRINGLIB_EMPTY
);
35 Py_INCREF(STRINGLIB_EMPTY
);
36 PyTuple_SET_ITEM(out
, 2, (PyObject
*) STRINGLIB_EMPTY
);
40 PyTuple_SET_ITEM(out
, 0, STRINGLIB_NEW(str
, pos
));
42 PyTuple_SET_ITEM(out
, 1, sep_obj
);
44 PyTuple_SET_ITEM(out
, 2, STRINGLIB_NEW(str
+ pos
, str_len
- pos
));
46 if (PyErr_Occurred()) {
54 Py_LOCAL_INLINE(PyObject
*)
56 PyObject
* str_obj
, const STRINGLIB_CHAR
* str
, Py_ssize_t str_len
,
57 PyObject
* sep_obj
, const STRINGLIB_CHAR
* sep
, Py_ssize_t sep_len
64 PyErr_SetString(PyExc_ValueError
, "empty separator");
72 /* XXX - create reversefastsearch helper! */
74 for (j
= str_len
- sep_len
; j
>= 0; --j
)
75 if (STRINGLIB_CMP(str
+j
, sep
, sep_len
) == 0) {
81 Py_INCREF(STRINGLIB_EMPTY
);
82 PyTuple_SET_ITEM(out
, 0, (PyObject
*) STRINGLIB_EMPTY
);
83 Py_INCREF(STRINGLIB_EMPTY
);
84 PyTuple_SET_ITEM(out
, 1, (PyObject
*) STRINGLIB_EMPTY
);
86 PyTuple_SET_ITEM(out
, 2, (PyObject
*) str_obj
);
90 PyTuple_SET_ITEM(out
, 0, STRINGLIB_NEW(str
, pos
));
92 PyTuple_SET_ITEM(out
, 1, sep_obj
);
94 PyTuple_SET_ITEM(out
, 2, STRINGLIB_NEW(str
+ pos
, str_len
- pos
));
96 if (PyErr_Occurred()) {
109 indent-tabs-mode: nil