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