17db96d56Sopenharmony_ci/* PyByteArray (bytearray) implementation */
27db96d56Sopenharmony_ci
37db96d56Sopenharmony_ci#define PY_SSIZE_T_CLEAN
47db96d56Sopenharmony_ci#include "Python.h"
57db96d56Sopenharmony_ci#include "pycore_abstract.h"      // _PyIndex_Check()
67db96d56Sopenharmony_ci#include "pycore_bytes_methods.h"
77db96d56Sopenharmony_ci#include "pycore_bytesobject.h"
87db96d56Sopenharmony_ci#include "pycore_object.h"        // _PyObject_GC_UNTRACK()
97db96d56Sopenharmony_ci#include "pycore_strhex.h"        // _Py_strhex_with_sep()
107db96d56Sopenharmony_ci#include "pycore_long.h"          // _PyLong_FromUnsignedChar()
117db96d56Sopenharmony_ci#include "bytesobject.h"
127db96d56Sopenharmony_ci
137db96d56Sopenharmony_ci/*[clinic input]
147db96d56Sopenharmony_ciclass bytearray "PyByteArrayObject *" "&PyByteArray_Type"
157db96d56Sopenharmony_ci[clinic start generated code]*/
167db96d56Sopenharmony_ci/*[clinic end generated code: output=da39a3ee5e6b4b0d input=5535b77c37a119e0]*/
177db96d56Sopenharmony_ci
187db96d56Sopenharmony_ci/* For PyByteArray_AS_STRING(). */
197db96d56Sopenharmony_cichar _PyByteArray_empty_string[] = "";
207db96d56Sopenharmony_ci
217db96d56Sopenharmony_ci/* Helpers */
227db96d56Sopenharmony_ci
237db96d56Sopenharmony_cistatic int
247db96d56Sopenharmony_ci_getbytevalue(PyObject* arg, int *value)
257db96d56Sopenharmony_ci{
267db96d56Sopenharmony_ci    int overflow;
277db96d56Sopenharmony_ci    long face_value = PyLong_AsLongAndOverflow(arg, &overflow);
287db96d56Sopenharmony_ci
297db96d56Sopenharmony_ci    if (face_value == -1 && PyErr_Occurred()) {
307db96d56Sopenharmony_ci        *value = -1;
317db96d56Sopenharmony_ci        return 0;
327db96d56Sopenharmony_ci    }
337db96d56Sopenharmony_ci    if (face_value < 0 || face_value >= 256) {
347db96d56Sopenharmony_ci        /* this includes an overflow in converting to C long */
357db96d56Sopenharmony_ci        PyErr_SetString(PyExc_ValueError, "byte must be in range(0, 256)");
367db96d56Sopenharmony_ci        *value = -1;
377db96d56Sopenharmony_ci        return 0;
387db96d56Sopenharmony_ci    }
397db96d56Sopenharmony_ci
407db96d56Sopenharmony_ci    *value = face_value;
417db96d56Sopenharmony_ci    return 1;
427db96d56Sopenharmony_ci}
437db96d56Sopenharmony_ci
447db96d56Sopenharmony_cistatic int
457db96d56Sopenharmony_cibytearray_getbuffer(PyByteArrayObject *obj, Py_buffer *view, int flags)
467db96d56Sopenharmony_ci{
477db96d56Sopenharmony_ci    void *ptr;
487db96d56Sopenharmony_ci    if (view == NULL) {
497db96d56Sopenharmony_ci        PyErr_SetString(PyExc_BufferError,
507db96d56Sopenharmony_ci            "bytearray_getbuffer: view==NULL argument is obsolete");
517db96d56Sopenharmony_ci        return -1;
527db96d56Sopenharmony_ci    }
537db96d56Sopenharmony_ci    ptr = (void *) PyByteArray_AS_STRING(obj);
547db96d56Sopenharmony_ci    /* cannot fail if view != NULL and readonly == 0 */
557db96d56Sopenharmony_ci    (void)PyBuffer_FillInfo(view, (PyObject*)obj, ptr, Py_SIZE(obj), 0, flags);
567db96d56Sopenharmony_ci    obj->ob_exports++;
577db96d56Sopenharmony_ci    return 0;
587db96d56Sopenharmony_ci}
597db96d56Sopenharmony_ci
607db96d56Sopenharmony_cistatic void
617db96d56Sopenharmony_cibytearray_releasebuffer(PyByteArrayObject *obj, Py_buffer *view)
627db96d56Sopenharmony_ci{
637db96d56Sopenharmony_ci    obj->ob_exports--;
647db96d56Sopenharmony_ci}
657db96d56Sopenharmony_ci
667db96d56Sopenharmony_cistatic int
677db96d56Sopenharmony_ci_canresize(PyByteArrayObject *self)
687db96d56Sopenharmony_ci{
697db96d56Sopenharmony_ci    if (self->ob_exports > 0) {
707db96d56Sopenharmony_ci        PyErr_SetString(PyExc_BufferError,
717db96d56Sopenharmony_ci                "Existing exports of data: object cannot be re-sized");
727db96d56Sopenharmony_ci        return 0;
737db96d56Sopenharmony_ci    }
747db96d56Sopenharmony_ci    return 1;
757db96d56Sopenharmony_ci}
767db96d56Sopenharmony_ci
777db96d56Sopenharmony_ci#include "clinic/bytearrayobject.c.h"
787db96d56Sopenharmony_ci
797db96d56Sopenharmony_ci/* Direct API functions */
807db96d56Sopenharmony_ci
817db96d56Sopenharmony_ciPyObject *
827db96d56Sopenharmony_ciPyByteArray_FromObject(PyObject *input)
837db96d56Sopenharmony_ci{
847db96d56Sopenharmony_ci    return PyObject_CallOneArg((PyObject *)&PyByteArray_Type, input);
857db96d56Sopenharmony_ci}
867db96d56Sopenharmony_ci
877db96d56Sopenharmony_cistatic PyObject *
887db96d56Sopenharmony_ci_PyByteArray_FromBufferObject(PyObject *obj)
897db96d56Sopenharmony_ci{
907db96d56Sopenharmony_ci    PyObject *result;
917db96d56Sopenharmony_ci    Py_buffer view;
927db96d56Sopenharmony_ci
937db96d56Sopenharmony_ci    if (PyObject_GetBuffer(obj, &view, PyBUF_FULL_RO) < 0) {
947db96d56Sopenharmony_ci        return NULL;
957db96d56Sopenharmony_ci    }
967db96d56Sopenharmony_ci    result = PyByteArray_FromStringAndSize(NULL, view.len);
977db96d56Sopenharmony_ci    if (result != NULL &&
987db96d56Sopenharmony_ci        PyBuffer_ToContiguous(PyByteArray_AS_STRING(result),
997db96d56Sopenharmony_ci                              &view, view.len, 'C') < 0)
1007db96d56Sopenharmony_ci    {
1017db96d56Sopenharmony_ci        Py_CLEAR(result);
1027db96d56Sopenharmony_ci    }
1037db96d56Sopenharmony_ci    PyBuffer_Release(&view);
1047db96d56Sopenharmony_ci    return result;
1057db96d56Sopenharmony_ci}
1067db96d56Sopenharmony_ci
1077db96d56Sopenharmony_ciPyObject *
1087db96d56Sopenharmony_ciPyByteArray_FromStringAndSize(const char *bytes, Py_ssize_t size)
1097db96d56Sopenharmony_ci{
1107db96d56Sopenharmony_ci    PyByteArrayObject *new;
1117db96d56Sopenharmony_ci    Py_ssize_t alloc;
1127db96d56Sopenharmony_ci
1137db96d56Sopenharmony_ci    if (size < 0) {
1147db96d56Sopenharmony_ci        PyErr_SetString(PyExc_SystemError,
1157db96d56Sopenharmony_ci            "Negative size passed to PyByteArray_FromStringAndSize");
1167db96d56Sopenharmony_ci        return NULL;
1177db96d56Sopenharmony_ci    }
1187db96d56Sopenharmony_ci
1197db96d56Sopenharmony_ci    /* Prevent buffer overflow when setting alloc to size+1. */
1207db96d56Sopenharmony_ci    if (size == PY_SSIZE_T_MAX) {
1217db96d56Sopenharmony_ci        return PyErr_NoMemory();
1227db96d56Sopenharmony_ci    }
1237db96d56Sopenharmony_ci
1247db96d56Sopenharmony_ci    new = PyObject_New(PyByteArrayObject, &PyByteArray_Type);
1257db96d56Sopenharmony_ci    if (new == NULL)
1267db96d56Sopenharmony_ci        return NULL;
1277db96d56Sopenharmony_ci
1287db96d56Sopenharmony_ci    if (size == 0) {
1297db96d56Sopenharmony_ci        new->ob_bytes = NULL;
1307db96d56Sopenharmony_ci        alloc = 0;
1317db96d56Sopenharmony_ci    }
1327db96d56Sopenharmony_ci    else {
1337db96d56Sopenharmony_ci        alloc = size + 1;
1347db96d56Sopenharmony_ci        new->ob_bytes = PyObject_Malloc(alloc);
1357db96d56Sopenharmony_ci        if (new->ob_bytes == NULL) {
1367db96d56Sopenharmony_ci            Py_DECREF(new);
1377db96d56Sopenharmony_ci            return PyErr_NoMemory();
1387db96d56Sopenharmony_ci        }
1397db96d56Sopenharmony_ci        if (bytes != NULL && size > 0)
1407db96d56Sopenharmony_ci            memcpy(new->ob_bytes, bytes, size);
1417db96d56Sopenharmony_ci        new->ob_bytes[size] = '\0';  /* Trailing null byte */
1427db96d56Sopenharmony_ci    }
1437db96d56Sopenharmony_ci    Py_SET_SIZE(new, size);
1447db96d56Sopenharmony_ci    new->ob_alloc = alloc;
1457db96d56Sopenharmony_ci    new->ob_start = new->ob_bytes;
1467db96d56Sopenharmony_ci    new->ob_exports = 0;
1477db96d56Sopenharmony_ci
1487db96d56Sopenharmony_ci    return (PyObject *)new;
1497db96d56Sopenharmony_ci}
1507db96d56Sopenharmony_ci
1517db96d56Sopenharmony_ciPy_ssize_t
1527db96d56Sopenharmony_ciPyByteArray_Size(PyObject *self)
1537db96d56Sopenharmony_ci{
1547db96d56Sopenharmony_ci    assert(self != NULL);
1557db96d56Sopenharmony_ci    assert(PyByteArray_Check(self));
1567db96d56Sopenharmony_ci
1577db96d56Sopenharmony_ci    return PyByteArray_GET_SIZE(self);
1587db96d56Sopenharmony_ci}
1597db96d56Sopenharmony_ci
1607db96d56Sopenharmony_cichar  *
1617db96d56Sopenharmony_ciPyByteArray_AsString(PyObject *self)
1627db96d56Sopenharmony_ci{
1637db96d56Sopenharmony_ci    assert(self != NULL);
1647db96d56Sopenharmony_ci    assert(PyByteArray_Check(self));
1657db96d56Sopenharmony_ci
1667db96d56Sopenharmony_ci    return PyByteArray_AS_STRING(self);
1677db96d56Sopenharmony_ci}
1687db96d56Sopenharmony_ci
1697db96d56Sopenharmony_ciint
1707db96d56Sopenharmony_ciPyByteArray_Resize(PyObject *self, Py_ssize_t requested_size)
1717db96d56Sopenharmony_ci{
1727db96d56Sopenharmony_ci    void *sval;
1737db96d56Sopenharmony_ci    PyByteArrayObject *obj = ((PyByteArrayObject *)self);
1747db96d56Sopenharmony_ci    /* All computations are done unsigned to avoid integer overflows
1757db96d56Sopenharmony_ci       (see issue #22335). */
1767db96d56Sopenharmony_ci    size_t alloc = (size_t) obj->ob_alloc;
1777db96d56Sopenharmony_ci    size_t logical_offset = (size_t) (obj->ob_start - obj->ob_bytes);
1787db96d56Sopenharmony_ci    size_t size = (size_t) requested_size;
1797db96d56Sopenharmony_ci
1807db96d56Sopenharmony_ci    assert(self != NULL);
1817db96d56Sopenharmony_ci    assert(PyByteArray_Check(self));
1827db96d56Sopenharmony_ci    assert(logical_offset <= alloc);
1837db96d56Sopenharmony_ci    assert(requested_size >= 0);
1847db96d56Sopenharmony_ci
1857db96d56Sopenharmony_ci    if (requested_size == Py_SIZE(self)) {
1867db96d56Sopenharmony_ci        return 0;
1877db96d56Sopenharmony_ci    }
1887db96d56Sopenharmony_ci    if (!_canresize(obj)) {
1897db96d56Sopenharmony_ci        return -1;
1907db96d56Sopenharmony_ci    }
1917db96d56Sopenharmony_ci
1927db96d56Sopenharmony_ci    if (size + logical_offset + 1 <= alloc) {
1937db96d56Sopenharmony_ci        /* Current buffer is large enough to host the requested size,
1947db96d56Sopenharmony_ci           decide on a strategy. */
1957db96d56Sopenharmony_ci        if (size < alloc / 2) {
1967db96d56Sopenharmony_ci            /* Major downsize; resize down to exact size */
1977db96d56Sopenharmony_ci            alloc = size + 1;
1987db96d56Sopenharmony_ci        }
1997db96d56Sopenharmony_ci        else {
2007db96d56Sopenharmony_ci            /* Minor downsize; quick exit */
2017db96d56Sopenharmony_ci            Py_SET_SIZE(self, size);
2027db96d56Sopenharmony_ci            PyByteArray_AS_STRING(self)[size] = '\0'; /* Trailing null */
2037db96d56Sopenharmony_ci            return 0;
2047db96d56Sopenharmony_ci        }
2057db96d56Sopenharmony_ci    }
2067db96d56Sopenharmony_ci    else {
2077db96d56Sopenharmony_ci        /* Need growing, decide on a strategy */
2087db96d56Sopenharmony_ci        if (size <= alloc * 1.125) {
2097db96d56Sopenharmony_ci            /* Moderate upsize; overallocate similar to list_resize() */
2107db96d56Sopenharmony_ci            alloc = size + (size >> 3) + (size < 9 ? 3 : 6);
2117db96d56Sopenharmony_ci        }
2127db96d56Sopenharmony_ci        else {
2137db96d56Sopenharmony_ci            /* Major upsize; resize up to exact size */
2147db96d56Sopenharmony_ci            alloc = size + 1;
2157db96d56Sopenharmony_ci        }
2167db96d56Sopenharmony_ci    }
2177db96d56Sopenharmony_ci    if (alloc > PY_SSIZE_T_MAX) {
2187db96d56Sopenharmony_ci        PyErr_NoMemory();
2197db96d56Sopenharmony_ci        return -1;
2207db96d56Sopenharmony_ci    }
2217db96d56Sopenharmony_ci
2227db96d56Sopenharmony_ci    if (logical_offset > 0) {
2237db96d56Sopenharmony_ci        sval = PyObject_Malloc(alloc);
2247db96d56Sopenharmony_ci        if (sval == NULL) {
2257db96d56Sopenharmony_ci            PyErr_NoMemory();
2267db96d56Sopenharmony_ci            return -1;
2277db96d56Sopenharmony_ci        }
2287db96d56Sopenharmony_ci        memcpy(sval, PyByteArray_AS_STRING(self),
2297db96d56Sopenharmony_ci               Py_MIN((size_t)requested_size, (size_t)Py_SIZE(self)));
2307db96d56Sopenharmony_ci        PyObject_Free(obj->ob_bytes);
2317db96d56Sopenharmony_ci    }
2327db96d56Sopenharmony_ci    else {
2337db96d56Sopenharmony_ci        sval = PyObject_Realloc(obj->ob_bytes, alloc);
2347db96d56Sopenharmony_ci        if (sval == NULL) {
2357db96d56Sopenharmony_ci            PyErr_NoMemory();
2367db96d56Sopenharmony_ci            return -1;
2377db96d56Sopenharmony_ci        }
2387db96d56Sopenharmony_ci    }
2397db96d56Sopenharmony_ci
2407db96d56Sopenharmony_ci    obj->ob_bytes = obj->ob_start = sval;
2417db96d56Sopenharmony_ci    Py_SET_SIZE(self, size);
2427db96d56Sopenharmony_ci    obj->ob_alloc = alloc;
2437db96d56Sopenharmony_ci    obj->ob_bytes[size] = '\0'; /* Trailing null byte */
2447db96d56Sopenharmony_ci
2457db96d56Sopenharmony_ci    return 0;
2467db96d56Sopenharmony_ci}
2477db96d56Sopenharmony_ci
2487db96d56Sopenharmony_ciPyObject *
2497db96d56Sopenharmony_ciPyByteArray_Concat(PyObject *a, PyObject *b)
2507db96d56Sopenharmony_ci{
2517db96d56Sopenharmony_ci    Py_buffer va, vb;
2527db96d56Sopenharmony_ci    PyByteArrayObject *result = NULL;
2537db96d56Sopenharmony_ci
2547db96d56Sopenharmony_ci    va.len = -1;
2557db96d56Sopenharmony_ci    vb.len = -1;
2567db96d56Sopenharmony_ci    if (PyObject_GetBuffer(a, &va, PyBUF_SIMPLE) != 0 ||
2577db96d56Sopenharmony_ci        PyObject_GetBuffer(b, &vb, PyBUF_SIMPLE) != 0) {
2587db96d56Sopenharmony_ci            PyErr_Format(PyExc_TypeError, "can't concat %.100s to %.100s",
2597db96d56Sopenharmony_ci                         Py_TYPE(b)->tp_name, Py_TYPE(a)->tp_name);
2607db96d56Sopenharmony_ci            goto done;
2617db96d56Sopenharmony_ci    }
2627db96d56Sopenharmony_ci
2637db96d56Sopenharmony_ci    if (va.len > PY_SSIZE_T_MAX - vb.len) {
2647db96d56Sopenharmony_ci        PyErr_NoMemory();
2657db96d56Sopenharmony_ci        goto done;
2667db96d56Sopenharmony_ci    }
2677db96d56Sopenharmony_ci
2687db96d56Sopenharmony_ci    result = (PyByteArrayObject *) \
2697db96d56Sopenharmony_ci        PyByteArray_FromStringAndSize(NULL, va.len + vb.len);
2707db96d56Sopenharmony_ci    // result->ob_bytes is NULL if result is an empty bytearray:
2717db96d56Sopenharmony_ci    // if va.len + vb.len equals zero.
2727db96d56Sopenharmony_ci    if (result != NULL && result->ob_bytes != NULL) {
2737db96d56Sopenharmony_ci        memcpy(result->ob_bytes, va.buf, va.len);
2747db96d56Sopenharmony_ci        memcpy(result->ob_bytes + va.len, vb.buf, vb.len);
2757db96d56Sopenharmony_ci    }
2767db96d56Sopenharmony_ci
2777db96d56Sopenharmony_ci  done:
2787db96d56Sopenharmony_ci    if (va.len != -1)
2797db96d56Sopenharmony_ci        PyBuffer_Release(&va);
2807db96d56Sopenharmony_ci    if (vb.len != -1)
2817db96d56Sopenharmony_ci        PyBuffer_Release(&vb);
2827db96d56Sopenharmony_ci    return (PyObject *)result;
2837db96d56Sopenharmony_ci}
2847db96d56Sopenharmony_ci
2857db96d56Sopenharmony_ci/* Functions stuffed into the type object */
2867db96d56Sopenharmony_ci
2877db96d56Sopenharmony_cistatic Py_ssize_t
2887db96d56Sopenharmony_cibytearray_length(PyByteArrayObject *self)
2897db96d56Sopenharmony_ci{
2907db96d56Sopenharmony_ci    return Py_SIZE(self);
2917db96d56Sopenharmony_ci}
2927db96d56Sopenharmony_ci
2937db96d56Sopenharmony_cistatic PyObject *
2947db96d56Sopenharmony_cibytearray_iconcat(PyByteArrayObject *self, PyObject *other)
2957db96d56Sopenharmony_ci{
2967db96d56Sopenharmony_ci    Py_ssize_t size;
2977db96d56Sopenharmony_ci    Py_buffer vo;
2987db96d56Sopenharmony_ci
2997db96d56Sopenharmony_ci    if (PyObject_GetBuffer(other, &vo, PyBUF_SIMPLE) != 0) {
3007db96d56Sopenharmony_ci        PyErr_Format(PyExc_TypeError, "can't concat %.100s to %.100s",
3017db96d56Sopenharmony_ci                     Py_TYPE(other)->tp_name, Py_TYPE(self)->tp_name);
3027db96d56Sopenharmony_ci        return NULL;
3037db96d56Sopenharmony_ci    }
3047db96d56Sopenharmony_ci
3057db96d56Sopenharmony_ci    size = Py_SIZE(self);
3067db96d56Sopenharmony_ci    if (size > PY_SSIZE_T_MAX - vo.len) {
3077db96d56Sopenharmony_ci        PyBuffer_Release(&vo);
3087db96d56Sopenharmony_ci        return PyErr_NoMemory();
3097db96d56Sopenharmony_ci    }
3107db96d56Sopenharmony_ci    if (PyByteArray_Resize((PyObject *)self, size + vo.len) < 0) {
3117db96d56Sopenharmony_ci        PyBuffer_Release(&vo);
3127db96d56Sopenharmony_ci        return NULL;
3137db96d56Sopenharmony_ci    }
3147db96d56Sopenharmony_ci    memcpy(PyByteArray_AS_STRING(self) + size, vo.buf, vo.len);
3157db96d56Sopenharmony_ci    PyBuffer_Release(&vo);
3167db96d56Sopenharmony_ci    Py_INCREF(self);
3177db96d56Sopenharmony_ci    return (PyObject *)self;
3187db96d56Sopenharmony_ci}
3197db96d56Sopenharmony_ci
3207db96d56Sopenharmony_cistatic PyObject *
3217db96d56Sopenharmony_cibytearray_repeat(PyByteArrayObject *self, Py_ssize_t count)
3227db96d56Sopenharmony_ci{
3237db96d56Sopenharmony_ci    if (count < 0)
3247db96d56Sopenharmony_ci        count = 0;
3257db96d56Sopenharmony_ci    const Py_ssize_t mysize = Py_SIZE(self);
3267db96d56Sopenharmony_ci    if (count > 0 && mysize > PY_SSIZE_T_MAX / count)
3277db96d56Sopenharmony_ci        return PyErr_NoMemory();
3287db96d56Sopenharmony_ci    Py_ssize_t size = mysize * count;
3297db96d56Sopenharmony_ci    PyByteArrayObject* result = (PyByteArrayObject *)PyByteArray_FromStringAndSize(NULL, size);
3307db96d56Sopenharmony_ci    const char* buf = PyByteArray_AS_STRING(self);
3317db96d56Sopenharmony_ci    if (result != NULL && size != 0) {
3327db96d56Sopenharmony_ci        _PyBytes_Repeat(result->ob_bytes, size, buf, mysize);
3337db96d56Sopenharmony_ci    }
3347db96d56Sopenharmony_ci    return (PyObject *)result;
3357db96d56Sopenharmony_ci}
3367db96d56Sopenharmony_ci
3377db96d56Sopenharmony_cistatic PyObject *
3387db96d56Sopenharmony_cibytearray_irepeat(PyByteArrayObject *self, Py_ssize_t count)
3397db96d56Sopenharmony_ci{
3407db96d56Sopenharmony_ci    if (count < 0)
3417db96d56Sopenharmony_ci        count = 0;
3427db96d56Sopenharmony_ci    else if (count == 1) {
3437db96d56Sopenharmony_ci        Py_INCREF(self);
3447db96d56Sopenharmony_ci        return (PyObject*)self;
3457db96d56Sopenharmony_ci    }
3467db96d56Sopenharmony_ci
3477db96d56Sopenharmony_ci    const Py_ssize_t mysize = Py_SIZE(self);
3487db96d56Sopenharmony_ci    if (count > 0 && mysize > PY_SSIZE_T_MAX / count)
3497db96d56Sopenharmony_ci        return PyErr_NoMemory();
3507db96d56Sopenharmony_ci    const Py_ssize_t size = mysize * count;
3517db96d56Sopenharmony_ci    if (PyByteArray_Resize((PyObject *)self, size) < 0)
3527db96d56Sopenharmony_ci        return NULL;
3537db96d56Sopenharmony_ci
3547db96d56Sopenharmony_ci    char* buf = PyByteArray_AS_STRING(self);
3557db96d56Sopenharmony_ci    _PyBytes_Repeat(buf, size, buf, mysize);
3567db96d56Sopenharmony_ci
3577db96d56Sopenharmony_ci    Py_INCREF(self);
3587db96d56Sopenharmony_ci    return (PyObject *)self;
3597db96d56Sopenharmony_ci}
3607db96d56Sopenharmony_ci
3617db96d56Sopenharmony_cistatic PyObject *
3627db96d56Sopenharmony_cibytearray_getitem(PyByteArrayObject *self, Py_ssize_t i)
3637db96d56Sopenharmony_ci{
3647db96d56Sopenharmony_ci    if (i < 0 || i >= Py_SIZE(self)) {
3657db96d56Sopenharmony_ci        PyErr_SetString(PyExc_IndexError, "bytearray index out of range");
3667db96d56Sopenharmony_ci        return NULL;
3677db96d56Sopenharmony_ci    }
3687db96d56Sopenharmony_ci    return _PyLong_FromUnsignedChar((unsigned char)(self->ob_start[i]));
3697db96d56Sopenharmony_ci}
3707db96d56Sopenharmony_ci
3717db96d56Sopenharmony_cistatic PyObject *
3727db96d56Sopenharmony_cibytearray_subscript(PyByteArrayObject *self, PyObject *index)
3737db96d56Sopenharmony_ci{
3747db96d56Sopenharmony_ci    if (_PyIndex_Check(index)) {
3757db96d56Sopenharmony_ci        Py_ssize_t i = PyNumber_AsSsize_t(index, PyExc_IndexError);
3767db96d56Sopenharmony_ci
3777db96d56Sopenharmony_ci        if (i == -1 && PyErr_Occurred())
3787db96d56Sopenharmony_ci            return NULL;
3797db96d56Sopenharmony_ci
3807db96d56Sopenharmony_ci        if (i < 0)
3817db96d56Sopenharmony_ci            i += PyByteArray_GET_SIZE(self);
3827db96d56Sopenharmony_ci
3837db96d56Sopenharmony_ci        if (i < 0 || i >= Py_SIZE(self)) {
3847db96d56Sopenharmony_ci            PyErr_SetString(PyExc_IndexError, "bytearray index out of range");
3857db96d56Sopenharmony_ci            return NULL;
3867db96d56Sopenharmony_ci        }
3877db96d56Sopenharmony_ci        return _PyLong_FromUnsignedChar((unsigned char)(self->ob_start[i]));
3887db96d56Sopenharmony_ci    }
3897db96d56Sopenharmony_ci    else if (PySlice_Check(index)) {
3907db96d56Sopenharmony_ci        Py_ssize_t start, stop, step, slicelength, i;
3917db96d56Sopenharmony_ci        size_t cur;
3927db96d56Sopenharmony_ci        if (PySlice_Unpack(index, &start, &stop, &step) < 0) {
3937db96d56Sopenharmony_ci            return NULL;
3947db96d56Sopenharmony_ci        }
3957db96d56Sopenharmony_ci        slicelength = PySlice_AdjustIndices(PyByteArray_GET_SIZE(self),
3967db96d56Sopenharmony_ci                                            &start, &stop, step);
3977db96d56Sopenharmony_ci
3987db96d56Sopenharmony_ci        if (slicelength <= 0)
3997db96d56Sopenharmony_ci            return PyByteArray_FromStringAndSize("", 0);
4007db96d56Sopenharmony_ci        else if (step == 1) {
4017db96d56Sopenharmony_ci            return PyByteArray_FromStringAndSize(
4027db96d56Sopenharmony_ci                PyByteArray_AS_STRING(self) + start, slicelength);
4037db96d56Sopenharmony_ci        }
4047db96d56Sopenharmony_ci        else {
4057db96d56Sopenharmony_ci            char *source_buf = PyByteArray_AS_STRING(self);
4067db96d56Sopenharmony_ci            char *result_buf;
4077db96d56Sopenharmony_ci            PyObject *result;
4087db96d56Sopenharmony_ci
4097db96d56Sopenharmony_ci            result = PyByteArray_FromStringAndSize(NULL, slicelength);
4107db96d56Sopenharmony_ci            if (result == NULL)
4117db96d56Sopenharmony_ci                return NULL;
4127db96d56Sopenharmony_ci
4137db96d56Sopenharmony_ci            result_buf = PyByteArray_AS_STRING(result);
4147db96d56Sopenharmony_ci            for (cur = start, i = 0; i < slicelength;
4157db96d56Sopenharmony_ci                 cur += step, i++) {
4167db96d56Sopenharmony_ci                     result_buf[i] = source_buf[cur];
4177db96d56Sopenharmony_ci            }
4187db96d56Sopenharmony_ci            return result;
4197db96d56Sopenharmony_ci        }
4207db96d56Sopenharmony_ci    }
4217db96d56Sopenharmony_ci    else {
4227db96d56Sopenharmony_ci        PyErr_Format(PyExc_TypeError,
4237db96d56Sopenharmony_ci                     "bytearray indices must be integers or slices, not %.200s",
4247db96d56Sopenharmony_ci                     Py_TYPE(index)->tp_name);
4257db96d56Sopenharmony_ci        return NULL;
4267db96d56Sopenharmony_ci    }
4277db96d56Sopenharmony_ci}
4287db96d56Sopenharmony_ci
4297db96d56Sopenharmony_cistatic int
4307db96d56Sopenharmony_cibytearray_setslice_linear(PyByteArrayObject *self,
4317db96d56Sopenharmony_ci                          Py_ssize_t lo, Py_ssize_t hi,
4327db96d56Sopenharmony_ci                          char *bytes, Py_ssize_t bytes_len)
4337db96d56Sopenharmony_ci{
4347db96d56Sopenharmony_ci    Py_ssize_t avail = hi - lo;
4357db96d56Sopenharmony_ci    char *buf = PyByteArray_AS_STRING(self);
4367db96d56Sopenharmony_ci    Py_ssize_t growth = bytes_len - avail;
4377db96d56Sopenharmony_ci    int res = 0;
4387db96d56Sopenharmony_ci    assert(avail >= 0);
4397db96d56Sopenharmony_ci
4407db96d56Sopenharmony_ci    if (growth < 0) {
4417db96d56Sopenharmony_ci        if (!_canresize(self))
4427db96d56Sopenharmony_ci            return -1;
4437db96d56Sopenharmony_ci
4447db96d56Sopenharmony_ci        if (lo == 0) {
4457db96d56Sopenharmony_ci            /* Shrink the buffer by advancing its logical start */
4467db96d56Sopenharmony_ci            self->ob_start -= growth;
4477db96d56Sopenharmony_ci            /*
4487db96d56Sopenharmony_ci              0   lo               hi             old_size
4497db96d56Sopenharmony_ci              |   |<----avail----->|<-----tail------>|
4507db96d56Sopenharmony_ci              |      |<-bytes_len->|<-----tail------>|
4517db96d56Sopenharmony_ci              0    new_lo         new_hi          new_size
4527db96d56Sopenharmony_ci            */
4537db96d56Sopenharmony_ci        }
4547db96d56Sopenharmony_ci        else {
4557db96d56Sopenharmony_ci            /*
4567db96d56Sopenharmony_ci              0   lo               hi               old_size
4577db96d56Sopenharmony_ci              |   |<----avail----->|<-----tomove------>|
4587db96d56Sopenharmony_ci              |   |<-bytes_len->|<-----tomove------>|
4597db96d56Sopenharmony_ci              0   lo         new_hi              new_size
4607db96d56Sopenharmony_ci            */
4617db96d56Sopenharmony_ci            memmove(buf + lo + bytes_len, buf + hi,
4627db96d56Sopenharmony_ci                    Py_SIZE(self) - hi);
4637db96d56Sopenharmony_ci        }
4647db96d56Sopenharmony_ci        if (PyByteArray_Resize((PyObject *)self,
4657db96d56Sopenharmony_ci                               Py_SIZE(self) + growth) < 0) {
4667db96d56Sopenharmony_ci            /* Issue #19578: Handling the memory allocation failure here is
4677db96d56Sopenharmony_ci               tricky here because the bytearray object has already been
4687db96d56Sopenharmony_ci               modified. Depending on growth and lo, the behaviour is
4697db96d56Sopenharmony_ci               different.
4707db96d56Sopenharmony_ci
4717db96d56Sopenharmony_ci               If growth < 0 and lo != 0, the operation is completed, but a
4727db96d56Sopenharmony_ci               MemoryError is still raised and the memory block is not
4737db96d56Sopenharmony_ci               shrunk. Otherwise, the bytearray is restored in its previous
4747db96d56Sopenharmony_ci               state and a MemoryError is raised. */
4757db96d56Sopenharmony_ci            if (lo == 0) {
4767db96d56Sopenharmony_ci                self->ob_start += growth;
4777db96d56Sopenharmony_ci                return -1;
4787db96d56Sopenharmony_ci            }
4797db96d56Sopenharmony_ci            /* memmove() removed bytes, the bytearray object cannot be
4807db96d56Sopenharmony_ci               restored in its previous state. */
4817db96d56Sopenharmony_ci            Py_SET_SIZE(self, Py_SIZE(self) + growth);
4827db96d56Sopenharmony_ci            res = -1;
4837db96d56Sopenharmony_ci        }
4847db96d56Sopenharmony_ci        buf = PyByteArray_AS_STRING(self);
4857db96d56Sopenharmony_ci    }
4867db96d56Sopenharmony_ci    else if (growth > 0) {
4877db96d56Sopenharmony_ci        if (Py_SIZE(self) > (Py_ssize_t)PY_SSIZE_T_MAX - growth) {
4887db96d56Sopenharmony_ci            PyErr_NoMemory();
4897db96d56Sopenharmony_ci            return -1;
4907db96d56Sopenharmony_ci        }
4917db96d56Sopenharmony_ci
4927db96d56Sopenharmony_ci        if (PyByteArray_Resize((PyObject *)self,
4937db96d56Sopenharmony_ci                               Py_SIZE(self) + growth) < 0) {
4947db96d56Sopenharmony_ci            return -1;
4957db96d56Sopenharmony_ci        }
4967db96d56Sopenharmony_ci        buf = PyByteArray_AS_STRING(self);
4977db96d56Sopenharmony_ci        /* Make the place for the additional bytes */
4987db96d56Sopenharmony_ci        /*
4997db96d56Sopenharmony_ci          0   lo        hi               old_size
5007db96d56Sopenharmony_ci          |   |<-avail->|<-----tomove------>|
5017db96d56Sopenharmony_ci          |   |<---bytes_len-->|<-----tomove------>|
5027db96d56Sopenharmony_ci          0   lo            new_hi              new_size
5037db96d56Sopenharmony_ci         */
5047db96d56Sopenharmony_ci        memmove(buf + lo + bytes_len, buf + hi,
5057db96d56Sopenharmony_ci                Py_SIZE(self) - lo - bytes_len);
5067db96d56Sopenharmony_ci    }
5077db96d56Sopenharmony_ci
5087db96d56Sopenharmony_ci    if (bytes_len > 0)
5097db96d56Sopenharmony_ci        memcpy(buf + lo, bytes, bytes_len);
5107db96d56Sopenharmony_ci    return res;
5117db96d56Sopenharmony_ci}
5127db96d56Sopenharmony_ci
5137db96d56Sopenharmony_cistatic int
5147db96d56Sopenharmony_cibytearray_setslice(PyByteArrayObject *self, Py_ssize_t lo, Py_ssize_t hi,
5157db96d56Sopenharmony_ci               PyObject *values)
5167db96d56Sopenharmony_ci{
5177db96d56Sopenharmony_ci    Py_ssize_t needed;
5187db96d56Sopenharmony_ci    void *bytes;
5197db96d56Sopenharmony_ci    Py_buffer vbytes;
5207db96d56Sopenharmony_ci    int res = 0;
5217db96d56Sopenharmony_ci
5227db96d56Sopenharmony_ci    vbytes.len = -1;
5237db96d56Sopenharmony_ci    if (values == (PyObject *)self) {
5247db96d56Sopenharmony_ci        /* Make a copy and call this function recursively */
5257db96d56Sopenharmony_ci        int err;
5267db96d56Sopenharmony_ci        values = PyByteArray_FromStringAndSize(PyByteArray_AS_STRING(values),
5277db96d56Sopenharmony_ci                                               PyByteArray_GET_SIZE(values));
5287db96d56Sopenharmony_ci        if (values == NULL)
5297db96d56Sopenharmony_ci            return -1;
5307db96d56Sopenharmony_ci        err = bytearray_setslice(self, lo, hi, values);
5317db96d56Sopenharmony_ci        Py_DECREF(values);
5327db96d56Sopenharmony_ci        return err;
5337db96d56Sopenharmony_ci    }
5347db96d56Sopenharmony_ci    if (values == NULL) {
5357db96d56Sopenharmony_ci        /* del b[lo:hi] */
5367db96d56Sopenharmony_ci        bytes = NULL;
5377db96d56Sopenharmony_ci        needed = 0;
5387db96d56Sopenharmony_ci    }
5397db96d56Sopenharmony_ci    else {
5407db96d56Sopenharmony_ci        if (PyObject_GetBuffer(values, &vbytes, PyBUF_SIMPLE) != 0) {
5417db96d56Sopenharmony_ci            PyErr_Format(PyExc_TypeError,
5427db96d56Sopenharmony_ci                         "can't set bytearray slice from %.100s",
5437db96d56Sopenharmony_ci                         Py_TYPE(values)->tp_name);
5447db96d56Sopenharmony_ci            return -1;
5457db96d56Sopenharmony_ci        }
5467db96d56Sopenharmony_ci        needed = vbytes.len;
5477db96d56Sopenharmony_ci        bytes = vbytes.buf;
5487db96d56Sopenharmony_ci    }
5497db96d56Sopenharmony_ci
5507db96d56Sopenharmony_ci    if (lo < 0)
5517db96d56Sopenharmony_ci        lo = 0;
5527db96d56Sopenharmony_ci    if (hi < lo)
5537db96d56Sopenharmony_ci        hi = lo;
5547db96d56Sopenharmony_ci    if (hi > Py_SIZE(self))
5557db96d56Sopenharmony_ci        hi = Py_SIZE(self);
5567db96d56Sopenharmony_ci
5577db96d56Sopenharmony_ci    res = bytearray_setslice_linear(self, lo, hi, bytes, needed);
5587db96d56Sopenharmony_ci    if (vbytes.len != -1)
5597db96d56Sopenharmony_ci        PyBuffer_Release(&vbytes);
5607db96d56Sopenharmony_ci    return res;
5617db96d56Sopenharmony_ci}
5627db96d56Sopenharmony_ci
5637db96d56Sopenharmony_cistatic int
5647db96d56Sopenharmony_cibytearray_setitem(PyByteArrayObject *self, Py_ssize_t i, PyObject *value)
5657db96d56Sopenharmony_ci{
5667db96d56Sopenharmony_ci    int ival = -1;
5677db96d56Sopenharmony_ci
5687db96d56Sopenharmony_ci    // GH-91153: We need to do this *before* the size check, in case value has a
5697db96d56Sopenharmony_ci    // nasty __index__ method that changes the size of the bytearray:
5707db96d56Sopenharmony_ci    if (value && !_getbytevalue(value, &ival)) {
5717db96d56Sopenharmony_ci        return -1;
5727db96d56Sopenharmony_ci    }
5737db96d56Sopenharmony_ci
5747db96d56Sopenharmony_ci    if (i < 0) {
5757db96d56Sopenharmony_ci        i += Py_SIZE(self);
5767db96d56Sopenharmony_ci    }
5777db96d56Sopenharmony_ci
5787db96d56Sopenharmony_ci    if (i < 0 || i >= Py_SIZE(self)) {
5797db96d56Sopenharmony_ci        PyErr_SetString(PyExc_IndexError, "bytearray index out of range");
5807db96d56Sopenharmony_ci        return -1;
5817db96d56Sopenharmony_ci    }
5827db96d56Sopenharmony_ci
5837db96d56Sopenharmony_ci    if (value == NULL) {
5847db96d56Sopenharmony_ci        return bytearray_setslice(self, i, i+1, NULL);
5857db96d56Sopenharmony_ci    }
5867db96d56Sopenharmony_ci
5877db96d56Sopenharmony_ci    assert(0 <= ival && ival < 256);
5887db96d56Sopenharmony_ci    PyByteArray_AS_STRING(self)[i] = ival;
5897db96d56Sopenharmony_ci    return 0;
5907db96d56Sopenharmony_ci}
5917db96d56Sopenharmony_ci
5927db96d56Sopenharmony_cistatic int
5937db96d56Sopenharmony_cibytearray_ass_subscript(PyByteArrayObject *self, PyObject *index, PyObject *values)
5947db96d56Sopenharmony_ci{
5957db96d56Sopenharmony_ci    Py_ssize_t start, stop, step, slicelen, needed;
5967db96d56Sopenharmony_ci    char *buf, *bytes;
5977db96d56Sopenharmony_ci    buf = PyByteArray_AS_STRING(self);
5987db96d56Sopenharmony_ci
5997db96d56Sopenharmony_ci    if (_PyIndex_Check(index)) {
6007db96d56Sopenharmony_ci        Py_ssize_t i = PyNumber_AsSsize_t(index, PyExc_IndexError);
6017db96d56Sopenharmony_ci
6027db96d56Sopenharmony_ci        if (i == -1 && PyErr_Occurred()) {
6037db96d56Sopenharmony_ci            return -1;
6047db96d56Sopenharmony_ci        }
6057db96d56Sopenharmony_ci
6067db96d56Sopenharmony_ci        int ival = -1;
6077db96d56Sopenharmony_ci
6087db96d56Sopenharmony_ci        // GH-91153: We need to do this *before* the size check, in case values
6097db96d56Sopenharmony_ci        // has a nasty __index__ method that changes the size of the bytearray:
6107db96d56Sopenharmony_ci        if (values && !_getbytevalue(values, &ival)) {
6117db96d56Sopenharmony_ci            return -1;
6127db96d56Sopenharmony_ci        }
6137db96d56Sopenharmony_ci
6147db96d56Sopenharmony_ci        if (i < 0) {
6157db96d56Sopenharmony_ci            i += PyByteArray_GET_SIZE(self);
6167db96d56Sopenharmony_ci        }
6177db96d56Sopenharmony_ci
6187db96d56Sopenharmony_ci        if (i < 0 || i >= Py_SIZE(self)) {
6197db96d56Sopenharmony_ci            PyErr_SetString(PyExc_IndexError, "bytearray index out of range");
6207db96d56Sopenharmony_ci            return -1;
6217db96d56Sopenharmony_ci        }
6227db96d56Sopenharmony_ci
6237db96d56Sopenharmony_ci        if (values == NULL) {
6247db96d56Sopenharmony_ci            /* Fall through to slice assignment */
6257db96d56Sopenharmony_ci            start = i;
6267db96d56Sopenharmony_ci            stop = i + 1;
6277db96d56Sopenharmony_ci            step = 1;
6287db96d56Sopenharmony_ci            slicelen = 1;
6297db96d56Sopenharmony_ci        }
6307db96d56Sopenharmony_ci        else {
6317db96d56Sopenharmony_ci            assert(0 <= ival && ival < 256);
6327db96d56Sopenharmony_ci            buf[i] = (char)ival;
6337db96d56Sopenharmony_ci            return 0;
6347db96d56Sopenharmony_ci        }
6357db96d56Sopenharmony_ci    }
6367db96d56Sopenharmony_ci    else if (PySlice_Check(index)) {
6377db96d56Sopenharmony_ci        if (PySlice_Unpack(index, &start, &stop, &step) < 0) {
6387db96d56Sopenharmony_ci            return -1;
6397db96d56Sopenharmony_ci        }
6407db96d56Sopenharmony_ci        slicelen = PySlice_AdjustIndices(PyByteArray_GET_SIZE(self), &start,
6417db96d56Sopenharmony_ci                                         &stop, step);
6427db96d56Sopenharmony_ci    }
6437db96d56Sopenharmony_ci    else {
6447db96d56Sopenharmony_ci        PyErr_Format(PyExc_TypeError,
6457db96d56Sopenharmony_ci                     "bytearray indices must be integers or slices, not %.200s",
6467db96d56Sopenharmony_ci                      Py_TYPE(index)->tp_name);
6477db96d56Sopenharmony_ci        return -1;
6487db96d56Sopenharmony_ci    }
6497db96d56Sopenharmony_ci
6507db96d56Sopenharmony_ci    if (values == NULL) {
6517db96d56Sopenharmony_ci        bytes = NULL;
6527db96d56Sopenharmony_ci        needed = 0;
6537db96d56Sopenharmony_ci    }
6547db96d56Sopenharmony_ci    else if (values == (PyObject *)self || !PyByteArray_Check(values)) {
6557db96d56Sopenharmony_ci        int err;
6567db96d56Sopenharmony_ci        if (PyNumber_Check(values) || PyUnicode_Check(values)) {
6577db96d56Sopenharmony_ci            PyErr_SetString(PyExc_TypeError,
6587db96d56Sopenharmony_ci                            "can assign only bytes, buffers, or iterables "
6597db96d56Sopenharmony_ci                            "of ints in range(0, 256)");
6607db96d56Sopenharmony_ci            return -1;
6617db96d56Sopenharmony_ci        }
6627db96d56Sopenharmony_ci        /* Make a copy and call this function recursively */
6637db96d56Sopenharmony_ci        values = PyByteArray_FromObject(values);
6647db96d56Sopenharmony_ci        if (values == NULL)
6657db96d56Sopenharmony_ci            return -1;
6667db96d56Sopenharmony_ci        err = bytearray_ass_subscript(self, index, values);
6677db96d56Sopenharmony_ci        Py_DECREF(values);
6687db96d56Sopenharmony_ci        return err;
6697db96d56Sopenharmony_ci    }
6707db96d56Sopenharmony_ci    else {
6717db96d56Sopenharmony_ci        assert(PyByteArray_Check(values));
6727db96d56Sopenharmony_ci        bytes = PyByteArray_AS_STRING(values);
6737db96d56Sopenharmony_ci        needed = Py_SIZE(values);
6747db96d56Sopenharmony_ci    }
6757db96d56Sopenharmony_ci    /* Make sure b[5:2] = ... inserts before 5, not before 2. */
6767db96d56Sopenharmony_ci    if ((step < 0 && start < stop) ||
6777db96d56Sopenharmony_ci        (step > 0 && start > stop))
6787db96d56Sopenharmony_ci        stop = start;
6797db96d56Sopenharmony_ci    if (step == 1) {
6807db96d56Sopenharmony_ci        return bytearray_setslice_linear(self, start, stop, bytes, needed);
6817db96d56Sopenharmony_ci    }
6827db96d56Sopenharmony_ci    else {
6837db96d56Sopenharmony_ci        if (needed == 0) {
6847db96d56Sopenharmony_ci            /* Delete slice */
6857db96d56Sopenharmony_ci            size_t cur;
6867db96d56Sopenharmony_ci            Py_ssize_t i;
6877db96d56Sopenharmony_ci
6887db96d56Sopenharmony_ci            if (!_canresize(self))
6897db96d56Sopenharmony_ci                return -1;
6907db96d56Sopenharmony_ci
6917db96d56Sopenharmony_ci            if (slicelen == 0)
6927db96d56Sopenharmony_ci                /* Nothing to do here. */
6937db96d56Sopenharmony_ci                return 0;
6947db96d56Sopenharmony_ci
6957db96d56Sopenharmony_ci            if (step < 0) {
6967db96d56Sopenharmony_ci                stop = start + 1;
6977db96d56Sopenharmony_ci                start = stop + step * (slicelen - 1) - 1;
6987db96d56Sopenharmony_ci                step = -step;
6997db96d56Sopenharmony_ci            }
7007db96d56Sopenharmony_ci            for (cur = start, i = 0;
7017db96d56Sopenharmony_ci                 i < slicelen; cur += step, i++) {
7027db96d56Sopenharmony_ci                Py_ssize_t lim = step - 1;
7037db96d56Sopenharmony_ci
7047db96d56Sopenharmony_ci                if (cur + step >= (size_t)PyByteArray_GET_SIZE(self))
7057db96d56Sopenharmony_ci                    lim = PyByteArray_GET_SIZE(self) - cur - 1;
7067db96d56Sopenharmony_ci
7077db96d56Sopenharmony_ci                memmove(buf + cur - i,
7087db96d56Sopenharmony_ci                        buf + cur + 1, lim);
7097db96d56Sopenharmony_ci            }
7107db96d56Sopenharmony_ci            /* Move the tail of the bytes, in one chunk */
7117db96d56Sopenharmony_ci            cur = start + (size_t)slicelen*step;
7127db96d56Sopenharmony_ci            if (cur < (size_t)PyByteArray_GET_SIZE(self)) {
7137db96d56Sopenharmony_ci                memmove(buf + cur - slicelen,
7147db96d56Sopenharmony_ci                        buf + cur,
7157db96d56Sopenharmony_ci                        PyByteArray_GET_SIZE(self) - cur);
7167db96d56Sopenharmony_ci            }
7177db96d56Sopenharmony_ci            if (PyByteArray_Resize((PyObject *)self,
7187db96d56Sopenharmony_ci                               PyByteArray_GET_SIZE(self) - slicelen) < 0)
7197db96d56Sopenharmony_ci                return -1;
7207db96d56Sopenharmony_ci
7217db96d56Sopenharmony_ci            return 0;
7227db96d56Sopenharmony_ci        }
7237db96d56Sopenharmony_ci        else {
7247db96d56Sopenharmony_ci            /* Assign slice */
7257db96d56Sopenharmony_ci            Py_ssize_t i;
7267db96d56Sopenharmony_ci            size_t cur;
7277db96d56Sopenharmony_ci
7287db96d56Sopenharmony_ci            if (needed != slicelen) {
7297db96d56Sopenharmony_ci                PyErr_Format(PyExc_ValueError,
7307db96d56Sopenharmony_ci                             "attempt to assign bytes of size %zd "
7317db96d56Sopenharmony_ci                             "to extended slice of size %zd",
7327db96d56Sopenharmony_ci                             needed, slicelen);
7337db96d56Sopenharmony_ci                return -1;
7347db96d56Sopenharmony_ci            }
7357db96d56Sopenharmony_ci            for (cur = start, i = 0; i < slicelen; cur += step, i++)
7367db96d56Sopenharmony_ci                buf[cur] = bytes[i];
7377db96d56Sopenharmony_ci            return 0;
7387db96d56Sopenharmony_ci        }
7397db96d56Sopenharmony_ci    }
7407db96d56Sopenharmony_ci}
7417db96d56Sopenharmony_ci
7427db96d56Sopenharmony_ci/*[clinic input]
7437db96d56Sopenharmony_cibytearray.__init__
7447db96d56Sopenharmony_ci
7457db96d56Sopenharmony_ci    source as arg: object = NULL
7467db96d56Sopenharmony_ci    encoding: str = NULL
7477db96d56Sopenharmony_ci    errors: str = NULL
7487db96d56Sopenharmony_ci
7497db96d56Sopenharmony_ci[clinic start generated code]*/
7507db96d56Sopenharmony_ci
7517db96d56Sopenharmony_cistatic int
7527db96d56Sopenharmony_cibytearray___init___impl(PyByteArrayObject *self, PyObject *arg,
7537db96d56Sopenharmony_ci                        const char *encoding, const char *errors)
7547db96d56Sopenharmony_ci/*[clinic end generated code: output=4ce1304649c2f8b3 input=1141a7122eefd7b9]*/
7557db96d56Sopenharmony_ci{
7567db96d56Sopenharmony_ci    Py_ssize_t count;
7577db96d56Sopenharmony_ci    PyObject *it;
7587db96d56Sopenharmony_ci    PyObject *(*iternext)(PyObject *);
7597db96d56Sopenharmony_ci
7607db96d56Sopenharmony_ci    if (Py_SIZE(self) != 0) {
7617db96d56Sopenharmony_ci        /* Empty previous contents (yes, do this first of all!) */
7627db96d56Sopenharmony_ci        if (PyByteArray_Resize((PyObject *)self, 0) < 0)
7637db96d56Sopenharmony_ci            return -1;
7647db96d56Sopenharmony_ci    }
7657db96d56Sopenharmony_ci
7667db96d56Sopenharmony_ci    /* Make a quick exit if no first argument */
7677db96d56Sopenharmony_ci    if (arg == NULL) {
7687db96d56Sopenharmony_ci        if (encoding != NULL || errors != NULL) {
7697db96d56Sopenharmony_ci            PyErr_SetString(PyExc_TypeError,
7707db96d56Sopenharmony_ci                            encoding != NULL ?
7717db96d56Sopenharmony_ci                            "encoding without a string argument" :
7727db96d56Sopenharmony_ci                            "errors without a string argument");
7737db96d56Sopenharmony_ci            return -1;
7747db96d56Sopenharmony_ci        }
7757db96d56Sopenharmony_ci        return 0;
7767db96d56Sopenharmony_ci    }
7777db96d56Sopenharmony_ci
7787db96d56Sopenharmony_ci    if (PyUnicode_Check(arg)) {
7797db96d56Sopenharmony_ci        /* Encode via the codec registry */
7807db96d56Sopenharmony_ci        PyObject *encoded, *new;
7817db96d56Sopenharmony_ci        if (encoding == NULL) {
7827db96d56Sopenharmony_ci            PyErr_SetString(PyExc_TypeError,
7837db96d56Sopenharmony_ci                            "string argument without an encoding");
7847db96d56Sopenharmony_ci            return -1;
7857db96d56Sopenharmony_ci        }
7867db96d56Sopenharmony_ci        encoded = PyUnicode_AsEncodedString(arg, encoding, errors);
7877db96d56Sopenharmony_ci        if (encoded == NULL)
7887db96d56Sopenharmony_ci            return -1;
7897db96d56Sopenharmony_ci        assert(PyBytes_Check(encoded));
7907db96d56Sopenharmony_ci        new = bytearray_iconcat(self, encoded);
7917db96d56Sopenharmony_ci        Py_DECREF(encoded);
7927db96d56Sopenharmony_ci        if (new == NULL)
7937db96d56Sopenharmony_ci            return -1;
7947db96d56Sopenharmony_ci        Py_DECREF(new);
7957db96d56Sopenharmony_ci        return 0;
7967db96d56Sopenharmony_ci    }
7977db96d56Sopenharmony_ci
7987db96d56Sopenharmony_ci    /* If it's not unicode, there can't be encoding or errors */
7997db96d56Sopenharmony_ci    if (encoding != NULL || errors != NULL) {
8007db96d56Sopenharmony_ci        PyErr_SetString(PyExc_TypeError,
8017db96d56Sopenharmony_ci                        encoding != NULL ?
8027db96d56Sopenharmony_ci                        "encoding without a string argument" :
8037db96d56Sopenharmony_ci                        "errors without a string argument");
8047db96d56Sopenharmony_ci        return -1;
8057db96d56Sopenharmony_ci    }
8067db96d56Sopenharmony_ci
8077db96d56Sopenharmony_ci    /* Is it an int? */
8087db96d56Sopenharmony_ci    if (_PyIndex_Check(arg)) {
8097db96d56Sopenharmony_ci        count = PyNumber_AsSsize_t(arg, PyExc_OverflowError);
8107db96d56Sopenharmony_ci        if (count == -1 && PyErr_Occurred()) {
8117db96d56Sopenharmony_ci            if (!PyErr_ExceptionMatches(PyExc_TypeError))
8127db96d56Sopenharmony_ci                return -1;
8137db96d56Sopenharmony_ci            PyErr_Clear();  /* fall through */
8147db96d56Sopenharmony_ci        }
8157db96d56Sopenharmony_ci        else {
8167db96d56Sopenharmony_ci            if (count < 0) {
8177db96d56Sopenharmony_ci                PyErr_SetString(PyExc_ValueError, "negative count");
8187db96d56Sopenharmony_ci                return -1;
8197db96d56Sopenharmony_ci            }
8207db96d56Sopenharmony_ci            if (count > 0) {
8217db96d56Sopenharmony_ci                if (PyByteArray_Resize((PyObject *)self, count))
8227db96d56Sopenharmony_ci                    return -1;
8237db96d56Sopenharmony_ci                memset(PyByteArray_AS_STRING(self), 0, count);
8247db96d56Sopenharmony_ci            }
8257db96d56Sopenharmony_ci            return 0;
8267db96d56Sopenharmony_ci        }
8277db96d56Sopenharmony_ci    }
8287db96d56Sopenharmony_ci
8297db96d56Sopenharmony_ci    /* Use the buffer API */
8307db96d56Sopenharmony_ci    if (PyObject_CheckBuffer(arg)) {
8317db96d56Sopenharmony_ci        Py_ssize_t size;
8327db96d56Sopenharmony_ci        Py_buffer view;
8337db96d56Sopenharmony_ci        if (PyObject_GetBuffer(arg, &view, PyBUF_FULL_RO) < 0)
8347db96d56Sopenharmony_ci            return -1;
8357db96d56Sopenharmony_ci        size = view.len;
8367db96d56Sopenharmony_ci        if (PyByteArray_Resize((PyObject *)self, size) < 0) goto fail;
8377db96d56Sopenharmony_ci        if (PyBuffer_ToContiguous(PyByteArray_AS_STRING(self),
8387db96d56Sopenharmony_ci            &view, size, 'C') < 0)
8397db96d56Sopenharmony_ci            goto fail;
8407db96d56Sopenharmony_ci        PyBuffer_Release(&view);
8417db96d56Sopenharmony_ci        return 0;
8427db96d56Sopenharmony_ci    fail:
8437db96d56Sopenharmony_ci        PyBuffer_Release(&view);
8447db96d56Sopenharmony_ci        return -1;
8457db96d56Sopenharmony_ci    }
8467db96d56Sopenharmony_ci
8477db96d56Sopenharmony_ci    if (PyList_CheckExact(arg) || PyTuple_CheckExact(arg)) {
8487db96d56Sopenharmony_ci        Py_ssize_t size = PySequence_Fast_GET_SIZE(arg);
8497db96d56Sopenharmony_ci        if (PyByteArray_Resize((PyObject *)self, size) < 0) {
8507db96d56Sopenharmony_ci            return -1;
8517db96d56Sopenharmony_ci        }
8527db96d56Sopenharmony_ci        PyObject **items = PySequence_Fast_ITEMS(arg);
8537db96d56Sopenharmony_ci        char *s = PyByteArray_AS_STRING(self);
8547db96d56Sopenharmony_ci        for (Py_ssize_t i = 0; i < size; i++) {
8557db96d56Sopenharmony_ci            int value;
8567db96d56Sopenharmony_ci            if (!PyLong_CheckExact(items[i])) {
8577db96d56Sopenharmony_ci                /* Resize to 0 and go through slowpath */
8587db96d56Sopenharmony_ci                if (Py_SIZE(self) != 0) {
8597db96d56Sopenharmony_ci                   if (PyByteArray_Resize((PyObject *)self, 0) < 0) {
8607db96d56Sopenharmony_ci                       return -1;
8617db96d56Sopenharmony_ci                   }
8627db96d56Sopenharmony_ci                }
8637db96d56Sopenharmony_ci                goto slowpath;
8647db96d56Sopenharmony_ci            }
8657db96d56Sopenharmony_ci            int rc = _getbytevalue(items[i], &value);
8667db96d56Sopenharmony_ci            if (!rc) {
8677db96d56Sopenharmony_ci                return -1;
8687db96d56Sopenharmony_ci            }
8697db96d56Sopenharmony_ci            s[i] = value;
8707db96d56Sopenharmony_ci        }
8717db96d56Sopenharmony_ci        return 0;
8727db96d56Sopenharmony_ci    }
8737db96d56Sopenharmony_cislowpath:
8747db96d56Sopenharmony_ci    /* Get the iterator */
8757db96d56Sopenharmony_ci    it = PyObject_GetIter(arg);
8767db96d56Sopenharmony_ci    if (it == NULL) {
8777db96d56Sopenharmony_ci        if (PyErr_ExceptionMatches(PyExc_TypeError)) {
8787db96d56Sopenharmony_ci            PyErr_Format(PyExc_TypeError,
8797db96d56Sopenharmony_ci                         "cannot convert '%.200s' object to bytearray",
8807db96d56Sopenharmony_ci                         Py_TYPE(arg)->tp_name);
8817db96d56Sopenharmony_ci        }
8827db96d56Sopenharmony_ci        return -1;
8837db96d56Sopenharmony_ci    }
8847db96d56Sopenharmony_ci    iternext = *Py_TYPE(it)->tp_iternext;
8857db96d56Sopenharmony_ci
8867db96d56Sopenharmony_ci    /* Run the iterator to exhaustion */
8877db96d56Sopenharmony_ci    for (;;) {
8887db96d56Sopenharmony_ci        PyObject *item;
8897db96d56Sopenharmony_ci        int rc, value;
8907db96d56Sopenharmony_ci
8917db96d56Sopenharmony_ci        /* Get the next item */
8927db96d56Sopenharmony_ci        item = iternext(it);
8937db96d56Sopenharmony_ci        if (item == NULL) {
8947db96d56Sopenharmony_ci            if (PyErr_Occurred()) {
8957db96d56Sopenharmony_ci                if (!PyErr_ExceptionMatches(PyExc_StopIteration))
8967db96d56Sopenharmony_ci                    goto error;
8977db96d56Sopenharmony_ci                PyErr_Clear();
8987db96d56Sopenharmony_ci            }
8997db96d56Sopenharmony_ci            break;
9007db96d56Sopenharmony_ci        }
9017db96d56Sopenharmony_ci
9027db96d56Sopenharmony_ci        /* Interpret it as an int (__index__) */
9037db96d56Sopenharmony_ci        rc = _getbytevalue(item, &value);
9047db96d56Sopenharmony_ci        Py_DECREF(item);
9057db96d56Sopenharmony_ci        if (!rc)
9067db96d56Sopenharmony_ci            goto error;
9077db96d56Sopenharmony_ci
9087db96d56Sopenharmony_ci        /* Append the byte */
9097db96d56Sopenharmony_ci        if (Py_SIZE(self) + 1 < self->ob_alloc) {
9107db96d56Sopenharmony_ci            Py_SET_SIZE(self, Py_SIZE(self) + 1);
9117db96d56Sopenharmony_ci            PyByteArray_AS_STRING(self)[Py_SIZE(self)] = '\0';
9127db96d56Sopenharmony_ci        }
9137db96d56Sopenharmony_ci        else if (PyByteArray_Resize((PyObject *)self, Py_SIZE(self)+1) < 0)
9147db96d56Sopenharmony_ci            goto error;
9157db96d56Sopenharmony_ci        PyByteArray_AS_STRING(self)[Py_SIZE(self)-1] = value;
9167db96d56Sopenharmony_ci    }
9177db96d56Sopenharmony_ci
9187db96d56Sopenharmony_ci    /* Clean up and return success */
9197db96d56Sopenharmony_ci    Py_DECREF(it);
9207db96d56Sopenharmony_ci    return 0;
9217db96d56Sopenharmony_ci
9227db96d56Sopenharmony_ci error:
9237db96d56Sopenharmony_ci    /* Error handling when it != NULL */
9247db96d56Sopenharmony_ci    Py_DECREF(it);
9257db96d56Sopenharmony_ci    return -1;
9267db96d56Sopenharmony_ci}
9277db96d56Sopenharmony_ci
9287db96d56Sopenharmony_ci/* Mostly copied from string_repr, but without the
9297db96d56Sopenharmony_ci   "smart quote" functionality. */
9307db96d56Sopenharmony_cistatic PyObject *
9317db96d56Sopenharmony_cibytearray_repr(PyByteArrayObject *self)
9327db96d56Sopenharmony_ci{
9337db96d56Sopenharmony_ci    const char *className = _PyType_Name(Py_TYPE(self));
9347db96d56Sopenharmony_ci    const char *quote_prefix = "(b";
9357db96d56Sopenharmony_ci    const char *quote_postfix = ")";
9367db96d56Sopenharmony_ci    Py_ssize_t length = Py_SIZE(self);
9377db96d56Sopenharmony_ci    /* 6 == strlen(quote_prefix) + 2 + strlen(quote_postfix) + 1 */
9387db96d56Sopenharmony_ci    Py_ssize_t newsize;
9397db96d56Sopenharmony_ci    PyObject *v;
9407db96d56Sopenharmony_ci    Py_ssize_t i;
9417db96d56Sopenharmony_ci    char *bytes;
9427db96d56Sopenharmony_ci    char c;
9437db96d56Sopenharmony_ci    char *p;
9447db96d56Sopenharmony_ci    int quote;
9457db96d56Sopenharmony_ci    char *test, *start;
9467db96d56Sopenharmony_ci    char *buffer;
9477db96d56Sopenharmony_ci
9487db96d56Sopenharmony_ci    newsize = strlen(className);
9497db96d56Sopenharmony_ci    if (length > (PY_SSIZE_T_MAX - 6 - newsize) / 4) {
9507db96d56Sopenharmony_ci        PyErr_SetString(PyExc_OverflowError,
9517db96d56Sopenharmony_ci            "bytearray object is too large to make repr");
9527db96d56Sopenharmony_ci        return NULL;
9537db96d56Sopenharmony_ci    }
9547db96d56Sopenharmony_ci
9557db96d56Sopenharmony_ci    newsize += 6 + length * 4;
9567db96d56Sopenharmony_ci    buffer = PyObject_Malloc(newsize);
9577db96d56Sopenharmony_ci    if (buffer == NULL) {
9587db96d56Sopenharmony_ci        PyErr_NoMemory();
9597db96d56Sopenharmony_ci        return NULL;
9607db96d56Sopenharmony_ci    }
9617db96d56Sopenharmony_ci
9627db96d56Sopenharmony_ci    /* Figure out which quote to use; single is preferred */
9637db96d56Sopenharmony_ci    quote = '\'';
9647db96d56Sopenharmony_ci    start = PyByteArray_AS_STRING(self);
9657db96d56Sopenharmony_ci    for (test = start; test < start+length; ++test) {
9667db96d56Sopenharmony_ci        if (*test == '"') {
9677db96d56Sopenharmony_ci            quote = '\''; /* back to single */
9687db96d56Sopenharmony_ci            break;
9697db96d56Sopenharmony_ci        }
9707db96d56Sopenharmony_ci        else if (*test == '\'')
9717db96d56Sopenharmony_ci            quote = '"';
9727db96d56Sopenharmony_ci    }
9737db96d56Sopenharmony_ci
9747db96d56Sopenharmony_ci    p = buffer;
9757db96d56Sopenharmony_ci    while (*className)
9767db96d56Sopenharmony_ci        *p++ = *className++;
9777db96d56Sopenharmony_ci    while (*quote_prefix)
9787db96d56Sopenharmony_ci        *p++ = *quote_prefix++;
9797db96d56Sopenharmony_ci    *p++ = quote;
9807db96d56Sopenharmony_ci
9817db96d56Sopenharmony_ci    bytes = PyByteArray_AS_STRING(self);
9827db96d56Sopenharmony_ci    for (i = 0; i < length; i++) {
9837db96d56Sopenharmony_ci        /* There's at least enough room for a hex escape
9847db96d56Sopenharmony_ci           and a closing quote. */
9857db96d56Sopenharmony_ci        assert(newsize - (p - buffer) >= 5);
9867db96d56Sopenharmony_ci        c = bytes[i];
9877db96d56Sopenharmony_ci        if (c == '\'' || c == '\\')
9887db96d56Sopenharmony_ci            *p++ = '\\', *p++ = c;
9897db96d56Sopenharmony_ci        else if (c == '\t')
9907db96d56Sopenharmony_ci            *p++ = '\\', *p++ = 't';
9917db96d56Sopenharmony_ci        else if (c == '\n')
9927db96d56Sopenharmony_ci            *p++ = '\\', *p++ = 'n';
9937db96d56Sopenharmony_ci        else if (c == '\r')
9947db96d56Sopenharmony_ci            *p++ = '\\', *p++ = 'r';
9957db96d56Sopenharmony_ci        else if (c == 0)
9967db96d56Sopenharmony_ci            *p++ = '\\', *p++ = 'x', *p++ = '0', *p++ = '0';
9977db96d56Sopenharmony_ci        else if (c < ' ' || c >= 0x7f) {
9987db96d56Sopenharmony_ci            *p++ = '\\';
9997db96d56Sopenharmony_ci            *p++ = 'x';
10007db96d56Sopenharmony_ci            *p++ = Py_hexdigits[(c & 0xf0) >> 4];
10017db96d56Sopenharmony_ci            *p++ = Py_hexdigits[c & 0xf];
10027db96d56Sopenharmony_ci        }
10037db96d56Sopenharmony_ci        else
10047db96d56Sopenharmony_ci            *p++ = c;
10057db96d56Sopenharmony_ci    }
10067db96d56Sopenharmony_ci    assert(newsize - (p - buffer) >= 1);
10077db96d56Sopenharmony_ci    *p++ = quote;
10087db96d56Sopenharmony_ci    while (*quote_postfix) {
10097db96d56Sopenharmony_ci       *p++ = *quote_postfix++;
10107db96d56Sopenharmony_ci    }
10117db96d56Sopenharmony_ci
10127db96d56Sopenharmony_ci    v = PyUnicode_FromStringAndSize(buffer, p - buffer);
10137db96d56Sopenharmony_ci    PyObject_Free(buffer);
10147db96d56Sopenharmony_ci    return v;
10157db96d56Sopenharmony_ci}
10167db96d56Sopenharmony_ci
10177db96d56Sopenharmony_cistatic PyObject *
10187db96d56Sopenharmony_cibytearray_str(PyObject *op)
10197db96d56Sopenharmony_ci{
10207db96d56Sopenharmony_ci    if (_Py_GetConfig()->bytes_warning) {
10217db96d56Sopenharmony_ci        if (PyErr_WarnEx(PyExc_BytesWarning,
10227db96d56Sopenharmony_ci                         "str() on a bytearray instance", 1)) {
10237db96d56Sopenharmony_ci                return NULL;
10247db96d56Sopenharmony_ci        }
10257db96d56Sopenharmony_ci    }
10267db96d56Sopenharmony_ci    return bytearray_repr((PyByteArrayObject*)op);
10277db96d56Sopenharmony_ci}
10287db96d56Sopenharmony_ci
10297db96d56Sopenharmony_cistatic PyObject *
10307db96d56Sopenharmony_cibytearray_richcompare(PyObject *self, PyObject *other, int op)
10317db96d56Sopenharmony_ci{
10327db96d56Sopenharmony_ci    Py_ssize_t self_size, other_size;
10337db96d56Sopenharmony_ci    Py_buffer self_bytes, other_bytes;
10347db96d56Sopenharmony_ci    int cmp;
10357db96d56Sopenharmony_ci
10367db96d56Sopenharmony_ci    if (!PyObject_CheckBuffer(self) || !PyObject_CheckBuffer(other)) {
10377db96d56Sopenharmony_ci        if (PyUnicode_Check(self) || PyUnicode_Check(other)) {
10387db96d56Sopenharmony_ci            if (_Py_GetConfig()->bytes_warning && (op == Py_EQ || op == Py_NE)) {
10397db96d56Sopenharmony_ci                if (PyErr_WarnEx(PyExc_BytesWarning,
10407db96d56Sopenharmony_ci                                "Comparison between bytearray and string", 1))
10417db96d56Sopenharmony_ci                    return NULL;
10427db96d56Sopenharmony_ci            }
10437db96d56Sopenharmony_ci        }
10447db96d56Sopenharmony_ci        Py_RETURN_NOTIMPLEMENTED;
10457db96d56Sopenharmony_ci    }
10467db96d56Sopenharmony_ci
10477db96d56Sopenharmony_ci    /* Bytearrays can be compared to anything that supports the buffer API. */
10487db96d56Sopenharmony_ci    if (PyObject_GetBuffer(self, &self_bytes, PyBUF_SIMPLE) != 0) {
10497db96d56Sopenharmony_ci        PyErr_Clear();
10507db96d56Sopenharmony_ci        Py_RETURN_NOTIMPLEMENTED;
10517db96d56Sopenharmony_ci    }
10527db96d56Sopenharmony_ci    self_size = self_bytes.len;
10537db96d56Sopenharmony_ci
10547db96d56Sopenharmony_ci    if (PyObject_GetBuffer(other, &other_bytes, PyBUF_SIMPLE) != 0) {
10557db96d56Sopenharmony_ci        PyErr_Clear();
10567db96d56Sopenharmony_ci        PyBuffer_Release(&self_bytes);
10577db96d56Sopenharmony_ci        Py_RETURN_NOTIMPLEMENTED;
10587db96d56Sopenharmony_ci    }
10597db96d56Sopenharmony_ci    other_size = other_bytes.len;
10607db96d56Sopenharmony_ci
10617db96d56Sopenharmony_ci    if (self_size != other_size && (op == Py_EQ || op == Py_NE)) {
10627db96d56Sopenharmony_ci        /* Shortcut: if the lengths differ, the objects differ */
10637db96d56Sopenharmony_ci        PyBuffer_Release(&self_bytes);
10647db96d56Sopenharmony_ci        PyBuffer_Release(&other_bytes);
10657db96d56Sopenharmony_ci        return PyBool_FromLong((op == Py_NE));
10667db96d56Sopenharmony_ci    }
10677db96d56Sopenharmony_ci    else {
10687db96d56Sopenharmony_ci        cmp = memcmp(self_bytes.buf, other_bytes.buf,
10697db96d56Sopenharmony_ci                     Py_MIN(self_size, other_size));
10707db96d56Sopenharmony_ci        /* In ISO C, memcmp() guarantees to use unsigned bytes! */
10717db96d56Sopenharmony_ci
10727db96d56Sopenharmony_ci        PyBuffer_Release(&self_bytes);
10737db96d56Sopenharmony_ci        PyBuffer_Release(&other_bytes);
10747db96d56Sopenharmony_ci
10757db96d56Sopenharmony_ci        if (cmp != 0) {
10767db96d56Sopenharmony_ci            Py_RETURN_RICHCOMPARE(cmp, 0, op);
10777db96d56Sopenharmony_ci        }
10787db96d56Sopenharmony_ci
10797db96d56Sopenharmony_ci        Py_RETURN_RICHCOMPARE(self_size, other_size, op);
10807db96d56Sopenharmony_ci    }
10817db96d56Sopenharmony_ci
10827db96d56Sopenharmony_ci}
10837db96d56Sopenharmony_ci
10847db96d56Sopenharmony_cistatic void
10857db96d56Sopenharmony_cibytearray_dealloc(PyByteArrayObject *self)
10867db96d56Sopenharmony_ci{
10877db96d56Sopenharmony_ci    if (self->ob_exports > 0) {
10887db96d56Sopenharmony_ci        PyErr_SetString(PyExc_SystemError,
10897db96d56Sopenharmony_ci                        "deallocated bytearray object has exported buffers");
10907db96d56Sopenharmony_ci        PyErr_Print();
10917db96d56Sopenharmony_ci    }
10927db96d56Sopenharmony_ci    if (self->ob_bytes != 0) {
10937db96d56Sopenharmony_ci        PyObject_Free(self->ob_bytes);
10947db96d56Sopenharmony_ci    }
10957db96d56Sopenharmony_ci    Py_TYPE(self)->tp_free((PyObject *)self);
10967db96d56Sopenharmony_ci}
10977db96d56Sopenharmony_ci
10987db96d56Sopenharmony_ci
10997db96d56Sopenharmony_ci/* -------------------------------------------------------------------- */
11007db96d56Sopenharmony_ci/* Methods */
11017db96d56Sopenharmony_ci
11027db96d56Sopenharmony_ci#define STRINGLIB_IS_UNICODE 0
11037db96d56Sopenharmony_ci#define FASTSEARCH fastsearch
11047db96d56Sopenharmony_ci#define STRINGLIB(F) stringlib_##F
11057db96d56Sopenharmony_ci#define STRINGLIB_CHAR char
11067db96d56Sopenharmony_ci#define STRINGLIB_SIZEOF_CHAR 1
11077db96d56Sopenharmony_ci#define STRINGLIB_LEN PyByteArray_GET_SIZE
11087db96d56Sopenharmony_ci#define STRINGLIB_STR PyByteArray_AS_STRING
11097db96d56Sopenharmony_ci#define STRINGLIB_NEW PyByteArray_FromStringAndSize
11107db96d56Sopenharmony_ci#define STRINGLIB_ISSPACE Py_ISSPACE
11117db96d56Sopenharmony_ci#define STRINGLIB_ISLINEBREAK(x) ((x == '\n') || (x == '\r'))
11127db96d56Sopenharmony_ci#define STRINGLIB_CHECK_EXACT PyByteArray_CheckExact
11137db96d56Sopenharmony_ci#define STRINGLIB_MUTABLE 1
11147db96d56Sopenharmony_ci
11157db96d56Sopenharmony_ci#include "stringlib/fastsearch.h"
11167db96d56Sopenharmony_ci#include "stringlib/count.h"
11177db96d56Sopenharmony_ci#include "stringlib/find.h"
11187db96d56Sopenharmony_ci#include "stringlib/join.h"
11197db96d56Sopenharmony_ci#include "stringlib/partition.h"
11207db96d56Sopenharmony_ci#include "stringlib/split.h"
11217db96d56Sopenharmony_ci#include "stringlib/ctype.h"
11227db96d56Sopenharmony_ci#include "stringlib/transmogrify.h"
11237db96d56Sopenharmony_ci
11247db96d56Sopenharmony_ci
11257db96d56Sopenharmony_cistatic PyObject *
11267db96d56Sopenharmony_cibytearray_find(PyByteArrayObject *self, PyObject *args)
11277db96d56Sopenharmony_ci{
11287db96d56Sopenharmony_ci    return _Py_bytes_find(PyByteArray_AS_STRING(self), PyByteArray_GET_SIZE(self), args);
11297db96d56Sopenharmony_ci}
11307db96d56Sopenharmony_ci
11317db96d56Sopenharmony_cistatic PyObject *
11327db96d56Sopenharmony_cibytearray_count(PyByteArrayObject *self, PyObject *args)
11337db96d56Sopenharmony_ci{
11347db96d56Sopenharmony_ci    return _Py_bytes_count(PyByteArray_AS_STRING(self), PyByteArray_GET_SIZE(self), args);
11357db96d56Sopenharmony_ci}
11367db96d56Sopenharmony_ci
11377db96d56Sopenharmony_ci/*[clinic input]
11387db96d56Sopenharmony_cibytearray.clear
11397db96d56Sopenharmony_ci
11407db96d56Sopenharmony_ciRemove all items from the bytearray.
11417db96d56Sopenharmony_ci[clinic start generated code]*/
11427db96d56Sopenharmony_ci
11437db96d56Sopenharmony_cistatic PyObject *
11447db96d56Sopenharmony_cibytearray_clear_impl(PyByteArrayObject *self)
11457db96d56Sopenharmony_ci/*[clinic end generated code: output=85c2fe6aede0956c input=ed6edae9de447ac4]*/
11467db96d56Sopenharmony_ci{
11477db96d56Sopenharmony_ci    if (PyByteArray_Resize((PyObject *)self, 0) < 0)
11487db96d56Sopenharmony_ci        return NULL;
11497db96d56Sopenharmony_ci    Py_RETURN_NONE;
11507db96d56Sopenharmony_ci}
11517db96d56Sopenharmony_ci
11527db96d56Sopenharmony_ci/*[clinic input]
11537db96d56Sopenharmony_cibytearray.copy
11547db96d56Sopenharmony_ci
11557db96d56Sopenharmony_ciReturn a copy of B.
11567db96d56Sopenharmony_ci[clinic start generated code]*/
11577db96d56Sopenharmony_ci
11587db96d56Sopenharmony_cistatic PyObject *
11597db96d56Sopenharmony_cibytearray_copy_impl(PyByteArrayObject *self)
11607db96d56Sopenharmony_ci/*[clinic end generated code: output=68cfbcfed484c132 input=6597b0c01bccaa9e]*/
11617db96d56Sopenharmony_ci{
11627db96d56Sopenharmony_ci    return PyByteArray_FromStringAndSize(PyByteArray_AS_STRING((PyObject *)self),
11637db96d56Sopenharmony_ci                                         PyByteArray_GET_SIZE(self));
11647db96d56Sopenharmony_ci}
11657db96d56Sopenharmony_ci
11667db96d56Sopenharmony_cistatic PyObject *
11677db96d56Sopenharmony_cibytearray_index(PyByteArrayObject *self, PyObject *args)
11687db96d56Sopenharmony_ci{
11697db96d56Sopenharmony_ci    return _Py_bytes_index(PyByteArray_AS_STRING(self), PyByteArray_GET_SIZE(self), args);
11707db96d56Sopenharmony_ci}
11717db96d56Sopenharmony_ci
11727db96d56Sopenharmony_cistatic PyObject *
11737db96d56Sopenharmony_cibytearray_rfind(PyByteArrayObject *self, PyObject *args)
11747db96d56Sopenharmony_ci{
11757db96d56Sopenharmony_ci    return _Py_bytes_rfind(PyByteArray_AS_STRING(self), PyByteArray_GET_SIZE(self), args);
11767db96d56Sopenharmony_ci}
11777db96d56Sopenharmony_ci
11787db96d56Sopenharmony_cistatic PyObject *
11797db96d56Sopenharmony_cibytearray_rindex(PyByteArrayObject *self, PyObject *args)
11807db96d56Sopenharmony_ci{
11817db96d56Sopenharmony_ci    return _Py_bytes_rindex(PyByteArray_AS_STRING(self), PyByteArray_GET_SIZE(self), args);
11827db96d56Sopenharmony_ci}
11837db96d56Sopenharmony_ci
11847db96d56Sopenharmony_cistatic int
11857db96d56Sopenharmony_cibytearray_contains(PyObject *self, PyObject *arg)
11867db96d56Sopenharmony_ci{
11877db96d56Sopenharmony_ci    return _Py_bytes_contains(PyByteArray_AS_STRING(self), PyByteArray_GET_SIZE(self), arg);
11887db96d56Sopenharmony_ci}
11897db96d56Sopenharmony_ci
11907db96d56Sopenharmony_cistatic PyObject *
11917db96d56Sopenharmony_cibytearray_startswith(PyByteArrayObject *self, PyObject *args)
11927db96d56Sopenharmony_ci{
11937db96d56Sopenharmony_ci    return _Py_bytes_startswith(PyByteArray_AS_STRING(self), PyByteArray_GET_SIZE(self), args);
11947db96d56Sopenharmony_ci}
11957db96d56Sopenharmony_ci
11967db96d56Sopenharmony_cistatic PyObject *
11977db96d56Sopenharmony_cibytearray_endswith(PyByteArrayObject *self, PyObject *args)
11987db96d56Sopenharmony_ci{
11997db96d56Sopenharmony_ci    return _Py_bytes_endswith(PyByteArray_AS_STRING(self), PyByteArray_GET_SIZE(self), args);
12007db96d56Sopenharmony_ci}
12017db96d56Sopenharmony_ci
12027db96d56Sopenharmony_ci/*[clinic input]
12037db96d56Sopenharmony_cibytearray.removeprefix as bytearray_removeprefix
12047db96d56Sopenharmony_ci
12057db96d56Sopenharmony_ci    prefix: Py_buffer
12067db96d56Sopenharmony_ci    /
12077db96d56Sopenharmony_ci
12087db96d56Sopenharmony_ciReturn a bytearray with the given prefix string removed if present.
12097db96d56Sopenharmony_ci
12107db96d56Sopenharmony_ciIf the bytearray starts with the prefix string, return
12117db96d56Sopenharmony_cibytearray[len(prefix):].  Otherwise, return a copy of the original
12127db96d56Sopenharmony_cibytearray.
12137db96d56Sopenharmony_ci[clinic start generated code]*/
12147db96d56Sopenharmony_ci
12157db96d56Sopenharmony_cistatic PyObject *
12167db96d56Sopenharmony_cibytearray_removeprefix_impl(PyByteArrayObject *self, Py_buffer *prefix)
12177db96d56Sopenharmony_ci/*[clinic end generated code: output=6cabc585e7f502e0 input=968aada38aedd262]*/
12187db96d56Sopenharmony_ci{
12197db96d56Sopenharmony_ci    const char *self_start = PyByteArray_AS_STRING(self);
12207db96d56Sopenharmony_ci    Py_ssize_t self_len = PyByteArray_GET_SIZE(self);
12217db96d56Sopenharmony_ci    const char *prefix_start = prefix->buf;
12227db96d56Sopenharmony_ci    Py_ssize_t prefix_len = prefix->len;
12237db96d56Sopenharmony_ci
12247db96d56Sopenharmony_ci    if (self_len >= prefix_len
12257db96d56Sopenharmony_ci        && memcmp(self_start, prefix_start, prefix_len) == 0)
12267db96d56Sopenharmony_ci    {
12277db96d56Sopenharmony_ci        return PyByteArray_FromStringAndSize(self_start + prefix_len,
12287db96d56Sopenharmony_ci                                             self_len - prefix_len);
12297db96d56Sopenharmony_ci    }
12307db96d56Sopenharmony_ci
12317db96d56Sopenharmony_ci    return PyByteArray_FromStringAndSize(self_start, self_len);
12327db96d56Sopenharmony_ci}
12337db96d56Sopenharmony_ci
12347db96d56Sopenharmony_ci/*[clinic input]
12357db96d56Sopenharmony_cibytearray.removesuffix as bytearray_removesuffix
12367db96d56Sopenharmony_ci
12377db96d56Sopenharmony_ci    suffix: Py_buffer
12387db96d56Sopenharmony_ci    /
12397db96d56Sopenharmony_ci
12407db96d56Sopenharmony_ciReturn a bytearray with the given suffix string removed if present.
12417db96d56Sopenharmony_ci
12427db96d56Sopenharmony_ciIf the bytearray ends with the suffix string and that suffix is not
12437db96d56Sopenharmony_ciempty, return bytearray[:-len(suffix)].  Otherwise, return a copy of
12447db96d56Sopenharmony_cithe original bytearray.
12457db96d56Sopenharmony_ci[clinic start generated code]*/
12467db96d56Sopenharmony_ci
12477db96d56Sopenharmony_cistatic PyObject *
12487db96d56Sopenharmony_cibytearray_removesuffix_impl(PyByteArrayObject *self, Py_buffer *suffix)
12497db96d56Sopenharmony_ci/*[clinic end generated code: output=2bc8cfb79de793d3 input=c1827e810b2f6b99]*/
12507db96d56Sopenharmony_ci{
12517db96d56Sopenharmony_ci    const char *self_start = PyByteArray_AS_STRING(self);
12527db96d56Sopenharmony_ci    Py_ssize_t self_len = PyByteArray_GET_SIZE(self);
12537db96d56Sopenharmony_ci    const char *suffix_start = suffix->buf;
12547db96d56Sopenharmony_ci    Py_ssize_t suffix_len = suffix->len;
12557db96d56Sopenharmony_ci
12567db96d56Sopenharmony_ci    if (self_len >= suffix_len
12577db96d56Sopenharmony_ci        && memcmp(self_start + self_len - suffix_len,
12587db96d56Sopenharmony_ci                  suffix_start, suffix_len) == 0)
12597db96d56Sopenharmony_ci    {
12607db96d56Sopenharmony_ci        return PyByteArray_FromStringAndSize(self_start,
12617db96d56Sopenharmony_ci                                             self_len - suffix_len);
12627db96d56Sopenharmony_ci    }
12637db96d56Sopenharmony_ci
12647db96d56Sopenharmony_ci    return PyByteArray_FromStringAndSize(self_start, self_len);
12657db96d56Sopenharmony_ci}
12667db96d56Sopenharmony_ci
12677db96d56Sopenharmony_ci
12687db96d56Sopenharmony_ci/*[clinic input]
12697db96d56Sopenharmony_cibytearray.translate
12707db96d56Sopenharmony_ci
12717db96d56Sopenharmony_ci    table: object
12727db96d56Sopenharmony_ci        Translation table, which must be a bytes object of length 256.
12737db96d56Sopenharmony_ci    /
12747db96d56Sopenharmony_ci    delete as deletechars: object(c_default="NULL") = b''
12757db96d56Sopenharmony_ci
12767db96d56Sopenharmony_ciReturn a copy with each character mapped by the given translation table.
12777db96d56Sopenharmony_ci
12787db96d56Sopenharmony_ciAll characters occurring in the optional argument delete are removed.
12797db96d56Sopenharmony_ciThe remaining characters are mapped through the given translation table.
12807db96d56Sopenharmony_ci[clinic start generated code]*/
12817db96d56Sopenharmony_ci
12827db96d56Sopenharmony_cistatic PyObject *
12837db96d56Sopenharmony_cibytearray_translate_impl(PyByteArrayObject *self, PyObject *table,
12847db96d56Sopenharmony_ci                         PyObject *deletechars)
12857db96d56Sopenharmony_ci/*[clinic end generated code: output=b6a8f01c2a74e446 input=cfff956d4d127a9b]*/
12867db96d56Sopenharmony_ci{
12877db96d56Sopenharmony_ci    char *input, *output;
12887db96d56Sopenharmony_ci    const char *table_chars;
12897db96d56Sopenharmony_ci    Py_ssize_t i, c;
12907db96d56Sopenharmony_ci    PyObject *input_obj = (PyObject*)self;
12917db96d56Sopenharmony_ci    const char *output_start;
12927db96d56Sopenharmony_ci    Py_ssize_t inlen;
12937db96d56Sopenharmony_ci    PyObject *result = NULL;
12947db96d56Sopenharmony_ci    int trans_table[256];
12957db96d56Sopenharmony_ci    Py_buffer vtable, vdel;
12967db96d56Sopenharmony_ci
12977db96d56Sopenharmony_ci    if (table == Py_None) {
12987db96d56Sopenharmony_ci        table_chars = NULL;
12997db96d56Sopenharmony_ci        table = NULL;
13007db96d56Sopenharmony_ci    } else if (PyObject_GetBuffer(table, &vtable, PyBUF_SIMPLE) != 0) {
13017db96d56Sopenharmony_ci        return NULL;
13027db96d56Sopenharmony_ci    } else {
13037db96d56Sopenharmony_ci        if (vtable.len != 256) {
13047db96d56Sopenharmony_ci            PyErr_SetString(PyExc_ValueError,
13057db96d56Sopenharmony_ci                            "translation table must be 256 characters long");
13067db96d56Sopenharmony_ci            PyBuffer_Release(&vtable);
13077db96d56Sopenharmony_ci            return NULL;
13087db96d56Sopenharmony_ci        }
13097db96d56Sopenharmony_ci        table_chars = (const char*)vtable.buf;
13107db96d56Sopenharmony_ci    }
13117db96d56Sopenharmony_ci
13127db96d56Sopenharmony_ci    if (deletechars != NULL) {
13137db96d56Sopenharmony_ci        if (PyObject_GetBuffer(deletechars, &vdel, PyBUF_SIMPLE) != 0) {
13147db96d56Sopenharmony_ci            if (table != NULL)
13157db96d56Sopenharmony_ci                PyBuffer_Release(&vtable);
13167db96d56Sopenharmony_ci            return NULL;
13177db96d56Sopenharmony_ci        }
13187db96d56Sopenharmony_ci    }
13197db96d56Sopenharmony_ci    else {
13207db96d56Sopenharmony_ci        vdel.buf = NULL;
13217db96d56Sopenharmony_ci        vdel.len = 0;
13227db96d56Sopenharmony_ci    }
13237db96d56Sopenharmony_ci
13247db96d56Sopenharmony_ci    inlen = PyByteArray_GET_SIZE(input_obj);
13257db96d56Sopenharmony_ci    result = PyByteArray_FromStringAndSize((char *)NULL, inlen);
13267db96d56Sopenharmony_ci    if (result == NULL)
13277db96d56Sopenharmony_ci        goto done;
13287db96d56Sopenharmony_ci    output_start = output = PyByteArray_AS_STRING(result);
13297db96d56Sopenharmony_ci    input = PyByteArray_AS_STRING(input_obj);
13307db96d56Sopenharmony_ci
13317db96d56Sopenharmony_ci    if (vdel.len == 0 && table_chars != NULL) {
13327db96d56Sopenharmony_ci        /* If no deletions are required, use faster code */
13337db96d56Sopenharmony_ci        for (i = inlen; --i >= 0; ) {
13347db96d56Sopenharmony_ci            c = Py_CHARMASK(*input++);
13357db96d56Sopenharmony_ci            *output++ = table_chars[c];
13367db96d56Sopenharmony_ci        }
13377db96d56Sopenharmony_ci        goto done;
13387db96d56Sopenharmony_ci    }
13397db96d56Sopenharmony_ci
13407db96d56Sopenharmony_ci    if (table_chars == NULL) {
13417db96d56Sopenharmony_ci        for (i = 0; i < 256; i++)
13427db96d56Sopenharmony_ci            trans_table[i] = Py_CHARMASK(i);
13437db96d56Sopenharmony_ci    } else {
13447db96d56Sopenharmony_ci        for (i = 0; i < 256; i++)
13457db96d56Sopenharmony_ci            trans_table[i] = Py_CHARMASK(table_chars[i]);
13467db96d56Sopenharmony_ci    }
13477db96d56Sopenharmony_ci
13487db96d56Sopenharmony_ci    for (i = 0; i < vdel.len; i++)
13497db96d56Sopenharmony_ci        trans_table[(int) Py_CHARMASK( ((unsigned char*)vdel.buf)[i] )] = -1;
13507db96d56Sopenharmony_ci
13517db96d56Sopenharmony_ci    for (i = inlen; --i >= 0; ) {
13527db96d56Sopenharmony_ci        c = Py_CHARMASK(*input++);
13537db96d56Sopenharmony_ci        if (trans_table[c] != -1)
13547db96d56Sopenharmony_ci            *output++ = (char)trans_table[c];
13557db96d56Sopenharmony_ci    }
13567db96d56Sopenharmony_ci    /* Fix the size of the resulting bytearray */
13577db96d56Sopenharmony_ci    if (inlen > 0)
13587db96d56Sopenharmony_ci        if (PyByteArray_Resize(result, output - output_start) < 0) {
13597db96d56Sopenharmony_ci            Py_CLEAR(result);
13607db96d56Sopenharmony_ci            goto done;
13617db96d56Sopenharmony_ci        }
13627db96d56Sopenharmony_ci
13637db96d56Sopenharmony_cidone:
13647db96d56Sopenharmony_ci    if (table != NULL)
13657db96d56Sopenharmony_ci        PyBuffer_Release(&vtable);
13667db96d56Sopenharmony_ci    if (deletechars != NULL)
13677db96d56Sopenharmony_ci        PyBuffer_Release(&vdel);
13687db96d56Sopenharmony_ci    return result;
13697db96d56Sopenharmony_ci}
13707db96d56Sopenharmony_ci
13717db96d56Sopenharmony_ci
13727db96d56Sopenharmony_ci/*[clinic input]
13737db96d56Sopenharmony_ci
13747db96d56Sopenharmony_ci@staticmethod
13757db96d56Sopenharmony_cibytearray.maketrans
13767db96d56Sopenharmony_ci
13777db96d56Sopenharmony_ci    frm: Py_buffer
13787db96d56Sopenharmony_ci    to: Py_buffer
13797db96d56Sopenharmony_ci    /
13807db96d56Sopenharmony_ci
13817db96d56Sopenharmony_ciReturn a translation table useable for the bytes or bytearray translate method.
13827db96d56Sopenharmony_ci
13837db96d56Sopenharmony_ciThe returned table will be one where each byte in frm is mapped to the byte at
13847db96d56Sopenharmony_cithe same position in to.
13857db96d56Sopenharmony_ci
13867db96d56Sopenharmony_ciThe bytes objects frm and to must be of the same length.
13877db96d56Sopenharmony_ci[clinic start generated code]*/
13887db96d56Sopenharmony_ci
13897db96d56Sopenharmony_cistatic PyObject *
13907db96d56Sopenharmony_cibytearray_maketrans_impl(Py_buffer *frm, Py_buffer *to)
13917db96d56Sopenharmony_ci/*[clinic end generated code: output=1df267d99f56b15e input=5925a81d2fbbf151]*/
13927db96d56Sopenharmony_ci{
13937db96d56Sopenharmony_ci    return _Py_bytes_maketrans(frm, to);
13947db96d56Sopenharmony_ci}
13957db96d56Sopenharmony_ci
13967db96d56Sopenharmony_ci
13977db96d56Sopenharmony_ci/*[clinic input]
13987db96d56Sopenharmony_cibytearray.replace
13997db96d56Sopenharmony_ci
14007db96d56Sopenharmony_ci    old: Py_buffer
14017db96d56Sopenharmony_ci    new: Py_buffer
14027db96d56Sopenharmony_ci    count: Py_ssize_t = -1
14037db96d56Sopenharmony_ci        Maximum number of occurrences to replace.
14047db96d56Sopenharmony_ci        -1 (the default value) means replace all occurrences.
14057db96d56Sopenharmony_ci    /
14067db96d56Sopenharmony_ci
14077db96d56Sopenharmony_ciReturn a copy with all occurrences of substring old replaced by new.
14087db96d56Sopenharmony_ci
14097db96d56Sopenharmony_ciIf the optional argument count is given, only the first count occurrences are
14107db96d56Sopenharmony_cireplaced.
14117db96d56Sopenharmony_ci[clinic start generated code]*/
14127db96d56Sopenharmony_ci
14137db96d56Sopenharmony_cistatic PyObject *
14147db96d56Sopenharmony_cibytearray_replace_impl(PyByteArrayObject *self, Py_buffer *old,
14157db96d56Sopenharmony_ci                       Py_buffer *new, Py_ssize_t count)
14167db96d56Sopenharmony_ci/*[clinic end generated code: output=d39884c4dc59412a input=aa379d988637c7fb]*/
14177db96d56Sopenharmony_ci{
14187db96d56Sopenharmony_ci    return stringlib_replace((PyObject *)self,
14197db96d56Sopenharmony_ci                             (const char *)old->buf, old->len,
14207db96d56Sopenharmony_ci                             (const char *)new->buf, new->len, count);
14217db96d56Sopenharmony_ci}
14227db96d56Sopenharmony_ci
14237db96d56Sopenharmony_ci/*[clinic input]
14247db96d56Sopenharmony_cibytearray.split
14257db96d56Sopenharmony_ci
14267db96d56Sopenharmony_ci    sep: object = None
14277db96d56Sopenharmony_ci        The delimiter according which to split the bytearray.
14287db96d56Sopenharmony_ci        None (the default value) means split on ASCII whitespace characters
14297db96d56Sopenharmony_ci        (space, tab, return, newline, formfeed, vertical tab).
14307db96d56Sopenharmony_ci    maxsplit: Py_ssize_t = -1
14317db96d56Sopenharmony_ci        Maximum number of splits to do.
14327db96d56Sopenharmony_ci        -1 (the default value) means no limit.
14337db96d56Sopenharmony_ci
14347db96d56Sopenharmony_ciReturn a list of the sections in the bytearray, using sep as the delimiter.
14357db96d56Sopenharmony_ci[clinic start generated code]*/
14367db96d56Sopenharmony_ci
14377db96d56Sopenharmony_cistatic PyObject *
14387db96d56Sopenharmony_cibytearray_split_impl(PyByteArrayObject *self, PyObject *sep,
14397db96d56Sopenharmony_ci                     Py_ssize_t maxsplit)
14407db96d56Sopenharmony_ci/*[clinic end generated code: output=833e2cf385d9a04d input=24f82669f41bf523]*/
14417db96d56Sopenharmony_ci{
14427db96d56Sopenharmony_ci    Py_ssize_t len = PyByteArray_GET_SIZE(self), n;
14437db96d56Sopenharmony_ci    const char *s = PyByteArray_AS_STRING(self), *sub;
14447db96d56Sopenharmony_ci    PyObject *list;
14457db96d56Sopenharmony_ci    Py_buffer vsub;
14467db96d56Sopenharmony_ci
14477db96d56Sopenharmony_ci    if (maxsplit < 0)
14487db96d56Sopenharmony_ci        maxsplit = PY_SSIZE_T_MAX;
14497db96d56Sopenharmony_ci
14507db96d56Sopenharmony_ci    if (sep == Py_None)
14517db96d56Sopenharmony_ci        return stringlib_split_whitespace((PyObject*) self, s, len, maxsplit);
14527db96d56Sopenharmony_ci
14537db96d56Sopenharmony_ci    if (PyObject_GetBuffer(sep, &vsub, PyBUF_SIMPLE) != 0)
14547db96d56Sopenharmony_ci        return NULL;
14557db96d56Sopenharmony_ci    sub = vsub.buf;
14567db96d56Sopenharmony_ci    n = vsub.len;
14577db96d56Sopenharmony_ci
14587db96d56Sopenharmony_ci    list = stringlib_split(
14597db96d56Sopenharmony_ci        (PyObject*) self, s, len, sub, n, maxsplit
14607db96d56Sopenharmony_ci        );
14617db96d56Sopenharmony_ci    PyBuffer_Release(&vsub);
14627db96d56Sopenharmony_ci    return list;
14637db96d56Sopenharmony_ci}
14647db96d56Sopenharmony_ci
14657db96d56Sopenharmony_ci/*[clinic input]
14667db96d56Sopenharmony_cibytearray.partition
14677db96d56Sopenharmony_ci
14687db96d56Sopenharmony_ci    sep: object
14697db96d56Sopenharmony_ci    /
14707db96d56Sopenharmony_ci
14717db96d56Sopenharmony_ciPartition the bytearray into three parts using the given separator.
14727db96d56Sopenharmony_ci
14737db96d56Sopenharmony_ciThis will search for the separator sep in the bytearray. If the separator is
14747db96d56Sopenharmony_cifound, returns a 3-tuple containing the part before the separator, the
14757db96d56Sopenharmony_ciseparator itself, and the part after it as new bytearray objects.
14767db96d56Sopenharmony_ci
14777db96d56Sopenharmony_ciIf the separator is not found, returns a 3-tuple containing the copy of the
14787db96d56Sopenharmony_cioriginal bytearray object and two empty bytearray objects.
14797db96d56Sopenharmony_ci[clinic start generated code]*/
14807db96d56Sopenharmony_ci
14817db96d56Sopenharmony_cistatic PyObject *
14827db96d56Sopenharmony_cibytearray_partition(PyByteArrayObject *self, PyObject *sep)
14837db96d56Sopenharmony_ci/*[clinic end generated code: output=45d2525ddd35f957 input=8f644749ee4fc83a]*/
14847db96d56Sopenharmony_ci{
14857db96d56Sopenharmony_ci    PyObject *bytesep, *result;
14867db96d56Sopenharmony_ci
14877db96d56Sopenharmony_ci    bytesep = _PyByteArray_FromBufferObject(sep);
14887db96d56Sopenharmony_ci    if (! bytesep)
14897db96d56Sopenharmony_ci        return NULL;
14907db96d56Sopenharmony_ci
14917db96d56Sopenharmony_ci    result = stringlib_partition(
14927db96d56Sopenharmony_ci            (PyObject*) self,
14937db96d56Sopenharmony_ci            PyByteArray_AS_STRING(self), PyByteArray_GET_SIZE(self),
14947db96d56Sopenharmony_ci            bytesep,
14957db96d56Sopenharmony_ci            PyByteArray_AS_STRING(bytesep), PyByteArray_GET_SIZE(bytesep)
14967db96d56Sopenharmony_ci            );
14977db96d56Sopenharmony_ci
14987db96d56Sopenharmony_ci    Py_DECREF(bytesep);
14997db96d56Sopenharmony_ci    return result;
15007db96d56Sopenharmony_ci}
15017db96d56Sopenharmony_ci
15027db96d56Sopenharmony_ci/*[clinic input]
15037db96d56Sopenharmony_cibytearray.rpartition
15047db96d56Sopenharmony_ci
15057db96d56Sopenharmony_ci    sep: object
15067db96d56Sopenharmony_ci    /
15077db96d56Sopenharmony_ci
15087db96d56Sopenharmony_ciPartition the bytearray into three parts using the given separator.
15097db96d56Sopenharmony_ci
15107db96d56Sopenharmony_ciThis will search for the separator sep in the bytearray, starting at the end.
15117db96d56Sopenharmony_ciIf the separator is found, returns a 3-tuple containing the part before the
15127db96d56Sopenharmony_ciseparator, the separator itself, and the part after it as new bytearray
15137db96d56Sopenharmony_ciobjects.
15147db96d56Sopenharmony_ci
15157db96d56Sopenharmony_ciIf the separator is not found, returns a 3-tuple containing two empty bytearray
15167db96d56Sopenharmony_ciobjects and the copy of the original bytearray object.
15177db96d56Sopenharmony_ci[clinic start generated code]*/
15187db96d56Sopenharmony_ci
15197db96d56Sopenharmony_cistatic PyObject *
15207db96d56Sopenharmony_cibytearray_rpartition(PyByteArrayObject *self, PyObject *sep)
15217db96d56Sopenharmony_ci/*[clinic end generated code: output=440de3c9426115e8 input=7e3df3e6cb8fa0ac]*/
15227db96d56Sopenharmony_ci{
15237db96d56Sopenharmony_ci    PyObject *bytesep, *result;
15247db96d56Sopenharmony_ci
15257db96d56Sopenharmony_ci    bytesep = _PyByteArray_FromBufferObject(sep);
15267db96d56Sopenharmony_ci    if (! bytesep)
15277db96d56Sopenharmony_ci        return NULL;
15287db96d56Sopenharmony_ci
15297db96d56Sopenharmony_ci    result = stringlib_rpartition(
15307db96d56Sopenharmony_ci            (PyObject*) self,
15317db96d56Sopenharmony_ci            PyByteArray_AS_STRING(self), PyByteArray_GET_SIZE(self),
15327db96d56Sopenharmony_ci            bytesep,
15337db96d56Sopenharmony_ci            PyByteArray_AS_STRING(bytesep), PyByteArray_GET_SIZE(bytesep)
15347db96d56Sopenharmony_ci            );
15357db96d56Sopenharmony_ci
15367db96d56Sopenharmony_ci    Py_DECREF(bytesep);
15377db96d56Sopenharmony_ci    return result;
15387db96d56Sopenharmony_ci}
15397db96d56Sopenharmony_ci
15407db96d56Sopenharmony_ci/*[clinic input]
15417db96d56Sopenharmony_cibytearray.rsplit = bytearray.split
15427db96d56Sopenharmony_ci
15437db96d56Sopenharmony_ciReturn a list of the sections in the bytearray, using sep as the delimiter.
15447db96d56Sopenharmony_ci
15457db96d56Sopenharmony_ciSplitting is done starting at the end of the bytearray and working to the front.
15467db96d56Sopenharmony_ci[clinic start generated code]*/
15477db96d56Sopenharmony_ci
15487db96d56Sopenharmony_cistatic PyObject *
15497db96d56Sopenharmony_cibytearray_rsplit_impl(PyByteArrayObject *self, PyObject *sep,
15507db96d56Sopenharmony_ci                      Py_ssize_t maxsplit)
15517db96d56Sopenharmony_ci/*[clinic end generated code: output=a55e0b5a03cb6190 input=a68286e4dd692ffe]*/
15527db96d56Sopenharmony_ci{
15537db96d56Sopenharmony_ci    Py_ssize_t len = PyByteArray_GET_SIZE(self), n;
15547db96d56Sopenharmony_ci    const char *s = PyByteArray_AS_STRING(self), *sub;
15557db96d56Sopenharmony_ci    PyObject *list;
15567db96d56Sopenharmony_ci    Py_buffer vsub;
15577db96d56Sopenharmony_ci
15587db96d56Sopenharmony_ci    if (maxsplit < 0)
15597db96d56Sopenharmony_ci        maxsplit = PY_SSIZE_T_MAX;
15607db96d56Sopenharmony_ci
15617db96d56Sopenharmony_ci    if (sep == Py_None)
15627db96d56Sopenharmony_ci        return stringlib_rsplit_whitespace((PyObject*) self, s, len, maxsplit);
15637db96d56Sopenharmony_ci
15647db96d56Sopenharmony_ci    if (PyObject_GetBuffer(sep, &vsub, PyBUF_SIMPLE) != 0)
15657db96d56Sopenharmony_ci        return NULL;
15667db96d56Sopenharmony_ci    sub = vsub.buf;
15677db96d56Sopenharmony_ci    n = vsub.len;
15687db96d56Sopenharmony_ci
15697db96d56Sopenharmony_ci    list = stringlib_rsplit(
15707db96d56Sopenharmony_ci        (PyObject*) self, s, len, sub, n, maxsplit
15717db96d56Sopenharmony_ci        );
15727db96d56Sopenharmony_ci    PyBuffer_Release(&vsub);
15737db96d56Sopenharmony_ci    return list;
15747db96d56Sopenharmony_ci}
15757db96d56Sopenharmony_ci
15767db96d56Sopenharmony_ci/*[clinic input]
15777db96d56Sopenharmony_cibytearray.reverse
15787db96d56Sopenharmony_ci
15797db96d56Sopenharmony_ciReverse the order of the values in B in place.
15807db96d56Sopenharmony_ci[clinic start generated code]*/
15817db96d56Sopenharmony_ci
15827db96d56Sopenharmony_cistatic PyObject *
15837db96d56Sopenharmony_cibytearray_reverse_impl(PyByteArrayObject *self)
15847db96d56Sopenharmony_ci/*[clinic end generated code: output=9f7616f29ab309d3 input=543356319fc78557]*/
15857db96d56Sopenharmony_ci{
15867db96d56Sopenharmony_ci    char swap, *head, *tail;
15877db96d56Sopenharmony_ci    Py_ssize_t i, j, n = Py_SIZE(self);
15887db96d56Sopenharmony_ci
15897db96d56Sopenharmony_ci    j = n / 2;
15907db96d56Sopenharmony_ci    head = PyByteArray_AS_STRING(self);
15917db96d56Sopenharmony_ci    tail = head + n - 1;
15927db96d56Sopenharmony_ci    for (i = 0; i < j; i++) {
15937db96d56Sopenharmony_ci        swap = *head;
15947db96d56Sopenharmony_ci        *head++ = *tail;
15957db96d56Sopenharmony_ci        *tail-- = swap;
15967db96d56Sopenharmony_ci    }
15977db96d56Sopenharmony_ci
15987db96d56Sopenharmony_ci    Py_RETURN_NONE;
15997db96d56Sopenharmony_ci}
16007db96d56Sopenharmony_ci
16017db96d56Sopenharmony_ci
16027db96d56Sopenharmony_ci/*[python input]
16037db96d56Sopenharmony_ciclass bytesvalue_converter(CConverter):
16047db96d56Sopenharmony_ci    type = 'int'
16057db96d56Sopenharmony_ci    converter = '_getbytevalue'
16067db96d56Sopenharmony_ci[python start generated code]*/
16077db96d56Sopenharmony_ci/*[python end generated code: output=da39a3ee5e6b4b0d input=29c2e7c26c212812]*/
16087db96d56Sopenharmony_ci
16097db96d56Sopenharmony_ci
16107db96d56Sopenharmony_ci/*[clinic input]
16117db96d56Sopenharmony_cibytearray.insert
16127db96d56Sopenharmony_ci
16137db96d56Sopenharmony_ci    index: Py_ssize_t
16147db96d56Sopenharmony_ci        The index where the value is to be inserted.
16157db96d56Sopenharmony_ci    item: bytesvalue
16167db96d56Sopenharmony_ci        The item to be inserted.
16177db96d56Sopenharmony_ci    /
16187db96d56Sopenharmony_ci
16197db96d56Sopenharmony_ciInsert a single item into the bytearray before the given index.
16207db96d56Sopenharmony_ci[clinic start generated code]*/
16217db96d56Sopenharmony_ci
16227db96d56Sopenharmony_cistatic PyObject *
16237db96d56Sopenharmony_cibytearray_insert_impl(PyByteArrayObject *self, Py_ssize_t index, int item)
16247db96d56Sopenharmony_ci/*[clinic end generated code: output=76c775a70e7b07b7 input=b2b5d07e9de6c070]*/
16257db96d56Sopenharmony_ci{
16267db96d56Sopenharmony_ci    Py_ssize_t n = Py_SIZE(self);
16277db96d56Sopenharmony_ci    char *buf;
16287db96d56Sopenharmony_ci
16297db96d56Sopenharmony_ci    if (n == PY_SSIZE_T_MAX) {
16307db96d56Sopenharmony_ci        PyErr_SetString(PyExc_OverflowError,
16317db96d56Sopenharmony_ci                        "cannot add more objects to bytearray");
16327db96d56Sopenharmony_ci        return NULL;
16337db96d56Sopenharmony_ci    }
16347db96d56Sopenharmony_ci    if (PyByteArray_Resize((PyObject *)self, n + 1) < 0)
16357db96d56Sopenharmony_ci        return NULL;
16367db96d56Sopenharmony_ci    buf = PyByteArray_AS_STRING(self);
16377db96d56Sopenharmony_ci
16387db96d56Sopenharmony_ci    if (index < 0) {
16397db96d56Sopenharmony_ci        index += n;
16407db96d56Sopenharmony_ci        if (index < 0)
16417db96d56Sopenharmony_ci            index = 0;
16427db96d56Sopenharmony_ci    }
16437db96d56Sopenharmony_ci    if (index > n)
16447db96d56Sopenharmony_ci        index = n;
16457db96d56Sopenharmony_ci    memmove(buf + index + 1, buf + index, n - index);
16467db96d56Sopenharmony_ci    buf[index] = item;
16477db96d56Sopenharmony_ci
16487db96d56Sopenharmony_ci    Py_RETURN_NONE;
16497db96d56Sopenharmony_ci}
16507db96d56Sopenharmony_ci
16517db96d56Sopenharmony_ci/*[clinic input]
16527db96d56Sopenharmony_cibytearray.append
16537db96d56Sopenharmony_ci
16547db96d56Sopenharmony_ci    item: bytesvalue
16557db96d56Sopenharmony_ci        The item to be appended.
16567db96d56Sopenharmony_ci    /
16577db96d56Sopenharmony_ci
16587db96d56Sopenharmony_ciAppend a single item to the end of the bytearray.
16597db96d56Sopenharmony_ci[clinic start generated code]*/
16607db96d56Sopenharmony_ci
16617db96d56Sopenharmony_cistatic PyObject *
16627db96d56Sopenharmony_cibytearray_append_impl(PyByteArrayObject *self, int item)
16637db96d56Sopenharmony_ci/*[clinic end generated code: output=a154e19ed1886cb6 input=20d6bec3d1340593]*/
16647db96d56Sopenharmony_ci{
16657db96d56Sopenharmony_ci    Py_ssize_t n = Py_SIZE(self);
16667db96d56Sopenharmony_ci
16677db96d56Sopenharmony_ci    if (n == PY_SSIZE_T_MAX) {
16687db96d56Sopenharmony_ci        PyErr_SetString(PyExc_OverflowError,
16697db96d56Sopenharmony_ci                        "cannot add more objects to bytearray");
16707db96d56Sopenharmony_ci        return NULL;
16717db96d56Sopenharmony_ci    }
16727db96d56Sopenharmony_ci    if (PyByteArray_Resize((PyObject *)self, n + 1) < 0)
16737db96d56Sopenharmony_ci        return NULL;
16747db96d56Sopenharmony_ci
16757db96d56Sopenharmony_ci    PyByteArray_AS_STRING(self)[n] = item;
16767db96d56Sopenharmony_ci
16777db96d56Sopenharmony_ci    Py_RETURN_NONE;
16787db96d56Sopenharmony_ci}
16797db96d56Sopenharmony_ci
16807db96d56Sopenharmony_ci/*[clinic input]
16817db96d56Sopenharmony_cibytearray.extend
16827db96d56Sopenharmony_ci
16837db96d56Sopenharmony_ci    iterable_of_ints: object
16847db96d56Sopenharmony_ci        The iterable of items to append.
16857db96d56Sopenharmony_ci    /
16867db96d56Sopenharmony_ci
16877db96d56Sopenharmony_ciAppend all the items from the iterator or sequence to the end of the bytearray.
16887db96d56Sopenharmony_ci[clinic start generated code]*/
16897db96d56Sopenharmony_ci
16907db96d56Sopenharmony_cistatic PyObject *
16917db96d56Sopenharmony_cibytearray_extend(PyByteArrayObject *self, PyObject *iterable_of_ints)
16927db96d56Sopenharmony_ci/*[clinic end generated code: output=98155dbe249170b1 input=c617b3a93249ba28]*/
16937db96d56Sopenharmony_ci{
16947db96d56Sopenharmony_ci    PyObject *it, *item, *bytearray_obj;
16957db96d56Sopenharmony_ci    Py_ssize_t buf_size = 0, len = 0;
16967db96d56Sopenharmony_ci    int value;
16977db96d56Sopenharmony_ci    char *buf;
16987db96d56Sopenharmony_ci
16997db96d56Sopenharmony_ci    /* bytearray_setslice code only accepts something supporting PEP 3118. */
17007db96d56Sopenharmony_ci    if (PyObject_CheckBuffer(iterable_of_ints)) {
17017db96d56Sopenharmony_ci        if (bytearray_setslice(self, Py_SIZE(self), Py_SIZE(self), iterable_of_ints) == -1)
17027db96d56Sopenharmony_ci            return NULL;
17037db96d56Sopenharmony_ci
17047db96d56Sopenharmony_ci        Py_RETURN_NONE;
17057db96d56Sopenharmony_ci    }
17067db96d56Sopenharmony_ci
17077db96d56Sopenharmony_ci    it = PyObject_GetIter(iterable_of_ints);
17087db96d56Sopenharmony_ci    if (it == NULL) {
17097db96d56Sopenharmony_ci        if (PyErr_ExceptionMatches(PyExc_TypeError)) {
17107db96d56Sopenharmony_ci            PyErr_Format(PyExc_TypeError,
17117db96d56Sopenharmony_ci                         "can't extend bytearray with %.100s",
17127db96d56Sopenharmony_ci                         Py_TYPE(iterable_of_ints)->tp_name);
17137db96d56Sopenharmony_ci        }
17147db96d56Sopenharmony_ci        return NULL;
17157db96d56Sopenharmony_ci    }
17167db96d56Sopenharmony_ci
17177db96d56Sopenharmony_ci    /* Try to determine the length of the argument. 32 is arbitrary. */
17187db96d56Sopenharmony_ci    buf_size = PyObject_LengthHint(iterable_of_ints, 32);
17197db96d56Sopenharmony_ci    if (buf_size == -1) {
17207db96d56Sopenharmony_ci        Py_DECREF(it);
17217db96d56Sopenharmony_ci        return NULL;
17227db96d56Sopenharmony_ci    }
17237db96d56Sopenharmony_ci
17247db96d56Sopenharmony_ci    bytearray_obj = PyByteArray_FromStringAndSize(NULL, buf_size);
17257db96d56Sopenharmony_ci    if (bytearray_obj == NULL) {
17267db96d56Sopenharmony_ci        Py_DECREF(it);
17277db96d56Sopenharmony_ci        return NULL;
17287db96d56Sopenharmony_ci    }
17297db96d56Sopenharmony_ci    buf = PyByteArray_AS_STRING(bytearray_obj);
17307db96d56Sopenharmony_ci
17317db96d56Sopenharmony_ci    while ((item = PyIter_Next(it)) != NULL) {
17327db96d56Sopenharmony_ci        if (! _getbytevalue(item, &value)) {
17337db96d56Sopenharmony_ci            Py_DECREF(item);
17347db96d56Sopenharmony_ci            Py_DECREF(it);
17357db96d56Sopenharmony_ci            Py_DECREF(bytearray_obj);
17367db96d56Sopenharmony_ci            return NULL;
17377db96d56Sopenharmony_ci        }
17387db96d56Sopenharmony_ci        buf[len++] = value;
17397db96d56Sopenharmony_ci        Py_DECREF(item);
17407db96d56Sopenharmony_ci
17417db96d56Sopenharmony_ci        if (len >= buf_size) {
17427db96d56Sopenharmony_ci            Py_ssize_t addition;
17437db96d56Sopenharmony_ci            if (len == PY_SSIZE_T_MAX) {
17447db96d56Sopenharmony_ci                Py_DECREF(it);
17457db96d56Sopenharmony_ci                Py_DECREF(bytearray_obj);
17467db96d56Sopenharmony_ci                return PyErr_NoMemory();
17477db96d56Sopenharmony_ci            }
17487db96d56Sopenharmony_ci            addition = len >> 1;
17497db96d56Sopenharmony_ci            if (addition > PY_SSIZE_T_MAX - len - 1)
17507db96d56Sopenharmony_ci                buf_size = PY_SSIZE_T_MAX;
17517db96d56Sopenharmony_ci            else
17527db96d56Sopenharmony_ci                buf_size = len + addition + 1;
17537db96d56Sopenharmony_ci            if (PyByteArray_Resize((PyObject *)bytearray_obj, buf_size) < 0) {
17547db96d56Sopenharmony_ci                Py_DECREF(it);
17557db96d56Sopenharmony_ci                Py_DECREF(bytearray_obj);
17567db96d56Sopenharmony_ci                return NULL;
17577db96d56Sopenharmony_ci            }
17587db96d56Sopenharmony_ci            /* Recompute the `buf' pointer, since the resizing operation may
17597db96d56Sopenharmony_ci               have invalidated it. */
17607db96d56Sopenharmony_ci            buf = PyByteArray_AS_STRING(bytearray_obj);
17617db96d56Sopenharmony_ci        }
17627db96d56Sopenharmony_ci    }
17637db96d56Sopenharmony_ci    Py_DECREF(it);
17647db96d56Sopenharmony_ci
17657db96d56Sopenharmony_ci    if (PyErr_Occurred()) {
17667db96d56Sopenharmony_ci        Py_DECREF(bytearray_obj);
17677db96d56Sopenharmony_ci        return NULL;
17687db96d56Sopenharmony_ci    }
17697db96d56Sopenharmony_ci
17707db96d56Sopenharmony_ci    /* Resize down to exact size. */
17717db96d56Sopenharmony_ci    if (PyByteArray_Resize((PyObject *)bytearray_obj, len) < 0) {
17727db96d56Sopenharmony_ci        Py_DECREF(bytearray_obj);
17737db96d56Sopenharmony_ci        return NULL;
17747db96d56Sopenharmony_ci    }
17757db96d56Sopenharmony_ci
17767db96d56Sopenharmony_ci    if (bytearray_setslice(self, Py_SIZE(self), Py_SIZE(self), bytearray_obj) == -1) {
17777db96d56Sopenharmony_ci        Py_DECREF(bytearray_obj);
17787db96d56Sopenharmony_ci        return NULL;
17797db96d56Sopenharmony_ci    }
17807db96d56Sopenharmony_ci    Py_DECREF(bytearray_obj);
17817db96d56Sopenharmony_ci
17827db96d56Sopenharmony_ci    assert(!PyErr_Occurred());
17837db96d56Sopenharmony_ci    Py_RETURN_NONE;
17847db96d56Sopenharmony_ci}
17857db96d56Sopenharmony_ci
17867db96d56Sopenharmony_ci/*[clinic input]
17877db96d56Sopenharmony_cibytearray.pop
17887db96d56Sopenharmony_ci
17897db96d56Sopenharmony_ci    index: Py_ssize_t = -1
17907db96d56Sopenharmony_ci        The index from where to remove the item.
17917db96d56Sopenharmony_ci        -1 (the default value) means remove the last item.
17927db96d56Sopenharmony_ci    /
17937db96d56Sopenharmony_ci
17947db96d56Sopenharmony_ciRemove and return a single item from B.
17957db96d56Sopenharmony_ci
17967db96d56Sopenharmony_ciIf no index argument is given, will pop the last item.
17977db96d56Sopenharmony_ci[clinic start generated code]*/
17987db96d56Sopenharmony_ci
17997db96d56Sopenharmony_cistatic PyObject *
18007db96d56Sopenharmony_cibytearray_pop_impl(PyByteArrayObject *self, Py_ssize_t index)
18017db96d56Sopenharmony_ci/*[clinic end generated code: output=e0ccd401f8021da8 input=3591df2d06c0d237]*/
18027db96d56Sopenharmony_ci{
18037db96d56Sopenharmony_ci    int value;
18047db96d56Sopenharmony_ci    Py_ssize_t n = Py_SIZE(self);
18057db96d56Sopenharmony_ci    char *buf;
18067db96d56Sopenharmony_ci
18077db96d56Sopenharmony_ci    if (n == 0) {
18087db96d56Sopenharmony_ci        PyErr_SetString(PyExc_IndexError,
18097db96d56Sopenharmony_ci                        "pop from empty bytearray");
18107db96d56Sopenharmony_ci        return NULL;
18117db96d56Sopenharmony_ci    }
18127db96d56Sopenharmony_ci    if (index < 0)
18137db96d56Sopenharmony_ci        index += Py_SIZE(self);
18147db96d56Sopenharmony_ci    if (index < 0 || index >= Py_SIZE(self)) {
18157db96d56Sopenharmony_ci        PyErr_SetString(PyExc_IndexError, "pop index out of range");
18167db96d56Sopenharmony_ci        return NULL;
18177db96d56Sopenharmony_ci    }
18187db96d56Sopenharmony_ci    if (!_canresize(self))
18197db96d56Sopenharmony_ci        return NULL;
18207db96d56Sopenharmony_ci
18217db96d56Sopenharmony_ci    buf = PyByteArray_AS_STRING(self);
18227db96d56Sopenharmony_ci    value = buf[index];
18237db96d56Sopenharmony_ci    memmove(buf + index, buf + index + 1, n - index);
18247db96d56Sopenharmony_ci    if (PyByteArray_Resize((PyObject *)self, n - 1) < 0)
18257db96d56Sopenharmony_ci        return NULL;
18267db96d56Sopenharmony_ci
18277db96d56Sopenharmony_ci    return _PyLong_FromUnsignedChar((unsigned char)value);
18287db96d56Sopenharmony_ci}
18297db96d56Sopenharmony_ci
18307db96d56Sopenharmony_ci/*[clinic input]
18317db96d56Sopenharmony_cibytearray.remove
18327db96d56Sopenharmony_ci
18337db96d56Sopenharmony_ci    value: bytesvalue
18347db96d56Sopenharmony_ci        The value to remove.
18357db96d56Sopenharmony_ci    /
18367db96d56Sopenharmony_ci
18377db96d56Sopenharmony_ciRemove the first occurrence of a value in the bytearray.
18387db96d56Sopenharmony_ci[clinic start generated code]*/
18397db96d56Sopenharmony_ci
18407db96d56Sopenharmony_cistatic PyObject *
18417db96d56Sopenharmony_cibytearray_remove_impl(PyByteArrayObject *self, int value)
18427db96d56Sopenharmony_ci/*[clinic end generated code: output=d659e37866709c13 input=121831240cd51ddf]*/
18437db96d56Sopenharmony_ci{
18447db96d56Sopenharmony_ci    Py_ssize_t where, n = Py_SIZE(self);
18457db96d56Sopenharmony_ci    char *buf = PyByteArray_AS_STRING(self);
18467db96d56Sopenharmony_ci
18477db96d56Sopenharmony_ci    where = stringlib_find_char(buf, n, value);
18487db96d56Sopenharmony_ci    if (where < 0) {
18497db96d56Sopenharmony_ci        PyErr_SetString(PyExc_ValueError, "value not found in bytearray");
18507db96d56Sopenharmony_ci        return NULL;
18517db96d56Sopenharmony_ci    }
18527db96d56Sopenharmony_ci    if (!_canresize(self))
18537db96d56Sopenharmony_ci        return NULL;
18547db96d56Sopenharmony_ci
18557db96d56Sopenharmony_ci    memmove(buf + where, buf + where + 1, n - where);
18567db96d56Sopenharmony_ci    if (PyByteArray_Resize((PyObject *)self, n - 1) < 0)
18577db96d56Sopenharmony_ci        return NULL;
18587db96d56Sopenharmony_ci
18597db96d56Sopenharmony_ci    Py_RETURN_NONE;
18607db96d56Sopenharmony_ci}
18617db96d56Sopenharmony_ci
18627db96d56Sopenharmony_ci#define LEFTSTRIP 0
18637db96d56Sopenharmony_ci#define RIGHTSTRIP 1
18647db96d56Sopenharmony_ci#define BOTHSTRIP 2
18657db96d56Sopenharmony_ci
18667db96d56Sopenharmony_cistatic PyObject*
18677db96d56Sopenharmony_cibytearray_strip_impl_helper(PyByteArrayObject* self, PyObject* bytes, int striptype)
18687db96d56Sopenharmony_ci{
18697db96d56Sopenharmony_ci    Py_ssize_t mysize, byteslen;
18707db96d56Sopenharmony_ci    const char* myptr;
18717db96d56Sopenharmony_ci    const char* bytesptr;
18727db96d56Sopenharmony_ci    Py_buffer vbytes;
18737db96d56Sopenharmony_ci
18747db96d56Sopenharmony_ci    if (bytes == Py_None) {
18757db96d56Sopenharmony_ci        bytesptr = "\t\n\r\f\v ";
18767db96d56Sopenharmony_ci        byteslen = 6;
18777db96d56Sopenharmony_ci    }
18787db96d56Sopenharmony_ci    else {
18797db96d56Sopenharmony_ci        if (PyObject_GetBuffer(bytes, &vbytes, PyBUF_SIMPLE) != 0)
18807db96d56Sopenharmony_ci            return NULL;
18817db96d56Sopenharmony_ci        bytesptr = (const char*)vbytes.buf;
18827db96d56Sopenharmony_ci        byteslen = vbytes.len;
18837db96d56Sopenharmony_ci    }
18847db96d56Sopenharmony_ci    myptr = PyByteArray_AS_STRING(self);
18857db96d56Sopenharmony_ci    mysize = Py_SIZE(self);
18867db96d56Sopenharmony_ci
18877db96d56Sopenharmony_ci    Py_ssize_t left = 0;
18887db96d56Sopenharmony_ci    if (striptype != RIGHTSTRIP) {
18897db96d56Sopenharmony_ci        while (left < mysize && memchr(bytesptr, (unsigned char)myptr[left], byteslen))
18907db96d56Sopenharmony_ci            left++;
18917db96d56Sopenharmony_ci    }
18927db96d56Sopenharmony_ci    Py_ssize_t right = mysize;
18937db96d56Sopenharmony_ci    if (striptype != LEFTSTRIP) {
18947db96d56Sopenharmony_ci        do {
18957db96d56Sopenharmony_ci            right--;
18967db96d56Sopenharmony_ci        } while (right >= left && memchr(bytesptr, (unsigned char)myptr[right], byteslen));
18977db96d56Sopenharmony_ci        right++;
18987db96d56Sopenharmony_ci    }
18997db96d56Sopenharmony_ci    if (bytes != Py_None)
19007db96d56Sopenharmony_ci        PyBuffer_Release(&vbytes);
19017db96d56Sopenharmony_ci    return PyByteArray_FromStringAndSize(myptr + left, right - left);
19027db96d56Sopenharmony_ci}
19037db96d56Sopenharmony_ci
19047db96d56Sopenharmony_ci/*[clinic input]
19057db96d56Sopenharmony_cibytearray.strip
19067db96d56Sopenharmony_ci
19077db96d56Sopenharmony_ci    bytes: object = None
19087db96d56Sopenharmony_ci    /
19097db96d56Sopenharmony_ci
19107db96d56Sopenharmony_ciStrip leading and trailing bytes contained in the argument.
19117db96d56Sopenharmony_ci
19127db96d56Sopenharmony_ciIf the argument is omitted or None, strip leading and trailing ASCII whitespace.
19137db96d56Sopenharmony_ci[clinic start generated code]*/
19147db96d56Sopenharmony_ci
19157db96d56Sopenharmony_cistatic PyObject *
19167db96d56Sopenharmony_cibytearray_strip_impl(PyByteArrayObject *self, PyObject *bytes)
19177db96d56Sopenharmony_ci/*[clinic end generated code: output=760412661a34ad5a input=ef7bb59b09c21d62]*/
19187db96d56Sopenharmony_ci{
19197db96d56Sopenharmony_ci    return bytearray_strip_impl_helper(self, bytes, BOTHSTRIP);
19207db96d56Sopenharmony_ci}
19217db96d56Sopenharmony_ci
19227db96d56Sopenharmony_ci/*[clinic input]
19237db96d56Sopenharmony_cibytearray.lstrip
19247db96d56Sopenharmony_ci
19257db96d56Sopenharmony_ci    bytes: object = None
19267db96d56Sopenharmony_ci    /
19277db96d56Sopenharmony_ci
19287db96d56Sopenharmony_ciStrip leading bytes contained in the argument.
19297db96d56Sopenharmony_ci
19307db96d56Sopenharmony_ciIf the argument is omitted or None, strip leading ASCII whitespace.
19317db96d56Sopenharmony_ci[clinic start generated code]*/
19327db96d56Sopenharmony_ci
19337db96d56Sopenharmony_cistatic PyObject *
19347db96d56Sopenharmony_cibytearray_lstrip_impl(PyByteArrayObject *self, PyObject *bytes)
19357db96d56Sopenharmony_ci/*[clinic end generated code: output=d005c9d0ab909e66 input=80843f975dd7c480]*/
19367db96d56Sopenharmony_ci{
19377db96d56Sopenharmony_ci    return bytearray_strip_impl_helper(self, bytes, LEFTSTRIP);
19387db96d56Sopenharmony_ci}
19397db96d56Sopenharmony_ci
19407db96d56Sopenharmony_ci/*[clinic input]
19417db96d56Sopenharmony_cibytearray.rstrip
19427db96d56Sopenharmony_ci
19437db96d56Sopenharmony_ci    bytes: object = None
19447db96d56Sopenharmony_ci    /
19457db96d56Sopenharmony_ci
19467db96d56Sopenharmony_ciStrip trailing bytes contained in the argument.
19477db96d56Sopenharmony_ci
19487db96d56Sopenharmony_ciIf the argument is omitted or None, strip trailing ASCII whitespace.
19497db96d56Sopenharmony_ci[clinic start generated code]*/
19507db96d56Sopenharmony_ci
19517db96d56Sopenharmony_cistatic PyObject *
19527db96d56Sopenharmony_cibytearray_rstrip_impl(PyByteArrayObject *self, PyObject *bytes)
19537db96d56Sopenharmony_ci/*[clinic end generated code: output=030e2fbd2f7276bd input=e728b994954cfd91]*/
19547db96d56Sopenharmony_ci{
19557db96d56Sopenharmony_ci    return bytearray_strip_impl_helper(self, bytes, RIGHTSTRIP);
19567db96d56Sopenharmony_ci}
19577db96d56Sopenharmony_ci
19587db96d56Sopenharmony_ci/*[clinic input]
19597db96d56Sopenharmony_cibytearray.decode
19607db96d56Sopenharmony_ci
19617db96d56Sopenharmony_ci    encoding: str(c_default="NULL") = 'utf-8'
19627db96d56Sopenharmony_ci        The encoding with which to decode the bytearray.
19637db96d56Sopenharmony_ci    errors: str(c_default="NULL") = 'strict'
19647db96d56Sopenharmony_ci        The error handling scheme to use for the handling of decoding errors.
19657db96d56Sopenharmony_ci        The default is 'strict' meaning that decoding errors raise a
19667db96d56Sopenharmony_ci        UnicodeDecodeError. Other possible values are 'ignore' and 'replace'
19677db96d56Sopenharmony_ci        as well as any other name registered with codecs.register_error that
19687db96d56Sopenharmony_ci        can handle UnicodeDecodeErrors.
19697db96d56Sopenharmony_ci
19707db96d56Sopenharmony_ciDecode the bytearray using the codec registered for encoding.
19717db96d56Sopenharmony_ci[clinic start generated code]*/
19727db96d56Sopenharmony_ci
19737db96d56Sopenharmony_cistatic PyObject *
19747db96d56Sopenharmony_cibytearray_decode_impl(PyByteArrayObject *self, const char *encoding,
19757db96d56Sopenharmony_ci                      const char *errors)
19767db96d56Sopenharmony_ci/*[clinic end generated code: output=f57d43f4a00b42c5 input=f28d8f903020257b]*/
19777db96d56Sopenharmony_ci{
19787db96d56Sopenharmony_ci    if (encoding == NULL)
19797db96d56Sopenharmony_ci        encoding = PyUnicode_GetDefaultEncoding();
19807db96d56Sopenharmony_ci    return PyUnicode_FromEncodedObject((PyObject*)self, encoding, errors);
19817db96d56Sopenharmony_ci}
19827db96d56Sopenharmony_ci
19837db96d56Sopenharmony_ciPyDoc_STRVAR(alloc_doc,
19847db96d56Sopenharmony_ci"B.__alloc__() -> int\n\
19857db96d56Sopenharmony_ci\n\
19867db96d56Sopenharmony_ciReturn the number of bytes actually allocated.");
19877db96d56Sopenharmony_ci
19887db96d56Sopenharmony_cistatic PyObject *
19897db96d56Sopenharmony_cibytearray_alloc(PyByteArrayObject *self, PyObject *Py_UNUSED(ignored))
19907db96d56Sopenharmony_ci{
19917db96d56Sopenharmony_ci    return PyLong_FromSsize_t(self->ob_alloc);
19927db96d56Sopenharmony_ci}
19937db96d56Sopenharmony_ci
19947db96d56Sopenharmony_ci/*[clinic input]
19957db96d56Sopenharmony_cibytearray.join
19967db96d56Sopenharmony_ci
19977db96d56Sopenharmony_ci    iterable_of_bytes: object
19987db96d56Sopenharmony_ci    /
19997db96d56Sopenharmony_ci
20007db96d56Sopenharmony_ciConcatenate any number of bytes/bytearray objects.
20017db96d56Sopenharmony_ci
20027db96d56Sopenharmony_ciThe bytearray whose method is called is inserted in between each pair.
20037db96d56Sopenharmony_ci
20047db96d56Sopenharmony_ciThe result is returned as a new bytearray object.
20057db96d56Sopenharmony_ci[clinic start generated code]*/
20067db96d56Sopenharmony_ci
20077db96d56Sopenharmony_cistatic PyObject *
20087db96d56Sopenharmony_cibytearray_join(PyByteArrayObject *self, PyObject *iterable_of_bytes)
20097db96d56Sopenharmony_ci/*[clinic end generated code: output=a8516370bf68ae08 input=aba6b1f9b30fcb8e]*/
20107db96d56Sopenharmony_ci{
20117db96d56Sopenharmony_ci    return stringlib_bytes_join((PyObject*)self, iterable_of_bytes);
20127db96d56Sopenharmony_ci}
20137db96d56Sopenharmony_ci
20147db96d56Sopenharmony_ci/*[clinic input]
20157db96d56Sopenharmony_cibytearray.splitlines
20167db96d56Sopenharmony_ci
20177db96d56Sopenharmony_ci    keepends: bool(accept={int}) = False
20187db96d56Sopenharmony_ci
20197db96d56Sopenharmony_ciReturn a list of the lines in the bytearray, breaking at line boundaries.
20207db96d56Sopenharmony_ci
20217db96d56Sopenharmony_ciLine breaks are not included in the resulting list unless keepends is given and
20227db96d56Sopenharmony_citrue.
20237db96d56Sopenharmony_ci[clinic start generated code]*/
20247db96d56Sopenharmony_ci
20257db96d56Sopenharmony_cistatic PyObject *
20267db96d56Sopenharmony_cibytearray_splitlines_impl(PyByteArrayObject *self, int keepends)
20277db96d56Sopenharmony_ci/*[clinic end generated code: output=4223c94b895f6ad9 input=99a27ad959b9cf6b]*/
20287db96d56Sopenharmony_ci{
20297db96d56Sopenharmony_ci    return stringlib_splitlines(
20307db96d56Sopenharmony_ci        (PyObject*) self, PyByteArray_AS_STRING(self),
20317db96d56Sopenharmony_ci        PyByteArray_GET_SIZE(self), keepends
20327db96d56Sopenharmony_ci        );
20337db96d56Sopenharmony_ci}
20347db96d56Sopenharmony_ci
20357db96d56Sopenharmony_ci/*[clinic input]
20367db96d56Sopenharmony_ci@classmethod
20377db96d56Sopenharmony_cibytearray.fromhex
20387db96d56Sopenharmony_ci
20397db96d56Sopenharmony_ci    string: unicode
20407db96d56Sopenharmony_ci    /
20417db96d56Sopenharmony_ci
20427db96d56Sopenharmony_ciCreate a bytearray object from a string of hexadecimal numbers.
20437db96d56Sopenharmony_ci
20447db96d56Sopenharmony_ciSpaces between two numbers are accepted.
20457db96d56Sopenharmony_ciExample: bytearray.fromhex('B9 01EF') -> bytearray(b'\\xb9\\x01\\xef')
20467db96d56Sopenharmony_ci[clinic start generated code]*/
20477db96d56Sopenharmony_ci
20487db96d56Sopenharmony_cistatic PyObject *
20497db96d56Sopenharmony_cibytearray_fromhex_impl(PyTypeObject *type, PyObject *string)
20507db96d56Sopenharmony_ci/*[clinic end generated code: output=8f0f0b6d30fb3ba0 input=f033a16d1fb21f48]*/
20517db96d56Sopenharmony_ci{
20527db96d56Sopenharmony_ci    PyObject *result = _PyBytes_FromHex(string, type == &PyByteArray_Type);
20537db96d56Sopenharmony_ci    if (type != &PyByteArray_Type && result != NULL) {
20547db96d56Sopenharmony_ci        Py_SETREF(result, PyObject_CallOneArg((PyObject *)type, result));
20557db96d56Sopenharmony_ci    }
20567db96d56Sopenharmony_ci    return result;
20577db96d56Sopenharmony_ci}
20587db96d56Sopenharmony_ci
20597db96d56Sopenharmony_ci/*[clinic input]
20607db96d56Sopenharmony_cibytearray.hex
20617db96d56Sopenharmony_ci
20627db96d56Sopenharmony_ci    sep: object = NULL
20637db96d56Sopenharmony_ci        An optional single character or byte to separate hex bytes.
20647db96d56Sopenharmony_ci    bytes_per_sep: int = 1
20657db96d56Sopenharmony_ci        How many bytes between separators.  Positive values count from the
20667db96d56Sopenharmony_ci        right, negative values count from the left.
20677db96d56Sopenharmony_ci
20687db96d56Sopenharmony_ciCreate a string of hexadecimal numbers from a bytearray object.
20697db96d56Sopenharmony_ci
20707db96d56Sopenharmony_ciExample:
20717db96d56Sopenharmony_ci>>> value = bytearray([0xb9, 0x01, 0xef])
20727db96d56Sopenharmony_ci>>> value.hex()
20737db96d56Sopenharmony_ci'b901ef'
20747db96d56Sopenharmony_ci>>> value.hex(':')
20757db96d56Sopenharmony_ci'b9:01:ef'
20767db96d56Sopenharmony_ci>>> value.hex(':', 2)
20777db96d56Sopenharmony_ci'b9:01ef'
20787db96d56Sopenharmony_ci>>> value.hex(':', -2)
20797db96d56Sopenharmony_ci'b901:ef'
20807db96d56Sopenharmony_ci[clinic start generated code]*/
20817db96d56Sopenharmony_ci
20827db96d56Sopenharmony_cistatic PyObject *
20837db96d56Sopenharmony_cibytearray_hex_impl(PyByteArrayObject *self, PyObject *sep, int bytes_per_sep)
20847db96d56Sopenharmony_ci/*[clinic end generated code: output=29c4e5ef72c565a0 input=808667e49bcccb54]*/
20857db96d56Sopenharmony_ci{
20867db96d56Sopenharmony_ci    char* argbuf = PyByteArray_AS_STRING(self);
20877db96d56Sopenharmony_ci    Py_ssize_t arglen = PyByteArray_GET_SIZE(self);
20887db96d56Sopenharmony_ci    return _Py_strhex_with_sep(argbuf, arglen, sep, bytes_per_sep);
20897db96d56Sopenharmony_ci}
20907db96d56Sopenharmony_ci
20917db96d56Sopenharmony_cistatic PyObject *
20927db96d56Sopenharmony_ci_common_reduce(PyByteArrayObject *self, int proto)
20937db96d56Sopenharmony_ci{
20947db96d56Sopenharmony_ci    PyObject *state;
20957db96d56Sopenharmony_ci    const char *buf;
20967db96d56Sopenharmony_ci
20977db96d56Sopenharmony_ci    state = _PyObject_GetState((PyObject *)self);
20987db96d56Sopenharmony_ci    if (state == NULL) {
20997db96d56Sopenharmony_ci        return NULL;
21007db96d56Sopenharmony_ci    }
21017db96d56Sopenharmony_ci
21027db96d56Sopenharmony_ci    if (!Py_SIZE(self)) {
21037db96d56Sopenharmony_ci        return Py_BuildValue("(O()N)", Py_TYPE(self), state);
21047db96d56Sopenharmony_ci    }
21057db96d56Sopenharmony_ci    buf = PyByteArray_AS_STRING(self);
21067db96d56Sopenharmony_ci    if (proto < 3) {
21077db96d56Sopenharmony_ci        /* use str based reduction for backwards compatibility with Python 2.x */
21087db96d56Sopenharmony_ci        PyObject *latin1 = PyUnicode_DecodeLatin1(buf, Py_SIZE(self), NULL);
21097db96d56Sopenharmony_ci        return Py_BuildValue("(O(Ns)N)", Py_TYPE(self), latin1, "latin-1", state);
21107db96d56Sopenharmony_ci    }
21117db96d56Sopenharmony_ci    else {
21127db96d56Sopenharmony_ci        /* use more efficient byte based reduction */
21137db96d56Sopenharmony_ci        return Py_BuildValue("(O(y#)N)", Py_TYPE(self), buf, Py_SIZE(self), state);
21147db96d56Sopenharmony_ci    }
21157db96d56Sopenharmony_ci}
21167db96d56Sopenharmony_ci
21177db96d56Sopenharmony_ci/*[clinic input]
21187db96d56Sopenharmony_cibytearray.__reduce__ as bytearray_reduce
21197db96d56Sopenharmony_ci
21207db96d56Sopenharmony_ciReturn state information for pickling.
21217db96d56Sopenharmony_ci[clinic start generated code]*/
21227db96d56Sopenharmony_ci
21237db96d56Sopenharmony_cistatic PyObject *
21247db96d56Sopenharmony_cibytearray_reduce_impl(PyByteArrayObject *self)
21257db96d56Sopenharmony_ci/*[clinic end generated code: output=52bf304086464cab input=44b5737ada62dd3f]*/
21267db96d56Sopenharmony_ci{
21277db96d56Sopenharmony_ci    return _common_reduce(self, 2);
21287db96d56Sopenharmony_ci}
21297db96d56Sopenharmony_ci
21307db96d56Sopenharmony_ci/*[clinic input]
21317db96d56Sopenharmony_cibytearray.__reduce_ex__ as bytearray_reduce_ex
21327db96d56Sopenharmony_ci
21337db96d56Sopenharmony_ci    proto: int = 0
21347db96d56Sopenharmony_ci    /
21357db96d56Sopenharmony_ci
21367db96d56Sopenharmony_ciReturn state information for pickling.
21377db96d56Sopenharmony_ci[clinic start generated code]*/
21387db96d56Sopenharmony_ci
21397db96d56Sopenharmony_cistatic PyObject *
21407db96d56Sopenharmony_cibytearray_reduce_ex_impl(PyByteArrayObject *self, int proto)
21417db96d56Sopenharmony_ci/*[clinic end generated code: output=52eac33377197520 input=f129bc1a1aa151ee]*/
21427db96d56Sopenharmony_ci{
21437db96d56Sopenharmony_ci    return _common_reduce(self, proto);
21447db96d56Sopenharmony_ci}
21457db96d56Sopenharmony_ci
21467db96d56Sopenharmony_ci/*[clinic input]
21477db96d56Sopenharmony_cibytearray.__sizeof__ as bytearray_sizeof
21487db96d56Sopenharmony_ci
21497db96d56Sopenharmony_ciReturns the size of the bytearray object in memory, in bytes.
21507db96d56Sopenharmony_ci[clinic start generated code]*/
21517db96d56Sopenharmony_ci
21527db96d56Sopenharmony_cistatic PyObject *
21537db96d56Sopenharmony_cibytearray_sizeof_impl(PyByteArrayObject *self)
21547db96d56Sopenharmony_ci/*[clinic end generated code: output=738abdd17951c427 input=e27320fd98a4bc5a]*/
21557db96d56Sopenharmony_ci{
21567db96d56Sopenharmony_ci    Py_ssize_t res;
21577db96d56Sopenharmony_ci
21587db96d56Sopenharmony_ci    res = _PyObject_SIZE(Py_TYPE(self)) + self->ob_alloc * sizeof(char);
21597db96d56Sopenharmony_ci    return PyLong_FromSsize_t(res);
21607db96d56Sopenharmony_ci}
21617db96d56Sopenharmony_ci
21627db96d56Sopenharmony_cistatic PySequenceMethods bytearray_as_sequence = {
21637db96d56Sopenharmony_ci    (lenfunc)bytearray_length,              /* sq_length */
21647db96d56Sopenharmony_ci    (binaryfunc)PyByteArray_Concat,         /* sq_concat */
21657db96d56Sopenharmony_ci    (ssizeargfunc)bytearray_repeat,         /* sq_repeat */
21667db96d56Sopenharmony_ci    (ssizeargfunc)bytearray_getitem,        /* sq_item */
21677db96d56Sopenharmony_ci    0,                                      /* sq_slice */
21687db96d56Sopenharmony_ci    (ssizeobjargproc)bytearray_setitem,     /* sq_ass_item */
21697db96d56Sopenharmony_ci    0,                                      /* sq_ass_slice */
21707db96d56Sopenharmony_ci    (objobjproc)bytearray_contains,         /* sq_contains */
21717db96d56Sopenharmony_ci    (binaryfunc)bytearray_iconcat,          /* sq_inplace_concat */
21727db96d56Sopenharmony_ci    (ssizeargfunc)bytearray_irepeat,        /* sq_inplace_repeat */
21737db96d56Sopenharmony_ci};
21747db96d56Sopenharmony_ci
21757db96d56Sopenharmony_cistatic PyMappingMethods bytearray_as_mapping = {
21767db96d56Sopenharmony_ci    (lenfunc)bytearray_length,
21777db96d56Sopenharmony_ci    (binaryfunc)bytearray_subscript,
21787db96d56Sopenharmony_ci    (objobjargproc)bytearray_ass_subscript,
21797db96d56Sopenharmony_ci};
21807db96d56Sopenharmony_ci
21817db96d56Sopenharmony_cistatic PyBufferProcs bytearray_as_buffer = {
21827db96d56Sopenharmony_ci    (getbufferproc)bytearray_getbuffer,
21837db96d56Sopenharmony_ci    (releasebufferproc)bytearray_releasebuffer,
21847db96d56Sopenharmony_ci};
21857db96d56Sopenharmony_ci
21867db96d56Sopenharmony_cistatic PyMethodDef
21877db96d56Sopenharmony_cibytearray_methods[] = {
21887db96d56Sopenharmony_ci    {"__alloc__", (PyCFunction)bytearray_alloc, METH_NOARGS, alloc_doc},
21897db96d56Sopenharmony_ci    BYTEARRAY_REDUCE_METHODDEF
21907db96d56Sopenharmony_ci    BYTEARRAY_REDUCE_EX_METHODDEF
21917db96d56Sopenharmony_ci    BYTEARRAY_SIZEOF_METHODDEF
21927db96d56Sopenharmony_ci    BYTEARRAY_APPEND_METHODDEF
21937db96d56Sopenharmony_ci    {"capitalize", stringlib_capitalize, METH_NOARGS,
21947db96d56Sopenharmony_ci     _Py_capitalize__doc__},
21957db96d56Sopenharmony_ci    STRINGLIB_CENTER_METHODDEF
21967db96d56Sopenharmony_ci    BYTEARRAY_CLEAR_METHODDEF
21977db96d56Sopenharmony_ci    BYTEARRAY_COPY_METHODDEF
21987db96d56Sopenharmony_ci    {"count", (PyCFunction)bytearray_count, METH_VARARGS,
21997db96d56Sopenharmony_ci     _Py_count__doc__},
22007db96d56Sopenharmony_ci    BYTEARRAY_DECODE_METHODDEF
22017db96d56Sopenharmony_ci    {"endswith", (PyCFunction)bytearray_endswith, METH_VARARGS,
22027db96d56Sopenharmony_ci     _Py_endswith__doc__},
22037db96d56Sopenharmony_ci    STRINGLIB_EXPANDTABS_METHODDEF
22047db96d56Sopenharmony_ci    BYTEARRAY_EXTEND_METHODDEF
22057db96d56Sopenharmony_ci    {"find", (PyCFunction)bytearray_find, METH_VARARGS,
22067db96d56Sopenharmony_ci     _Py_find__doc__},
22077db96d56Sopenharmony_ci    BYTEARRAY_FROMHEX_METHODDEF
22087db96d56Sopenharmony_ci    BYTEARRAY_HEX_METHODDEF
22097db96d56Sopenharmony_ci    {"index", (PyCFunction)bytearray_index, METH_VARARGS, _Py_index__doc__},
22107db96d56Sopenharmony_ci    BYTEARRAY_INSERT_METHODDEF
22117db96d56Sopenharmony_ci    {"isalnum", stringlib_isalnum, METH_NOARGS,
22127db96d56Sopenharmony_ci     _Py_isalnum__doc__},
22137db96d56Sopenharmony_ci    {"isalpha", stringlib_isalpha, METH_NOARGS,
22147db96d56Sopenharmony_ci     _Py_isalpha__doc__},
22157db96d56Sopenharmony_ci    {"isascii", stringlib_isascii, METH_NOARGS,
22167db96d56Sopenharmony_ci     _Py_isascii__doc__},
22177db96d56Sopenharmony_ci    {"isdigit", stringlib_isdigit, METH_NOARGS,
22187db96d56Sopenharmony_ci     _Py_isdigit__doc__},
22197db96d56Sopenharmony_ci    {"islower", stringlib_islower, METH_NOARGS,
22207db96d56Sopenharmony_ci     _Py_islower__doc__},
22217db96d56Sopenharmony_ci    {"isspace", stringlib_isspace, METH_NOARGS,
22227db96d56Sopenharmony_ci     _Py_isspace__doc__},
22237db96d56Sopenharmony_ci    {"istitle", stringlib_istitle, METH_NOARGS,
22247db96d56Sopenharmony_ci     _Py_istitle__doc__},
22257db96d56Sopenharmony_ci    {"isupper", stringlib_isupper, METH_NOARGS,
22267db96d56Sopenharmony_ci     _Py_isupper__doc__},
22277db96d56Sopenharmony_ci    BYTEARRAY_JOIN_METHODDEF
22287db96d56Sopenharmony_ci    STRINGLIB_LJUST_METHODDEF
22297db96d56Sopenharmony_ci    {"lower", stringlib_lower, METH_NOARGS, _Py_lower__doc__},
22307db96d56Sopenharmony_ci    BYTEARRAY_LSTRIP_METHODDEF
22317db96d56Sopenharmony_ci    BYTEARRAY_MAKETRANS_METHODDEF
22327db96d56Sopenharmony_ci    BYTEARRAY_PARTITION_METHODDEF
22337db96d56Sopenharmony_ci    BYTEARRAY_POP_METHODDEF
22347db96d56Sopenharmony_ci    BYTEARRAY_REMOVE_METHODDEF
22357db96d56Sopenharmony_ci    BYTEARRAY_REPLACE_METHODDEF
22367db96d56Sopenharmony_ci    BYTEARRAY_REMOVEPREFIX_METHODDEF
22377db96d56Sopenharmony_ci    BYTEARRAY_REMOVESUFFIX_METHODDEF
22387db96d56Sopenharmony_ci    BYTEARRAY_REVERSE_METHODDEF
22397db96d56Sopenharmony_ci    {"rfind", (PyCFunction)bytearray_rfind, METH_VARARGS, _Py_rfind__doc__},
22407db96d56Sopenharmony_ci    {"rindex", (PyCFunction)bytearray_rindex, METH_VARARGS, _Py_rindex__doc__},
22417db96d56Sopenharmony_ci    STRINGLIB_RJUST_METHODDEF
22427db96d56Sopenharmony_ci    BYTEARRAY_RPARTITION_METHODDEF
22437db96d56Sopenharmony_ci    BYTEARRAY_RSPLIT_METHODDEF
22447db96d56Sopenharmony_ci    BYTEARRAY_RSTRIP_METHODDEF
22457db96d56Sopenharmony_ci    BYTEARRAY_SPLIT_METHODDEF
22467db96d56Sopenharmony_ci    BYTEARRAY_SPLITLINES_METHODDEF
22477db96d56Sopenharmony_ci    {"startswith", (PyCFunction)bytearray_startswith, METH_VARARGS ,
22487db96d56Sopenharmony_ci     _Py_startswith__doc__},
22497db96d56Sopenharmony_ci    BYTEARRAY_STRIP_METHODDEF
22507db96d56Sopenharmony_ci    {"swapcase", stringlib_swapcase, METH_NOARGS,
22517db96d56Sopenharmony_ci     _Py_swapcase__doc__},
22527db96d56Sopenharmony_ci    {"title", stringlib_title, METH_NOARGS, _Py_title__doc__},
22537db96d56Sopenharmony_ci    BYTEARRAY_TRANSLATE_METHODDEF
22547db96d56Sopenharmony_ci    {"upper", stringlib_upper, METH_NOARGS, _Py_upper__doc__},
22557db96d56Sopenharmony_ci    STRINGLIB_ZFILL_METHODDEF
22567db96d56Sopenharmony_ci    {NULL}
22577db96d56Sopenharmony_ci};
22587db96d56Sopenharmony_ci
22597db96d56Sopenharmony_cistatic PyObject *
22607db96d56Sopenharmony_cibytearray_mod(PyObject *v, PyObject *w)
22617db96d56Sopenharmony_ci{
22627db96d56Sopenharmony_ci    if (!PyByteArray_Check(v))
22637db96d56Sopenharmony_ci        Py_RETURN_NOTIMPLEMENTED;
22647db96d56Sopenharmony_ci    return _PyBytes_FormatEx(PyByteArray_AS_STRING(v), PyByteArray_GET_SIZE(v), w, 1);
22657db96d56Sopenharmony_ci}
22667db96d56Sopenharmony_ci
22677db96d56Sopenharmony_cistatic PyNumberMethods bytearray_as_number = {
22687db96d56Sopenharmony_ci    0,              /*nb_add*/
22697db96d56Sopenharmony_ci    0,              /*nb_subtract*/
22707db96d56Sopenharmony_ci    0,              /*nb_multiply*/
22717db96d56Sopenharmony_ci    bytearray_mod,  /*nb_remainder*/
22727db96d56Sopenharmony_ci};
22737db96d56Sopenharmony_ci
22747db96d56Sopenharmony_ciPyDoc_STRVAR(bytearray_doc,
22757db96d56Sopenharmony_ci"bytearray(iterable_of_ints) -> bytearray\n\
22767db96d56Sopenharmony_cibytearray(string, encoding[, errors]) -> bytearray\n\
22777db96d56Sopenharmony_cibytearray(bytes_or_buffer) -> mutable copy of bytes_or_buffer\n\
22787db96d56Sopenharmony_cibytearray(int) -> bytes array of size given by the parameter initialized with null bytes\n\
22797db96d56Sopenharmony_cibytearray() -> empty bytes array\n\
22807db96d56Sopenharmony_ci\n\
22817db96d56Sopenharmony_ciConstruct a mutable bytearray object from:\n\
22827db96d56Sopenharmony_ci  - an iterable yielding integers in range(256)\n\
22837db96d56Sopenharmony_ci  - a text string encoded using the specified encoding\n\
22847db96d56Sopenharmony_ci  - a bytes or a buffer object\n\
22857db96d56Sopenharmony_ci  - any object implementing the buffer API.\n\
22867db96d56Sopenharmony_ci  - an integer");
22877db96d56Sopenharmony_ci
22887db96d56Sopenharmony_ci
22897db96d56Sopenharmony_cistatic PyObject *bytearray_iter(PyObject *seq);
22907db96d56Sopenharmony_ci
22917db96d56Sopenharmony_ciPyTypeObject PyByteArray_Type = {
22927db96d56Sopenharmony_ci    PyVarObject_HEAD_INIT(&PyType_Type, 0)
22937db96d56Sopenharmony_ci    "bytearray",
22947db96d56Sopenharmony_ci    sizeof(PyByteArrayObject),
22957db96d56Sopenharmony_ci    0,
22967db96d56Sopenharmony_ci    (destructor)bytearray_dealloc,       /* tp_dealloc */
22977db96d56Sopenharmony_ci    0,                                  /* tp_vectorcall_offset */
22987db96d56Sopenharmony_ci    0,                                  /* tp_getattr */
22997db96d56Sopenharmony_ci    0,                                  /* tp_setattr */
23007db96d56Sopenharmony_ci    0,                                  /* tp_as_async */
23017db96d56Sopenharmony_ci    (reprfunc)bytearray_repr,           /* tp_repr */
23027db96d56Sopenharmony_ci    &bytearray_as_number,               /* tp_as_number */
23037db96d56Sopenharmony_ci    &bytearray_as_sequence,             /* tp_as_sequence */
23047db96d56Sopenharmony_ci    &bytearray_as_mapping,              /* tp_as_mapping */
23057db96d56Sopenharmony_ci    0,                                  /* tp_hash */
23067db96d56Sopenharmony_ci    0,                                  /* tp_call */
23077db96d56Sopenharmony_ci    bytearray_str,                      /* tp_str */
23087db96d56Sopenharmony_ci    PyObject_GenericGetAttr,            /* tp_getattro */
23097db96d56Sopenharmony_ci    0,                                  /* tp_setattro */
23107db96d56Sopenharmony_ci    &bytearray_as_buffer,               /* tp_as_buffer */
23117db96d56Sopenharmony_ci    Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE |
23127db96d56Sopenharmony_ci        _Py_TPFLAGS_MATCH_SELF,       /* tp_flags */
23137db96d56Sopenharmony_ci    bytearray_doc,                      /* tp_doc */
23147db96d56Sopenharmony_ci    0,                                  /* tp_traverse */
23157db96d56Sopenharmony_ci    0,                                  /* tp_clear */
23167db96d56Sopenharmony_ci    (richcmpfunc)bytearray_richcompare, /* tp_richcompare */
23177db96d56Sopenharmony_ci    0,                                  /* tp_weaklistoffset */
23187db96d56Sopenharmony_ci    bytearray_iter,                     /* tp_iter */
23197db96d56Sopenharmony_ci    0,                                  /* tp_iternext */
23207db96d56Sopenharmony_ci    bytearray_methods,                  /* tp_methods */
23217db96d56Sopenharmony_ci    0,                                  /* tp_members */
23227db96d56Sopenharmony_ci    0,                                  /* tp_getset */
23237db96d56Sopenharmony_ci    0,                                  /* tp_base */
23247db96d56Sopenharmony_ci    0,                                  /* tp_dict */
23257db96d56Sopenharmony_ci    0,                                  /* tp_descr_get */
23267db96d56Sopenharmony_ci    0,                                  /* tp_descr_set */
23277db96d56Sopenharmony_ci    0,                                  /* tp_dictoffset */
23287db96d56Sopenharmony_ci    (initproc)bytearray___init__,       /* tp_init */
23297db96d56Sopenharmony_ci    PyType_GenericAlloc,                /* tp_alloc */
23307db96d56Sopenharmony_ci    PyType_GenericNew,                  /* tp_new */
23317db96d56Sopenharmony_ci    PyObject_Del,                       /* tp_free */
23327db96d56Sopenharmony_ci};
23337db96d56Sopenharmony_ci
23347db96d56Sopenharmony_ci/*********************** Bytearray Iterator ****************************/
23357db96d56Sopenharmony_ci
23367db96d56Sopenharmony_citypedef struct {
23377db96d56Sopenharmony_ci    PyObject_HEAD
23387db96d56Sopenharmony_ci    Py_ssize_t it_index;
23397db96d56Sopenharmony_ci    PyByteArrayObject *it_seq; /* Set to NULL when iterator is exhausted */
23407db96d56Sopenharmony_ci} bytesiterobject;
23417db96d56Sopenharmony_ci
23427db96d56Sopenharmony_cistatic void
23437db96d56Sopenharmony_cibytearrayiter_dealloc(bytesiterobject *it)
23447db96d56Sopenharmony_ci{
23457db96d56Sopenharmony_ci    _PyObject_GC_UNTRACK(it);
23467db96d56Sopenharmony_ci    Py_XDECREF(it->it_seq);
23477db96d56Sopenharmony_ci    PyObject_GC_Del(it);
23487db96d56Sopenharmony_ci}
23497db96d56Sopenharmony_ci
23507db96d56Sopenharmony_cistatic int
23517db96d56Sopenharmony_cibytearrayiter_traverse(bytesiterobject *it, visitproc visit, void *arg)
23527db96d56Sopenharmony_ci{
23537db96d56Sopenharmony_ci    Py_VISIT(it->it_seq);
23547db96d56Sopenharmony_ci    return 0;
23557db96d56Sopenharmony_ci}
23567db96d56Sopenharmony_ci
23577db96d56Sopenharmony_cistatic PyObject *
23587db96d56Sopenharmony_cibytearrayiter_next(bytesiterobject *it)
23597db96d56Sopenharmony_ci{
23607db96d56Sopenharmony_ci    PyByteArrayObject *seq;
23617db96d56Sopenharmony_ci
23627db96d56Sopenharmony_ci    assert(it != NULL);
23637db96d56Sopenharmony_ci    seq = it->it_seq;
23647db96d56Sopenharmony_ci    if (seq == NULL)
23657db96d56Sopenharmony_ci        return NULL;
23667db96d56Sopenharmony_ci    assert(PyByteArray_Check(seq));
23677db96d56Sopenharmony_ci
23687db96d56Sopenharmony_ci    if (it->it_index < PyByteArray_GET_SIZE(seq)) {
23697db96d56Sopenharmony_ci        return _PyLong_FromUnsignedChar(
23707db96d56Sopenharmony_ci            (unsigned char)PyByteArray_AS_STRING(seq)[it->it_index++]);
23717db96d56Sopenharmony_ci    }
23727db96d56Sopenharmony_ci
23737db96d56Sopenharmony_ci    it->it_seq = NULL;
23747db96d56Sopenharmony_ci    Py_DECREF(seq);
23757db96d56Sopenharmony_ci    return NULL;
23767db96d56Sopenharmony_ci}
23777db96d56Sopenharmony_ci
23787db96d56Sopenharmony_cistatic PyObject *
23797db96d56Sopenharmony_cibytearrayiter_length_hint(bytesiterobject *it, PyObject *Py_UNUSED(ignored))
23807db96d56Sopenharmony_ci{
23817db96d56Sopenharmony_ci    Py_ssize_t len = 0;
23827db96d56Sopenharmony_ci    if (it->it_seq) {
23837db96d56Sopenharmony_ci        len = PyByteArray_GET_SIZE(it->it_seq) - it->it_index;
23847db96d56Sopenharmony_ci        if (len < 0) {
23857db96d56Sopenharmony_ci            len = 0;
23867db96d56Sopenharmony_ci        }
23877db96d56Sopenharmony_ci    }
23887db96d56Sopenharmony_ci    return PyLong_FromSsize_t(len);
23897db96d56Sopenharmony_ci}
23907db96d56Sopenharmony_ci
23917db96d56Sopenharmony_ciPyDoc_STRVAR(length_hint_doc,
23927db96d56Sopenharmony_ci    "Private method returning an estimate of len(list(it)).");
23937db96d56Sopenharmony_ci
23947db96d56Sopenharmony_cistatic PyObject *
23957db96d56Sopenharmony_cibytearrayiter_reduce(bytesiterobject *it, PyObject *Py_UNUSED(ignored))
23967db96d56Sopenharmony_ci{
23977db96d56Sopenharmony_ci    PyObject *iter = _PyEval_GetBuiltin(&_Py_ID(iter));
23987db96d56Sopenharmony_ci
23997db96d56Sopenharmony_ci    /* _PyEval_GetBuiltin can invoke arbitrary code,
24007db96d56Sopenharmony_ci     * call must be before access of iterator pointers.
24017db96d56Sopenharmony_ci     * see issue #101765 */
24027db96d56Sopenharmony_ci
24037db96d56Sopenharmony_ci    if (it->it_seq != NULL) {
24047db96d56Sopenharmony_ci        return Py_BuildValue("N(O)n", iter, it->it_seq, it->it_index);
24057db96d56Sopenharmony_ci    } else {
24067db96d56Sopenharmony_ci        return Py_BuildValue("N(())", iter);
24077db96d56Sopenharmony_ci    }
24087db96d56Sopenharmony_ci}
24097db96d56Sopenharmony_ci
24107db96d56Sopenharmony_cistatic PyObject *
24117db96d56Sopenharmony_cibytearrayiter_setstate(bytesiterobject *it, PyObject *state)
24127db96d56Sopenharmony_ci{
24137db96d56Sopenharmony_ci    Py_ssize_t index = PyLong_AsSsize_t(state);
24147db96d56Sopenharmony_ci    if (index == -1 && PyErr_Occurred())
24157db96d56Sopenharmony_ci        return NULL;
24167db96d56Sopenharmony_ci    if (it->it_seq != NULL) {
24177db96d56Sopenharmony_ci        if (index < 0)
24187db96d56Sopenharmony_ci            index = 0;
24197db96d56Sopenharmony_ci        else if (index > PyByteArray_GET_SIZE(it->it_seq))
24207db96d56Sopenharmony_ci            index = PyByteArray_GET_SIZE(it->it_seq); /* iterator exhausted */
24217db96d56Sopenharmony_ci        it->it_index = index;
24227db96d56Sopenharmony_ci    }
24237db96d56Sopenharmony_ci    Py_RETURN_NONE;
24247db96d56Sopenharmony_ci}
24257db96d56Sopenharmony_ci
24267db96d56Sopenharmony_ciPyDoc_STRVAR(setstate_doc, "Set state information for unpickling.");
24277db96d56Sopenharmony_ci
24287db96d56Sopenharmony_cistatic PyMethodDef bytearrayiter_methods[] = {
24297db96d56Sopenharmony_ci    {"__length_hint__", (PyCFunction)bytearrayiter_length_hint, METH_NOARGS,
24307db96d56Sopenharmony_ci     length_hint_doc},
24317db96d56Sopenharmony_ci     {"__reduce__",      (PyCFunction)bytearrayiter_reduce, METH_NOARGS,
24327db96d56Sopenharmony_ci     bytearray_reduce__doc__},
24337db96d56Sopenharmony_ci    {"__setstate__",    (PyCFunction)bytearrayiter_setstate, METH_O,
24347db96d56Sopenharmony_ci     setstate_doc},
24357db96d56Sopenharmony_ci    {NULL, NULL} /* sentinel */
24367db96d56Sopenharmony_ci};
24377db96d56Sopenharmony_ci
24387db96d56Sopenharmony_ciPyTypeObject PyByteArrayIter_Type = {
24397db96d56Sopenharmony_ci    PyVarObject_HEAD_INIT(&PyType_Type, 0)
24407db96d56Sopenharmony_ci    "bytearray_iterator",              /* tp_name */
24417db96d56Sopenharmony_ci    sizeof(bytesiterobject),           /* tp_basicsize */
24427db96d56Sopenharmony_ci    0,                                 /* tp_itemsize */
24437db96d56Sopenharmony_ci    /* methods */
24447db96d56Sopenharmony_ci    (destructor)bytearrayiter_dealloc, /* tp_dealloc */
24457db96d56Sopenharmony_ci    0,                                 /* tp_vectorcall_offset */
24467db96d56Sopenharmony_ci    0,                                 /* tp_getattr */
24477db96d56Sopenharmony_ci    0,                                 /* tp_setattr */
24487db96d56Sopenharmony_ci    0,                                 /* tp_as_async */
24497db96d56Sopenharmony_ci    0,                                 /* tp_repr */
24507db96d56Sopenharmony_ci    0,                                 /* tp_as_number */
24517db96d56Sopenharmony_ci    0,                                 /* tp_as_sequence */
24527db96d56Sopenharmony_ci    0,                                 /* tp_as_mapping */
24537db96d56Sopenharmony_ci    0,                                 /* tp_hash */
24547db96d56Sopenharmony_ci    0,                                 /* tp_call */
24557db96d56Sopenharmony_ci    0,                                 /* tp_str */
24567db96d56Sopenharmony_ci    PyObject_GenericGetAttr,           /* tp_getattro */
24577db96d56Sopenharmony_ci    0,                                 /* tp_setattro */
24587db96d56Sopenharmony_ci    0,                                 /* tp_as_buffer */
24597db96d56Sopenharmony_ci    Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC, /* tp_flags */
24607db96d56Sopenharmony_ci    0,                                 /* tp_doc */
24617db96d56Sopenharmony_ci    (traverseproc)bytearrayiter_traverse,  /* tp_traverse */
24627db96d56Sopenharmony_ci    0,                                 /* tp_clear */
24637db96d56Sopenharmony_ci    0,                                 /* tp_richcompare */
24647db96d56Sopenharmony_ci    0,                                 /* tp_weaklistoffset */
24657db96d56Sopenharmony_ci    PyObject_SelfIter,                 /* tp_iter */
24667db96d56Sopenharmony_ci    (iternextfunc)bytearrayiter_next,  /* tp_iternext */
24677db96d56Sopenharmony_ci    bytearrayiter_methods,             /* tp_methods */
24687db96d56Sopenharmony_ci    0,
24697db96d56Sopenharmony_ci};
24707db96d56Sopenharmony_ci
24717db96d56Sopenharmony_cistatic PyObject *
24727db96d56Sopenharmony_cibytearray_iter(PyObject *seq)
24737db96d56Sopenharmony_ci{
24747db96d56Sopenharmony_ci    bytesiterobject *it;
24757db96d56Sopenharmony_ci
24767db96d56Sopenharmony_ci    if (!PyByteArray_Check(seq)) {
24777db96d56Sopenharmony_ci        PyErr_BadInternalCall();
24787db96d56Sopenharmony_ci        return NULL;
24797db96d56Sopenharmony_ci    }
24807db96d56Sopenharmony_ci    it = PyObject_GC_New(bytesiterobject, &PyByteArrayIter_Type);
24817db96d56Sopenharmony_ci    if (it == NULL)
24827db96d56Sopenharmony_ci        return NULL;
24837db96d56Sopenharmony_ci    it->it_index = 0;
24847db96d56Sopenharmony_ci    Py_INCREF(seq);
24857db96d56Sopenharmony_ci    it->it_seq = (PyByteArrayObject *)seq;
24867db96d56Sopenharmony_ci    _PyObject_GC_TRACK(it);
24877db96d56Sopenharmony_ci    return (PyObject *)it;
24887db96d56Sopenharmony_ci}
2489