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