aboutsummaryrefslogtreecommitdiffstats
path: root/contrib/tools/python3/src/Objects/stringlib/partition.h
blob: d47ac35217fdfab26a1ab95698d8abc53bb70d47 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
/* stringlib: partition implementation */ 
 
#ifndef STRINGLIB_FASTSEARCH_H 
#error must include "stringlib/fastsearch.h" before including this module 
#endif 
 
Py_LOCAL_INLINE(PyObject*) 
STRINGLIB(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, -1, FAST_SEARCH); 
 
    if (pos < 0) { 
#if STRINGLIB_MUTABLE 
        PyTuple_SET_ITEM(out, 0, STRINGLIB_NEW(str, str_len)); 
        PyTuple_SET_ITEM(out, 1, STRINGLIB_NEW(NULL, 0)); 
        PyTuple_SET_ITEM(out, 2, STRINGLIB_NEW(NULL, 0)); 
 
        if (PyErr_Occurred()) { 
            Py_DECREF(out); 
            return NULL; 
        } 
#else 
        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); 
#endif 
        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; 
} 
 
Py_LOCAL_INLINE(PyObject*) 
STRINGLIB(rpartition)(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, -1, FAST_RSEARCH); 
 
    if (pos < 0) { 
#if STRINGLIB_MUTABLE 
        PyTuple_SET_ITEM(out, 0, STRINGLIB_NEW(NULL, 0)); 
        PyTuple_SET_ITEM(out, 1, STRINGLIB_NEW(NULL, 0)); 
        PyTuple_SET_ITEM(out, 2, STRINGLIB_NEW(str, str_len)); 
 
        if (PyErr_Occurred()) { 
            Py_DECREF(out); 
            return NULL; 
        } 
#else 
        Py_INCREF(STRINGLIB_EMPTY); 
        PyTuple_SET_ITEM(out, 0, (PyObject*) STRINGLIB_EMPTY); 
        Py_INCREF(STRINGLIB_EMPTY); 
        PyTuple_SET_ITEM(out, 1, (PyObject*) STRINGLIB_EMPTY); 
        Py_INCREF(str_obj); 
        PyTuple_SET_ITEM(out, 2, (PyObject*) str_obj); 
#endif 
        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; 
}