blob: 8cc7abeaaf62ac4f5c632f30fb4d1a5554aac659 [file] [log] [blame]
Fredrik Lundhb9479482006-05-26 17:22:38 +00001/* stringlib: partition implementation */
2
3#ifndef STRINGLIB_PARTITION_H
4#define STRINGLIB_PARTITION_H
5
Fredrik Lundh58b5e842006-05-26 19:24:53 +00006#ifndef STRINGLIB_FASTSEARCH_H
7#error must include "stringlib/fastsearch.h" before including this module
8#endif
9
Fredrik Lundhb9479482006-05-26 17:22:38 +000010Py_LOCAL(PyObject*)
Fredrik Lundh58b5e842006-05-26 19:24:53 +000011stringlib_partition(
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
14 )
Fredrik Lundhb9479482006-05-26 17:22:38 +000015{
16 PyObject* out;
17 Py_ssize_t pos;
18
19 if (sep_len == 0) {
20 PyErr_SetString(PyExc_ValueError, "empty separator");
21 return NULL;
22 }
23
24 out = PyTuple_New(3);
25 if (!out)
26 return NULL;
27
28 pos = fastsearch(str, str_len, sep, sep_len, FAST_SEARCH);
29
30 if (pos < 0) {
31 Py_INCREF(str_obj);
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);
37 return out;
38 }
39
40 PyTuple_SET_ITEM(out, 0, STRINGLIB_NEW(str, pos));
41 Py_INCREF(sep_obj);
42 PyTuple_SET_ITEM(out, 1, sep_obj);
43 pos += sep_len;
44 PyTuple_SET_ITEM(out, 2, STRINGLIB_NEW(str + pos, str_len - pos));
45
46 if (PyErr_Occurred()) {
47 Py_DECREF(out);
48 return NULL;
49 }
50
51 return out;
52}
53
Fredrik Lundhb3167cb2006-05-26 18:15:38 +000054Py_LOCAL(PyObject*)
Fredrik Lundh58b5e842006-05-26 19:24:53 +000055stringlib_rpartition(
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
58 )
Fredrik Lundhb3167cb2006-05-26 18:15:38 +000059{
60 PyObject* out;
61 Py_ssize_t pos;
62
63 if (sep_len == 0) {
64 PyErr_SetString(PyExc_ValueError, "empty separator");
65 return NULL;
66 }
67
68 out = PyTuple_New(3);
69 if (!out)
70 return NULL;
71
72 /* XXX - create reversefastsearch helper! */
73 if (sep_len == 0)
74 pos = str_len;
75 else {
76 Py_ssize_t j;
77 pos = -1;
78 for (j = str_len - sep_len; j >= 0; --j)
79 if (STRINGLIB_CMP(str+j, sep, sep_len) == 0) {
80 pos = j;
81 break;
82 }
83 }
84
85 if (pos < 0) {
86 Py_INCREF(str_obj);
87 PyTuple_SET_ITEM(out, 0, (PyObject*) str_obj);
88 Py_INCREF(STRINGLIB_EMPTY);
89 PyTuple_SET_ITEM(out, 1, (PyObject*) STRINGLIB_EMPTY);
90 Py_INCREF(STRINGLIB_EMPTY);
91 PyTuple_SET_ITEM(out, 2, (PyObject*) STRINGLIB_EMPTY);
92 return out;
93 }
94
95 PyTuple_SET_ITEM(out, 0, STRINGLIB_NEW(str, pos));
96 Py_INCREF(sep_obj);
97 PyTuple_SET_ITEM(out, 1, sep_obj);
98 pos += sep_len;
99 PyTuple_SET_ITEM(out, 2, STRINGLIB_NEW(str + pos, str_len - pos));
100
101 if (PyErr_Occurred()) {
102 Py_DECREF(out);
103 return NULL;
104 }
105
106 return out;
107}
108
Fredrik Lundhb9479482006-05-26 17:22:38 +0000109#endif
Fredrik Lundhb3167cb2006-05-26 18:15:38 +0000110
111/*
112Local variables:
113c-basic-offset: 4
114indent-tabs-mode: nil
115End:
116*/