blob: 5a803be6277c88b3f885e6d5fb0654fda2cddbe4 [file] [log] [blame]
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001/* PyByteArray (bytearray) implementation */
2
3#define PY_SSIZE_T_CLEAN
4#include "Python.h"
Victor Stinner4a21e572020-04-15 02:35:41 +02005#include "pycore_abstract.h" // _PyIndex_Check()
Victor Stinner45876a92020-02-12 22:32:34 +01006#include "pycore_bytes_methods.h"
Victor Stinnerbcda8f12018-11-21 22:27:47 +01007#include "pycore_object.h"
Ethan Furmanb95b5612015-01-23 20:05:18 -08008#include "bytesobject.h"
Gregory P. Smith8cb65692015-04-25 23:22:26 +00009#include "pystrhex.h"
Christian Heimes2c9c7a52008-05-26 13:42:13 +000010
Martin v. Löwis7252a6e2014-07-27 16:25:09 +020011/*[clinic input]
12class bytearray "PyByteArrayObject *" "&PyByteArray_Type"
13[clinic start generated code]*/
14/*[clinic end generated code: output=da39a3ee5e6b4b0d input=5535b77c37a119e0]*/
15
Antoine Pitroufc8d6f42010-01-17 12:38:54 +000016char _PyByteArray_empty_string[] = "";
Christian Heimes2c9c7a52008-05-26 13:42:13 +000017
Christian Heimes2c9c7a52008-05-26 13:42:13 +000018/* end nullbytes support */
19
20/* Helpers */
21
22static int
23_getbytevalue(PyObject* arg, int *value)
24{
25 long face_value;
26
27 if (PyLong_Check(arg)) {
28 face_value = PyLong_AsLong(arg);
Georg Brandl9a54d7c2008-07-16 23:15:30 +000029 } else {
30 PyObject *index = PyNumber_Index(arg);
31 if (index == NULL) {
Mark Dickinson10de93a2010-07-09 19:25:48 +000032 *value = -1;
Christian Heimes2c9c7a52008-05-26 13:42:13 +000033 return 0;
34 }
Georg Brandl9a54d7c2008-07-16 23:15:30 +000035 face_value = PyLong_AsLong(index);
36 Py_DECREF(index);
37 }
38
39 if (face_value < 0 || face_value >= 256) {
40 /* this includes the OverflowError in case the long is too large */
41 PyErr_SetString(PyExc_ValueError, "byte must be in range(0, 256)");
Mark Dickinson10de93a2010-07-09 19:25:48 +000042 *value = -1;
Christian Heimes2c9c7a52008-05-26 13:42:13 +000043 return 0;
44 }
45
46 *value = face_value;
47 return 1;
48}
49
50static int
Benjamin Peterson153c70f2009-04-18 15:42:12 +000051bytearray_getbuffer(PyByteArrayObject *obj, Py_buffer *view, int flags)
Christian Heimes2c9c7a52008-05-26 13:42:13 +000052{
Christian Heimes2c9c7a52008-05-26 13:42:13 +000053 void *ptr;
54 if (view == NULL) {
Stefan Krah5178d912015-02-03 16:57:21 +010055 PyErr_SetString(PyExc_BufferError,
56 "bytearray_getbuffer: view==NULL argument is obsolete");
57 return -1;
Christian Heimes2c9c7a52008-05-26 13:42:13 +000058 }
Antoine Pitroufc8d6f42010-01-17 12:38:54 +000059 ptr = (void *) PyByteArray_AS_STRING(obj);
Stefan Krah5178d912015-02-03 16:57:21 +010060 /* cannot fail if view != NULL and readonly == 0 */
61 (void)PyBuffer_FillInfo(view, (PyObject*)obj, ptr, Py_SIZE(obj), 0, flags);
62 obj->ob_exports++;
63 return 0;
Christian Heimes2c9c7a52008-05-26 13:42:13 +000064}
65
66static void
Benjamin Peterson153c70f2009-04-18 15:42:12 +000067bytearray_releasebuffer(PyByteArrayObject *obj, Py_buffer *view)
Christian Heimes2c9c7a52008-05-26 13:42:13 +000068{
69 obj->ob_exports--;
70}
71
Antoine Pitrou5504e892008-12-06 21:27:53 +000072static int
73_canresize(PyByteArrayObject *self)
74{
75 if (self->ob_exports > 0) {
76 PyErr_SetString(PyExc_BufferError,
77 "Existing exports of data: object cannot be re-sized");
78 return 0;
79 }
80 return 1;
81}
82
Serhiy Storchaka1009bf12015-04-03 23:53:51 +030083#include "clinic/bytearrayobject.c.h"
84
Christian Heimes2c9c7a52008-05-26 13:42:13 +000085/* Direct API functions */
86
87PyObject *
88PyByteArray_FromObject(PyObject *input)
89{
Petr Viktorinffd97532020-02-11 17:46:57 +010090 return PyObject_CallOneArg((PyObject *)&PyByteArray_Type, input);
Christian Heimes2c9c7a52008-05-26 13:42:13 +000091}
92
Serhiy Storchakaa2314282017-10-29 02:11:54 +030093static PyObject *
94_PyByteArray_FromBufferObject(PyObject *obj)
95{
96 PyObject *result;
97 Py_buffer view;
98
99 if (PyObject_GetBuffer(obj, &view, PyBUF_FULL_RO) < 0) {
100 return NULL;
101 }
102 result = PyByteArray_FromStringAndSize(NULL, view.len);
103 if (result != NULL &&
104 PyBuffer_ToContiguous(PyByteArray_AS_STRING(result),
105 &view, view.len, 'C') < 0)
106 {
107 Py_CLEAR(result);
108 }
109 PyBuffer_Release(&view);
110 return result;
111}
112
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000113PyObject *
114PyByteArray_FromStringAndSize(const char *bytes, Py_ssize_t size)
115{
116 PyByteArrayObject *new;
117 Py_ssize_t alloc;
118
119 if (size < 0) {
120 PyErr_SetString(PyExc_SystemError,
121 "Negative size passed to PyByteArray_FromStringAndSize");
122 return NULL;
123 }
124
Neal Norwitz3ce5d922008-08-24 07:08:55 +0000125 /* Prevent buffer overflow when setting alloc to size+1. */
126 if (size == PY_SSIZE_T_MAX) {
127 return PyErr_NoMemory();
128 }
129
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000130 new = PyObject_New(PyByteArrayObject, &PyByteArray_Type);
131 if (new == NULL)
132 return NULL;
133
134 if (size == 0) {
135 new->ob_bytes = NULL;
136 alloc = 0;
137 }
138 else {
139 alloc = size + 1;
Antoine Pitrou39aba4f2011-11-12 21:15:28 +0100140 new->ob_bytes = PyObject_Malloc(alloc);
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000141 if (new->ob_bytes == NULL) {
142 Py_DECREF(new);
143 return PyErr_NoMemory();
144 }
Antoine Pitroufc8d6f42010-01-17 12:38:54 +0000145 if (bytes != NULL && size > 0)
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000146 memcpy(new->ob_bytes, bytes, size);
147 new->ob_bytes[size] = '\0'; /* Trailing null byte */
148 }
Victor Stinner60ac6ed2020-02-07 23:18:08 +0100149 Py_SET_SIZE(new, size);
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000150 new->ob_alloc = alloc;
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200151 new->ob_start = new->ob_bytes;
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000152 new->ob_exports = 0;
153
154 return (PyObject *)new;
155}
156
157Py_ssize_t
158PyByteArray_Size(PyObject *self)
159{
160 assert(self != NULL);
161 assert(PyByteArray_Check(self));
162
163 return PyByteArray_GET_SIZE(self);
164}
165
166char *
167PyByteArray_AsString(PyObject *self)
168{
169 assert(self != NULL);
170 assert(PyByteArray_Check(self));
171
172 return PyByteArray_AS_STRING(self);
173}
174
175int
Antoine Pitroucc231542014-11-02 18:40:09 +0100176PyByteArray_Resize(PyObject *self, Py_ssize_t requested_size)
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000177{
178 void *sval;
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200179 PyByteArrayObject *obj = ((PyByteArrayObject *)self);
Antoine Pitroucc231542014-11-02 18:40:09 +0100180 /* All computations are done unsigned to avoid integer overflows
181 (see issue #22335). */
182 size_t alloc = (size_t) obj->ob_alloc;
183 size_t logical_offset = (size_t) (obj->ob_start - obj->ob_bytes);
184 size_t size = (size_t) requested_size;
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000185
186 assert(self != NULL);
187 assert(PyByteArray_Check(self));
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200188 assert(logical_offset <= alloc);
Antoine Pitroucc231542014-11-02 18:40:09 +0100189 assert(requested_size >= 0);
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000190
Antoine Pitroucc231542014-11-02 18:40:09 +0100191 if (requested_size == Py_SIZE(self)) {
Antoine Pitrou5504e892008-12-06 21:27:53 +0000192 return 0;
193 }
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200194 if (!_canresize(obj)) {
Antoine Pitrou5504e892008-12-06 21:27:53 +0000195 return -1;
196 }
197
Antoine Pitrou25454112015-05-19 20:52:27 +0200198 if (size + logical_offset + 1 <= alloc) {
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200199 /* Current buffer is large enough to host the requested size,
200 decide on a strategy. */
201 if (size < alloc / 2) {
202 /* Major downsize; resize down to exact size */
203 alloc = size + 1;
204 }
205 else {
206 /* Minor downsize; quick exit */
Victor Stinner60ac6ed2020-02-07 23:18:08 +0100207 Py_SET_SIZE(self, size);
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200208 PyByteArray_AS_STRING(self)[size] = '\0'; /* Trailing null */
209 return 0;
210 }
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000211 }
212 else {
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200213 /* Need growing, decide on a strategy */
214 if (size <= alloc * 1.125) {
215 /* Moderate upsize; overallocate similar to list_resize() */
216 alloc = size + (size >> 3) + (size < 9 ? 3 : 6);
217 }
218 else {
219 /* Major upsize; resize up to exact size */
220 alloc = size + 1;
221 }
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000222 }
Antoine Pitroucc231542014-11-02 18:40:09 +0100223 if (alloc > PY_SSIZE_T_MAX) {
224 PyErr_NoMemory();
225 return -1;
226 }
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000227
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200228 if (logical_offset > 0) {
229 sval = PyObject_Malloc(alloc);
230 if (sval == NULL) {
231 PyErr_NoMemory();
232 return -1;
233 }
Antoine Pitroucc231542014-11-02 18:40:09 +0100234 memcpy(sval, PyByteArray_AS_STRING(self),
Stefan Krahdce65022017-08-25 20:12:05 +0200235 Py_MIN((size_t)requested_size, (size_t)Py_SIZE(self)));
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200236 PyObject_Free(obj->ob_bytes);
237 }
238 else {
239 sval = PyObject_Realloc(obj->ob_bytes, alloc);
240 if (sval == NULL) {
241 PyErr_NoMemory();
242 return -1;
243 }
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000244 }
245
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200246 obj->ob_bytes = obj->ob_start = sval;
Victor Stinner60ac6ed2020-02-07 23:18:08 +0100247 Py_SET_SIZE(self, size);
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200248 obj->ob_alloc = alloc;
249 obj->ob_bytes[size] = '\0'; /* Trailing null byte */
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000250
251 return 0;
252}
253
254PyObject *
255PyByteArray_Concat(PyObject *a, PyObject *b)
256{
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000257 Py_buffer va, vb;
258 PyByteArrayObject *result = NULL;
259
260 va.len = -1;
261 vb.len = -1;
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +0200262 if (PyObject_GetBuffer(a, &va, PyBUF_SIMPLE) != 0 ||
263 PyObject_GetBuffer(b, &vb, PyBUF_SIMPLE) != 0) {
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000264 PyErr_Format(PyExc_TypeError, "can't concat %.100s to %.100s",
Serhiy Storchaka6b5a9ec2017-03-19 19:47:02 +0200265 Py_TYPE(b)->tp_name, Py_TYPE(a)->tp_name);
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000266 goto done;
267 }
268
Serhiy Storchaka06cfb0c2016-07-10 20:48:43 +0300269 if (va.len > PY_SSIZE_T_MAX - vb.len) {
270 PyErr_NoMemory();
271 goto done;
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000272 }
273
Serhiy Storchaka06cfb0c2016-07-10 20:48:43 +0300274 result = (PyByteArrayObject *) \
275 PyByteArray_FromStringAndSize(NULL, va.len + vb.len);
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000276 if (result != NULL) {
277 memcpy(result->ob_bytes, va.buf, va.len);
278 memcpy(result->ob_bytes + va.len, vb.buf, vb.len);
279 }
280
281 done:
282 if (va.len != -1)
Martin v. Löwis423be952008-08-13 15:53:07 +0000283 PyBuffer_Release(&va);
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000284 if (vb.len != -1)
Martin v. Löwis423be952008-08-13 15:53:07 +0000285 PyBuffer_Release(&vb);
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000286 return (PyObject *)result;
287}
288
289/* Functions stuffed into the type object */
290
291static Py_ssize_t
Benjamin Peterson153c70f2009-04-18 15:42:12 +0000292bytearray_length(PyByteArrayObject *self)
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000293{
294 return Py_SIZE(self);
295}
296
297static PyObject *
Benjamin Peterson153c70f2009-04-18 15:42:12 +0000298bytearray_iconcat(PyByteArrayObject *self, PyObject *other)
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000299{
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000300 Py_ssize_t size;
301 Py_buffer vo;
302
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +0200303 if (PyObject_GetBuffer(other, &vo, PyBUF_SIMPLE) != 0) {
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000304 PyErr_Format(PyExc_TypeError, "can't concat %.100s to %.100s",
305 Py_TYPE(other)->tp_name, Py_TYPE(self)->tp_name);
306 return NULL;
307 }
308
Serhiy Storchaka06cfb0c2016-07-10 20:48:43 +0300309 size = Py_SIZE(self);
310 if (size > PY_SSIZE_T_MAX - vo.len) {
Martin v. Löwis423be952008-08-13 15:53:07 +0000311 PyBuffer_Release(&vo);
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000312 return PyErr_NoMemory();
313 }
Serhiy Storchaka06cfb0c2016-07-10 20:48:43 +0300314 if (PyByteArray_Resize((PyObject *)self, size + vo.len) < 0) {
Martin v. Löwis423be952008-08-13 15:53:07 +0000315 PyBuffer_Release(&vo);
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000316 return NULL;
317 }
Serhiy Storchaka06cfb0c2016-07-10 20:48:43 +0300318 memcpy(PyByteArray_AS_STRING(self) + size, vo.buf, vo.len);
Martin v. Löwis423be952008-08-13 15:53:07 +0000319 PyBuffer_Release(&vo);
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000320 Py_INCREF(self);
321 return (PyObject *)self;
322}
323
324static PyObject *
Benjamin Peterson153c70f2009-04-18 15:42:12 +0000325bytearray_repeat(PyByteArrayObject *self, Py_ssize_t count)
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000326{
327 PyByteArrayObject *result;
328 Py_ssize_t mysize;
329 Py_ssize_t size;
330
331 if (count < 0)
332 count = 0;
333 mysize = Py_SIZE(self);
Mark Dickinsoncf940c72010-08-10 18:35:01 +0000334 if (count > 0 && mysize > PY_SSIZE_T_MAX / count)
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000335 return PyErr_NoMemory();
Mark Dickinsoncf940c72010-08-10 18:35:01 +0000336 size = mysize * count;
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000337 result = (PyByteArrayObject *)PyByteArray_FromStringAndSize(NULL, size);
338 if (result != NULL && size != 0) {
339 if (mysize == 1)
340 memset(result->ob_bytes, self->ob_bytes[0], size);
341 else {
342 Py_ssize_t i;
343 for (i = 0; i < count; i++)
344 memcpy(result->ob_bytes + i*mysize, self->ob_bytes, mysize);
345 }
346 }
347 return (PyObject *)result;
348}
349
350static PyObject *
Benjamin Peterson153c70f2009-04-18 15:42:12 +0000351bytearray_irepeat(PyByteArrayObject *self, Py_ssize_t count)
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000352{
353 Py_ssize_t mysize;
354 Py_ssize_t size;
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200355 char *buf;
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000356
357 if (count < 0)
358 count = 0;
359 mysize = Py_SIZE(self);
Mark Dickinsoncf940c72010-08-10 18:35:01 +0000360 if (count > 0 && mysize > PY_SSIZE_T_MAX / count)
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000361 return PyErr_NoMemory();
Mark Dickinsoncf940c72010-08-10 18:35:01 +0000362 size = mysize * count;
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200363 if (PyByteArray_Resize((PyObject *)self, size) < 0)
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000364 return NULL;
365
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200366 buf = PyByteArray_AS_STRING(self);
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000367 if (mysize == 1)
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200368 memset(buf, buf[0], size);
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000369 else {
370 Py_ssize_t i;
371 for (i = 1; i < count; i++)
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200372 memcpy(buf + i*mysize, buf, mysize);
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000373 }
374
375 Py_INCREF(self);
376 return (PyObject *)self;
377}
378
379static PyObject *
Benjamin Peterson153c70f2009-04-18 15:42:12 +0000380bytearray_getitem(PyByteArrayObject *self, Py_ssize_t i)
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000381{
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000382 if (i < 0 || i >= Py_SIZE(self)) {
383 PyErr_SetString(PyExc_IndexError, "bytearray index out of range");
384 return NULL;
385 }
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200386 return PyLong_FromLong((unsigned char)(PyByteArray_AS_STRING(self)[i]));
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000387}
388
389static PyObject *
Benjamin Peterson153c70f2009-04-18 15:42:12 +0000390bytearray_subscript(PyByteArrayObject *self, PyObject *index)
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000391{
Victor Stinnera15e2602020-04-08 02:01:56 +0200392 if (_PyIndex_Check(index)) {
Georg Brandl9a54d7c2008-07-16 23:15:30 +0000393 Py_ssize_t i = PyNumber_AsSsize_t(index, PyExc_IndexError);
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000394
395 if (i == -1 && PyErr_Occurred())
396 return NULL;
397
398 if (i < 0)
399 i += PyByteArray_GET_SIZE(self);
400
401 if (i < 0 || i >= Py_SIZE(self)) {
402 PyErr_SetString(PyExc_IndexError, "bytearray index out of range");
403 return NULL;
404 }
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200405 return PyLong_FromLong((unsigned char)(PyByteArray_AS_STRING(self)[i]));
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000406 }
Georg Brandl9a54d7c2008-07-16 23:15:30 +0000407 else if (PySlice_Check(index)) {
Zackery Spytz14514d92019-05-17 01:13:03 -0600408 Py_ssize_t start, stop, step, slicelength, i;
409 size_t cur;
Serhiy Storchakab879fe82017-04-08 09:53:51 +0300410 if (PySlice_Unpack(index, &start, &stop, &step) < 0) {
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000411 return NULL;
412 }
Serhiy Storchakab879fe82017-04-08 09:53:51 +0300413 slicelength = PySlice_AdjustIndices(PyByteArray_GET_SIZE(self),
414 &start, &stop, step);
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000415
416 if (slicelength <= 0)
417 return PyByteArray_FromStringAndSize("", 0);
418 else if (step == 1) {
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200419 return PyByteArray_FromStringAndSize(
420 PyByteArray_AS_STRING(self) + start, slicelength);
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000421 }
422 else {
423 char *source_buf = PyByteArray_AS_STRING(self);
Alexandre Vassalottie2641f42009-04-03 06:38:02 +0000424 char *result_buf;
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000425 PyObject *result;
426
Alexandre Vassalottie2641f42009-04-03 06:38:02 +0000427 result = PyByteArray_FromStringAndSize(NULL, slicelength);
428 if (result == NULL)
429 return NULL;
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000430
Alexandre Vassalottie2641f42009-04-03 06:38:02 +0000431 result_buf = PyByteArray_AS_STRING(result);
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000432 for (cur = start, i = 0; i < slicelength;
433 cur += step, i++) {
434 result_buf[i] = source_buf[cur];
435 }
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000436 return result;
437 }
438 }
439 else {
Terry Jan Reedyffff1442014-08-02 01:30:37 -0400440 PyErr_Format(PyExc_TypeError,
441 "bytearray indices must be integers or slices, not %.200s",
442 Py_TYPE(index)->tp_name);
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000443 return NULL;
444 }
445}
446
447static int
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200448bytearray_setslice_linear(PyByteArrayObject *self,
449 Py_ssize_t lo, Py_ssize_t hi,
450 char *bytes, Py_ssize_t bytes_len)
451{
452 Py_ssize_t avail = hi - lo;
453 char *buf = PyByteArray_AS_STRING(self);
454 Py_ssize_t growth = bytes_len - avail;
Victor Stinner84557232013-11-21 12:29:51 +0100455 int res = 0;
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200456 assert(avail >= 0);
457
Victor Stinner84557232013-11-21 12:29:51 +0100458 if (growth < 0) {
459 if (!_canresize(self))
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200460 return -1;
Victor Stinner84557232013-11-21 12:29:51 +0100461
462 if (lo == 0) {
463 /* Shrink the buffer by advancing its logical start */
464 self->ob_start -= growth;
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200465 /*
Victor Stinner84557232013-11-21 12:29:51 +0100466 0 lo hi old_size
467 | |<----avail----->|<-----tail------>|
468 | |<-bytes_len->|<-----tail------>|
469 0 new_lo new_hi new_size
470 */
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200471 }
Victor Stinner84557232013-11-21 12:29:51 +0100472 else {
473 /*
474 0 lo hi old_size
475 | |<----avail----->|<-----tomove------>|
476 | |<-bytes_len->|<-----tomove------>|
477 0 lo new_hi new_size
478 */
479 memmove(buf + lo + bytes_len, buf + hi,
480 Py_SIZE(self) - hi);
481 }
482 if (PyByteArray_Resize((PyObject *)self,
483 Py_SIZE(self) + growth) < 0) {
484 /* Issue #19578: Handling the memory allocation failure here is
485 tricky here because the bytearray object has already been
486 modified. Depending on growth and lo, the behaviour is
487 different.
488
489 If growth < 0 and lo != 0, the operation is completed, but a
490 MemoryError is still raised and the memory block is not
Raymond Hettinger15f44ab2016-08-30 10:47:49 -0700491 shrunk. Otherwise, the bytearray is restored in its previous
Victor Stinner84557232013-11-21 12:29:51 +0100492 state and a MemoryError is raised. */
493 if (lo == 0) {
494 self->ob_start += growth;
495 return -1;
496 }
497 /* memmove() removed bytes, the bytearray object cannot be
498 restored in its previous state. */
Victor Stinner60ac6ed2020-02-07 23:18:08 +0100499 Py_SET_SIZE(self, Py_SIZE(self) + growth);
Victor Stinner84557232013-11-21 12:29:51 +0100500 res = -1;
501 }
502 buf = PyByteArray_AS_STRING(self);
503 }
504 else if (growth > 0) {
505 if (Py_SIZE(self) > (Py_ssize_t)PY_SSIZE_T_MAX - growth) {
506 PyErr_NoMemory();
507 return -1;
508 }
509
510 if (PyByteArray_Resize((PyObject *)self,
511 Py_SIZE(self) + growth) < 0) {
512 return -1;
513 }
514 buf = PyByteArray_AS_STRING(self);
515 /* Make the place for the additional bytes */
516 /*
517 0 lo hi old_size
518 | |<-avail->|<-----tomove------>|
519 | |<---bytes_len-->|<-----tomove------>|
520 0 lo new_hi new_size
521 */
522 memmove(buf + lo + bytes_len, buf + hi,
523 Py_SIZE(self) - lo - bytes_len);
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200524 }
525
526 if (bytes_len > 0)
527 memcpy(buf + lo, bytes, bytes_len);
Victor Stinner84557232013-11-21 12:29:51 +0100528 return res;
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200529}
530
531static int
Benjamin Peterson153c70f2009-04-18 15:42:12 +0000532bytearray_setslice(PyByteArrayObject *self, Py_ssize_t lo, Py_ssize_t hi,
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000533 PyObject *values)
534{
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200535 Py_ssize_t needed;
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000536 void *bytes;
537 Py_buffer vbytes;
538 int res = 0;
539
540 vbytes.len = -1;
541 if (values == (PyObject *)self) {
542 /* Make a copy and call this function recursively */
543 int err;
Serhiy Storchakaa2314282017-10-29 02:11:54 +0300544 values = PyByteArray_FromStringAndSize(PyByteArray_AS_STRING(values),
545 PyByteArray_GET_SIZE(values));
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000546 if (values == NULL)
547 return -1;
Benjamin Peterson153c70f2009-04-18 15:42:12 +0000548 err = bytearray_setslice(self, lo, hi, values);
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000549 Py_DECREF(values);
550 return err;
551 }
552 if (values == NULL) {
553 /* del b[lo:hi] */
554 bytes = NULL;
555 needed = 0;
556 }
557 else {
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +0200558 if (PyObject_GetBuffer(values, &vbytes, PyBUF_SIMPLE) != 0) {
559 PyErr_Format(PyExc_TypeError,
560 "can't set bytearray slice from %.100s",
561 Py_TYPE(values)->tp_name);
562 return -1;
563 }
564 needed = vbytes.len;
565 bytes = vbytes.buf;
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000566 }
567
568 if (lo < 0)
569 lo = 0;
570 if (hi < lo)
571 hi = lo;
572 if (hi > Py_SIZE(self))
573 hi = Py_SIZE(self);
574
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200575 res = bytearray_setslice_linear(self, lo, hi, bytes, needed);
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000576 if (vbytes.len != -1)
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200577 PyBuffer_Release(&vbytes);
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000578 return res;
579}
580
581static int
Benjamin Peterson153c70f2009-04-18 15:42:12 +0000582bytearray_setitem(PyByteArrayObject *self, Py_ssize_t i, PyObject *value)
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000583{
Georg Brandl9a54d7c2008-07-16 23:15:30 +0000584 int ival;
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000585
586 if (i < 0)
587 i += Py_SIZE(self);
588
589 if (i < 0 || i >= Py_SIZE(self)) {
590 PyErr_SetString(PyExc_IndexError, "bytearray index out of range");
591 return -1;
592 }
593
594 if (value == NULL)
Benjamin Peterson153c70f2009-04-18 15:42:12 +0000595 return bytearray_setslice(self, i, i+1, NULL);
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000596
Georg Brandl9a54d7c2008-07-16 23:15:30 +0000597 if (!_getbytevalue(value, &ival))
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000598 return -1;
599
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200600 PyByteArray_AS_STRING(self)[i] = ival;
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000601 return 0;
602}
603
604static int
Benjamin Peterson153c70f2009-04-18 15:42:12 +0000605bytearray_ass_subscript(PyByteArrayObject *self, PyObject *index, PyObject *values)
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000606{
607 Py_ssize_t start, stop, step, slicelen, needed;
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200608 char *buf, *bytes;
609 buf = PyByteArray_AS_STRING(self);
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000610
Victor Stinnera15e2602020-04-08 02:01:56 +0200611 if (_PyIndex_Check(index)) {
Georg Brandl9a54d7c2008-07-16 23:15:30 +0000612 Py_ssize_t i = PyNumber_AsSsize_t(index, PyExc_IndexError);
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000613
614 if (i == -1 && PyErr_Occurred())
615 return -1;
616
617 if (i < 0)
618 i += PyByteArray_GET_SIZE(self);
619
620 if (i < 0 || i >= Py_SIZE(self)) {
621 PyErr_SetString(PyExc_IndexError, "bytearray index out of range");
622 return -1;
623 }
624
625 if (values == NULL) {
626 /* Fall through to slice assignment */
627 start = i;
628 stop = i + 1;
629 step = 1;
630 slicelen = 1;
631 }
632 else {
Georg Brandl9a54d7c2008-07-16 23:15:30 +0000633 int ival;
634 if (!_getbytevalue(values, &ival))
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000635 return -1;
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200636 buf[i] = (char)ival;
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000637 return 0;
638 }
639 }
Georg Brandl9a54d7c2008-07-16 23:15:30 +0000640 else if (PySlice_Check(index)) {
Serhiy Storchakab879fe82017-04-08 09:53:51 +0300641 if (PySlice_Unpack(index, &start, &stop, &step) < 0) {
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000642 return -1;
643 }
Serhiy Storchakab879fe82017-04-08 09:53:51 +0300644 slicelen = PySlice_AdjustIndices(PyByteArray_GET_SIZE(self), &start,
645 &stop, step);
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000646 }
647 else {
Terry Jan Reedyffff1442014-08-02 01:30:37 -0400648 PyErr_Format(PyExc_TypeError,
649 "bytearray indices must be integers or slices, not %.200s",
650 Py_TYPE(index)->tp_name);
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000651 return -1;
652 }
653
654 if (values == NULL) {
655 bytes = NULL;
656 needed = 0;
657 }
658 else if (values == (PyObject *)self || !PyByteArray_Check(values)) {
Christian Heimes6d26ade2012-11-03 23:07:59 +0100659 int err;
Ezio Melottic64bcbe2012-11-03 21:19:06 +0200660 if (PyNumber_Check(values) || PyUnicode_Check(values)) {
661 PyErr_SetString(PyExc_TypeError,
662 "can assign only bytes, buffers, or iterables "
663 "of ints in range(0, 256)");
664 return -1;
665 }
Georg Brandlf3fa5682010-12-04 17:09:30 +0000666 /* Make a copy and call this function recursively */
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000667 values = PyByteArray_FromObject(values);
668 if (values == NULL)
669 return -1;
Benjamin Peterson153c70f2009-04-18 15:42:12 +0000670 err = bytearray_ass_subscript(self, index, values);
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000671 Py_DECREF(values);
672 return err;
673 }
674 else {
675 assert(PyByteArray_Check(values));
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200676 bytes = PyByteArray_AS_STRING(values);
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000677 needed = Py_SIZE(values);
678 }
679 /* Make sure b[5:2] = ... inserts before 5, not before 2. */
680 if ((step < 0 && start < stop) ||
681 (step > 0 && start > stop))
682 stop = start;
683 if (step == 1) {
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200684 return bytearray_setslice_linear(self, start, stop, bytes, needed);
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000685 }
686 else {
687 if (needed == 0) {
688 /* Delete slice */
Mark Dickinsonbc099642010-01-29 17:27:24 +0000689 size_t cur;
690 Py_ssize_t i;
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000691
Antoine Pitrou5504e892008-12-06 21:27:53 +0000692 if (!_canresize(self))
693 return -1;
Mark Dickinson7e3b9482010-08-06 21:33:18 +0000694
695 if (slicelen == 0)
696 /* Nothing to do here. */
697 return 0;
698
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000699 if (step < 0) {
700 stop = start + 1;
701 start = stop + step * (slicelen - 1) - 1;
702 step = -step;
703 }
704 for (cur = start, i = 0;
705 i < slicelen; cur += step, i++) {
706 Py_ssize_t lim = step - 1;
707
Mark Dickinson66f575b2010-02-14 12:53:32 +0000708 if (cur + step >= (size_t)PyByteArray_GET_SIZE(self))
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000709 lim = PyByteArray_GET_SIZE(self) - cur - 1;
710
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200711 memmove(buf + cur - i,
712 buf + cur + 1, lim);
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000713 }
714 /* Move the tail of the bytes, in one chunk */
Mark Dickinson7e3b9482010-08-06 21:33:18 +0000715 cur = start + (size_t)slicelen*step;
Mark Dickinson66f575b2010-02-14 12:53:32 +0000716 if (cur < (size_t)PyByteArray_GET_SIZE(self)) {
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200717 memmove(buf + cur - slicelen,
718 buf + cur,
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000719 PyByteArray_GET_SIZE(self) - cur);
720 }
721 if (PyByteArray_Resize((PyObject *)self,
722 PyByteArray_GET_SIZE(self) - slicelen) < 0)
723 return -1;
724
725 return 0;
726 }
727 else {
728 /* Assign slice */
Mark Dickinson7e3b9482010-08-06 21:33:18 +0000729 Py_ssize_t i;
730 size_t cur;
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000731
732 if (needed != slicelen) {
733 PyErr_Format(PyExc_ValueError,
734 "attempt to assign bytes of size %zd "
735 "to extended slice of size %zd",
736 needed, slicelen);
737 return -1;
738 }
739 for (cur = start, i = 0; i < slicelen; cur += step, i++)
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200740 buf[cur] = bytes[i];
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000741 return 0;
742 }
743 }
744}
745
746static int
Benjamin Peterson153c70f2009-04-18 15:42:12 +0000747bytearray_init(PyByteArrayObject *self, PyObject *args, PyObject *kwds)
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000748{
749 static char *kwlist[] = {"source", "encoding", "errors", 0};
750 PyObject *arg = NULL;
751 const char *encoding = NULL;
752 const char *errors = NULL;
753 Py_ssize_t count;
754 PyObject *it;
755 PyObject *(*iternext)(PyObject *);
756
757 if (Py_SIZE(self) != 0) {
758 /* Empty previous contents (yes, do this first of all!) */
759 if (PyByteArray_Resize((PyObject *)self, 0) < 0)
760 return -1;
761 }
762
763 /* Parse arguments */
Georg Brandl3dbca812008-07-23 16:10:53 +0000764 if (!PyArg_ParseTupleAndKeywords(args, kwds, "|Oss:bytearray", kwlist,
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000765 &arg, &encoding, &errors))
766 return -1;
767
768 /* Make a quick exit if no first argument */
769 if (arg == NULL) {
770 if (encoding != NULL || errors != NULL) {
771 PyErr_SetString(PyExc_TypeError,
Serhiy Storchaka2c2044e2018-10-21 15:29:12 +0300772 encoding != NULL ?
773 "encoding without a string argument" :
774 "errors without a string argument");
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000775 return -1;
776 }
777 return 0;
778 }
779
780 if (PyUnicode_Check(arg)) {
781 /* Encode via the codec registry */
782 PyObject *encoded, *new;
783 if (encoding == NULL) {
784 PyErr_SetString(PyExc_TypeError,
785 "string argument without an encoding");
786 return -1;
787 }
Marc-André Lemburgb2750b52008-06-06 12:18:17 +0000788 encoded = PyUnicode_AsEncodedString(arg, encoding, errors);
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000789 if (encoded == NULL)
790 return -1;
791 assert(PyBytes_Check(encoded));
Benjamin Peterson153c70f2009-04-18 15:42:12 +0000792 new = bytearray_iconcat(self, encoded);
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000793 Py_DECREF(encoded);
794 if (new == NULL)
795 return -1;
796 Py_DECREF(new);
797 return 0;
798 }
799
800 /* If it's not unicode, there can't be encoding or errors */
801 if (encoding != NULL || errors != NULL) {
802 PyErr_SetString(PyExc_TypeError,
Serhiy Storchaka2c2044e2018-10-21 15:29:12 +0300803 encoding != NULL ?
804 "encoding without a string argument" :
805 "errors without a string argument");
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000806 return -1;
807 }
808
809 /* Is it an int? */
Victor Stinnera15e2602020-04-08 02:01:56 +0200810 if (_PyIndex_Check(arg)) {
Serhiy Storchakaeb249882016-08-15 09:46:07 +0300811 count = PyNumber_AsSsize_t(arg, PyExc_OverflowError);
812 if (count == -1 && PyErr_Occurred()) {
Serhiy Storchakae8904212018-10-15 00:02:57 +0300813 if (!PyErr_ExceptionMatches(PyExc_TypeError))
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000814 return -1;
INADA Naokia634e232017-01-06 17:32:01 +0900815 PyErr_Clear(); /* fall through */
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000816 }
INADA Naokia634e232017-01-06 17:32:01 +0900817 else {
818 if (count < 0) {
819 PyErr_SetString(PyExc_ValueError, "negative count");
820 return -1;
821 }
822 if (count > 0) {
823 if (PyByteArray_Resize((PyObject *)self, count))
824 return -1;
825 memset(PyByteArray_AS_STRING(self), 0, count);
826 }
827 return 0;
828 }
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000829 }
830
831 /* Use the buffer API */
832 if (PyObject_CheckBuffer(arg)) {
833 Py_ssize_t size;
834 Py_buffer view;
835 if (PyObject_GetBuffer(arg, &view, PyBUF_FULL_RO) < 0)
836 return -1;
837 size = view.len;
838 if (PyByteArray_Resize((PyObject *)self, size) < 0) goto fail;
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200839 if (PyBuffer_ToContiguous(PyByteArray_AS_STRING(self),
840 &view, size, 'C') < 0)
Stefan Krah7d12d9d2012-07-28 12:25:55 +0200841 goto fail;
Martin v. Löwis423be952008-08-13 15:53:07 +0000842 PyBuffer_Release(&view);
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000843 return 0;
844 fail:
Martin v. Löwis423be952008-08-13 15:53:07 +0000845 PyBuffer_Release(&view);
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000846 return -1;
847 }
848
849 /* XXX Optimize this if the arguments is a list, tuple */
850
851 /* Get the iterator */
852 it = PyObject_GetIter(arg);
Serhiy Storchaka2c2044e2018-10-21 15:29:12 +0300853 if (it == NULL) {
854 if (PyErr_ExceptionMatches(PyExc_TypeError)) {
855 PyErr_Format(PyExc_TypeError,
856 "cannot convert '%.200s' object to bytearray",
Victor Stinner58ac7002020-02-07 03:04:21 +0100857 Py_TYPE(arg)->tp_name);
Serhiy Storchaka2c2044e2018-10-21 15:29:12 +0300858 }
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000859 return -1;
Serhiy Storchaka2c2044e2018-10-21 15:29:12 +0300860 }
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000861 iternext = *Py_TYPE(it)->tp_iternext;
862
863 /* Run the iterator to exhaustion */
864 for (;;) {
865 PyObject *item;
Georg Brandl9a54d7c2008-07-16 23:15:30 +0000866 int rc, value;
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000867
868 /* Get the next item */
869 item = iternext(it);
870 if (item == NULL) {
871 if (PyErr_Occurred()) {
872 if (!PyErr_ExceptionMatches(PyExc_StopIteration))
873 goto error;
874 PyErr_Clear();
875 }
876 break;
877 }
878
879 /* Interpret it as an int (__index__) */
Georg Brandl9a54d7c2008-07-16 23:15:30 +0000880 rc = _getbytevalue(item, &value);
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000881 Py_DECREF(item);
Georg Brandl9a54d7c2008-07-16 23:15:30 +0000882 if (!rc)
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000883 goto error;
884
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000885 /* Append the byte */
Serhiy Storchaka7b6e3b92015-06-29 21:14:06 +0300886 if (Py_SIZE(self) + 1 < self->ob_alloc) {
Victor Stinner60ac6ed2020-02-07 23:18:08 +0100887 Py_SET_SIZE(self, Py_SIZE(self) + 1);
Serhiy Storchaka7b6e3b92015-06-29 21:14:06 +0300888 PyByteArray_AS_STRING(self)[Py_SIZE(self)] = '\0';
889 }
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000890 else if (PyByteArray_Resize((PyObject *)self, Py_SIZE(self)+1) < 0)
891 goto error;
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200892 PyByteArray_AS_STRING(self)[Py_SIZE(self)-1] = value;
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000893 }
894
895 /* Clean up and return success */
896 Py_DECREF(it);
897 return 0;
898
899 error:
900 /* Error handling when it != NULL */
901 Py_DECREF(it);
902 return -1;
903}
904
905/* Mostly copied from string_repr, but without the
906 "smart quote" functionality. */
907static PyObject *
Benjamin Peterson153c70f2009-04-18 15:42:12 +0000908bytearray_repr(PyByteArrayObject *self)
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000909{
Serhiy Storchakab3a77962017-09-21 14:24:13 +0300910 const char *className = _PyType_Name(Py_TYPE(self));
911 const char *quote_prefix = "(b";
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000912 const char *quote_postfix = ")";
913 Py_ssize_t length = Py_SIZE(self);
Serhiy Storchakab3a77962017-09-21 14:24:13 +0300914 /* 6 == strlen(quote_prefix) + 2 + strlen(quote_postfix) + 1 */
915 Py_ssize_t newsize;
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000916 PyObject *v;
Antoine Pitrou9ed5f272013-08-13 20:18:52 +0200917 Py_ssize_t i;
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200918 char *bytes;
Antoine Pitrou9ed5f272013-08-13 20:18:52 +0200919 char c;
920 char *p;
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200921 int quote;
922 char *test, *start;
923 char *buffer;
924
Serhiy Storchakab3a77962017-09-21 14:24:13 +0300925 newsize = strlen(className);
926 if (length > (PY_SSIZE_T_MAX - 6 - newsize) / 4) {
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000927 PyErr_SetString(PyExc_OverflowError,
928 "bytearray object is too large to make repr");
929 return NULL;
930 }
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200931
Serhiy Storchakab3a77962017-09-21 14:24:13 +0300932 newsize += 6 + length * 4;
Antoine Pitrou39aba4f2011-11-12 21:15:28 +0100933 buffer = PyObject_Malloc(newsize);
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200934 if (buffer == NULL) {
935 PyErr_NoMemory();
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000936 return NULL;
937 }
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000938
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200939 /* Figure out which quote to use; single is preferred */
940 quote = '\'';
941 start = PyByteArray_AS_STRING(self);
942 for (test = start; test < start+length; ++test) {
943 if (*test == '"') {
944 quote = '\''; /* back to single */
945 break;
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000946 }
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200947 else if (*test == '\'')
948 quote = '"';
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000949 }
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200950
951 p = buffer;
Serhiy Storchakab3a77962017-09-21 14:24:13 +0300952 while (*className)
953 *p++ = *className++;
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200954 while (*quote_prefix)
955 *p++ = *quote_prefix++;
956 *p++ = quote;
957
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200958 bytes = PyByteArray_AS_STRING(self);
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200959 for (i = 0; i < length; i++) {
960 /* There's at least enough room for a hex escape
961 and a closing quote. */
962 assert(newsize - (p - buffer) >= 5);
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200963 c = bytes[i];
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200964 if (c == '\'' || c == '\\')
965 *p++ = '\\', *p++ = c;
966 else if (c == '\t')
967 *p++ = '\\', *p++ = 't';
968 else if (c == '\n')
969 *p++ = '\\', *p++ = 'n';
970 else if (c == '\r')
971 *p++ = '\\', *p++ = 'r';
972 else if (c == 0)
973 *p++ = '\\', *p++ = 'x', *p++ = '0', *p++ = '0';
974 else if (c < ' ' || c >= 0x7f) {
975 *p++ = '\\';
976 *p++ = 'x';
Victor Stinnerf5cff562011-10-14 02:13:11 +0200977 *p++ = Py_hexdigits[(c & 0xf0) >> 4];
978 *p++ = Py_hexdigits[c & 0xf];
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200979 }
980 else
981 *p++ = c;
982 }
983 assert(newsize - (p - buffer) >= 1);
984 *p++ = quote;
985 while (*quote_postfix) {
986 *p++ = *quote_postfix++;
987 }
988
Serhiy Storchakab3a77962017-09-21 14:24:13 +0300989 v = PyUnicode_FromStringAndSize(buffer, p - buffer);
Antoine Pitrou39aba4f2011-11-12 21:15:28 +0100990 PyObject_Free(buffer);
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200991 return v;
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000992}
993
994static PyObject *
Benjamin Peterson153c70f2009-04-18 15:42:12 +0000995bytearray_str(PyObject *op)
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000996{
Victor Stinnerda7933e2020-04-13 03:04:28 +0200997 if (_Py_GetConfig()->bytes_warning) {
Victor Stinner53b7d4e2018-07-25 01:37:05 +0200998 if (PyErr_WarnEx(PyExc_BytesWarning,
999 "str() on a bytearray instance", 1)) {
1000 return NULL;
Alexander Belopolskyf0f45142010-08-11 17:31:17 +00001001 }
Victor Stinner53b7d4e2018-07-25 01:37:05 +02001002 }
1003 return bytearray_repr((PyByteArrayObject*)op);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001004}
1005
1006static PyObject *
Benjamin Peterson153c70f2009-04-18 15:42:12 +00001007bytearray_richcompare(PyObject *self, PyObject *other, int op)
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001008{
1009 Py_ssize_t self_size, other_size;
1010 Py_buffer self_bytes, other_bytes;
Serhiy Storchakafa494fd2015-05-30 17:45:22 +03001011 int cmp, rc;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001012
1013 /* Bytes can be compared to anything that supports the (binary)
1014 buffer API. Except that a comparison with Unicode is always an
1015 error, even if the comparison is for equality. */
Serhiy Storchakafa494fd2015-05-30 17:45:22 +03001016 rc = PyObject_IsInstance(self, (PyObject*)&PyUnicode_Type);
1017 if (!rc)
1018 rc = PyObject_IsInstance(other, (PyObject*)&PyUnicode_Type);
1019 if (rc < 0)
1020 return NULL;
1021 if (rc) {
Victor Stinnerda7933e2020-04-13 03:04:28 +02001022 if (_Py_GetConfig()->bytes_warning && (op == Py_EQ || op == Py_NE)) {
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001023 if (PyErr_WarnEx(PyExc_BytesWarning,
Georg Brandle5d68ac2008-06-04 11:30:26 +00001024 "Comparison between bytearray and string", 1))
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001025 return NULL;
1026 }
1027
Brian Curtindfc80e32011-08-10 20:28:54 -05001028 Py_RETURN_NOTIMPLEMENTED;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001029 }
1030
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +02001031 if (PyObject_GetBuffer(self, &self_bytes, PyBUF_SIMPLE) != 0) {
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001032 PyErr_Clear();
Brian Curtindfc80e32011-08-10 20:28:54 -05001033 Py_RETURN_NOTIMPLEMENTED;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001034 }
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +02001035 self_size = self_bytes.len;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001036
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +02001037 if (PyObject_GetBuffer(other, &other_bytes, PyBUF_SIMPLE) != 0) {
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001038 PyErr_Clear();
Martin v. Löwis423be952008-08-13 15:53:07 +00001039 PyBuffer_Release(&self_bytes);
Brian Curtindfc80e32011-08-10 20:28:54 -05001040 Py_RETURN_NOTIMPLEMENTED;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001041 }
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +02001042 other_size = other_bytes.len;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001043
1044 if (self_size != other_size && (op == Py_EQ || op == Py_NE)) {
1045 /* Shortcut: if the lengths differ, the objects differ */
stratakise8b19652017-11-02 11:32:54 +01001046 PyBuffer_Release(&self_bytes);
1047 PyBuffer_Release(&other_bytes);
1048 return PyBool_FromLong((op == Py_NE));
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001049 }
1050 else {
stratakise8b19652017-11-02 11:32:54 +01001051 cmp = memcmp(self_bytes.buf, other_bytes.buf,
1052 Py_MIN(self_size, other_size));
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001053 /* In ISO C, memcmp() guarantees to use unsigned bytes! */
1054
stratakise8b19652017-11-02 11:32:54 +01001055 PyBuffer_Release(&self_bytes);
1056 PyBuffer_Release(&other_bytes);
1057
1058 if (cmp != 0) {
1059 Py_RETURN_RICHCOMPARE(cmp, 0, op);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001060 }
1061
stratakise8b19652017-11-02 11:32:54 +01001062 Py_RETURN_RICHCOMPARE(self_size, other_size, op);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001063 }
1064
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001065}
1066
1067static void
Benjamin Peterson153c70f2009-04-18 15:42:12 +00001068bytearray_dealloc(PyByteArrayObject *self)
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001069{
Benjamin Petersone0124bd2009-03-09 21:04:33 +00001070 if (self->ob_exports > 0) {
1071 PyErr_SetString(PyExc_SystemError,
Benjamin Petersonef3e4c22009-04-11 19:48:14 +00001072 "deallocated bytearray object has exported buffers");
Benjamin Petersone0124bd2009-03-09 21:04:33 +00001073 PyErr_Print();
1074 }
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001075 if (self->ob_bytes != 0) {
Antoine Pitrou39aba4f2011-11-12 21:15:28 +01001076 PyObject_Free(self->ob_bytes);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001077 }
1078 Py_TYPE(self)->tp_free((PyObject *)self);
1079}
1080
1081
1082/* -------------------------------------------------------------------- */
1083/* Methods */
1084
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02001085#define FASTSEARCH fastsearch
1086#define STRINGLIB(F) stringlib_##F
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001087#define STRINGLIB_CHAR char
Antoine Pitroucfc22b42012-10-16 21:07:23 +02001088#define STRINGLIB_SIZEOF_CHAR 1
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001089#define STRINGLIB_LEN PyByteArray_GET_SIZE
1090#define STRINGLIB_STR PyByteArray_AS_STRING
1091#define STRINGLIB_NEW PyByteArray_FromStringAndSize
Antoine Pitrouf2c54842010-01-13 08:07:53 +00001092#define STRINGLIB_ISSPACE Py_ISSPACE
1093#define STRINGLIB_ISLINEBREAK(x) ((x == '\n') || (x == '\r'))
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001094#define STRINGLIB_CHECK_EXACT PyByteArray_CheckExact
1095#define STRINGLIB_MUTABLE 1
1096
1097#include "stringlib/fastsearch.h"
1098#include "stringlib/count.h"
1099#include "stringlib/find.h"
Antoine Pitroucfc22b42012-10-16 21:07:23 +02001100#include "stringlib/join.h"
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001101#include "stringlib/partition.h"
Antoine Pitrouf2c54842010-01-13 08:07:53 +00001102#include "stringlib/split.h"
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001103#include "stringlib/ctype.h"
1104#include "stringlib/transmogrify.h"
1105
1106
Serhiy Storchakae09132f2016-07-03 13:57:48 +03001107static PyObject *
1108bytearray_find(PyByteArrayObject *self, PyObject *args)
1109{
1110 return _Py_bytes_find(PyByteArray_AS_STRING(self), PyByteArray_GET_SIZE(self), args);
1111}
1112
1113static PyObject *
1114bytearray_count(PyByteArrayObject *self, PyObject *args)
1115{
1116 return _Py_bytes_count(PyByteArray_AS_STRING(self), PyByteArray_GET_SIZE(self), args);
1117}
1118
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001119/*[clinic input]
1120bytearray.clear
1121
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001122Remove all items from the bytearray.
1123[clinic start generated code]*/
1124
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001125static PyObject *
1126bytearray_clear_impl(PyByteArrayObject *self)
Serhiy Storchaka7a9579c2016-05-02 13:45:20 +03001127/*[clinic end generated code: output=85c2fe6aede0956c input=ed6edae9de447ac4]*/
Eli Bendersky4db28d32011-03-03 18:21:02 +00001128{
1129 if (PyByteArray_Resize((PyObject *)self, 0) < 0)
1130 return NULL;
1131 Py_RETURN_NONE;
1132}
1133
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001134/*[clinic input]
1135bytearray.copy
1136
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001137Return a copy of B.
1138[clinic start generated code]*/
1139
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001140static PyObject *
1141bytearray_copy_impl(PyByteArrayObject *self)
Serhiy Storchaka7a9579c2016-05-02 13:45:20 +03001142/*[clinic end generated code: output=68cfbcfed484c132 input=6597b0c01bccaa9e]*/
Eli Bendersky4db28d32011-03-03 18:21:02 +00001143{
1144 return PyByteArray_FromStringAndSize(PyByteArray_AS_STRING((PyObject *)self),
1145 PyByteArray_GET_SIZE(self));
1146}
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001147
Serhiy Storchakae09132f2016-07-03 13:57:48 +03001148static PyObject *
1149bytearray_index(PyByteArrayObject *self, PyObject *args)
1150{
1151 return _Py_bytes_index(PyByteArray_AS_STRING(self), PyByteArray_GET_SIZE(self), args);
1152}
1153
1154static PyObject *
1155bytearray_rfind(PyByteArrayObject *self, PyObject *args)
1156{
1157 return _Py_bytes_rfind(PyByteArray_AS_STRING(self), PyByteArray_GET_SIZE(self), args);
1158}
1159
1160static PyObject *
1161bytearray_rindex(PyByteArrayObject *self, PyObject *args)
1162{
1163 return _Py_bytes_rindex(PyByteArray_AS_STRING(self), PyByteArray_GET_SIZE(self), args);
1164}
1165
1166static int
1167bytearray_contains(PyObject *self, PyObject *arg)
1168{
1169 return _Py_bytes_contains(PyByteArray_AS_STRING(self), PyByteArray_GET_SIZE(self), arg);
1170}
1171
1172static PyObject *
1173bytearray_startswith(PyByteArrayObject *self, PyObject *args)
1174{
1175 return _Py_bytes_startswith(PyByteArray_AS_STRING(self), PyByteArray_GET_SIZE(self), args);
1176}
1177
1178static PyObject *
1179bytearray_endswith(PyByteArrayObject *self, PyObject *args)
1180{
1181 return _Py_bytes_endswith(PyByteArray_AS_STRING(self), PyByteArray_GET_SIZE(self), args);
1182}
1183
sweeneydea81849b2020-04-22 17:05:48 -04001184/*[clinic input]
1185bytearray.removeprefix as bytearray_removeprefix
1186
1187 prefix: Py_buffer
1188 /
1189
1190Return a bytearray with the given prefix string removed if present.
1191
1192If the bytearray starts with the prefix string, return
1193bytearray[len(prefix):]. Otherwise, return a copy of the original
1194bytearray.
1195[clinic start generated code]*/
1196
1197static PyObject *
1198bytearray_removeprefix_impl(PyByteArrayObject *self, Py_buffer *prefix)
1199/*[clinic end generated code: output=6cabc585e7f502e0 input=968aada38aedd262]*/
1200{
1201 const char *self_start = PyByteArray_AS_STRING(self);
1202 Py_ssize_t self_len = PyByteArray_GET_SIZE(self);
1203 const char *prefix_start = prefix->buf;
1204 Py_ssize_t prefix_len = prefix->len;
1205
1206 if (self_len >= prefix_len
1207 && memcmp(self_start, prefix_start, prefix_len) == 0)
1208 {
1209 return PyByteArray_FromStringAndSize(self_start + prefix_len,
1210 self_len - prefix_len);
1211 }
1212
1213 return PyByteArray_FromStringAndSize(self_start, self_len);
1214}
1215
1216/*[clinic input]
1217bytearray.removesuffix as bytearray_removesuffix
1218
1219 suffix: Py_buffer
1220 /
1221
1222Return a bytearray with the given suffix string removed if present.
1223
1224If the bytearray ends with the suffix string and that suffix is not
1225empty, return bytearray[:-len(suffix)]. Otherwise, return a copy of
1226the original bytearray.
1227[clinic start generated code]*/
1228
1229static PyObject *
1230bytearray_removesuffix_impl(PyByteArrayObject *self, Py_buffer *suffix)
1231/*[clinic end generated code: output=2bc8cfb79de793d3 input=c1827e810b2f6b99]*/
1232{
1233 const char *self_start = PyByteArray_AS_STRING(self);
1234 Py_ssize_t self_len = PyByteArray_GET_SIZE(self);
1235 const char *suffix_start = suffix->buf;
1236 Py_ssize_t suffix_len = suffix->len;
1237
1238 if (self_len >= suffix_len
1239 && memcmp(self_start + self_len - suffix_len,
1240 suffix_start, suffix_len) == 0)
1241 {
1242 return PyByteArray_FromStringAndSize(self_start,
1243 self_len - suffix_len);
1244 }
1245
1246 return PyByteArray_FromStringAndSize(self_start, self_len);
1247}
1248
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001249
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001250/*[clinic input]
1251bytearray.translate
1252
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001253 table: object
1254 Translation table, which must be a bytes object of length 256.
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001255 /
Martin Panter1b6c6da2016-08-27 08:35:02 +00001256 delete as deletechars: object(c_default="NULL") = b''
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001257
1258Return a copy with each character mapped by the given translation table.
1259
Martin Panter1b6c6da2016-08-27 08:35:02 +00001260All characters occurring in the optional argument delete are removed.
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001261The remaining characters are mapped through the given translation table.
1262[clinic start generated code]*/
1263
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001264static PyObject *
Larry Hastings89964c42015-04-14 18:07:59 -04001265bytearray_translate_impl(PyByteArrayObject *self, PyObject *table,
Martin Panter1b6c6da2016-08-27 08:35:02 +00001266 PyObject *deletechars)
1267/*[clinic end generated code: output=b6a8f01c2a74e446 input=cfff956d4d127a9b]*/
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001268{
Antoine Pitrou9ed5f272013-08-13 20:18:52 +02001269 char *input, *output;
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001270 const char *table_chars;
Antoine Pitrou9ed5f272013-08-13 20:18:52 +02001271 Py_ssize_t i, c;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001272 PyObject *input_obj = (PyObject*)self;
1273 const char *output_start;
1274 Py_ssize_t inlen;
Georg Brandlccc47b62008-12-28 11:44:14 +00001275 PyObject *result = NULL;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001276 int trans_table[256];
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001277 Py_buffer vtable, vdel;
1278
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001279 if (table == Py_None) {
1280 table_chars = NULL;
Georg Brandlccc47b62008-12-28 11:44:14 +00001281 table = NULL;
Serhiy Storchaka3dd3e262015-02-03 01:25:42 +02001282 } else if (PyObject_GetBuffer(table, &vtable, PyBUF_SIMPLE) != 0) {
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001283 return NULL;
Georg Brandlccc47b62008-12-28 11:44:14 +00001284 } else {
1285 if (vtable.len != 256) {
1286 PyErr_SetString(PyExc_ValueError,
1287 "translation table must be 256 characters long");
Georg Brandl953152f2009-07-22 12:03:59 +00001288 PyBuffer_Release(&vtable);
1289 return NULL;
Georg Brandlccc47b62008-12-28 11:44:14 +00001290 }
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001291 table_chars = (const char*)vtable.buf;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001292 }
1293
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001294 if (deletechars != NULL) {
Serhiy Storchaka3dd3e262015-02-03 01:25:42 +02001295 if (PyObject_GetBuffer(deletechars, &vdel, PyBUF_SIMPLE) != 0) {
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001296 if (table != NULL)
Georg Brandl953152f2009-07-22 12:03:59 +00001297 PyBuffer_Release(&vtable);
1298 return NULL;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001299 }
1300 }
1301 else {
1302 vdel.buf = NULL;
1303 vdel.len = 0;
1304 }
1305
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001306 inlen = PyByteArray_GET_SIZE(input_obj);
1307 result = PyByteArray_FromStringAndSize((char *)NULL, inlen);
1308 if (result == NULL)
1309 goto done;
Serhiy Storchakadd40fc32016-05-04 22:23:26 +03001310 output_start = output = PyByteArray_AS_STRING(result);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001311 input = PyByteArray_AS_STRING(input_obj);
1312
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001313 if (vdel.len == 0 && table_chars != NULL) {
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001314 /* If no deletions are required, use faster code */
1315 for (i = inlen; --i >= 0; ) {
1316 c = Py_CHARMASK(*input++);
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001317 *output++ = table_chars[c];
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001318 }
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001319 goto done;
1320 }
Georg Brandlccc47b62008-12-28 11:44:14 +00001321
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001322 if (table_chars == NULL) {
Georg Brandlccc47b62008-12-28 11:44:14 +00001323 for (i = 0; i < 256; i++)
1324 trans_table[i] = Py_CHARMASK(i);
1325 } else {
1326 for (i = 0; i < 256; i++)
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001327 trans_table[i] = Py_CHARMASK(table_chars[i]);
Georg Brandlccc47b62008-12-28 11:44:14 +00001328 }
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001329
1330 for (i = 0; i < vdel.len; i++)
1331 trans_table[(int) Py_CHARMASK( ((unsigned char*)vdel.buf)[i] )] = -1;
1332
1333 for (i = inlen; --i >= 0; ) {
1334 c = Py_CHARMASK(*input++);
1335 if (trans_table[c] != -1)
Martin Panter1b6c6da2016-08-27 08:35:02 +00001336 *output++ = (char)trans_table[c];
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001337 }
1338 /* Fix the size of the resulting string */
1339 if (inlen > 0)
Christian Heimesc731bbe2013-07-21 02:04:35 +02001340 if (PyByteArray_Resize(result, output - output_start) < 0) {
1341 Py_CLEAR(result);
1342 goto done;
1343 }
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001344
1345done:
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001346 if (table != NULL)
Georg Brandlccc47b62008-12-28 11:44:14 +00001347 PyBuffer_Release(&vtable);
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001348 if (deletechars != NULL)
Martin v. Löwis423be952008-08-13 15:53:07 +00001349 PyBuffer_Release(&vdel);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001350 return result;
1351}
1352
1353
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001354/*[clinic input]
1355
1356@staticmethod
1357bytearray.maketrans
1358
Serhiy Storchaka3dd3e262015-02-03 01:25:42 +02001359 frm: Py_buffer
1360 to: Py_buffer
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001361 /
1362
1363Return a translation table useable for the bytes or bytearray translate method.
1364
1365The returned table will be one where each byte in frm is mapped to the byte at
1366the same position in to.
1367
1368The bytes objects frm and to must be of the same length.
1369[clinic start generated code]*/
1370
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001371static PyObject *
Serhiy Storchaka3dd3e262015-02-03 01:25:42 +02001372bytearray_maketrans_impl(Py_buffer *frm, Py_buffer *to)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03001373/*[clinic end generated code: output=1df267d99f56b15e input=5925a81d2fbbf151]*/
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001374{
1375 return _Py_bytes_maketrans(frm, to);
Georg Brandlabc38772009-04-12 15:51:51 +00001376}
1377
1378
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001379/*[clinic input]
1380bytearray.replace
1381
Serhiy Storchaka3dd3e262015-02-03 01:25:42 +02001382 old: Py_buffer
1383 new: Py_buffer
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001384 count: Py_ssize_t = -1
1385 Maximum number of occurrences to replace.
1386 -1 (the default value) means replace all occurrences.
1387 /
1388
1389Return a copy with all occurrences of substring old replaced by new.
1390
1391If the optional argument count is given, only the first count occurrences are
1392replaced.
1393[clinic start generated code]*/
1394
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001395static PyObject *
Larry Hastings89964c42015-04-14 18:07:59 -04001396bytearray_replace_impl(PyByteArrayObject *self, Py_buffer *old,
1397 Py_buffer *new, Py_ssize_t count)
1398/*[clinic end generated code: output=d39884c4dc59412a input=aa379d988637c7fb]*/
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001399{
Serhiy Storchakafb81d3c2016-05-05 09:26:07 +03001400 return stringlib_replace((PyObject *)self,
Serhiy Storchakae09132f2016-07-03 13:57:48 +03001401 (const char *)old->buf, old->len,
1402 (const char *)new->buf, new->len, count);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001403}
1404
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001405/*[clinic input]
1406bytearray.split
1407
1408 sep: object = None
1409 The delimiter according which to split the bytearray.
1410 None (the default value) means split on ASCII whitespace characters
1411 (space, tab, return, newline, formfeed, vertical tab).
1412 maxsplit: Py_ssize_t = -1
1413 Maximum number of splits to do.
1414 -1 (the default value) means no limit.
1415
1416Return a list of the sections in the bytearray, using sep as the delimiter.
1417[clinic start generated code]*/
1418
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001419static PyObject *
Larry Hastings89964c42015-04-14 18:07:59 -04001420bytearray_split_impl(PyByteArrayObject *self, PyObject *sep,
1421 Py_ssize_t maxsplit)
1422/*[clinic end generated code: output=833e2cf385d9a04d input=24f82669f41bf523]*/
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001423{
1424 Py_ssize_t len = PyByteArray_GET_SIZE(self), n;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001425 const char *s = PyByteArray_AS_STRING(self), *sub;
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001426 PyObject *list;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001427 Py_buffer vsub;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001428
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001429 if (maxsplit < 0)
1430 maxsplit = PY_SSIZE_T_MAX;
1431
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001432 if (sep == Py_None)
Antoine Pitrouf2c54842010-01-13 08:07:53 +00001433 return stringlib_split_whitespace((PyObject*) self, s, len, maxsplit);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001434
Serhiy Storchaka3dd3e262015-02-03 01:25:42 +02001435 if (PyObject_GetBuffer(sep, &vsub, PyBUF_SIMPLE) != 0)
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001436 return NULL;
1437 sub = vsub.buf;
1438 n = vsub.len;
1439
Antoine Pitrouf2c54842010-01-13 08:07:53 +00001440 list = stringlib_split(
1441 (PyObject*) self, s, len, sub, n, maxsplit
1442 );
Martin v. Löwis423be952008-08-13 15:53:07 +00001443 PyBuffer_Release(&vsub);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001444 return list;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001445}
1446
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001447/*[clinic input]
1448bytearray.partition
1449
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001450 sep: object
1451 /
1452
1453Partition the bytearray into three parts using the given separator.
1454
1455This will search for the separator sep in the bytearray. If the separator is
1456found, returns a 3-tuple containing the part before the separator, the
Serhiy Storchakaa2314282017-10-29 02:11:54 +03001457separator itself, and the part after it as new bytearray objects.
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001458
Serhiy Storchakaa2314282017-10-29 02:11:54 +03001459If the separator is not found, returns a 3-tuple containing the copy of the
1460original bytearray object and two empty bytearray objects.
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001461[clinic start generated code]*/
1462
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001463static PyObject *
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001464bytearray_partition(PyByteArrayObject *self, PyObject *sep)
Serhiy Storchakaa2314282017-10-29 02:11:54 +03001465/*[clinic end generated code: output=45d2525ddd35f957 input=8f644749ee4fc83a]*/
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001466{
1467 PyObject *bytesep, *result;
1468
Serhiy Storchakaa2314282017-10-29 02:11:54 +03001469 bytesep = _PyByteArray_FromBufferObject(sep);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001470 if (! bytesep)
1471 return NULL;
1472
1473 result = stringlib_partition(
1474 (PyObject*) self,
1475 PyByteArray_AS_STRING(self), PyByteArray_GET_SIZE(self),
1476 bytesep,
1477 PyByteArray_AS_STRING(bytesep), PyByteArray_GET_SIZE(bytesep)
1478 );
1479
1480 Py_DECREF(bytesep);
Antoine Pitrouf2c54842010-01-13 08:07:53 +00001481 return result;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001482}
1483
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001484/*[clinic input]
1485bytearray.rpartition
1486
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001487 sep: object
1488 /
1489
Serhiy Storchakaa2314282017-10-29 02:11:54 +03001490Partition the bytearray into three parts using the given separator.
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001491
Serhiy Storchakaa2314282017-10-29 02:11:54 +03001492This will search for the separator sep in the bytearray, starting at the end.
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001493If the separator is found, returns a 3-tuple containing the part before the
Serhiy Storchakaa2314282017-10-29 02:11:54 +03001494separator, the separator itself, and the part after it as new bytearray
1495objects.
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001496
1497If the separator is not found, returns a 3-tuple containing two empty bytearray
Serhiy Storchakaa2314282017-10-29 02:11:54 +03001498objects and the copy of the original bytearray object.
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001499[clinic start generated code]*/
1500
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001501static PyObject *
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001502bytearray_rpartition(PyByteArrayObject *self, PyObject *sep)
Serhiy Storchakaa2314282017-10-29 02:11:54 +03001503/*[clinic end generated code: output=440de3c9426115e8 input=7e3df3e6cb8fa0ac]*/
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001504{
1505 PyObject *bytesep, *result;
1506
Serhiy Storchakaa2314282017-10-29 02:11:54 +03001507 bytesep = _PyByteArray_FromBufferObject(sep);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001508 if (! bytesep)
1509 return NULL;
1510
1511 result = stringlib_rpartition(
1512 (PyObject*) self,
1513 PyByteArray_AS_STRING(self), PyByteArray_GET_SIZE(self),
1514 bytesep,
1515 PyByteArray_AS_STRING(bytesep), PyByteArray_GET_SIZE(bytesep)
1516 );
1517
1518 Py_DECREF(bytesep);
Antoine Pitrouf2c54842010-01-13 08:07:53 +00001519 return result;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001520}
1521
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001522/*[clinic input]
1523bytearray.rsplit = bytearray.split
1524
1525Return a list of the sections in the bytearray, using sep as the delimiter.
1526
1527Splitting is done starting at the end of the bytearray and working to the front.
1528[clinic start generated code]*/
1529
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001530static PyObject *
Larry Hastings89964c42015-04-14 18:07:59 -04001531bytearray_rsplit_impl(PyByteArrayObject *self, PyObject *sep,
1532 Py_ssize_t maxsplit)
1533/*[clinic end generated code: output=a55e0b5a03cb6190 input=a68286e4dd692ffe]*/
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001534{
1535 Py_ssize_t len = PyByteArray_GET_SIZE(self), n;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001536 const char *s = PyByteArray_AS_STRING(self), *sub;
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001537 PyObject *list;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001538 Py_buffer vsub;
1539
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001540 if (maxsplit < 0)
1541 maxsplit = PY_SSIZE_T_MAX;
1542
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001543 if (sep == Py_None)
Antoine Pitrouf2c54842010-01-13 08:07:53 +00001544 return stringlib_rsplit_whitespace((PyObject*) self, s, len, maxsplit);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001545
Serhiy Storchaka3dd3e262015-02-03 01:25:42 +02001546 if (PyObject_GetBuffer(sep, &vsub, PyBUF_SIMPLE) != 0)
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001547 return NULL;
1548 sub = vsub.buf;
1549 n = vsub.len;
1550
Antoine Pitrouf2c54842010-01-13 08:07:53 +00001551 list = stringlib_rsplit(
1552 (PyObject*) self, s, len, sub, n, maxsplit
1553 );
Martin v. Löwis423be952008-08-13 15:53:07 +00001554 PyBuffer_Release(&vsub);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001555 return list;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001556}
1557
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001558/*[clinic input]
1559bytearray.reverse
1560
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001561Reverse the order of the values in B in place.
1562[clinic start generated code]*/
1563
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001564static PyObject *
1565bytearray_reverse_impl(PyByteArrayObject *self)
Serhiy Storchaka7a9579c2016-05-02 13:45:20 +03001566/*[clinic end generated code: output=9f7616f29ab309d3 input=543356319fc78557]*/
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001567{
1568 char swap, *head, *tail;
1569 Py_ssize_t i, j, n = Py_SIZE(self);
1570
1571 j = n / 2;
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +02001572 head = PyByteArray_AS_STRING(self);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001573 tail = head + n - 1;
1574 for (i = 0; i < j; i++) {
1575 swap = *head;
1576 *head++ = *tail;
1577 *tail-- = swap;
1578 }
1579
1580 Py_RETURN_NONE;
1581}
1582
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001583
1584/*[python input]
1585class bytesvalue_converter(CConverter):
1586 type = 'int'
1587 converter = '_getbytevalue'
1588[python start generated code]*/
1589/*[python end generated code: output=da39a3ee5e6b4b0d input=29c2e7c26c212812]*/
1590
1591
1592/*[clinic input]
1593bytearray.insert
1594
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001595 index: Py_ssize_t
1596 The index where the value is to be inserted.
1597 item: bytesvalue
1598 The item to be inserted.
1599 /
1600
1601Insert a single item into the bytearray before the given index.
1602[clinic start generated code]*/
1603
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001604static PyObject *
1605bytearray_insert_impl(PyByteArrayObject *self, Py_ssize_t index, int item)
Serhiy Storchaka7a9579c2016-05-02 13:45:20 +03001606/*[clinic end generated code: output=76c775a70e7b07b7 input=b2b5d07e9de6c070]*/
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001607{
1608 Py_ssize_t n = Py_SIZE(self);
1609 char *buf;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001610
1611 if (n == PY_SSIZE_T_MAX) {
1612 PyErr_SetString(PyExc_OverflowError,
Mark Dickinson2b6705f2009-09-06 10:34:47 +00001613 "cannot add more objects to bytearray");
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001614 return NULL;
1615 }
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001616 if (PyByteArray_Resize((PyObject *)self, n + 1) < 0)
1617 return NULL;
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +02001618 buf = PyByteArray_AS_STRING(self);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001619
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001620 if (index < 0) {
1621 index += n;
1622 if (index < 0)
1623 index = 0;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001624 }
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001625 if (index > n)
1626 index = n;
1627 memmove(buf + index + 1, buf + index, n - index);
1628 buf[index] = item;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001629
1630 Py_RETURN_NONE;
1631}
1632
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001633/*[clinic input]
1634bytearray.append
1635
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001636 item: bytesvalue
1637 The item to be appended.
1638 /
1639
1640Append a single item to the end of the bytearray.
1641[clinic start generated code]*/
1642
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001643static PyObject *
1644bytearray_append_impl(PyByteArrayObject *self, int item)
Serhiy Storchaka7a9579c2016-05-02 13:45:20 +03001645/*[clinic end generated code: output=a154e19ed1886cb6 input=20d6bec3d1340593]*/
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001646{
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001647 Py_ssize_t n = Py_SIZE(self);
1648
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001649 if (n == PY_SSIZE_T_MAX) {
1650 PyErr_SetString(PyExc_OverflowError,
Mark Dickinson2b6705f2009-09-06 10:34:47 +00001651 "cannot add more objects to bytearray");
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001652 return NULL;
1653 }
1654 if (PyByteArray_Resize((PyObject *)self, n + 1) < 0)
1655 return NULL;
1656
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001657 PyByteArray_AS_STRING(self)[n] = item;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001658
1659 Py_RETURN_NONE;
1660}
1661
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001662/*[clinic input]
1663bytearray.extend
1664
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001665 iterable_of_ints: object
1666 The iterable of items to append.
1667 /
1668
1669Append all the items from the iterator or sequence to the end of the bytearray.
1670[clinic start generated code]*/
1671
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001672static PyObject *
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001673bytearray_extend(PyByteArrayObject *self, PyObject *iterable_of_ints)
Serhiy Storchaka7a9579c2016-05-02 13:45:20 +03001674/*[clinic end generated code: output=98155dbe249170b1 input=c617b3a93249ba28]*/
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001675{
Benjamin Peterson153c70f2009-04-18 15:42:12 +00001676 PyObject *it, *item, *bytearray_obj;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001677 Py_ssize_t buf_size = 0, len = 0;
1678 int value;
1679 char *buf;
1680
Benjamin Peterson153c70f2009-04-18 15:42:12 +00001681 /* bytearray_setslice code only accepts something supporting PEP 3118. */
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001682 if (PyObject_CheckBuffer(iterable_of_ints)) {
1683 if (bytearray_setslice(self, Py_SIZE(self), Py_SIZE(self), iterable_of_ints) == -1)
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001684 return NULL;
1685
1686 Py_RETURN_NONE;
1687 }
1688
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001689 it = PyObject_GetIter(iterable_of_ints);
Serhiy Storchaka2c2044e2018-10-21 15:29:12 +03001690 if (it == NULL) {
1691 if (PyErr_ExceptionMatches(PyExc_TypeError)) {
1692 PyErr_Format(PyExc_TypeError,
1693 "can't extend bytearray with %.100s",
Victor Stinner58ac7002020-02-07 03:04:21 +01001694 Py_TYPE(iterable_of_ints)->tp_name);
Serhiy Storchaka2c2044e2018-10-21 15:29:12 +03001695 }
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001696 return NULL;
Serhiy Storchaka2c2044e2018-10-21 15:29:12 +03001697 }
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001698
Ezio Melotti42da6632011-03-15 05:18:48 +02001699 /* Try to determine the length of the argument. 32 is arbitrary. */
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001700 buf_size = PyObject_LengthHint(iterable_of_ints, 32);
Benjamin Petersonef3e4c22009-04-11 19:48:14 +00001701 if (buf_size == -1) {
1702 Py_DECREF(it);
1703 return NULL;
1704 }
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001705
Benjamin Peterson153c70f2009-04-18 15:42:12 +00001706 bytearray_obj = PyByteArray_FromStringAndSize(NULL, buf_size);
Antoine Pitrou58bb82e2012-04-01 16:05:46 +02001707 if (bytearray_obj == NULL) {
1708 Py_DECREF(it);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001709 return NULL;
Antoine Pitrou58bb82e2012-04-01 16:05:46 +02001710 }
Benjamin Peterson153c70f2009-04-18 15:42:12 +00001711 buf = PyByteArray_AS_STRING(bytearray_obj);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001712
1713 while ((item = PyIter_Next(it)) != NULL) {
1714 if (! _getbytevalue(item, &value)) {
1715 Py_DECREF(item);
1716 Py_DECREF(it);
Benjamin Peterson153c70f2009-04-18 15:42:12 +00001717 Py_DECREF(bytearray_obj);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001718 return NULL;
1719 }
1720 buf[len++] = value;
1721 Py_DECREF(item);
1722
1723 if (len >= buf_size) {
Martin Panter371731e2016-07-18 07:53:13 +00001724 Py_ssize_t addition;
1725 if (len == PY_SSIZE_T_MAX) {
1726 Py_DECREF(it);
1727 Py_DECREF(bytearray_obj);
1728 return PyErr_NoMemory();
1729 }
1730 addition = len >> 1;
1731 if (addition > PY_SSIZE_T_MAX - len - 1)
1732 buf_size = PY_SSIZE_T_MAX;
1733 else
1734 buf_size = len + addition + 1;
Benjamin Peterson153c70f2009-04-18 15:42:12 +00001735 if (PyByteArray_Resize((PyObject *)bytearray_obj, buf_size) < 0) {
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001736 Py_DECREF(it);
Benjamin Peterson153c70f2009-04-18 15:42:12 +00001737 Py_DECREF(bytearray_obj);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001738 return NULL;
1739 }
1740 /* Recompute the `buf' pointer, since the resizing operation may
1741 have invalidated it. */
Benjamin Peterson153c70f2009-04-18 15:42:12 +00001742 buf = PyByteArray_AS_STRING(bytearray_obj);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001743 }
1744 }
1745 Py_DECREF(it);
1746
1747 /* Resize down to exact size. */
Benjamin Peterson153c70f2009-04-18 15:42:12 +00001748 if (PyByteArray_Resize((PyObject *)bytearray_obj, len) < 0) {
1749 Py_DECREF(bytearray_obj);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001750 return NULL;
1751 }
1752
Antoine Pitrou58bb82e2012-04-01 16:05:46 +02001753 if (bytearray_setslice(self, Py_SIZE(self), Py_SIZE(self), bytearray_obj) == -1) {
1754 Py_DECREF(bytearray_obj);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001755 return NULL;
Antoine Pitrou58bb82e2012-04-01 16:05:46 +02001756 }
Benjamin Peterson153c70f2009-04-18 15:42:12 +00001757 Py_DECREF(bytearray_obj);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001758
Brandt Bucher2a7d5962019-06-26 12:06:18 -07001759 if (PyErr_Occurred()) {
1760 return NULL;
1761 }
1762
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001763 Py_RETURN_NONE;
1764}
1765
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001766/*[clinic input]
1767bytearray.pop
1768
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001769 index: Py_ssize_t = -1
1770 The index from where to remove the item.
1771 -1 (the default value) means remove the last item.
1772 /
1773
1774Remove and return a single item from B.
1775
1776If no index argument is given, will pop the last item.
1777[clinic start generated code]*/
1778
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001779static PyObject *
1780bytearray_pop_impl(PyByteArrayObject *self, Py_ssize_t index)
Serhiy Storchaka7a9579c2016-05-02 13:45:20 +03001781/*[clinic end generated code: output=e0ccd401f8021da8 input=3591df2d06c0d237]*/
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001782{
1783 int value;
1784 Py_ssize_t n = Py_SIZE(self);
1785 char *buf;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001786
1787 if (n == 0) {
Eli Bendersky1bc4f192011-03-04 04:55:25 +00001788 PyErr_SetString(PyExc_IndexError,
1789 "pop from empty bytearray");
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001790 return NULL;
1791 }
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001792 if (index < 0)
1793 index += Py_SIZE(self);
1794 if (index < 0 || index >= Py_SIZE(self)) {
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001795 PyErr_SetString(PyExc_IndexError, "pop index out of range");
1796 return NULL;
1797 }
Antoine Pitrou5504e892008-12-06 21:27:53 +00001798 if (!_canresize(self))
1799 return NULL;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001800
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +02001801 buf = PyByteArray_AS_STRING(self);
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001802 value = buf[index];
1803 memmove(buf + index, buf + index + 1, n - index);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001804 if (PyByteArray_Resize((PyObject *)self, n - 1) < 0)
1805 return NULL;
1806
Mark Dickinson54a3db92009-09-06 10:19:23 +00001807 return PyLong_FromLong((unsigned char)value);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001808}
1809
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001810/*[clinic input]
1811bytearray.remove
1812
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001813 value: bytesvalue
1814 The value to remove.
1815 /
1816
1817Remove the first occurrence of a value in the bytearray.
1818[clinic start generated code]*/
1819
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001820static PyObject *
1821bytearray_remove_impl(PyByteArrayObject *self, int value)
Serhiy Storchaka7a9579c2016-05-02 13:45:20 +03001822/*[clinic end generated code: output=d659e37866709c13 input=121831240cd51ddf]*/
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001823{
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001824 Py_ssize_t where, n = Py_SIZE(self);
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +02001825 char *buf = PyByteArray_AS_STRING(self);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001826
Serhiy Storchaka4b234942016-05-16 22:24:03 +03001827 where = stringlib_find_char(buf, n, value);
1828 if (where < 0) {
Mark Dickinson2b6705f2009-09-06 10:34:47 +00001829 PyErr_SetString(PyExc_ValueError, "value not found in bytearray");
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001830 return NULL;
1831 }
Antoine Pitrou5504e892008-12-06 21:27:53 +00001832 if (!_canresize(self))
1833 return NULL;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001834
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +02001835 memmove(buf + where, buf + where + 1, n - where);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001836 if (PyByteArray_Resize((PyObject *)self, n - 1) < 0)
1837 return NULL;
1838
1839 Py_RETURN_NONE;
1840}
1841
1842/* XXX These two helpers could be optimized if argsize == 1 */
1843
1844static Py_ssize_t
Serhiy Storchakaef1585e2015-12-25 20:01:53 +02001845lstrip_helper(const char *myptr, Py_ssize_t mysize,
1846 const void *argptr, Py_ssize_t argsize)
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001847{
1848 Py_ssize_t i = 0;
Antoine Pitrou5b720752013-10-05 21:24:10 +02001849 while (i < mysize && memchr(argptr, (unsigned char) myptr[i], argsize))
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001850 i++;
1851 return i;
1852}
1853
1854static Py_ssize_t
Serhiy Storchakaef1585e2015-12-25 20:01:53 +02001855rstrip_helper(const char *myptr, Py_ssize_t mysize,
1856 const void *argptr, Py_ssize_t argsize)
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001857{
1858 Py_ssize_t i = mysize - 1;
Antoine Pitrou5b720752013-10-05 21:24:10 +02001859 while (i >= 0 && memchr(argptr, (unsigned char) myptr[i], argsize))
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001860 i--;
1861 return i + 1;
1862}
1863
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001864/*[clinic input]
1865bytearray.strip
1866
1867 bytes: object = None
1868 /
1869
1870Strip leading and trailing bytes contained in the argument.
1871
1872If the argument is omitted or None, strip leading and trailing ASCII whitespace.
1873[clinic start generated code]*/
1874
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001875static PyObject *
1876bytearray_strip_impl(PyByteArrayObject *self, PyObject *bytes)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03001877/*[clinic end generated code: output=760412661a34ad5a input=ef7bb59b09c21d62]*/
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001878{
1879 Py_ssize_t left, right, mysize, byteslen;
Serhiy Storchakae2f92de2017-11-11 13:06:26 +02001880 char *myptr;
1881 const char *bytesptr;
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001882 Py_buffer vbytes;
1883
1884 if (bytes == Py_None) {
1885 bytesptr = "\t\n\r\f\v ";
1886 byteslen = 6;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001887 }
1888 else {
Serhiy Storchaka3dd3e262015-02-03 01:25:42 +02001889 if (PyObject_GetBuffer(bytes, &vbytes, PyBUF_SIMPLE) != 0)
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001890 return NULL;
Serhiy Storchakae2f92de2017-11-11 13:06:26 +02001891 bytesptr = (const char *) vbytes.buf;
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001892 byteslen = vbytes.len;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001893 }
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +02001894 myptr = PyByteArray_AS_STRING(self);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001895 mysize = Py_SIZE(self);
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001896 left = lstrip_helper(myptr, mysize, bytesptr, byteslen);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001897 if (left == mysize)
1898 right = left;
1899 else
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001900 right = rstrip_helper(myptr, mysize, bytesptr, byteslen);
1901 if (bytes != Py_None)
1902 PyBuffer_Release(&vbytes);
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +02001903 return PyByteArray_FromStringAndSize(myptr + left, right - left);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001904}
1905
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001906/*[clinic input]
1907bytearray.lstrip
1908
1909 bytes: object = None
1910 /
1911
1912Strip leading bytes contained in the argument.
1913
1914If the argument is omitted or None, strip leading ASCII whitespace.
1915[clinic start generated code]*/
1916
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001917static PyObject *
1918bytearray_lstrip_impl(PyByteArrayObject *self, PyObject *bytes)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03001919/*[clinic end generated code: output=d005c9d0ab909e66 input=80843f975dd7c480]*/
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001920{
1921 Py_ssize_t left, right, mysize, byteslen;
Serhiy Storchakae2f92de2017-11-11 13:06:26 +02001922 char *myptr;
1923 const char *bytesptr;
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001924 Py_buffer vbytes;
1925
1926 if (bytes == Py_None) {
1927 bytesptr = "\t\n\r\f\v ";
1928 byteslen = 6;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001929 }
1930 else {
Serhiy Storchaka3dd3e262015-02-03 01:25:42 +02001931 if (PyObject_GetBuffer(bytes, &vbytes, PyBUF_SIMPLE) != 0)
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001932 return NULL;
Serhiy Storchakae2f92de2017-11-11 13:06:26 +02001933 bytesptr = (const char *) vbytes.buf;
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001934 byteslen = vbytes.len;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001935 }
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +02001936 myptr = PyByteArray_AS_STRING(self);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001937 mysize = Py_SIZE(self);
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001938 left = lstrip_helper(myptr, mysize, bytesptr, byteslen);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001939 right = mysize;
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001940 if (bytes != Py_None)
1941 PyBuffer_Release(&vbytes);
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +02001942 return PyByteArray_FromStringAndSize(myptr + left, right - left);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001943}
1944
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001945/*[clinic input]
1946bytearray.rstrip
1947
1948 bytes: object = None
1949 /
1950
1951Strip trailing bytes contained in the argument.
1952
1953If the argument is omitted or None, strip trailing ASCII whitespace.
1954[clinic start generated code]*/
1955
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001956static PyObject *
1957bytearray_rstrip_impl(PyByteArrayObject *self, PyObject *bytes)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03001958/*[clinic end generated code: output=030e2fbd2f7276bd input=e728b994954cfd91]*/
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001959{
1960 Py_ssize_t right, mysize, byteslen;
Serhiy Storchakae2f92de2017-11-11 13:06:26 +02001961 char *myptr;
1962 const char *bytesptr;
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001963 Py_buffer vbytes;
1964
1965 if (bytes == Py_None) {
1966 bytesptr = "\t\n\r\f\v ";
1967 byteslen = 6;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001968 }
1969 else {
Serhiy Storchaka3dd3e262015-02-03 01:25:42 +02001970 if (PyObject_GetBuffer(bytes, &vbytes, PyBUF_SIMPLE) != 0)
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001971 return NULL;
Serhiy Storchakae2f92de2017-11-11 13:06:26 +02001972 bytesptr = (const char *) vbytes.buf;
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001973 byteslen = vbytes.len;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001974 }
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +02001975 myptr = PyByteArray_AS_STRING(self);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001976 mysize = Py_SIZE(self);
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001977 right = rstrip_helper(myptr, mysize, bytesptr, byteslen);
1978 if (bytes != Py_None)
1979 PyBuffer_Release(&vbytes);
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +02001980 return PyByteArray_FromStringAndSize(myptr, right);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001981}
1982
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001983/*[clinic input]
1984bytearray.decode
1985
1986 encoding: str(c_default="NULL") = 'utf-8'
1987 The encoding with which to decode the bytearray.
1988 errors: str(c_default="NULL") = 'strict'
1989 The error handling scheme to use for the handling of decoding errors.
1990 The default is 'strict' meaning that decoding errors raise a
1991 UnicodeDecodeError. Other possible values are 'ignore' and 'replace'
1992 as well as any other name registered with codecs.register_error that
1993 can handle UnicodeDecodeErrors.
1994
1995Decode the bytearray using the codec registered for encoding.
1996[clinic start generated code]*/
1997
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001998static PyObject *
Larry Hastings89964c42015-04-14 18:07:59 -04001999bytearray_decode_impl(PyByteArrayObject *self, const char *encoding,
2000 const char *errors)
2001/*[clinic end generated code: output=f57d43f4a00b42c5 input=f28d8f903020257b]*/
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002002{
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002003 if (encoding == NULL)
2004 encoding = PyUnicode_GetDefaultEncoding();
Martin v. Löwis0efea322014-07-27 17:29:17 +02002005 return PyUnicode_FromEncodedObject((PyObject*)self, encoding, errors);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002006}
2007
2008PyDoc_STRVAR(alloc_doc,
2009"B.__alloc__() -> int\n\
2010\n\
Georg Brandl17cb8a82008-05-30 08:20:09 +00002011Return the number of bytes actually allocated.");
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002012
2013static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05302014bytearray_alloc(PyByteArrayObject *self, PyObject *Py_UNUSED(ignored))
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002015{
2016 return PyLong_FromSsize_t(self->ob_alloc);
2017}
2018
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002019/*[clinic input]
2020bytearray.join
2021
2022 iterable_of_bytes: object
2023 /
2024
2025Concatenate any number of bytes/bytearray objects.
2026
2027The bytearray whose method is called is inserted in between each pair.
2028
2029The result is returned as a new bytearray object.
2030[clinic start generated code]*/
2031
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002032static PyObject *
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002033bytearray_join(PyByteArrayObject *self, PyObject *iterable_of_bytes)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03002034/*[clinic end generated code: output=a8516370bf68ae08 input=aba6b1f9b30fcb8e]*/
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002035{
Martin v. Löwis0efea322014-07-27 17:29:17 +02002036 return stringlib_bytes_join((PyObject*)self, iterable_of_bytes);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002037}
2038
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002039/*[clinic input]
2040bytearray.splitlines
Antoine Pitrouf2c54842010-01-13 08:07:53 +00002041
Serhiy Storchaka202fda52017-03-12 10:10:47 +02002042 keepends: bool(accept={int}) = False
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002043
2044Return a list of the lines in the bytearray, breaking at line boundaries.
2045
2046Line breaks are not included in the resulting list unless keepends is given and
2047true.
2048[clinic start generated code]*/
2049
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002050static PyObject *
2051bytearray_splitlines_impl(PyByteArrayObject *self, int keepends)
Serhiy Storchaka202fda52017-03-12 10:10:47 +02002052/*[clinic end generated code: output=4223c94b895f6ad9 input=99a27ad959b9cf6b]*/
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002053{
Antoine Pitrouf2c54842010-01-13 08:07:53 +00002054 return stringlib_splitlines(
2055 (PyObject*) self, PyByteArray_AS_STRING(self),
2056 PyByteArray_GET_SIZE(self), keepends
2057 );
2058}
2059
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002060/*[clinic input]
2061@classmethod
2062bytearray.fromhex
2063
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002064 string: unicode
2065 /
2066
2067Create a bytearray object from a string of hexadecimal numbers.
2068
2069Spaces between two numbers are accepted.
2070Example: bytearray.fromhex('B9 01EF') -> bytearray(b'\\xb9\\x01\\xef')
2071[clinic start generated code]*/
2072
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002073static PyObject *
Serhiy Storchaka0855e702016-07-01 17:22:31 +03002074bytearray_fromhex_impl(PyTypeObject *type, PyObject *string)
2075/*[clinic end generated code: output=8f0f0b6d30fb3ba0 input=f033a16d1fb21f48]*/
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002076{
Serhiy Storchaka0855e702016-07-01 17:22:31 +03002077 PyObject *result = _PyBytes_FromHex(string, type == &PyByteArray_Type);
2078 if (type != &PyByteArray_Type && result != NULL) {
Petr Viktorinffd97532020-02-11 17:46:57 +01002079 Py_SETREF(result, PyObject_CallOneArg((PyObject *)type, result));
Serhiy Storchaka0855e702016-07-01 17:22:31 +03002080 }
2081 return result;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002082}
2083
Gregory P. Smith0c2f9302019-05-29 11:46:58 -07002084/*[clinic input]
2085bytearray.hex
2086
2087 sep: object = NULL
2088 An optional single character or byte to separate hex bytes.
2089 bytes_per_sep: int = 1
2090 How many bytes between separators. Positive values count from the
2091 right, negative values count from the left.
2092
2093Create a str of hexadecimal numbers from a bytearray object.
2094
2095Example:
2096>>> value = bytearray([0xb9, 0x01, 0xef])
2097>>> value.hex()
2098'b901ef'
2099>>> value.hex(':')
2100'b9:01:ef'
2101>>> value.hex(':', 2)
2102'b9:01ef'
2103>>> value.hex(':', -2)
2104'b901:ef'
2105[clinic start generated code]*/
Gregory P. Smith8cb65692015-04-25 23:22:26 +00002106
2107static PyObject *
Gregory P. Smith0c2f9302019-05-29 11:46:58 -07002108bytearray_hex_impl(PyByteArrayObject *self, PyObject *sep, int bytes_per_sep)
2109/*[clinic end generated code: output=29c4e5ef72c565a0 input=814c15830ac8c4b5]*/
Serhiy Storchakae09132f2016-07-03 13:57:48 +03002110{
2111 char* argbuf = PyByteArray_AS_STRING(self);
2112 Py_ssize_t arglen = PyByteArray_GET_SIZE(self);
Gregory P. Smith0c2f9302019-05-29 11:46:58 -07002113 return _Py_strhex_with_sep(argbuf, arglen, sep, bytes_per_sep);
Serhiy Storchakae09132f2016-07-03 13:57:48 +03002114}
2115
2116static PyObject *
Antoine Pitroub0e1f8b2011-12-05 20:40:08 +01002117_common_reduce(PyByteArrayObject *self, int proto)
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002118{
Antoine Pitroub0e1f8b2011-12-05 20:40:08 +01002119 PyObject *dict;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02002120 _Py_IDENTIFIER(__dict__);
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +02002121 char *buf;
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02002122
Serhiy Storchaka41c57b32019-09-01 12:03:39 +03002123 if (_PyObject_LookupAttrId((PyObject *)self, &PyId___dict__, &dict) < 0) {
2124 return NULL;
2125 }
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002126 if (dict == NULL) {
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002127 dict = Py_None;
2128 Py_INCREF(dict);
2129 }
2130
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +02002131 buf = PyByteArray_AS_STRING(self);
Antoine Pitroub0e1f8b2011-12-05 20:40:08 +01002132 if (proto < 3) {
2133 /* use str based reduction for backwards compatibility with Python 2.x */
2134 PyObject *latin1;
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +02002135 if (Py_SIZE(self))
2136 latin1 = PyUnicode_DecodeLatin1(buf, Py_SIZE(self), NULL);
Antoine Pitroub0e1f8b2011-12-05 20:40:08 +01002137 else
2138 latin1 = PyUnicode_FromString("");
2139 return Py_BuildValue("(O(Ns)N)", Py_TYPE(self), latin1, "latin-1", dict);
2140 }
2141 else {
2142 /* use more efficient byte based reduction */
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +02002143 if (Py_SIZE(self)) {
2144 return Py_BuildValue("(O(y#)N)", Py_TYPE(self), buf, Py_SIZE(self), dict);
Antoine Pitroub0e1f8b2011-12-05 20:40:08 +01002145 }
2146 else {
2147 return Py_BuildValue("(O()N)", Py_TYPE(self), dict);
2148 }
2149 }
2150}
2151
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002152/*[clinic input]
2153bytearray.__reduce__ as bytearray_reduce
2154
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002155Return state information for pickling.
2156[clinic start generated code]*/
2157
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002158static PyObject *
2159bytearray_reduce_impl(PyByteArrayObject *self)
Serhiy Storchaka7a9579c2016-05-02 13:45:20 +03002160/*[clinic end generated code: output=52bf304086464cab input=44b5737ada62dd3f]*/
Antoine Pitroub0e1f8b2011-12-05 20:40:08 +01002161{
2162 return _common_reduce(self, 2);
2163}
2164
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002165/*[clinic input]
2166bytearray.__reduce_ex__ as bytearray_reduce_ex
2167
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002168 proto: int = 0
2169 /
2170
2171Return state information for pickling.
2172[clinic start generated code]*/
2173
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002174static PyObject *
2175bytearray_reduce_ex_impl(PyByteArrayObject *self, int proto)
Serhiy Storchaka7a9579c2016-05-02 13:45:20 +03002176/*[clinic end generated code: output=52eac33377197520 input=f129bc1a1aa151ee]*/
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002177{
Antoine Pitroub0e1f8b2011-12-05 20:40:08 +01002178 return _common_reduce(self, proto);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002179}
2180
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002181/*[clinic input]
2182bytearray.__sizeof__ as bytearray_sizeof
2183
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002184Returns the size of the bytearray object in memory, in bytes.
2185[clinic start generated code]*/
2186
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002187static PyObject *
2188bytearray_sizeof_impl(PyByteArrayObject *self)
Serhiy Storchaka7a9579c2016-05-02 13:45:20 +03002189/*[clinic end generated code: output=738abdd17951c427 input=e27320fd98a4bc5a]*/
Robert Schuppeniesfbe94c52008-07-14 10:13:31 +00002190{
Benjamin Petersonef3e4c22009-04-11 19:48:14 +00002191 Py_ssize_t res;
Robert Schuppeniesfbe94c52008-07-14 10:13:31 +00002192
Serhiy Storchaka5c4064e2015-12-19 20:05:25 +02002193 res = _PyObject_SIZE(Py_TYPE(self)) + self->ob_alloc * sizeof(char);
Benjamin Petersonef3e4c22009-04-11 19:48:14 +00002194 return PyLong_FromSsize_t(res);
Robert Schuppeniesfbe94c52008-07-14 10:13:31 +00002195}
2196
Benjamin Peterson153c70f2009-04-18 15:42:12 +00002197static PySequenceMethods bytearray_as_sequence = {
2198 (lenfunc)bytearray_length, /* sq_length */
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002199 (binaryfunc)PyByteArray_Concat, /* sq_concat */
Benjamin Peterson153c70f2009-04-18 15:42:12 +00002200 (ssizeargfunc)bytearray_repeat, /* sq_repeat */
2201 (ssizeargfunc)bytearray_getitem, /* sq_item */
2202 0, /* sq_slice */
2203 (ssizeobjargproc)bytearray_setitem, /* sq_ass_item */
2204 0, /* sq_ass_slice */
Serhiy Storchakae09132f2016-07-03 13:57:48 +03002205 (objobjproc)bytearray_contains, /* sq_contains */
Benjamin Peterson153c70f2009-04-18 15:42:12 +00002206 (binaryfunc)bytearray_iconcat, /* sq_inplace_concat */
2207 (ssizeargfunc)bytearray_irepeat, /* sq_inplace_repeat */
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002208};
2209
Benjamin Peterson153c70f2009-04-18 15:42:12 +00002210static PyMappingMethods bytearray_as_mapping = {
2211 (lenfunc)bytearray_length,
2212 (binaryfunc)bytearray_subscript,
2213 (objobjargproc)bytearray_ass_subscript,
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002214};
2215
Benjamin Peterson153c70f2009-04-18 15:42:12 +00002216static PyBufferProcs bytearray_as_buffer = {
2217 (getbufferproc)bytearray_getbuffer,
2218 (releasebufferproc)bytearray_releasebuffer,
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002219};
2220
2221static PyMethodDef
Benjamin Peterson153c70f2009-04-18 15:42:12 +00002222bytearray_methods[] = {
2223 {"__alloc__", (PyCFunction)bytearray_alloc, METH_NOARGS, alloc_doc},
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002224 BYTEARRAY_REDUCE_METHODDEF
2225 BYTEARRAY_REDUCE_EX_METHODDEF
2226 BYTEARRAY_SIZEOF_METHODDEF
2227 BYTEARRAY_APPEND_METHODDEF
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05302228 {"capitalize", stringlib_capitalize, METH_NOARGS,
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002229 _Py_capitalize__doc__},
Tal Einatc929df32018-07-06 13:17:38 +03002230 STRINGLIB_CENTER_METHODDEF
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002231 BYTEARRAY_CLEAR_METHODDEF
2232 BYTEARRAY_COPY_METHODDEF
Serhiy Storchakae09132f2016-07-03 13:57:48 +03002233 {"count", (PyCFunction)bytearray_count, METH_VARARGS,
Serhiy Storchakadd40fc32016-05-04 22:23:26 +03002234 _Py_count__doc__},
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002235 BYTEARRAY_DECODE_METHODDEF
Serhiy Storchakae09132f2016-07-03 13:57:48 +03002236 {"endswith", (PyCFunction)bytearray_endswith, METH_VARARGS,
Serhiy Storchakadd40fc32016-05-04 22:23:26 +03002237 _Py_endswith__doc__},
Tal Einatc929df32018-07-06 13:17:38 +03002238 STRINGLIB_EXPANDTABS_METHODDEF
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002239 BYTEARRAY_EXTEND_METHODDEF
Serhiy Storchakae09132f2016-07-03 13:57:48 +03002240 {"find", (PyCFunction)bytearray_find, METH_VARARGS,
Serhiy Storchakadd40fc32016-05-04 22:23:26 +03002241 _Py_find__doc__},
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002242 BYTEARRAY_FROMHEX_METHODDEF
Gregory P. Smith0c2f9302019-05-29 11:46:58 -07002243 BYTEARRAY_HEX_METHODDEF
Serhiy Storchakae09132f2016-07-03 13:57:48 +03002244 {"index", (PyCFunction)bytearray_index, METH_VARARGS, _Py_index__doc__},
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002245 BYTEARRAY_INSERT_METHODDEF
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05302246 {"isalnum", stringlib_isalnum, METH_NOARGS,
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002247 _Py_isalnum__doc__},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05302248 {"isalpha", stringlib_isalpha, METH_NOARGS,
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002249 _Py_isalpha__doc__},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05302250 {"isascii", stringlib_isascii, METH_NOARGS,
INADA Naokia49ac992018-01-27 14:06:21 +09002251 _Py_isascii__doc__},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05302252 {"isdigit", stringlib_isdigit, METH_NOARGS,
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002253 _Py_isdigit__doc__},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05302254 {"islower", stringlib_islower, METH_NOARGS,
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002255 _Py_islower__doc__},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05302256 {"isspace", stringlib_isspace, METH_NOARGS,
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002257 _Py_isspace__doc__},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05302258 {"istitle", stringlib_istitle, METH_NOARGS,
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002259 _Py_istitle__doc__},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05302260 {"isupper", stringlib_isupper, METH_NOARGS,
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002261 _Py_isupper__doc__},
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002262 BYTEARRAY_JOIN_METHODDEF
Tal Einatc929df32018-07-06 13:17:38 +03002263 STRINGLIB_LJUST_METHODDEF
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05302264 {"lower", stringlib_lower, METH_NOARGS, _Py_lower__doc__},
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002265 BYTEARRAY_LSTRIP_METHODDEF
2266 BYTEARRAY_MAKETRANS_METHODDEF
2267 BYTEARRAY_PARTITION_METHODDEF
2268 BYTEARRAY_POP_METHODDEF
2269 BYTEARRAY_REMOVE_METHODDEF
2270 BYTEARRAY_REPLACE_METHODDEF
sweeneydea81849b2020-04-22 17:05:48 -04002271 BYTEARRAY_REMOVEPREFIX_METHODDEF
2272 BYTEARRAY_REMOVESUFFIX_METHODDEF
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002273 BYTEARRAY_REVERSE_METHODDEF
Serhiy Storchakae09132f2016-07-03 13:57:48 +03002274 {"rfind", (PyCFunction)bytearray_rfind, METH_VARARGS, _Py_rfind__doc__},
2275 {"rindex", (PyCFunction)bytearray_rindex, METH_VARARGS, _Py_rindex__doc__},
Tal Einatc929df32018-07-06 13:17:38 +03002276 STRINGLIB_RJUST_METHODDEF
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002277 BYTEARRAY_RPARTITION_METHODDEF
2278 BYTEARRAY_RSPLIT_METHODDEF
2279 BYTEARRAY_RSTRIP_METHODDEF
2280 BYTEARRAY_SPLIT_METHODDEF
2281 BYTEARRAY_SPLITLINES_METHODDEF
Serhiy Storchakae09132f2016-07-03 13:57:48 +03002282 {"startswith", (PyCFunction)bytearray_startswith, METH_VARARGS ,
Serhiy Storchakadd40fc32016-05-04 22:23:26 +03002283 _Py_startswith__doc__},
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002284 BYTEARRAY_STRIP_METHODDEF
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05302285 {"swapcase", stringlib_swapcase, METH_NOARGS,
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002286 _Py_swapcase__doc__},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05302287 {"title", stringlib_title, METH_NOARGS, _Py_title__doc__},
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002288 BYTEARRAY_TRANSLATE_METHODDEF
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05302289 {"upper", stringlib_upper, METH_NOARGS, _Py_upper__doc__},
Tal Einatc929df32018-07-06 13:17:38 +03002290 STRINGLIB_ZFILL_METHODDEF
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002291 {NULL}
2292};
2293
Ethan Furmanb95b5612015-01-23 20:05:18 -08002294static PyObject *
2295bytearray_mod(PyObject *v, PyObject *w)
2296{
2297 if (!PyByteArray_Check(v))
2298 Py_RETURN_NOTIMPLEMENTED;
Berker Peksag43de36d2016-04-16 01:20:47 +03002299 return _PyBytes_FormatEx(PyByteArray_AS_STRING(v), PyByteArray_GET_SIZE(v), w, 1);
Ethan Furmanb95b5612015-01-23 20:05:18 -08002300}
2301
2302static PyNumberMethods bytearray_as_number = {
2303 0, /*nb_add*/
2304 0, /*nb_subtract*/
2305 0, /*nb_multiply*/
2306 bytearray_mod, /*nb_remainder*/
2307};
2308
Benjamin Peterson153c70f2009-04-18 15:42:12 +00002309PyDoc_STRVAR(bytearray_doc,
Georg Brandl17cb8a82008-05-30 08:20:09 +00002310"bytearray(iterable_of_ints) -> bytearray\n\
2311bytearray(string, encoding[, errors]) -> bytearray\n\
Victor Stinnerbb2e9c42011-12-17 23:18:07 +01002312bytearray(bytes_or_buffer) -> mutable copy of bytes_or_buffer\n\
2313bytearray(int) -> bytes array of size given by the parameter initialized with null bytes\n\
2314bytearray() -> empty bytes array\n\
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002315\n\
Serhiy Storchaka6a7b3a72016-04-17 08:32:47 +03002316Construct a mutable bytearray object from:\n\
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002317 - an iterable yielding integers in range(256)\n\
2318 - a text string encoded using the specified encoding\n\
Victor Stinnerbb2e9c42011-12-17 23:18:07 +01002319 - a bytes or a buffer object\n\
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002320 - any object implementing the buffer API.\n\
Victor Stinnerbb2e9c42011-12-17 23:18:07 +01002321 - an integer");
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002322
2323
Benjamin Peterson153c70f2009-04-18 15:42:12 +00002324static PyObject *bytearray_iter(PyObject *seq);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002325
2326PyTypeObject PyByteArray_Type = {
2327 PyVarObject_HEAD_INIT(&PyType_Type, 0)
2328 "bytearray",
2329 sizeof(PyByteArrayObject),
2330 0,
Benjamin Peterson153c70f2009-04-18 15:42:12 +00002331 (destructor)bytearray_dealloc, /* tp_dealloc */
Jeroen Demeyer530f5062019-05-31 04:13:39 +02002332 0, /* tp_vectorcall_offset */
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002333 0, /* tp_getattr */
2334 0, /* tp_setattr */
Jeroen Demeyer530f5062019-05-31 04:13:39 +02002335 0, /* tp_as_async */
Benjamin Peterson153c70f2009-04-18 15:42:12 +00002336 (reprfunc)bytearray_repr, /* tp_repr */
Ethan Furmanb95b5612015-01-23 20:05:18 -08002337 &bytearray_as_number, /* tp_as_number */
Benjamin Peterson153c70f2009-04-18 15:42:12 +00002338 &bytearray_as_sequence, /* tp_as_sequence */
2339 &bytearray_as_mapping, /* tp_as_mapping */
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002340 0, /* tp_hash */
2341 0, /* tp_call */
Benjamin Peterson153c70f2009-04-18 15:42:12 +00002342 bytearray_str, /* tp_str */
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002343 PyObject_GenericGetAttr, /* tp_getattro */
2344 0, /* tp_setattro */
Benjamin Peterson153c70f2009-04-18 15:42:12 +00002345 &bytearray_as_buffer, /* tp_as_buffer */
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002346 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
Benjamin Peterson153c70f2009-04-18 15:42:12 +00002347 bytearray_doc, /* tp_doc */
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002348 0, /* tp_traverse */
2349 0, /* tp_clear */
Benjamin Peterson153c70f2009-04-18 15:42:12 +00002350 (richcmpfunc)bytearray_richcompare, /* tp_richcompare */
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002351 0, /* tp_weaklistoffset */
Benjamin Peterson153c70f2009-04-18 15:42:12 +00002352 bytearray_iter, /* tp_iter */
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002353 0, /* tp_iternext */
Benjamin Peterson153c70f2009-04-18 15:42:12 +00002354 bytearray_methods, /* tp_methods */
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002355 0, /* tp_members */
2356 0, /* tp_getset */
2357 0, /* tp_base */
2358 0, /* tp_dict */
2359 0, /* tp_descr_get */
2360 0, /* tp_descr_set */
2361 0, /* tp_dictoffset */
Benjamin Peterson153c70f2009-04-18 15:42:12 +00002362 (initproc)bytearray_init, /* tp_init */
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002363 PyType_GenericAlloc, /* tp_alloc */
2364 PyType_GenericNew, /* tp_new */
2365 PyObject_Del, /* tp_free */
2366};
2367
2368/*********************** Bytes Iterator ****************************/
2369
2370typedef struct {
2371 PyObject_HEAD
2372 Py_ssize_t it_index;
2373 PyByteArrayObject *it_seq; /* Set to NULL when iterator is exhausted */
2374} bytesiterobject;
2375
2376static void
Benjamin Peterson153c70f2009-04-18 15:42:12 +00002377bytearrayiter_dealloc(bytesiterobject *it)
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002378{
2379 _PyObject_GC_UNTRACK(it);
2380 Py_XDECREF(it->it_seq);
2381 PyObject_GC_Del(it);
2382}
2383
2384static int
Benjamin Peterson153c70f2009-04-18 15:42:12 +00002385bytearrayiter_traverse(bytesiterobject *it, visitproc visit, void *arg)
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002386{
2387 Py_VISIT(it->it_seq);
2388 return 0;
2389}
2390
2391static PyObject *
Benjamin Peterson153c70f2009-04-18 15:42:12 +00002392bytearrayiter_next(bytesiterobject *it)
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002393{
2394 PyByteArrayObject *seq;
2395 PyObject *item;
2396
2397 assert(it != NULL);
2398 seq = it->it_seq;
2399 if (seq == NULL)
2400 return NULL;
2401 assert(PyByteArray_Check(seq));
2402
2403 if (it->it_index < PyByteArray_GET_SIZE(seq)) {
2404 item = PyLong_FromLong(
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +02002405 (unsigned char)PyByteArray_AS_STRING(seq)[it->it_index]);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002406 if (item != NULL)
2407 ++it->it_index;
2408 return item;
2409 }
2410
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002411 it->it_seq = NULL;
Serhiy Storchakafbb1c5e2016-03-30 20:40:02 +03002412 Py_DECREF(seq);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002413 return NULL;
2414}
2415
2416static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05302417bytearrayiter_length_hint(bytesiterobject *it, PyObject *Py_UNUSED(ignored))
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002418{
2419 Py_ssize_t len = 0;
Serhiy Storchakaaf658722016-07-03 14:41:36 +03002420 if (it->it_seq) {
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002421 len = PyByteArray_GET_SIZE(it->it_seq) - it->it_index;
Serhiy Storchakaaf658722016-07-03 14:41:36 +03002422 if (len < 0) {
2423 len = 0;
2424 }
2425 }
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002426 return PyLong_FromSsize_t(len);
2427}
2428
2429PyDoc_STRVAR(length_hint_doc,
2430 "Private method returning an estimate of len(list(it)).");
2431
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00002432static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05302433bytearrayiter_reduce(bytesiterobject *it, PyObject *Py_UNUSED(ignored))
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00002434{
Serhiy Storchakabb86bf42018-12-11 08:28:18 +02002435 _Py_IDENTIFIER(iter);
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00002436 if (it->it_seq != NULL) {
Serhiy Storchakabb86bf42018-12-11 08:28:18 +02002437 return Py_BuildValue("N(O)n", _PyEval_GetBuiltinId(&PyId_iter),
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00002438 it->it_seq, it->it_index);
2439 } else {
Serhiy Storchakabb86bf42018-12-11 08:28:18 +02002440 return Py_BuildValue("N(())", _PyEval_GetBuiltinId(&PyId_iter));
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00002441 }
2442}
2443
2444static PyObject *
2445bytearrayiter_setstate(bytesiterobject *it, PyObject *state)
2446{
2447 Py_ssize_t index = PyLong_AsSsize_t(state);
2448 if (index == -1 && PyErr_Occurred())
2449 return NULL;
Kristján Valur Jónsson25dded02014-03-05 13:47:57 +00002450 if (it->it_seq != NULL) {
2451 if (index < 0)
2452 index = 0;
2453 else if (index > PyByteArray_GET_SIZE(it->it_seq))
2454 index = PyByteArray_GET_SIZE(it->it_seq); /* iterator exhausted */
2455 it->it_index = index;
2456 }
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00002457 Py_RETURN_NONE;
2458}
2459
2460PyDoc_STRVAR(setstate_doc, "Set state information for unpickling.");
2461
Benjamin Peterson153c70f2009-04-18 15:42:12 +00002462static PyMethodDef bytearrayiter_methods[] = {
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00002463 {"__length_hint__", (PyCFunction)bytearrayiter_length_hint, METH_NOARGS,
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002464 length_hint_doc},
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00002465 {"__reduce__", (PyCFunction)bytearrayiter_reduce, METH_NOARGS,
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002466 bytearray_reduce__doc__},
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00002467 {"__setstate__", (PyCFunction)bytearrayiter_setstate, METH_O,
2468 setstate_doc},
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002469 {NULL, NULL} /* sentinel */
2470};
2471
2472PyTypeObject PyByteArrayIter_Type = {
2473 PyVarObject_HEAD_INIT(&PyType_Type, 0)
2474 "bytearray_iterator", /* tp_name */
2475 sizeof(bytesiterobject), /* tp_basicsize */
2476 0, /* tp_itemsize */
2477 /* methods */
Benjamin Peterson153c70f2009-04-18 15:42:12 +00002478 (destructor)bytearrayiter_dealloc, /* tp_dealloc */
Jeroen Demeyer530f5062019-05-31 04:13:39 +02002479 0, /* tp_vectorcall_offset */
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002480 0, /* tp_getattr */
2481 0, /* tp_setattr */
Jeroen Demeyer530f5062019-05-31 04:13:39 +02002482 0, /* tp_as_async */
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002483 0, /* tp_repr */
2484 0, /* tp_as_number */
2485 0, /* tp_as_sequence */
2486 0, /* tp_as_mapping */
2487 0, /* tp_hash */
2488 0, /* tp_call */
2489 0, /* tp_str */
2490 PyObject_GenericGetAttr, /* tp_getattro */
2491 0, /* tp_setattro */
2492 0, /* tp_as_buffer */
2493 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC, /* tp_flags */
2494 0, /* tp_doc */
Benjamin Peterson153c70f2009-04-18 15:42:12 +00002495 (traverseproc)bytearrayiter_traverse, /* tp_traverse */
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002496 0, /* tp_clear */
2497 0, /* tp_richcompare */
2498 0, /* tp_weaklistoffset */
2499 PyObject_SelfIter, /* tp_iter */
Benjamin Peterson153c70f2009-04-18 15:42:12 +00002500 (iternextfunc)bytearrayiter_next, /* tp_iternext */
2501 bytearrayiter_methods, /* tp_methods */
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002502 0,
2503};
2504
2505static PyObject *
Benjamin Peterson153c70f2009-04-18 15:42:12 +00002506bytearray_iter(PyObject *seq)
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002507{
2508 bytesiterobject *it;
2509
2510 if (!PyByteArray_Check(seq)) {
2511 PyErr_BadInternalCall();
2512 return NULL;
2513 }
2514 it = PyObject_GC_New(bytesiterobject, &PyByteArrayIter_Type);
2515 if (it == NULL)
2516 return NULL;
2517 it->it_index = 0;
2518 Py_INCREF(seq);
2519 it->it_seq = (PyByteArrayObject *)seq;
2520 _PyObject_GC_TRACK(it);
2521 return (PyObject *)it;
2522}