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