static PyObject * strop_splitfields(PyObject *self, PyObject *args) { Py_ssize_t len, n, i, j, err; Py_ssize_t splitcount, maxsplit; char *s, *sub; PyObject *list, *item; WARN; sub = NULL; n = 0; splitcount = 0; maxsplit = 0; if (!PyArg_ParseTuple(args, "t#|z#n:split", &s, &len, &sub, &n, &maxsplit)) return NULL; if (sub == NULL) return split_whitespace(s, len, maxsplit); if (n == 0) { PyErr_SetString(PyExc_ValueError, "empty separator"); return NULL; } list = PyList_New(0); if (list == NULL) return NULL; i = j = 0; while (i+n <= len) { if (s[i] == sub[0] && (n == 1 || memcmp(s+i, sub, n) == 0)) { item = PyString_FromStringAndSize(s+j, i-j); if (item == NULL) goto fail; err = _Py_list_append(list, item); Py_DECREF(item); if (err < 0) goto fail; i = j = i + n; splitcount++; if (maxsplit && (splitcount >= maxsplit)) break; } else i++; } item = PyString_FromStringAndSize(s+j, len-j); if (item == NULL) goto fail; err = _Py_list_append(list, item); Py_DECREF(item); if (err < 0) goto fail; return list; fail: Py_DECREF(list); return NULL; }
static PyObject * split_whitespace(char *s, Py_ssize_t len, Py_ssize_t maxsplit) { Py_ssize_t i = 0, j; int err; Py_ssize_t countsplit = 0; PyObject* item; PyObject *list = PyList_New(0); if (list == NULL) return NULL; while (i < len) { while (i < len && isspace(Py_CHARMASK(s[i]))) { i = i+1; } j = i; while (i < len && !isspace(Py_CHARMASK(s[i]))) { i = i+1; } if (j < i) { item = PyString_FromStringAndSize(s+j, i-j); if (item == NULL) goto finally; err = _Py_list_append(list, item); Py_DECREF(item); if (err < 0) goto finally; countsplit++; while (i < len && isspace(Py_CHARMASK(s[i]))) { i = i+1; } if (maxsplit && (countsplit >= maxsplit) && i < len) { item = PyString_FromStringAndSize( s+i, len - i); if (item == NULL) goto finally; err = _Py_list_append(list, item); Py_DECREF(item); if (err < 0) goto finally; i = len; } } } return list; finally: Py_DECREF(list); return NULL; }
int PyArena_AddPyObject(PyArena *arena, PyObject *obj) { int r = _Py_list_append(arena->a_objects, obj); if (r >= 0) { Py_DECREF(obj); } return r; }