Line data Source code
1 : /* stringlib: partition implementation */
2 :
3 : #ifndef STRINGLIB_PARTITION_H
4 : #define STRINGLIB_PARTITION_H
5 :
6 : #ifndef STRINGLIB_FASTSEARCH_H
7 : #error must include "stringlib/fastsearch.h" before including this module
8 : #endif
9 :
10 : Py_LOCAL_INLINE(PyObject*)
11 0 : stringlib_partition(PyObject* str_obj,
12 : const STRINGLIB_CHAR* str, Py_ssize_t str_len,
13 : PyObject* sep_obj,
14 : const STRINGLIB_CHAR* sep, Py_ssize_t sep_len)
15 : {
16 : PyObject* out;
17 : Py_ssize_t pos;
18 :
19 0 : if (sep_len == 0) {
20 0 : PyErr_SetString(PyExc_ValueError, "empty separator");
21 0 : return NULL;
22 : }
23 :
24 0 : out = PyTuple_New(3);
25 0 : if (!out)
26 0 : return NULL;
27 :
28 0 : pos = fastsearch(str, str_len, sep, sep_len, -1, FAST_SEARCH);
29 :
30 0 : if (pos < 0) {
31 : #if STRINGLIB_MUTABLE
32 0 : PyTuple_SET_ITEM(out, 0, STRINGLIB_NEW(str, str_len));
33 0 : PyTuple_SET_ITEM(out, 1, STRINGLIB_NEW(NULL, 0));
34 0 : PyTuple_SET_ITEM(out, 2, STRINGLIB_NEW(NULL, 0));
35 : #else
36 0 : Py_INCREF(str_obj);
37 0 : PyTuple_SET_ITEM(out, 0, (PyObject*) str_obj);
38 0 : Py_INCREF(STRINGLIB_EMPTY);
39 0 : PyTuple_SET_ITEM(out, 1, (PyObject*) STRINGLIB_EMPTY);
40 0 : Py_INCREF(STRINGLIB_EMPTY);
41 0 : PyTuple_SET_ITEM(out, 2, (PyObject*) STRINGLIB_EMPTY);
42 : #endif
43 0 : return out;
44 : }
45 :
46 0 : PyTuple_SET_ITEM(out, 0, STRINGLIB_NEW(str, pos));
47 0 : Py_INCREF(sep_obj);
48 0 : PyTuple_SET_ITEM(out, 1, sep_obj);
49 0 : pos += sep_len;
50 0 : PyTuple_SET_ITEM(out, 2, STRINGLIB_NEW(str + pos, str_len - pos));
51 :
52 0 : if (PyErr_Occurred()) {
53 0 : Py_DECREF(out);
54 0 : return NULL;
55 : }
56 :
57 0 : return out;
58 : }
59 :
60 : Py_LOCAL_INLINE(PyObject*)
61 0 : stringlib_rpartition(PyObject* str_obj,
62 : const STRINGLIB_CHAR* str, Py_ssize_t str_len,
63 : PyObject* sep_obj,
64 : const STRINGLIB_CHAR* sep, Py_ssize_t sep_len)
65 : {
66 : PyObject* out;
67 : Py_ssize_t pos;
68 :
69 0 : if (sep_len == 0) {
70 0 : PyErr_SetString(PyExc_ValueError, "empty separator");
71 0 : return NULL;
72 : }
73 :
74 0 : out = PyTuple_New(3);
75 0 : if (!out)
76 0 : return NULL;
77 :
78 0 : pos = fastsearch(str, str_len, sep, sep_len, -1, FAST_RSEARCH);
79 :
80 0 : if (pos < 0) {
81 : #if STRINGLIB_MUTABLE
82 0 : PyTuple_SET_ITEM(out, 0, STRINGLIB_NEW(NULL, 0));
83 0 : PyTuple_SET_ITEM(out, 1, STRINGLIB_NEW(NULL, 0));
84 0 : PyTuple_SET_ITEM(out, 2, STRINGLIB_NEW(str, str_len));
85 : #else
86 0 : Py_INCREF(STRINGLIB_EMPTY);
87 0 : PyTuple_SET_ITEM(out, 0, (PyObject*) STRINGLIB_EMPTY);
88 0 : Py_INCREF(STRINGLIB_EMPTY);
89 0 : PyTuple_SET_ITEM(out, 1, (PyObject*) STRINGLIB_EMPTY);
90 0 : Py_INCREF(str_obj);
91 0 : PyTuple_SET_ITEM(out, 2, (PyObject*) str_obj);
92 : #endif
93 0 : return out;
94 : }
95 :
96 0 : PyTuple_SET_ITEM(out, 0, STRINGLIB_NEW(str, pos));
97 0 : Py_INCREF(sep_obj);
98 0 : PyTuple_SET_ITEM(out, 1, sep_obj);
99 0 : pos += sep_len;
100 0 : PyTuple_SET_ITEM(out, 2, STRINGLIB_NEW(str + pos, str_len - pos));
101 :
102 0 : if (PyErr_Occurred()) {
103 0 : Py_DECREF(out);
104 0 : return NULL;
105 : }
106 :
107 0 : return out;
108 : }
109 :
110 : #endif
|