17db96d56Sopenharmony_ci/* stringlib: partition implementation */
27db96d56Sopenharmony_ci
37db96d56Sopenharmony_ci#ifndef STRINGLIB_FASTSEARCH_H
47db96d56Sopenharmony_ci#  error must include "stringlib/fastsearch.h" before including this module
57db96d56Sopenharmony_ci#endif
67db96d56Sopenharmony_ci
77db96d56Sopenharmony_ci#if !STRINGLIB_MUTABLE && !defined(STRINGLIB_GET_EMPTY)
87db96d56Sopenharmony_ci#  error "STRINGLIB_GET_EMPTY must be defined if STRINGLIB_MUTABLE is zero"
97db96d56Sopenharmony_ci#endif
107db96d56Sopenharmony_ci
117db96d56Sopenharmony_ci
127db96d56Sopenharmony_ciPy_LOCAL_INLINE(PyObject*)
137db96d56Sopenharmony_ciSTRINGLIB(partition)(PyObject* str_obj,
147db96d56Sopenharmony_ci                    const STRINGLIB_CHAR* str, Py_ssize_t str_len,
157db96d56Sopenharmony_ci                    PyObject* sep_obj,
167db96d56Sopenharmony_ci                    const STRINGLIB_CHAR* sep, Py_ssize_t sep_len)
177db96d56Sopenharmony_ci{
187db96d56Sopenharmony_ci    PyObject* out;
197db96d56Sopenharmony_ci    Py_ssize_t pos;
207db96d56Sopenharmony_ci
217db96d56Sopenharmony_ci    if (sep_len == 0) {
227db96d56Sopenharmony_ci        PyErr_SetString(PyExc_ValueError, "empty separator");
237db96d56Sopenharmony_ci        return NULL;
247db96d56Sopenharmony_ci    }
257db96d56Sopenharmony_ci
267db96d56Sopenharmony_ci    out = PyTuple_New(3);
277db96d56Sopenharmony_ci    if (!out)
287db96d56Sopenharmony_ci        return NULL;
297db96d56Sopenharmony_ci
307db96d56Sopenharmony_ci    pos = FASTSEARCH(str, str_len, sep, sep_len, -1, FAST_SEARCH);
317db96d56Sopenharmony_ci
327db96d56Sopenharmony_ci    if (pos < 0) {
337db96d56Sopenharmony_ci#if STRINGLIB_MUTABLE
347db96d56Sopenharmony_ci        PyTuple_SET_ITEM(out, 0, STRINGLIB_NEW(str, str_len));
357db96d56Sopenharmony_ci        PyTuple_SET_ITEM(out, 1, STRINGLIB_NEW(NULL, 0));
367db96d56Sopenharmony_ci        PyTuple_SET_ITEM(out, 2, STRINGLIB_NEW(NULL, 0));
377db96d56Sopenharmony_ci
387db96d56Sopenharmony_ci        if (PyErr_Occurred()) {
397db96d56Sopenharmony_ci            Py_DECREF(out);
407db96d56Sopenharmony_ci            return NULL;
417db96d56Sopenharmony_ci        }
427db96d56Sopenharmony_ci#else
437db96d56Sopenharmony_ci        Py_INCREF(str_obj);
447db96d56Sopenharmony_ci        PyTuple_SET_ITEM(out, 0, (PyObject*) str_obj);
457db96d56Sopenharmony_ci        PyObject *empty = (PyObject*)STRINGLIB_GET_EMPTY();
467db96d56Sopenharmony_ci        assert(empty != NULL);
477db96d56Sopenharmony_ci        Py_INCREF(empty);
487db96d56Sopenharmony_ci        PyTuple_SET_ITEM(out, 1, empty);
497db96d56Sopenharmony_ci        Py_INCREF(empty);
507db96d56Sopenharmony_ci        PyTuple_SET_ITEM(out, 2, empty);
517db96d56Sopenharmony_ci#endif
527db96d56Sopenharmony_ci        return out;
537db96d56Sopenharmony_ci    }
547db96d56Sopenharmony_ci
557db96d56Sopenharmony_ci    PyTuple_SET_ITEM(out, 0, STRINGLIB_NEW(str, pos));
567db96d56Sopenharmony_ci    Py_INCREF(sep_obj);
577db96d56Sopenharmony_ci    PyTuple_SET_ITEM(out, 1, sep_obj);
587db96d56Sopenharmony_ci    pos += sep_len;
597db96d56Sopenharmony_ci    PyTuple_SET_ITEM(out, 2, STRINGLIB_NEW(str + pos, str_len - pos));
607db96d56Sopenharmony_ci
617db96d56Sopenharmony_ci    if (PyErr_Occurred()) {
627db96d56Sopenharmony_ci        Py_DECREF(out);
637db96d56Sopenharmony_ci        return NULL;
647db96d56Sopenharmony_ci    }
657db96d56Sopenharmony_ci
667db96d56Sopenharmony_ci    return out;
677db96d56Sopenharmony_ci}
687db96d56Sopenharmony_ci
697db96d56Sopenharmony_ciPy_LOCAL_INLINE(PyObject*)
707db96d56Sopenharmony_ciSTRINGLIB(rpartition)(PyObject* str_obj,
717db96d56Sopenharmony_ci                     const STRINGLIB_CHAR* str, Py_ssize_t str_len,
727db96d56Sopenharmony_ci                     PyObject* sep_obj,
737db96d56Sopenharmony_ci                     const STRINGLIB_CHAR* sep, Py_ssize_t sep_len)
747db96d56Sopenharmony_ci{
757db96d56Sopenharmony_ci    PyObject* out;
767db96d56Sopenharmony_ci    Py_ssize_t pos;
777db96d56Sopenharmony_ci
787db96d56Sopenharmony_ci    if (sep_len == 0) {
797db96d56Sopenharmony_ci        PyErr_SetString(PyExc_ValueError, "empty separator");
807db96d56Sopenharmony_ci        return NULL;
817db96d56Sopenharmony_ci    }
827db96d56Sopenharmony_ci
837db96d56Sopenharmony_ci    out = PyTuple_New(3);
847db96d56Sopenharmony_ci    if (!out)
857db96d56Sopenharmony_ci        return NULL;
867db96d56Sopenharmony_ci
877db96d56Sopenharmony_ci    pos = FASTSEARCH(str, str_len, sep, sep_len, -1, FAST_RSEARCH);
887db96d56Sopenharmony_ci
897db96d56Sopenharmony_ci    if (pos < 0) {
907db96d56Sopenharmony_ci#if STRINGLIB_MUTABLE
917db96d56Sopenharmony_ci        PyTuple_SET_ITEM(out, 0, STRINGLIB_NEW(NULL, 0));
927db96d56Sopenharmony_ci        PyTuple_SET_ITEM(out, 1, STRINGLIB_NEW(NULL, 0));
937db96d56Sopenharmony_ci        PyTuple_SET_ITEM(out, 2, STRINGLIB_NEW(str, str_len));
947db96d56Sopenharmony_ci
957db96d56Sopenharmony_ci        if (PyErr_Occurred()) {
967db96d56Sopenharmony_ci            Py_DECREF(out);
977db96d56Sopenharmony_ci            return NULL;
987db96d56Sopenharmony_ci        }
997db96d56Sopenharmony_ci#else
1007db96d56Sopenharmony_ci        PyObject *empty = (PyObject*)STRINGLIB_GET_EMPTY();
1017db96d56Sopenharmony_ci        assert(empty != NULL);
1027db96d56Sopenharmony_ci        Py_INCREF(empty);
1037db96d56Sopenharmony_ci        PyTuple_SET_ITEM(out, 0, empty);
1047db96d56Sopenharmony_ci        Py_INCREF(empty);
1057db96d56Sopenharmony_ci        PyTuple_SET_ITEM(out, 1, empty);
1067db96d56Sopenharmony_ci        Py_INCREF(str_obj);
1077db96d56Sopenharmony_ci        PyTuple_SET_ITEM(out, 2, (PyObject*) str_obj);
1087db96d56Sopenharmony_ci#endif
1097db96d56Sopenharmony_ci        return out;
1107db96d56Sopenharmony_ci    }
1117db96d56Sopenharmony_ci
1127db96d56Sopenharmony_ci    PyTuple_SET_ITEM(out, 0, STRINGLIB_NEW(str, pos));
1137db96d56Sopenharmony_ci    Py_INCREF(sep_obj);
1147db96d56Sopenharmony_ci    PyTuple_SET_ITEM(out, 1, sep_obj);
1157db96d56Sopenharmony_ci    pos += sep_len;
1167db96d56Sopenharmony_ci    PyTuple_SET_ITEM(out, 2, STRINGLIB_NEW(str + pos, str_len - pos));
1177db96d56Sopenharmony_ci
1187db96d56Sopenharmony_ci    if (PyErr_Occurred()) {
1197db96d56Sopenharmony_ci        Py_DECREF(out);
1207db96d56Sopenharmony_ci        return NULL;
1217db96d56Sopenharmony_ci    }
1227db96d56Sopenharmony_ci
1237db96d56Sopenharmony_ci    return out;
1247db96d56Sopenharmony_ci}
1257db96d56Sopenharmony_ci
126