blob: 97d7796769f8177b2723c3e0ed0237e7f69e2744 [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);
Miss Islington (bot)51b36ed2020-07-10 03:18:45 -0700276 // result->ob_bytes is NULL if result is an empty string:
277 // if va.len + vb.len equals zero.
278 if (result != NULL && result->ob_bytes != NULL) {
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000279 memcpy(result->ob_bytes, va.buf, va.len);
280 memcpy(result->ob_bytes + va.len, vb.buf, vb.len);
281 }
282
283 done:
284 if (va.len != -1)
Martin v. Löwis423be952008-08-13 15:53:07 +0000285 PyBuffer_Release(&va);
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000286 if (vb.len != -1)
Martin v. Löwis423be952008-08-13 15:53:07 +0000287 PyBuffer_Release(&vb);
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000288 return (PyObject *)result;
289}
290
291/* Functions stuffed into the type object */
292
293static Py_ssize_t
Benjamin Peterson153c70f2009-04-18 15:42:12 +0000294bytearray_length(PyByteArrayObject *self)
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000295{
296 return Py_SIZE(self);
297}
298
299static PyObject *
Benjamin Peterson153c70f2009-04-18 15:42:12 +0000300bytearray_iconcat(PyByteArrayObject *self, PyObject *other)
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000301{
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000302 Py_ssize_t size;
303 Py_buffer vo;
304
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +0200305 if (PyObject_GetBuffer(other, &vo, PyBUF_SIMPLE) != 0) {
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000306 PyErr_Format(PyExc_TypeError, "can't concat %.100s to %.100s",
307 Py_TYPE(other)->tp_name, Py_TYPE(self)->tp_name);
308 return NULL;
309 }
310
Serhiy Storchaka06cfb0c2016-07-10 20:48:43 +0300311 size = Py_SIZE(self);
312 if (size > PY_SSIZE_T_MAX - vo.len) {
Martin v. Löwis423be952008-08-13 15:53:07 +0000313 PyBuffer_Release(&vo);
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000314 return PyErr_NoMemory();
315 }
Serhiy Storchaka06cfb0c2016-07-10 20:48:43 +0300316 if (PyByteArray_Resize((PyObject *)self, size + vo.len) < 0) {
Martin v. Löwis423be952008-08-13 15:53:07 +0000317 PyBuffer_Release(&vo);
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000318 return NULL;
319 }
Serhiy Storchaka06cfb0c2016-07-10 20:48:43 +0300320 memcpy(PyByteArray_AS_STRING(self) + size, vo.buf, vo.len);
Martin v. Löwis423be952008-08-13 15:53:07 +0000321 PyBuffer_Release(&vo);
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000322 Py_INCREF(self);
323 return (PyObject *)self;
324}
325
326static PyObject *
Benjamin Peterson153c70f2009-04-18 15:42:12 +0000327bytearray_repeat(PyByteArrayObject *self, Py_ssize_t count)
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000328{
329 PyByteArrayObject *result;
330 Py_ssize_t mysize;
331 Py_ssize_t size;
332
333 if (count < 0)
334 count = 0;
335 mysize = Py_SIZE(self);
Mark Dickinsoncf940c72010-08-10 18:35:01 +0000336 if (count > 0 && mysize > PY_SSIZE_T_MAX / count)
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000337 return PyErr_NoMemory();
Mark Dickinsoncf940c72010-08-10 18:35:01 +0000338 size = mysize * count;
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000339 result = (PyByteArrayObject *)PyByteArray_FromStringAndSize(NULL, size);
340 if (result != NULL && size != 0) {
341 if (mysize == 1)
342 memset(result->ob_bytes, self->ob_bytes[0], size);
343 else {
344 Py_ssize_t i;
345 for (i = 0; i < count; i++)
346 memcpy(result->ob_bytes + i*mysize, self->ob_bytes, mysize);
347 }
348 }
349 return (PyObject *)result;
350}
351
352static PyObject *
Benjamin Peterson153c70f2009-04-18 15:42:12 +0000353bytearray_irepeat(PyByteArrayObject *self, Py_ssize_t count)
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000354{
355 Py_ssize_t mysize;
356 Py_ssize_t size;
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200357 char *buf;
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000358
359 if (count < 0)
360 count = 0;
361 mysize = Py_SIZE(self);
Mark Dickinsoncf940c72010-08-10 18:35:01 +0000362 if (count > 0 && mysize > PY_SSIZE_T_MAX / count)
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000363 return PyErr_NoMemory();
Mark Dickinsoncf940c72010-08-10 18:35:01 +0000364 size = mysize * count;
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200365 if (PyByteArray_Resize((PyObject *)self, size) < 0)
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000366 return NULL;
367
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200368 buf = PyByteArray_AS_STRING(self);
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000369 if (mysize == 1)
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200370 memset(buf, buf[0], size);
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000371 else {
372 Py_ssize_t i;
373 for (i = 1; i < count; i++)
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200374 memcpy(buf + i*mysize, buf, mysize);
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000375 }
376
377 Py_INCREF(self);
378 return (PyObject *)self;
379}
380
381static PyObject *
Benjamin Peterson153c70f2009-04-18 15:42:12 +0000382bytearray_getitem(PyByteArrayObject *self, Py_ssize_t i)
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000383{
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000384 if (i < 0 || i >= Py_SIZE(self)) {
385 PyErr_SetString(PyExc_IndexError, "bytearray index out of range");
386 return NULL;
387 }
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200388 return PyLong_FromLong((unsigned char)(PyByteArray_AS_STRING(self)[i]));
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000389}
390
391static PyObject *
Benjamin Peterson153c70f2009-04-18 15:42:12 +0000392bytearray_subscript(PyByteArrayObject *self, PyObject *index)
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000393{
Victor Stinnera15e2602020-04-08 02:01:56 +0200394 if (_PyIndex_Check(index)) {
Georg Brandl9a54d7c2008-07-16 23:15:30 +0000395 Py_ssize_t i = PyNumber_AsSsize_t(index, PyExc_IndexError);
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000396
397 if (i == -1 && PyErr_Occurred())
398 return NULL;
399
400 if (i < 0)
401 i += PyByteArray_GET_SIZE(self);
402
403 if (i < 0 || i >= Py_SIZE(self)) {
404 PyErr_SetString(PyExc_IndexError, "bytearray index out of range");
405 return NULL;
406 }
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200407 return PyLong_FromLong((unsigned char)(PyByteArray_AS_STRING(self)[i]));
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000408 }
Georg Brandl9a54d7c2008-07-16 23:15:30 +0000409 else if (PySlice_Check(index)) {
Zackery Spytz14514d92019-05-17 01:13:03 -0600410 Py_ssize_t start, stop, step, slicelength, i;
411 size_t cur;
Serhiy Storchakab879fe82017-04-08 09:53:51 +0300412 if (PySlice_Unpack(index, &start, &stop, &step) < 0) {
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000413 return NULL;
414 }
Serhiy Storchakab879fe82017-04-08 09:53:51 +0300415 slicelength = PySlice_AdjustIndices(PyByteArray_GET_SIZE(self),
416 &start, &stop, step);
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000417
418 if (slicelength <= 0)
419 return PyByteArray_FromStringAndSize("", 0);
420 else if (step == 1) {
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200421 return PyByteArray_FromStringAndSize(
422 PyByteArray_AS_STRING(self) + start, slicelength);
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000423 }
424 else {
425 char *source_buf = PyByteArray_AS_STRING(self);
Alexandre Vassalottie2641f42009-04-03 06:38:02 +0000426 char *result_buf;
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000427 PyObject *result;
428
Alexandre Vassalottie2641f42009-04-03 06:38:02 +0000429 result = PyByteArray_FromStringAndSize(NULL, slicelength);
430 if (result == NULL)
431 return NULL;
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000432
Alexandre Vassalottie2641f42009-04-03 06:38:02 +0000433 result_buf = PyByteArray_AS_STRING(result);
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000434 for (cur = start, i = 0; i < slicelength;
435 cur += step, i++) {
436 result_buf[i] = source_buf[cur];
437 }
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000438 return result;
439 }
440 }
441 else {
Terry Jan Reedyffff1442014-08-02 01:30:37 -0400442 PyErr_Format(PyExc_TypeError,
443 "bytearray indices must be integers or slices, not %.200s",
444 Py_TYPE(index)->tp_name);
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000445 return NULL;
446 }
447}
448
449static int
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200450bytearray_setslice_linear(PyByteArrayObject *self,
451 Py_ssize_t lo, Py_ssize_t hi,
452 char *bytes, Py_ssize_t bytes_len)
453{
454 Py_ssize_t avail = hi - lo;
455 char *buf = PyByteArray_AS_STRING(self);
456 Py_ssize_t growth = bytes_len - avail;
Victor Stinner84557232013-11-21 12:29:51 +0100457 int res = 0;
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200458 assert(avail >= 0);
459
Victor Stinner84557232013-11-21 12:29:51 +0100460 if (growth < 0) {
461 if (!_canresize(self))
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200462 return -1;
Victor Stinner84557232013-11-21 12:29:51 +0100463
464 if (lo == 0) {
465 /* Shrink the buffer by advancing its logical start */
466 self->ob_start -= growth;
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200467 /*
Victor Stinner84557232013-11-21 12:29:51 +0100468 0 lo hi old_size
469 | |<----avail----->|<-----tail------>|
470 | |<-bytes_len->|<-----tail------>|
471 0 new_lo new_hi new_size
472 */
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200473 }
Victor Stinner84557232013-11-21 12:29:51 +0100474 else {
475 /*
476 0 lo hi old_size
477 | |<----avail----->|<-----tomove------>|
478 | |<-bytes_len->|<-----tomove------>|
479 0 lo new_hi new_size
480 */
481 memmove(buf + lo + bytes_len, buf + hi,
482 Py_SIZE(self) - hi);
483 }
484 if (PyByteArray_Resize((PyObject *)self,
485 Py_SIZE(self) + growth) < 0) {
486 /* Issue #19578: Handling the memory allocation failure here is
487 tricky here because the bytearray object has already been
488 modified. Depending on growth and lo, the behaviour is
489 different.
490
491 If growth < 0 and lo != 0, the operation is completed, but a
492 MemoryError is still raised and the memory block is not
Raymond Hettinger15f44ab2016-08-30 10:47:49 -0700493 shrunk. Otherwise, the bytearray is restored in its previous
Victor Stinner84557232013-11-21 12:29:51 +0100494 state and a MemoryError is raised. */
495 if (lo == 0) {
496 self->ob_start += growth;
497 return -1;
498 }
499 /* memmove() removed bytes, the bytearray object cannot be
500 restored in its previous state. */
Victor Stinner60ac6ed2020-02-07 23:18:08 +0100501 Py_SET_SIZE(self, Py_SIZE(self) + growth);
Victor Stinner84557232013-11-21 12:29:51 +0100502 res = -1;
503 }
504 buf = PyByteArray_AS_STRING(self);
505 }
506 else if (growth > 0) {
507 if (Py_SIZE(self) > (Py_ssize_t)PY_SSIZE_T_MAX - growth) {
508 PyErr_NoMemory();
509 return -1;
510 }
511
512 if (PyByteArray_Resize((PyObject *)self,
513 Py_SIZE(self) + growth) < 0) {
514 return -1;
515 }
516 buf = PyByteArray_AS_STRING(self);
517 /* Make the place for the additional bytes */
518 /*
519 0 lo hi old_size
520 | |<-avail->|<-----tomove------>|
521 | |<---bytes_len-->|<-----tomove------>|
522 0 lo new_hi new_size
523 */
524 memmove(buf + lo + bytes_len, buf + hi,
525 Py_SIZE(self) - lo - bytes_len);
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200526 }
527
528 if (bytes_len > 0)
529 memcpy(buf + lo, bytes, bytes_len);
Victor Stinner84557232013-11-21 12:29:51 +0100530 return res;
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200531}
532
533static int
Benjamin Peterson153c70f2009-04-18 15:42:12 +0000534bytearray_setslice(PyByteArrayObject *self, Py_ssize_t lo, Py_ssize_t hi,
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000535 PyObject *values)
536{
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200537 Py_ssize_t needed;
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000538 void *bytes;
539 Py_buffer vbytes;
540 int res = 0;
541
542 vbytes.len = -1;
543 if (values == (PyObject *)self) {
544 /* Make a copy and call this function recursively */
545 int err;
Serhiy Storchakaa2314282017-10-29 02:11:54 +0300546 values = PyByteArray_FromStringAndSize(PyByteArray_AS_STRING(values),
547 PyByteArray_GET_SIZE(values));
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000548 if (values == NULL)
549 return -1;
Benjamin Peterson153c70f2009-04-18 15:42:12 +0000550 err = bytearray_setslice(self, lo, hi, values);
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000551 Py_DECREF(values);
552 return err;
553 }
554 if (values == NULL) {
555 /* del b[lo:hi] */
556 bytes = NULL;
557 needed = 0;
558 }
559 else {
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +0200560 if (PyObject_GetBuffer(values, &vbytes, PyBUF_SIMPLE) != 0) {
561 PyErr_Format(PyExc_TypeError,
562 "can't set bytearray slice from %.100s",
563 Py_TYPE(values)->tp_name);
564 return -1;
565 }
566 needed = vbytes.len;
567 bytes = vbytes.buf;
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000568 }
569
570 if (lo < 0)
571 lo = 0;
572 if (hi < lo)
573 hi = lo;
574 if (hi > Py_SIZE(self))
575 hi = Py_SIZE(self);
576
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200577 res = bytearray_setslice_linear(self, lo, hi, bytes, needed);
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000578 if (vbytes.len != -1)
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200579 PyBuffer_Release(&vbytes);
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000580 return res;
581}
582
583static int
Benjamin Peterson153c70f2009-04-18 15:42:12 +0000584bytearray_setitem(PyByteArrayObject *self, Py_ssize_t i, PyObject *value)
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000585{
Georg Brandl9a54d7c2008-07-16 23:15:30 +0000586 int ival;
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000587
588 if (i < 0)
589 i += Py_SIZE(self);
590
591 if (i < 0 || i >= Py_SIZE(self)) {
592 PyErr_SetString(PyExc_IndexError, "bytearray index out of range");
593 return -1;
594 }
595
596 if (value == NULL)
Benjamin Peterson153c70f2009-04-18 15:42:12 +0000597 return bytearray_setslice(self, i, i+1, NULL);
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000598
Georg Brandl9a54d7c2008-07-16 23:15:30 +0000599 if (!_getbytevalue(value, &ival))
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000600 return -1;
601
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200602 PyByteArray_AS_STRING(self)[i] = ival;
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000603 return 0;
604}
605
606static int
Benjamin Peterson153c70f2009-04-18 15:42:12 +0000607bytearray_ass_subscript(PyByteArrayObject *self, PyObject *index, PyObject *values)
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000608{
609 Py_ssize_t start, stop, step, slicelen, needed;
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200610 char *buf, *bytes;
611 buf = PyByteArray_AS_STRING(self);
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000612
Victor Stinnera15e2602020-04-08 02:01:56 +0200613 if (_PyIndex_Check(index)) {
Georg Brandl9a54d7c2008-07-16 23:15:30 +0000614 Py_ssize_t i = PyNumber_AsSsize_t(index, PyExc_IndexError);
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000615
616 if (i == -1 && PyErr_Occurred())
617 return -1;
618
619 if (i < 0)
620 i += PyByteArray_GET_SIZE(self);
621
622 if (i < 0 || i >= Py_SIZE(self)) {
623 PyErr_SetString(PyExc_IndexError, "bytearray index out of range");
624 return -1;
625 }
626
627 if (values == NULL) {
628 /* Fall through to slice assignment */
629 start = i;
630 stop = i + 1;
631 step = 1;
632 slicelen = 1;
633 }
634 else {
Georg Brandl9a54d7c2008-07-16 23:15:30 +0000635 int ival;
636 if (!_getbytevalue(values, &ival))
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000637 return -1;
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200638 buf[i] = (char)ival;
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000639 return 0;
640 }
641 }
Georg Brandl9a54d7c2008-07-16 23:15:30 +0000642 else if (PySlice_Check(index)) {
Serhiy Storchakab879fe82017-04-08 09:53:51 +0300643 if (PySlice_Unpack(index, &start, &stop, &step) < 0) {
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000644 return -1;
645 }
Serhiy Storchakab879fe82017-04-08 09:53:51 +0300646 slicelen = PySlice_AdjustIndices(PyByteArray_GET_SIZE(self), &start,
647 &stop, step);
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000648 }
649 else {
Terry Jan Reedyffff1442014-08-02 01:30:37 -0400650 PyErr_Format(PyExc_TypeError,
651 "bytearray indices must be integers or slices, not %.200s",
652 Py_TYPE(index)->tp_name);
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000653 return -1;
654 }
655
656 if (values == NULL) {
657 bytes = NULL;
658 needed = 0;
659 }
660 else if (values == (PyObject *)self || !PyByteArray_Check(values)) {
Christian Heimes6d26ade2012-11-03 23:07:59 +0100661 int err;
Ezio Melottic64bcbe2012-11-03 21:19:06 +0200662 if (PyNumber_Check(values) || PyUnicode_Check(values)) {
663 PyErr_SetString(PyExc_TypeError,
664 "can assign only bytes, buffers, or iterables "
665 "of ints in range(0, 256)");
666 return -1;
667 }
Georg Brandlf3fa5682010-12-04 17:09:30 +0000668 /* Make a copy and call this function recursively */
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000669 values = PyByteArray_FromObject(values);
670 if (values == NULL)
671 return -1;
Benjamin Peterson153c70f2009-04-18 15:42:12 +0000672 err = bytearray_ass_subscript(self, index, values);
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000673 Py_DECREF(values);
674 return err;
675 }
676 else {
677 assert(PyByteArray_Check(values));
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200678 bytes = PyByteArray_AS_STRING(values);
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000679 needed = Py_SIZE(values);
680 }
681 /* Make sure b[5:2] = ... inserts before 5, not before 2. */
682 if ((step < 0 && start < stop) ||
683 (step > 0 && start > stop))
684 stop = start;
685 if (step == 1) {
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200686 return bytearray_setslice_linear(self, start, stop, bytes, needed);
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000687 }
688 else {
689 if (needed == 0) {
690 /* Delete slice */
Mark Dickinsonbc099642010-01-29 17:27:24 +0000691 size_t cur;
692 Py_ssize_t i;
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000693
Antoine Pitrou5504e892008-12-06 21:27:53 +0000694 if (!_canresize(self))
695 return -1;
Mark Dickinson7e3b9482010-08-06 21:33:18 +0000696
697 if (slicelen == 0)
698 /* Nothing to do here. */
699 return 0;
700
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000701 if (step < 0) {
702 stop = start + 1;
703 start = stop + step * (slicelen - 1) - 1;
704 step = -step;
705 }
706 for (cur = start, i = 0;
707 i < slicelen; cur += step, i++) {
708 Py_ssize_t lim = step - 1;
709
Mark Dickinson66f575b2010-02-14 12:53:32 +0000710 if (cur + step >= (size_t)PyByteArray_GET_SIZE(self))
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000711 lim = PyByteArray_GET_SIZE(self) - cur - 1;
712
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200713 memmove(buf + cur - i,
714 buf + cur + 1, lim);
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000715 }
716 /* Move the tail of the bytes, in one chunk */
Mark Dickinson7e3b9482010-08-06 21:33:18 +0000717 cur = start + (size_t)slicelen*step;
Mark Dickinson66f575b2010-02-14 12:53:32 +0000718 if (cur < (size_t)PyByteArray_GET_SIZE(self)) {
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200719 memmove(buf + cur - slicelen,
720 buf + cur,
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000721 PyByteArray_GET_SIZE(self) - cur);
722 }
723 if (PyByteArray_Resize((PyObject *)self,
724 PyByteArray_GET_SIZE(self) - slicelen) < 0)
725 return -1;
726
727 return 0;
728 }
729 else {
730 /* Assign slice */
Mark Dickinson7e3b9482010-08-06 21:33:18 +0000731 Py_ssize_t i;
732 size_t cur;
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000733
734 if (needed != slicelen) {
735 PyErr_Format(PyExc_ValueError,
736 "attempt to assign bytes of size %zd "
737 "to extended slice of size %zd",
738 needed, slicelen);
739 return -1;
740 }
741 for (cur = start, i = 0; i < slicelen; cur += step, i++)
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200742 buf[cur] = bytes[i];
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000743 return 0;
744 }
745 }
746}
747
748static int
Benjamin Peterson153c70f2009-04-18 15:42:12 +0000749bytearray_init(PyByteArrayObject *self, PyObject *args, PyObject *kwds)
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000750{
751 static char *kwlist[] = {"source", "encoding", "errors", 0};
752 PyObject *arg = NULL;
753 const char *encoding = NULL;
754 const char *errors = NULL;
755 Py_ssize_t count;
756 PyObject *it;
757 PyObject *(*iternext)(PyObject *);
758
759 if (Py_SIZE(self) != 0) {
760 /* Empty previous contents (yes, do this first of all!) */
761 if (PyByteArray_Resize((PyObject *)self, 0) < 0)
762 return -1;
763 }
764
765 /* Parse arguments */
Georg Brandl3dbca812008-07-23 16:10:53 +0000766 if (!PyArg_ParseTupleAndKeywords(args, kwds, "|Oss:bytearray", kwlist,
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000767 &arg, &encoding, &errors))
768 return -1;
769
770 /* Make a quick exit if no first argument */
771 if (arg == NULL) {
772 if (encoding != NULL || errors != NULL) {
773 PyErr_SetString(PyExc_TypeError,
Serhiy Storchaka2c2044e2018-10-21 15:29:12 +0300774 encoding != NULL ?
775 "encoding without a string argument" :
776 "errors without a string argument");
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000777 return -1;
778 }
779 return 0;
780 }
781
782 if (PyUnicode_Check(arg)) {
783 /* Encode via the codec registry */
784 PyObject *encoded, *new;
785 if (encoding == NULL) {
786 PyErr_SetString(PyExc_TypeError,
787 "string argument without an encoding");
788 return -1;
789 }
Marc-André Lemburgb2750b52008-06-06 12:18:17 +0000790 encoded = PyUnicode_AsEncodedString(arg, encoding, errors);
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000791 if (encoded == NULL)
792 return -1;
793 assert(PyBytes_Check(encoded));
Benjamin Peterson153c70f2009-04-18 15:42:12 +0000794 new = bytearray_iconcat(self, encoded);
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000795 Py_DECREF(encoded);
796 if (new == NULL)
797 return -1;
798 Py_DECREF(new);
799 return 0;
800 }
801
802 /* If it's not unicode, there can't be encoding or errors */
803 if (encoding != NULL || errors != NULL) {
804 PyErr_SetString(PyExc_TypeError,
Serhiy Storchaka2c2044e2018-10-21 15:29:12 +0300805 encoding != NULL ?
806 "encoding without a string argument" :
807 "errors without a string argument");
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000808 return -1;
809 }
810
811 /* Is it an int? */
Victor Stinnera15e2602020-04-08 02:01:56 +0200812 if (_PyIndex_Check(arg)) {
Serhiy Storchakaeb249882016-08-15 09:46:07 +0300813 count = PyNumber_AsSsize_t(arg, PyExc_OverflowError);
814 if (count == -1 && PyErr_Occurred()) {
Serhiy Storchakae8904212018-10-15 00:02:57 +0300815 if (!PyErr_ExceptionMatches(PyExc_TypeError))
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000816 return -1;
INADA Naokia634e232017-01-06 17:32:01 +0900817 PyErr_Clear(); /* fall through */
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000818 }
INADA Naokia634e232017-01-06 17:32:01 +0900819 else {
820 if (count < 0) {
821 PyErr_SetString(PyExc_ValueError, "negative count");
822 return -1;
823 }
824 if (count > 0) {
825 if (PyByteArray_Resize((PyObject *)self, count))
826 return -1;
827 memset(PyByteArray_AS_STRING(self), 0, count);
828 }
829 return 0;
830 }
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000831 }
832
833 /* Use the buffer API */
834 if (PyObject_CheckBuffer(arg)) {
835 Py_ssize_t size;
836 Py_buffer view;
837 if (PyObject_GetBuffer(arg, &view, PyBUF_FULL_RO) < 0)
838 return -1;
839 size = view.len;
840 if (PyByteArray_Resize((PyObject *)self, size) < 0) goto fail;
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200841 if (PyBuffer_ToContiguous(PyByteArray_AS_STRING(self),
842 &view, size, 'C') < 0)
Stefan Krah7d12d9d2012-07-28 12:25:55 +0200843 goto fail;
Martin v. Löwis423be952008-08-13 15:53:07 +0000844 PyBuffer_Release(&view);
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000845 return 0;
846 fail:
Martin v. Löwis423be952008-08-13 15:53:07 +0000847 PyBuffer_Release(&view);
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000848 return -1;
849 }
850
851 /* XXX Optimize this if the arguments is a list, tuple */
852
853 /* Get the iterator */
854 it = PyObject_GetIter(arg);
Serhiy Storchaka2c2044e2018-10-21 15:29:12 +0300855 if (it == NULL) {
856 if (PyErr_ExceptionMatches(PyExc_TypeError)) {
857 PyErr_Format(PyExc_TypeError,
858 "cannot convert '%.200s' object to bytearray",
Victor Stinner58ac7002020-02-07 03:04:21 +0100859 Py_TYPE(arg)->tp_name);
Serhiy Storchaka2c2044e2018-10-21 15:29:12 +0300860 }
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000861 return -1;
Serhiy Storchaka2c2044e2018-10-21 15:29:12 +0300862 }
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000863 iternext = *Py_TYPE(it)->tp_iternext;
864
865 /* Run the iterator to exhaustion */
866 for (;;) {
867 PyObject *item;
Georg Brandl9a54d7c2008-07-16 23:15:30 +0000868 int rc, value;
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000869
870 /* Get the next item */
871 item = iternext(it);
872 if (item == NULL) {
873 if (PyErr_Occurred()) {
874 if (!PyErr_ExceptionMatches(PyExc_StopIteration))
875 goto error;
876 PyErr_Clear();
877 }
878 break;
879 }
880
881 /* Interpret it as an int (__index__) */
Georg Brandl9a54d7c2008-07-16 23:15:30 +0000882 rc = _getbytevalue(item, &value);
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000883 Py_DECREF(item);
Georg Brandl9a54d7c2008-07-16 23:15:30 +0000884 if (!rc)
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000885 goto error;
886
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000887 /* Append the byte */
Serhiy Storchaka7b6e3b92015-06-29 21:14:06 +0300888 if (Py_SIZE(self) + 1 < self->ob_alloc) {
Victor Stinner60ac6ed2020-02-07 23:18:08 +0100889 Py_SET_SIZE(self, Py_SIZE(self) + 1);
Serhiy Storchaka7b6e3b92015-06-29 21:14:06 +0300890 PyByteArray_AS_STRING(self)[Py_SIZE(self)] = '\0';
891 }
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000892 else if (PyByteArray_Resize((PyObject *)self, Py_SIZE(self)+1) < 0)
893 goto error;
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200894 PyByteArray_AS_STRING(self)[Py_SIZE(self)-1] = value;
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000895 }
896
897 /* Clean up and return success */
898 Py_DECREF(it);
899 return 0;
900
901 error:
902 /* Error handling when it != NULL */
903 Py_DECREF(it);
904 return -1;
905}
906
907/* Mostly copied from string_repr, but without the
908 "smart quote" functionality. */
909static PyObject *
Benjamin Peterson153c70f2009-04-18 15:42:12 +0000910bytearray_repr(PyByteArrayObject *self)
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000911{
Serhiy Storchakab3a77962017-09-21 14:24:13 +0300912 const char *className = _PyType_Name(Py_TYPE(self));
913 const char *quote_prefix = "(b";
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000914 const char *quote_postfix = ")";
915 Py_ssize_t length = Py_SIZE(self);
Serhiy Storchakab3a77962017-09-21 14:24:13 +0300916 /* 6 == strlen(quote_prefix) + 2 + strlen(quote_postfix) + 1 */
917 Py_ssize_t newsize;
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000918 PyObject *v;
Antoine Pitrou9ed5f272013-08-13 20:18:52 +0200919 Py_ssize_t i;
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200920 char *bytes;
Antoine Pitrou9ed5f272013-08-13 20:18:52 +0200921 char c;
922 char *p;
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200923 int quote;
924 char *test, *start;
925 char *buffer;
926
Serhiy Storchakab3a77962017-09-21 14:24:13 +0300927 newsize = strlen(className);
928 if (length > (PY_SSIZE_T_MAX - 6 - newsize) / 4) {
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000929 PyErr_SetString(PyExc_OverflowError,
930 "bytearray object is too large to make repr");
931 return NULL;
932 }
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200933
Serhiy Storchakab3a77962017-09-21 14:24:13 +0300934 newsize += 6 + length * 4;
Antoine Pitrou39aba4f2011-11-12 21:15:28 +0100935 buffer = PyObject_Malloc(newsize);
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200936 if (buffer == NULL) {
937 PyErr_NoMemory();
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000938 return NULL;
939 }
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000940
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200941 /* Figure out which quote to use; single is preferred */
942 quote = '\'';
943 start = PyByteArray_AS_STRING(self);
944 for (test = start; test < start+length; ++test) {
945 if (*test == '"') {
946 quote = '\''; /* back to single */
947 break;
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000948 }
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200949 else if (*test == '\'')
950 quote = '"';
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000951 }
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200952
953 p = buffer;
Serhiy Storchakab3a77962017-09-21 14:24:13 +0300954 while (*className)
955 *p++ = *className++;
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200956 while (*quote_prefix)
957 *p++ = *quote_prefix++;
958 *p++ = quote;
959
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200960 bytes = PyByteArray_AS_STRING(self);
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200961 for (i = 0; i < length; i++) {
962 /* There's at least enough room for a hex escape
963 and a closing quote. */
964 assert(newsize - (p - buffer) >= 5);
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200965 c = bytes[i];
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200966 if (c == '\'' || c == '\\')
967 *p++ = '\\', *p++ = c;
968 else if (c == '\t')
969 *p++ = '\\', *p++ = 't';
970 else if (c == '\n')
971 *p++ = '\\', *p++ = 'n';
972 else if (c == '\r')
973 *p++ = '\\', *p++ = 'r';
974 else if (c == 0)
975 *p++ = '\\', *p++ = 'x', *p++ = '0', *p++ = '0';
976 else if (c < ' ' || c >= 0x7f) {
977 *p++ = '\\';
978 *p++ = 'x';
Victor Stinnerf5cff562011-10-14 02:13:11 +0200979 *p++ = Py_hexdigits[(c & 0xf0) >> 4];
980 *p++ = Py_hexdigits[c & 0xf];
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200981 }
982 else
983 *p++ = c;
984 }
985 assert(newsize - (p - buffer) >= 1);
986 *p++ = quote;
987 while (*quote_postfix) {
988 *p++ = *quote_postfix++;
989 }
990
Serhiy Storchakab3a77962017-09-21 14:24:13 +0300991 v = PyUnicode_FromStringAndSize(buffer, p - buffer);
Antoine Pitrou39aba4f2011-11-12 21:15:28 +0100992 PyObject_Free(buffer);
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200993 return v;
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000994}
995
996static PyObject *
Benjamin Peterson153c70f2009-04-18 15:42:12 +0000997bytearray_str(PyObject *op)
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000998{
Victor Stinnerda7933e2020-04-13 03:04:28 +0200999 if (_Py_GetConfig()->bytes_warning) {
Victor Stinner53b7d4e2018-07-25 01:37:05 +02001000 if (PyErr_WarnEx(PyExc_BytesWarning,
1001 "str() on a bytearray instance", 1)) {
1002 return NULL;
Alexander Belopolskyf0f45142010-08-11 17:31:17 +00001003 }
Victor Stinner53b7d4e2018-07-25 01:37:05 +02001004 }
1005 return bytearray_repr((PyByteArrayObject*)op);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001006}
1007
1008static PyObject *
Benjamin Peterson153c70f2009-04-18 15:42:12 +00001009bytearray_richcompare(PyObject *self, PyObject *other, int op)
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001010{
1011 Py_ssize_t self_size, other_size;
1012 Py_buffer self_bytes, other_bytes;
Serhiy Storchakafa494fd2015-05-30 17:45:22 +03001013 int cmp, rc;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001014
1015 /* Bytes can be compared to anything that supports the (binary)
1016 buffer API. Except that a comparison with Unicode is always an
1017 error, even if the comparison is for equality. */
Serhiy Storchakafa494fd2015-05-30 17:45:22 +03001018 rc = PyObject_IsInstance(self, (PyObject*)&PyUnicode_Type);
1019 if (!rc)
1020 rc = PyObject_IsInstance(other, (PyObject*)&PyUnicode_Type);
1021 if (rc < 0)
1022 return NULL;
1023 if (rc) {
Victor Stinnerda7933e2020-04-13 03:04:28 +02001024 if (_Py_GetConfig()->bytes_warning && (op == Py_EQ || op == Py_NE)) {
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001025 if (PyErr_WarnEx(PyExc_BytesWarning,
Georg Brandle5d68ac2008-06-04 11:30:26 +00001026 "Comparison between bytearray and string", 1))
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001027 return NULL;
1028 }
1029
Brian Curtindfc80e32011-08-10 20:28:54 -05001030 Py_RETURN_NOTIMPLEMENTED;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001031 }
1032
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +02001033 if (PyObject_GetBuffer(self, &self_bytes, PyBUF_SIMPLE) != 0) {
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001034 PyErr_Clear();
Brian Curtindfc80e32011-08-10 20:28:54 -05001035 Py_RETURN_NOTIMPLEMENTED;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001036 }
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +02001037 self_size = self_bytes.len;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001038
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +02001039 if (PyObject_GetBuffer(other, &other_bytes, PyBUF_SIMPLE) != 0) {
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001040 PyErr_Clear();
Martin v. Löwis423be952008-08-13 15:53:07 +00001041 PyBuffer_Release(&self_bytes);
Brian Curtindfc80e32011-08-10 20:28:54 -05001042 Py_RETURN_NOTIMPLEMENTED;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001043 }
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +02001044 other_size = other_bytes.len;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001045
1046 if (self_size != other_size && (op == Py_EQ || op == Py_NE)) {
1047 /* Shortcut: if the lengths differ, the objects differ */
stratakise8b19652017-11-02 11:32:54 +01001048 PyBuffer_Release(&self_bytes);
1049 PyBuffer_Release(&other_bytes);
1050 return PyBool_FromLong((op == Py_NE));
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001051 }
1052 else {
stratakise8b19652017-11-02 11:32:54 +01001053 cmp = memcmp(self_bytes.buf, other_bytes.buf,
1054 Py_MIN(self_size, other_size));
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001055 /* In ISO C, memcmp() guarantees to use unsigned bytes! */
1056
stratakise8b19652017-11-02 11:32:54 +01001057 PyBuffer_Release(&self_bytes);
1058 PyBuffer_Release(&other_bytes);
1059
1060 if (cmp != 0) {
1061 Py_RETURN_RICHCOMPARE(cmp, 0, op);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001062 }
1063
stratakise8b19652017-11-02 11:32:54 +01001064 Py_RETURN_RICHCOMPARE(self_size, other_size, op);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001065 }
1066
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001067}
1068
1069static void
Benjamin Peterson153c70f2009-04-18 15:42:12 +00001070bytearray_dealloc(PyByteArrayObject *self)
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001071{
Benjamin Petersone0124bd2009-03-09 21:04:33 +00001072 if (self->ob_exports > 0) {
1073 PyErr_SetString(PyExc_SystemError,
Benjamin Petersonef3e4c22009-04-11 19:48:14 +00001074 "deallocated bytearray object has exported buffers");
Benjamin Petersone0124bd2009-03-09 21:04:33 +00001075 PyErr_Print();
1076 }
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001077 if (self->ob_bytes != 0) {
Antoine Pitrou39aba4f2011-11-12 21:15:28 +01001078 PyObject_Free(self->ob_bytes);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001079 }
1080 Py_TYPE(self)->tp_free((PyObject *)self);
1081}
1082
1083
1084/* -------------------------------------------------------------------- */
1085/* Methods */
1086
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02001087#define FASTSEARCH fastsearch
1088#define STRINGLIB(F) stringlib_##F
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001089#define STRINGLIB_CHAR char
Antoine Pitroucfc22b42012-10-16 21:07:23 +02001090#define STRINGLIB_SIZEOF_CHAR 1
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001091#define STRINGLIB_LEN PyByteArray_GET_SIZE
1092#define STRINGLIB_STR PyByteArray_AS_STRING
1093#define STRINGLIB_NEW PyByteArray_FromStringAndSize
Antoine Pitrouf2c54842010-01-13 08:07:53 +00001094#define STRINGLIB_ISSPACE Py_ISSPACE
1095#define STRINGLIB_ISLINEBREAK(x) ((x == '\n') || (x == '\r'))
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001096#define STRINGLIB_CHECK_EXACT PyByteArray_CheckExact
1097#define STRINGLIB_MUTABLE 1
1098
1099#include "stringlib/fastsearch.h"
1100#include "stringlib/count.h"
1101#include "stringlib/find.h"
Antoine Pitroucfc22b42012-10-16 21:07:23 +02001102#include "stringlib/join.h"
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001103#include "stringlib/partition.h"
Antoine Pitrouf2c54842010-01-13 08:07:53 +00001104#include "stringlib/split.h"
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001105#include "stringlib/ctype.h"
1106#include "stringlib/transmogrify.h"
1107
1108
Serhiy Storchakae09132f2016-07-03 13:57:48 +03001109static PyObject *
1110bytearray_find(PyByteArrayObject *self, PyObject *args)
1111{
1112 return _Py_bytes_find(PyByteArray_AS_STRING(self), PyByteArray_GET_SIZE(self), args);
1113}
1114
1115static PyObject *
1116bytearray_count(PyByteArrayObject *self, PyObject *args)
1117{
1118 return _Py_bytes_count(PyByteArray_AS_STRING(self), PyByteArray_GET_SIZE(self), args);
1119}
1120
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001121/*[clinic input]
1122bytearray.clear
1123
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001124Remove all items from the bytearray.
1125[clinic start generated code]*/
1126
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001127static PyObject *
1128bytearray_clear_impl(PyByteArrayObject *self)
Serhiy Storchaka7a9579c2016-05-02 13:45:20 +03001129/*[clinic end generated code: output=85c2fe6aede0956c input=ed6edae9de447ac4]*/
Eli Bendersky4db28d32011-03-03 18:21:02 +00001130{
1131 if (PyByteArray_Resize((PyObject *)self, 0) < 0)
1132 return NULL;
1133 Py_RETURN_NONE;
1134}
1135
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001136/*[clinic input]
1137bytearray.copy
1138
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001139Return a copy of B.
1140[clinic start generated code]*/
1141
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001142static PyObject *
1143bytearray_copy_impl(PyByteArrayObject *self)
Serhiy Storchaka7a9579c2016-05-02 13:45:20 +03001144/*[clinic end generated code: output=68cfbcfed484c132 input=6597b0c01bccaa9e]*/
Eli Bendersky4db28d32011-03-03 18:21:02 +00001145{
1146 return PyByteArray_FromStringAndSize(PyByteArray_AS_STRING((PyObject *)self),
1147 PyByteArray_GET_SIZE(self));
1148}
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001149
Serhiy Storchakae09132f2016-07-03 13:57:48 +03001150static PyObject *
1151bytearray_index(PyByteArrayObject *self, PyObject *args)
1152{
1153 return _Py_bytes_index(PyByteArray_AS_STRING(self), PyByteArray_GET_SIZE(self), args);
1154}
1155
1156static PyObject *
1157bytearray_rfind(PyByteArrayObject *self, PyObject *args)
1158{
1159 return _Py_bytes_rfind(PyByteArray_AS_STRING(self), PyByteArray_GET_SIZE(self), args);
1160}
1161
1162static PyObject *
1163bytearray_rindex(PyByteArrayObject *self, PyObject *args)
1164{
1165 return _Py_bytes_rindex(PyByteArray_AS_STRING(self), PyByteArray_GET_SIZE(self), args);
1166}
1167
1168static int
1169bytearray_contains(PyObject *self, PyObject *arg)
1170{
1171 return _Py_bytes_contains(PyByteArray_AS_STRING(self), PyByteArray_GET_SIZE(self), arg);
1172}
1173
1174static PyObject *
1175bytearray_startswith(PyByteArrayObject *self, PyObject *args)
1176{
1177 return _Py_bytes_startswith(PyByteArray_AS_STRING(self), PyByteArray_GET_SIZE(self), args);
1178}
1179
1180static PyObject *
1181bytearray_endswith(PyByteArrayObject *self, PyObject *args)
1182{
1183 return _Py_bytes_endswith(PyByteArray_AS_STRING(self), PyByteArray_GET_SIZE(self), args);
1184}
1185
sweeneydea81849b2020-04-22 17:05:48 -04001186/*[clinic input]
1187bytearray.removeprefix as bytearray_removeprefix
1188
1189 prefix: Py_buffer
1190 /
1191
1192Return a bytearray with the given prefix string removed if present.
1193
1194If the bytearray starts with the prefix string, return
1195bytearray[len(prefix):]. Otherwise, return a copy of the original
1196bytearray.
1197[clinic start generated code]*/
1198
1199static PyObject *
1200bytearray_removeprefix_impl(PyByteArrayObject *self, Py_buffer *prefix)
1201/*[clinic end generated code: output=6cabc585e7f502e0 input=968aada38aedd262]*/
1202{
1203 const char *self_start = PyByteArray_AS_STRING(self);
1204 Py_ssize_t self_len = PyByteArray_GET_SIZE(self);
1205 const char *prefix_start = prefix->buf;
1206 Py_ssize_t prefix_len = prefix->len;
1207
1208 if (self_len >= prefix_len
1209 && memcmp(self_start, prefix_start, prefix_len) == 0)
1210 {
1211 return PyByteArray_FromStringAndSize(self_start + prefix_len,
1212 self_len - prefix_len);
1213 }
1214
1215 return PyByteArray_FromStringAndSize(self_start, self_len);
1216}
1217
1218/*[clinic input]
1219bytearray.removesuffix as bytearray_removesuffix
1220
1221 suffix: Py_buffer
1222 /
1223
1224Return a bytearray with the given suffix string removed if present.
1225
1226If the bytearray ends with the suffix string and that suffix is not
1227empty, return bytearray[:-len(suffix)]. Otherwise, return a copy of
1228the original bytearray.
1229[clinic start generated code]*/
1230
1231static PyObject *
1232bytearray_removesuffix_impl(PyByteArrayObject *self, Py_buffer *suffix)
1233/*[clinic end generated code: output=2bc8cfb79de793d3 input=c1827e810b2f6b99]*/
1234{
1235 const char *self_start = PyByteArray_AS_STRING(self);
1236 Py_ssize_t self_len = PyByteArray_GET_SIZE(self);
1237 const char *suffix_start = suffix->buf;
1238 Py_ssize_t suffix_len = suffix->len;
1239
1240 if (self_len >= suffix_len
1241 && memcmp(self_start + self_len - suffix_len,
1242 suffix_start, suffix_len) == 0)
1243 {
1244 return PyByteArray_FromStringAndSize(self_start,
1245 self_len - suffix_len);
1246 }
1247
1248 return PyByteArray_FromStringAndSize(self_start, self_len);
1249}
1250
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001251
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001252/*[clinic input]
1253bytearray.translate
1254
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001255 table: object
1256 Translation table, which must be a bytes object of length 256.
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001257 /
Martin Panter1b6c6da2016-08-27 08:35:02 +00001258 delete as deletechars: object(c_default="NULL") = b''
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001259
1260Return a copy with each character mapped by the given translation table.
1261
Martin Panter1b6c6da2016-08-27 08:35:02 +00001262All characters occurring in the optional argument delete are removed.
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001263The remaining characters are mapped through the given translation table.
1264[clinic start generated code]*/
1265
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001266static PyObject *
Larry Hastings89964c42015-04-14 18:07:59 -04001267bytearray_translate_impl(PyByteArrayObject *self, PyObject *table,
Martin Panter1b6c6da2016-08-27 08:35:02 +00001268 PyObject *deletechars)
1269/*[clinic end generated code: output=b6a8f01c2a74e446 input=cfff956d4d127a9b]*/
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001270{
Antoine Pitrou9ed5f272013-08-13 20:18:52 +02001271 char *input, *output;
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001272 const char *table_chars;
Antoine Pitrou9ed5f272013-08-13 20:18:52 +02001273 Py_ssize_t i, c;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001274 PyObject *input_obj = (PyObject*)self;
1275 const char *output_start;
1276 Py_ssize_t inlen;
Georg Brandlccc47b62008-12-28 11:44:14 +00001277 PyObject *result = NULL;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001278 int trans_table[256];
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001279 Py_buffer vtable, vdel;
1280
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001281 if (table == Py_None) {
1282 table_chars = NULL;
Georg Brandlccc47b62008-12-28 11:44:14 +00001283 table = NULL;
Serhiy Storchaka3dd3e262015-02-03 01:25:42 +02001284 } else if (PyObject_GetBuffer(table, &vtable, PyBUF_SIMPLE) != 0) {
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001285 return NULL;
Georg Brandlccc47b62008-12-28 11:44:14 +00001286 } else {
1287 if (vtable.len != 256) {
1288 PyErr_SetString(PyExc_ValueError,
1289 "translation table must be 256 characters long");
Georg Brandl953152f2009-07-22 12:03:59 +00001290 PyBuffer_Release(&vtable);
1291 return NULL;
Georg Brandlccc47b62008-12-28 11:44:14 +00001292 }
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001293 table_chars = (const char*)vtable.buf;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001294 }
1295
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001296 if (deletechars != NULL) {
Serhiy Storchaka3dd3e262015-02-03 01:25:42 +02001297 if (PyObject_GetBuffer(deletechars, &vdel, PyBUF_SIMPLE) != 0) {
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001298 if (table != NULL)
Georg Brandl953152f2009-07-22 12:03:59 +00001299 PyBuffer_Release(&vtable);
1300 return NULL;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001301 }
1302 }
1303 else {
1304 vdel.buf = NULL;
1305 vdel.len = 0;
1306 }
1307
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001308 inlen = PyByteArray_GET_SIZE(input_obj);
1309 result = PyByteArray_FromStringAndSize((char *)NULL, inlen);
1310 if (result == NULL)
1311 goto done;
Serhiy Storchakadd40fc32016-05-04 22:23:26 +03001312 output_start = output = PyByteArray_AS_STRING(result);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001313 input = PyByteArray_AS_STRING(input_obj);
1314
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001315 if (vdel.len == 0 && table_chars != NULL) {
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001316 /* If no deletions are required, use faster code */
1317 for (i = inlen; --i >= 0; ) {
1318 c = Py_CHARMASK(*input++);
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001319 *output++ = table_chars[c];
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001320 }
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001321 goto done;
1322 }
Georg Brandlccc47b62008-12-28 11:44:14 +00001323
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001324 if (table_chars == NULL) {
Georg Brandlccc47b62008-12-28 11:44:14 +00001325 for (i = 0; i < 256; i++)
1326 trans_table[i] = Py_CHARMASK(i);
1327 } else {
1328 for (i = 0; i < 256; i++)
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001329 trans_table[i] = Py_CHARMASK(table_chars[i]);
Georg Brandlccc47b62008-12-28 11:44:14 +00001330 }
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001331
1332 for (i = 0; i < vdel.len; i++)
1333 trans_table[(int) Py_CHARMASK( ((unsigned char*)vdel.buf)[i] )] = -1;
1334
1335 for (i = inlen; --i >= 0; ) {
1336 c = Py_CHARMASK(*input++);
1337 if (trans_table[c] != -1)
Martin Panter1b6c6da2016-08-27 08:35:02 +00001338 *output++ = (char)trans_table[c];
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001339 }
1340 /* Fix the size of the resulting string */
1341 if (inlen > 0)
Christian Heimesc731bbe2013-07-21 02:04:35 +02001342 if (PyByteArray_Resize(result, output - output_start) < 0) {
1343 Py_CLEAR(result);
1344 goto done;
1345 }
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001346
1347done:
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001348 if (table != NULL)
Georg Brandlccc47b62008-12-28 11:44:14 +00001349 PyBuffer_Release(&vtable);
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001350 if (deletechars != NULL)
Martin v. Löwis423be952008-08-13 15:53:07 +00001351 PyBuffer_Release(&vdel);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001352 return result;
1353}
1354
1355
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001356/*[clinic input]
1357
1358@staticmethod
1359bytearray.maketrans
1360
Serhiy Storchaka3dd3e262015-02-03 01:25:42 +02001361 frm: Py_buffer
1362 to: Py_buffer
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001363 /
1364
1365Return a translation table useable for the bytes or bytearray translate method.
1366
1367The returned table will be one where each byte in frm is mapped to the byte at
1368the same position in to.
1369
1370The bytes objects frm and to must be of the same length.
1371[clinic start generated code]*/
1372
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001373static PyObject *
Serhiy Storchaka3dd3e262015-02-03 01:25:42 +02001374bytearray_maketrans_impl(Py_buffer *frm, Py_buffer *to)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03001375/*[clinic end generated code: output=1df267d99f56b15e input=5925a81d2fbbf151]*/
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001376{
1377 return _Py_bytes_maketrans(frm, to);
Georg Brandlabc38772009-04-12 15:51:51 +00001378}
1379
1380
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001381/*[clinic input]
1382bytearray.replace
1383
Serhiy Storchaka3dd3e262015-02-03 01:25:42 +02001384 old: Py_buffer
1385 new: Py_buffer
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001386 count: Py_ssize_t = -1
1387 Maximum number of occurrences to replace.
1388 -1 (the default value) means replace all occurrences.
1389 /
1390
1391Return a copy with all occurrences of substring old replaced by new.
1392
1393If the optional argument count is given, only the first count occurrences are
1394replaced.
1395[clinic start generated code]*/
1396
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001397static PyObject *
Larry Hastings89964c42015-04-14 18:07:59 -04001398bytearray_replace_impl(PyByteArrayObject *self, Py_buffer *old,
1399 Py_buffer *new, Py_ssize_t count)
1400/*[clinic end generated code: output=d39884c4dc59412a input=aa379d988637c7fb]*/
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001401{
Serhiy Storchakafb81d3c2016-05-05 09:26:07 +03001402 return stringlib_replace((PyObject *)self,
Serhiy Storchakae09132f2016-07-03 13:57:48 +03001403 (const char *)old->buf, old->len,
1404 (const char *)new->buf, new->len, count);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001405}
1406
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001407/*[clinic input]
1408bytearray.split
1409
1410 sep: object = None
1411 The delimiter according which to split the bytearray.
1412 None (the default value) means split on ASCII whitespace characters
1413 (space, tab, return, newline, formfeed, vertical tab).
1414 maxsplit: Py_ssize_t = -1
1415 Maximum number of splits to do.
1416 -1 (the default value) means no limit.
1417
1418Return a list of the sections in the bytearray, using sep as the delimiter.
1419[clinic start generated code]*/
1420
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001421static PyObject *
Larry Hastings89964c42015-04-14 18:07:59 -04001422bytearray_split_impl(PyByteArrayObject *self, PyObject *sep,
1423 Py_ssize_t maxsplit)
1424/*[clinic end generated code: output=833e2cf385d9a04d input=24f82669f41bf523]*/
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001425{
1426 Py_ssize_t len = PyByteArray_GET_SIZE(self), n;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001427 const char *s = PyByteArray_AS_STRING(self), *sub;
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001428 PyObject *list;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001429 Py_buffer vsub;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001430
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001431 if (maxsplit < 0)
1432 maxsplit = PY_SSIZE_T_MAX;
1433
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001434 if (sep == Py_None)
Antoine Pitrouf2c54842010-01-13 08:07:53 +00001435 return stringlib_split_whitespace((PyObject*) self, s, len, maxsplit);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001436
Serhiy Storchaka3dd3e262015-02-03 01:25:42 +02001437 if (PyObject_GetBuffer(sep, &vsub, PyBUF_SIMPLE) != 0)
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001438 return NULL;
1439 sub = vsub.buf;
1440 n = vsub.len;
1441
Antoine Pitrouf2c54842010-01-13 08:07:53 +00001442 list = stringlib_split(
1443 (PyObject*) self, s, len, sub, n, maxsplit
1444 );
Martin v. Löwis423be952008-08-13 15:53:07 +00001445 PyBuffer_Release(&vsub);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001446 return list;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001447}
1448
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001449/*[clinic input]
1450bytearray.partition
1451
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001452 sep: object
1453 /
1454
1455Partition the bytearray into three parts using the given separator.
1456
1457This will search for the separator sep in the bytearray. If the separator is
1458found, returns a 3-tuple containing the part before the separator, the
Serhiy Storchakaa2314282017-10-29 02:11:54 +03001459separator itself, and the part after it as new bytearray objects.
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001460
Serhiy Storchakaa2314282017-10-29 02:11:54 +03001461If the separator is not found, returns a 3-tuple containing the copy of the
1462original bytearray object and two empty bytearray objects.
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001463[clinic start generated code]*/
1464
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001465static PyObject *
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001466bytearray_partition(PyByteArrayObject *self, PyObject *sep)
Serhiy Storchakaa2314282017-10-29 02:11:54 +03001467/*[clinic end generated code: output=45d2525ddd35f957 input=8f644749ee4fc83a]*/
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001468{
1469 PyObject *bytesep, *result;
1470
Serhiy Storchakaa2314282017-10-29 02:11:54 +03001471 bytesep = _PyByteArray_FromBufferObject(sep);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001472 if (! bytesep)
1473 return NULL;
1474
1475 result = stringlib_partition(
1476 (PyObject*) self,
1477 PyByteArray_AS_STRING(self), PyByteArray_GET_SIZE(self),
1478 bytesep,
1479 PyByteArray_AS_STRING(bytesep), PyByteArray_GET_SIZE(bytesep)
1480 );
1481
1482 Py_DECREF(bytesep);
Antoine Pitrouf2c54842010-01-13 08:07:53 +00001483 return result;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001484}
1485
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001486/*[clinic input]
1487bytearray.rpartition
1488
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001489 sep: object
1490 /
1491
Serhiy Storchakaa2314282017-10-29 02:11:54 +03001492Partition the bytearray into three parts using the given separator.
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001493
Serhiy Storchakaa2314282017-10-29 02:11:54 +03001494This will search for the separator sep in the bytearray, starting at the end.
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001495If the separator is found, returns a 3-tuple containing the part before the
Serhiy Storchakaa2314282017-10-29 02:11:54 +03001496separator, the separator itself, and the part after it as new bytearray
1497objects.
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001498
1499If the separator is not found, returns a 3-tuple containing two empty bytearray
Serhiy Storchakaa2314282017-10-29 02:11:54 +03001500objects and the copy of the original bytearray object.
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001501[clinic start generated code]*/
1502
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001503static PyObject *
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001504bytearray_rpartition(PyByteArrayObject *self, PyObject *sep)
Serhiy Storchakaa2314282017-10-29 02:11:54 +03001505/*[clinic end generated code: output=440de3c9426115e8 input=7e3df3e6cb8fa0ac]*/
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001506{
1507 PyObject *bytesep, *result;
1508
Serhiy Storchakaa2314282017-10-29 02:11:54 +03001509 bytesep = _PyByteArray_FromBufferObject(sep);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001510 if (! bytesep)
1511 return NULL;
1512
1513 result = stringlib_rpartition(
1514 (PyObject*) self,
1515 PyByteArray_AS_STRING(self), PyByteArray_GET_SIZE(self),
1516 bytesep,
1517 PyByteArray_AS_STRING(bytesep), PyByteArray_GET_SIZE(bytesep)
1518 );
1519
1520 Py_DECREF(bytesep);
Antoine Pitrouf2c54842010-01-13 08:07:53 +00001521 return result;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001522}
1523
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001524/*[clinic input]
1525bytearray.rsplit = bytearray.split
1526
1527Return a list of the sections in the bytearray, using sep as the delimiter.
1528
1529Splitting is done starting at the end of the bytearray and working to the front.
1530[clinic start generated code]*/
1531
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001532static PyObject *
Larry Hastings89964c42015-04-14 18:07:59 -04001533bytearray_rsplit_impl(PyByteArrayObject *self, PyObject *sep,
1534 Py_ssize_t maxsplit)
1535/*[clinic end generated code: output=a55e0b5a03cb6190 input=a68286e4dd692ffe]*/
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001536{
1537 Py_ssize_t len = PyByteArray_GET_SIZE(self), n;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001538 const char *s = PyByteArray_AS_STRING(self), *sub;
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001539 PyObject *list;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001540 Py_buffer vsub;
1541
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001542 if (maxsplit < 0)
1543 maxsplit = PY_SSIZE_T_MAX;
1544
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001545 if (sep == Py_None)
Antoine Pitrouf2c54842010-01-13 08:07:53 +00001546 return stringlib_rsplit_whitespace((PyObject*) self, s, len, maxsplit);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001547
Serhiy Storchaka3dd3e262015-02-03 01:25:42 +02001548 if (PyObject_GetBuffer(sep, &vsub, PyBUF_SIMPLE) != 0)
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001549 return NULL;
1550 sub = vsub.buf;
1551 n = vsub.len;
1552
Antoine Pitrouf2c54842010-01-13 08:07:53 +00001553 list = stringlib_rsplit(
1554 (PyObject*) self, s, len, sub, n, maxsplit
1555 );
Martin v. Löwis423be952008-08-13 15:53:07 +00001556 PyBuffer_Release(&vsub);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001557 return list;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001558}
1559
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001560/*[clinic input]
1561bytearray.reverse
1562
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001563Reverse the order of the values in B in place.
1564[clinic start generated code]*/
1565
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001566static PyObject *
1567bytearray_reverse_impl(PyByteArrayObject *self)
Serhiy Storchaka7a9579c2016-05-02 13:45:20 +03001568/*[clinic end generated code: output=9f7616f29ab309d3 input=543356319fc78557]*/
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001569{
1570 char swap, *head, *tail;
1571 Py_ssize_t i, j, n = Py_SIZE(self);
1572
1573 j = n / 2;
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +02001574 head = PyByteArray_AS_STRING(self);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001575 tail = head + n - 1;
1576 for (i = 0; i < j; i++) {
1577 swap = *head;
1578 *head++ = *tail;
1579 *tail-- = swap;
1580 }
1581
1582 Py_RETURN_NONE;
1583}
1584
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001585
1586/*[python input]
1587class bytesvalue_converter(CConverter):
1588 type = 'int'
1589 converter = '_getbytevalue'
1590[python start generated code]*/
1591/*[python end generated code: output=da39a3ee5e6b4b0d input=29c2e7c26c212812]*/
1592
1593
1594/*[clinic input]
1595bytearray.insert
1596
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001597 index: Py_ssize_t
1598 The index where the value is to be inserted.
1599 item: bytesvalue
1600 The item to be inserted.
1601 /
1602
1603Insert a single item into the bytearray before the given index.
1604[clinic start generated code]*/
1605
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001606static PyObject *
1607bytearray_insert_impl(PyByteArrayObject *self, Py_ssize_t index, int item)
Serhiy Storchaka7a9579c2016-05-02 13:45:20 +03001608/*[clinic end generated code: output=76c775a70e7b07b7 input=b2b5d07e9de6c070]*/
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001609{
1610 Py_ssize_t n = Py_SIZE(self);
1611 char *buf;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001612
1613 if (n == PY_SSIZE_T_MAX) {
1614 PyErr_SetString(PyExc_OverflowError,
Mark Dickinson2b6705f2009-09-06 10:34:47 +00001615 "cannot add more objects to bytearray");
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001616 return NULL;
1617 }
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001618 if (PyByteArray_Resize((PyObject *)self, n + 1) < 0)
1619 return NULL;
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +02001620 buf = PyByteArray_AS_STRING(self);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001621
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001622 if (index < 0) {
1623 index += n;
1624 if (index < 0)
1625 index = 0;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001626 }
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001627 if (index > n)
1628 index = n;
1629 memmove(buf + index + 1, buf + index, n - index);
1630 buf[index] = item;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001631
1632 Py_RETURN_NONE;
1633}
1634
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001635/*[clinic input]
1636bytearray.append
1637
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001638 item: bytesvalue
1639 The item to be appended.
1640 /
1641
1642Append a single item to the end of the bytearray.
1643[clinic start generated code]*/
1644
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001645static PyObject *
1646bytearray_append_impl(PyByteArrayObject *self, int item)
Serhiy Storchaka7a9579c2016-05-02 13:45:20 +03001647/*[clinic end generated code: output=a154e19ed1886cb6 input=20d6bec3d1340593]*/
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001648{
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001649 Py_ssize_t n = Py_SIZE(self);
1650
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001651 if (n == PY_SSIZE_T_MAX) {
1652 PyErr_SetString(PyExc_OverflowError,
Mark Dickinson2b6705f2009-09-06 10:34:47 +00001653 "cannot add more objects to bytearray");
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001654 return NULL;
1655 }
1656 if (PyByteArray_Resize((PyObject *)self, n + 1) < 0)
1657 return NULL;
1658
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001659 PyByteArray_AS_STRING(self)[n] = item;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001660
1661 Py_RETURN_NONE;
1662}
1663
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001664/*[clinic input]
1665bytearray.extend
1666
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001667 iterable_of_ints: object
1668 The iterable of items to append.
1669 /
1670
1671Append all the items from the iterator or sequence to the end of the bytearray.
1672[clinic start generated code]*/
1673
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001674static PyObject *
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001675bytearray_extend(PyByteArrayObject *self, PyObject *iterable_of_ints)
Serhiy Storchaka7a9579c2016-05-02 13:45:20 +03001676/*[clinic end generated code: output=98155dbe249170b1 input=c617b3a93249ba28]*/
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001677{
Benjamin Peterson153c70f2009-04-18 15:42:12 +00001678 PyObject *it, *item, *bytearray_obj;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001679 Py_ssize_t buf_size = 0, len = 0;
1680 int value;
1681 char *buf;
1682
Benjamin Peterson153c70f2009-04-18 15:42:12 +00001683 /* bytearray_setslice code only accepts something supporting PEP 3118. */
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001684 if (PyObject_CheckBuffer(iterable_of_ints)) {
1685 if (bytearray_setslice(self, Py_SIZE(self), Py_SIZE(self), iterable_of_ints) == -1)
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001686 return NULL;
1687
1688 Py_RETURN_NONE;
1689 }
1690
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001691 it = PyObject_GetIter(iterable_of_ints);
Serhiy Storchaka2c2044e2018-10-21 15:29:12 +03001692 if (it == NULL) {
1693 if (PyErr_ExceptionMatches(PyExc_TypeError)) {
1694 PyErr_Format(PyExc_TypeError,
1695 "can't extend bytearray with %.100s",
Victor Stinner58ac7002020-02-07 03:04:21 +01001696 Py_TYPE(iterable_of_ints)->tp_name);
Serhiy Storchaka2c2044e2018-10-21 15:29:12 +03001697 }
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001698 return NULL;
Serhiy Storchaka2c2044e2018-10-21 15:29:12 +03001699 }
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001700
Ezio Melotti42da6632011-03-15 05:18:48 +02001701 /* Try to determine the length of the argument. 32 is arbitrary. */
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001702 buf_size = PyObject_LengthHint(iterable_of_ints, 32);
Benjamin Petersonef3e4c22009-04-11 19:48:14 +00001703 if (buf_size == -1) {
1704 Py_DECREF(it);
1705 return NULL;
1706 }
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001707
Benjamin Peterson153c70f2009-04-18 15:42:12 +00001708 bytearray_obj = PyByteArray_FromStringAndSize(NULL, buf_size);
Antoine Pitrou58bb82e2012-04-01 16:05:46 +02001709 if (bytearray_obj == NULL) {
1710 Py_DECREF(it);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001711 return NULL;
Antoine Pitrou58bb82e2012-04-01 16:05:46 +02001712 }
Benjamin Peterson153c70f2009-04-18 15:42:12 +00001713 buf = PyByteArray_AS_STRING(bytearray_obj);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001714
1715 while ((item = PyIter_Next(it)) != NULL) {
1716 if (! _getbytevalue(item, &value)) {
1717 Py_DECREF(item);
1718 Py_DECREF(it);
Benjamin Peterson153c70f2009-04-18 15:42:12 +00001719 Py_DECREF(bytearray_obj);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001720 return NULL;
1721 }
1722 buf[len++] = value;
1723 Py_DECREF(item);
1724
1725 if (len >= buf_size) {
Martin Panter371731e2016-07-18 07:53:13 +00001726 Py_ssize_t addition;
1727 if (len == PY_SSIZE_T_MAX) {
1728 Py_DECREF(it);
1729 Py_DECREF(bytearray_obj);
1730 return PyErr_NoMemory();
1731 }
1732 addition = len >> 1;
1733 if (addition > PY_SSIZE_T_MAX - len - 1)
1734 buf_size = PY_SSIZE_T_MAX;
1735 else
1736 buf_size = len + addition + 1;
Benjamin Peterson153c70f2009-04-18 15:42:12 +00001737 if (PyByteArray_Resize((PyObject *)bytearray_obj, buf_size) < 0) {
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001738 Py_DECREF(it);
Benjamin Peterson153c70f2009-04-18 15:42:12 +00001739 Py_DECREF(bytearray_obj);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001740 return NULL;
1741 }
1742 /* Recompute the `buf' pointer, since the resizing operation may
1743 have invalidated it. */
Benjamin Peterson153c70f2009-04-18 15:42:12 +00001744 buf = PyByteArray_AS_STRING(bytearray_obj);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001745 }
1746 }
1747 Py_DECREF(it);
1748
1749 /* Resize down to exact size. */
Benjamin Peterson153c70f2009-04-18 15:42:12 +00001750 if (PyByteArray_Resize((PyObject *)bytearray_obj, len) < 0) {
1751 Py_DECREF(bytearray_obj);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001752 return NULL;
1753 }
1754
Antoine Pitrou58bb82e2012-04-01 16:05:46 +02001755 if (bytearray_setslice(self, Py_SIZE(self), Py_SIZE(self), bytearray_obj) == -1) {
1756 Py_DECREF(bytearray_obj);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001757 return NULL;
Antoine Pitrou58bb82e2012-04-01 16:05:46 +02001758 }
Benjamin Peterson153c70f2009-04-18 15:42:12 +00001759 Py_DECREF(bytearray_obj);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001760
Brandt Bucher2a7d5962019-06-26 12:06:18 -07001761 if (PyErr_Occurred()) {
1762 return NULL;
1763 }
1764
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001765 Py_RETURN_NONE;
1766}
1767
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001768/*[clinic input]
1769bytearray.pop
1770
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001771 index: Py_ssize_t = -1
1772 The index from where to remove the item.
1773 -1 (the default value) means remove the last item.
1774 /
1775
1776Remove and return a single item from B.
1777
1778If no index argument is given, will pop the last item.
1779[clinic start generated code]*/
1780
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001781static PyObject *
1782bytearray_pop_impl(PyByteArrayObject *self, Py_ssize_t index)
Serhiy Storchaka7a9579c2016-05-02 13:45:20 +03001783/*[clinic end generated code: output=e0ccd401f8021da8 input=3591df2d06c0d237]*/
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001784{
1785 int value;
1786 Py_ssize_t n = Py_SIZE(self);
1787 char *buf;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001788
1789 if (n == 0) {
Eli Bendersky1bc4f192011-03-04 04:55:25 +00001790 PyErr_SetString(PyExc_IndexError,
1791 "pop from empty bytearray");
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001792 return NULL;
1793 }
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001794 if (index < 0)
1795 index += Py_SIZE(self);
1796 if (index < 0 || index >= Py_SIZE(self)) {
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001797 PyErr_SetString(PyExc_IndexError, "pop index out of range");
1798 return NULL;
1799 }
Antoine Pitrou5504e892008-12-06 21:27:53 +00001800 if (!_canresize(self))
1801 return NULL;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001802
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +02001803 buf = PyByteArray_AS_STRING(self);
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001804 value = buf[index];
1805 memmove(buf + index, buf + index + 1, n - index);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001806 if (PyByteArray_Resize((PyObject *)self, n - 1) < 0)
1807 return NULL;
1808
Mark Dickinson54a3db92009-09-06 10:19:23 +00001809 return PyLong_FromLong((unsigned char)value);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001810}
1811
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001812/*[clinic input]
1813bytearray.remove
1814
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001815 value: bytesvalue
1816 The value to remove.
1817 /
1818
1819Remove the first occurrence of a value in the bytearray.
1820[clinic start generated code]*/
1821
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001822static PyObject *
1823bytearray_remove_impl(PyByteArrayObject *self, int value)
Serhiy Storchaka7a9579c2016-05-02 13:45:20 +03001824/*[clinic end generated code: output=d659e37866709c13 input=121831240cd51ddf]*/
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001825{
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001826 Py_ssize_t where, n = Py_SIZE(self);
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +02001827 char *buf = PyByteArray_AS_STRING(self);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001828
Serhiy Storchaka4b234942016-05-16 22:24:03 +03001829 where = stringlib_find_char(buf, n, value);
1830 if (where < 0) {
Mark Dickinson2b6705f2009-09-06 10:34:47 +00001831 PyErr_SetString(PyExc_ValueError, "value not found in bytearray");
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001832 return NULL;
1833 }
Antoine Pitrou5504e892008-12-06 21:27:53 +00001834 if (!_canresize(self))
1835 return NULL;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001836
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +02001837 memmove(buf + where, buf + where + 1, n - where);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001838 if (PyByteArray_Resize((PyObject *)self, n - 1) < 0)
1839 return NULL;
1840
1841 Py_RETURN_NONE;
1842}
1843
1844/* XXX These two helpers could be optimized if argsize == 1 */
1845
1846static Py_ssize_t
Serhiy Storchakaef1585e2015-12-25 20:01:53 +02001847lstrip_helper(const char *myptr, Py_ssize_t mysize,
1848 const void *argptr, Py_ssize_t argsize)
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001849{
1850 Py_ssize_t i = 0;
Antoine Pitrou5b720752013-10-05 21:24:10 +02001851 while (i < mysize && memchr(argptr, (unsigned char) myptr[i], argsize))
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001852 i++;
1853 return i;
1854}
1855
1856static Py_ssize_t
Serhiy Storchakaef1585e2015-12-25 20:01:53 +02001857rstrip_helper(const char *myptr, Py_ssize_t mysize,
1858 const void *argptr, Py_ssize_t argsize)
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001859{
1860 Py_ssize_t i = mysize - 1;
Antoine Pitrou5b720752013-10-05 21:24:10 +02001861 while (i >= 0 && memchr(argptr, (unsigned char) myptr[i], argsize))
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001862 i--;
1863 return i + 1;
1864}
1865
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001866/*[clinic input]
1867bytearray.strip
1868
1869 bytes: object = None
1870 /
1871
1872Strip leading and trailing bytes contained in the argument.
1873
1874If the argument is omitted or None, strip leading and trailing ASCII whitespace.
1875[clinic start generated code]*/
1876
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001877static PyObject *
1878bytearray_strip_impl(PyByteArrayObject *self, PyObject *bytes)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03001879/*[clinic end generated code: output=760412661a34ad5a input=ef7bb59b09c21d62]*/
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001880{
1881 Py_ssize_t left, right, mysize, byteslen;
Serhiy Storchakae2f92de2017-11-11 13:06:26 +02001882 char *myptr;
1883 const char *bytesptr;
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001884 Py_buffer vbytes;
1885
1886 if (bytes == Py_None) {
1887 bytesptr = "\t\n\r\f\v ";
1888 byteslen = 6;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001889 }
1890 else {
Serhiy Storchaka3dd3e262015-02-03 01:25:42 +02001891 if (PyObject_GetBuffer(bytes, &vbytes, PyBUF_SIMPLE) != 0)
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001892 return NULL;
Serhiy Storchakae2f92de2017-11-11 13:06:26 +02001893 bytesptr = (const char *) vbytes.buf;
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001894 byteslen = vbytes.len;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001895 }
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +02001896 myptr = PyByteArray_AS_STRING(self);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001897 mysize = Py_SIZE(self);
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001898 left = lstrip_helper(myptr, mysize, bytesptr, byteslen);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001899 if (left == mysize)
1900 right = left;
1901 else
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001902 right = rstrip_helper(myptr, mysize, bytesptr, byteslen);
1903 if (bytes != Py_None)
1904 PyBuffer_Release(&vbytes);
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +02001905 return PyByteArray_FromStringAndSize(myptr + left, right - left);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001906}
1907
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001908/*[clinic input]
1909bytearray.lstrip
1910
1911 bytes: object = None
1912 /
1913
1914Strip leading bytes contained in the argument.
1915
1916If the argument is omitted or None, strip leading ASCII whitespace.
1917[clinic start generated code]*/
1918
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001919static PyObject *
1920bytearray_lstrip_impl(PyByteArrayObject *self, PyObject *bytes)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03001921/*[clinic end generated code: output=d005c9d0ab909e66 input=80843f975dd7c480]*/
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001922{
1923 Py_ssize_t left, right, mysize, byteslen;
Serhiy Storchakae2f92de2017-11-11 13:06:26 +02001924 char *myptr;
1925 const char *bytesptr;
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001926 Py_buffer vbytes;
1927
1928 if (bytes == Py_None) {
1929 bytesptr = "\t\n\r\f\v ";
1930 byteslen = 6;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001931 }
1932 else {
Serhiy Storchaka3dd3e262015-02-03 01:25:42 +02001933 if (PyObject_GetBuffer(bytes, &vbytes, PyBUF_SIMPLE) != 0)
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001934 return NULL;
Serhiy Storchakae2f92de2017-11-11 13:06:26 +02001935 bytesptr = (const char *) vbytes.buf;
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001936 byteslen = vbytes.len;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001937 }
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +02001938 myptr = PyByteArray_AS_STRING(self);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001939 mysize = Py_SIZE(self);
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001940 left = lstrip_helper(myptr, mysize, bytesptr, byteslen);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001941 right = mysize;
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001942 if (bytes != Py_None)
1943 PyBuffer_Release(&vbytes);
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +02001944 return PyByteArray_FromStringAndSize(myptr + left, right - left);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001945}
1946
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001947/*[clinic input]
1948bytearray.rstrip
1949
1950 bytes: object = None
1951 /
1952
1953Strip trailing bytes contained in the argument.
1954
1955If the argument is omitted or None, strip trailing ASCII whitespace.
1956[clinic start generated code]*/
1957
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001958static PyObject *
1959bytearray_rstrip_impl(PyByteArrayObject *self, PyObject *bytes)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03001960/*[clinic end generated code: output=030e2fbd2f7276bd input=e728b994954cfd91]*/
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001961{
1962 Py_ssize_t right, mysize, byteslen;
Serhiy Storchakae2f92de2017-11-11 13:06:26 +02001963 char *myptr;
1964 const char *bytesptr;
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001965 Py_buffer vbytes;
1966
1967 if (bytes == Py_None) {
1968 bytesptr = "\t\n\r\f\v ";
1969 byteslen = 6;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001970 }
1971 else {
Serhiy Storchaka3dd3e262015-02-03 01:25:42 +02001972 if (PyObject_GetBuffer(bytes, &vbytes, PyBUF_SIMPLE) != 0)
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001973 return NULL;
Serhiy Storchakae2f92de2017-11-11 13:06:26 +02001974 bytesptr = (const char *) vbytes.buf;
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001975 byteslen = vbytes.len;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001976 }
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +02001977 myptr = PyByteArray_AS_STRING(self);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001978 mysize = Py_SIZE(self);
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001979 right = rstrip_helper(myptr, mysize, bytesptr, byteslen);
1980 if (bytes != Py_None)
1981 PyBuffer_Release(&vbytes);
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +02001982 return PyByteArray_FromStringAndSize(myptr, right);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001983}
1984
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001985/*[clinic input]
1986bytearray.decode
1987
1988 encoding: str(c_default="NULL") = 'utf-8'
1989 The encoding with which to decode the bytearray.
1990 errors: str(c_default="NULL") = 'strict'
1991 The error handling scheme to use for the handling of decoding errors.
1992 The default is 'strict' meaning that decoding errors raise a
1993 UnicodeDecodeError. Other possible values are 'ignore' and 'replace'
1994 as well as any other name registered with codecs.register_error that
1995 can handle UnicodeDecodeErrors.
1996
1997Decode the bytearray using the codec registered for encoding.
1998[clinic start generated code]*/
1999
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002000static PyObject *
Larry Hastings89964c42015-04-14 18:07:59 -04002001bytearray_decode_impl(PyByteArrayObject *self, const char *encoding,
2002 const char *errors)
2003/*[clinic end generated code: output=f57d43f4a00b42c5 input=f28d8f903020257b]*/
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002004{
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002005 if (encoding == NULL)
2006 encoding = PyUnicode_GetDefaultEncoding();
Martin v. Löwis0efea322014-07-27 17:29:17 +02002007 return PyUnicode_FromEncodedObject((PyObject*)self, encoding, errors);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002008}
2009
2010PyDoc_STRVAR(alloc_doc,
2011"B.__alloc__() -> int\n\
2012\n\
Georg Brandl17cb8a82008-05-30 08:20:09 +00002013Return the number of bytes actually allocated.");
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002014
2015static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05302016bytearray_alloc(PyByteArrayObject *self, PyObject *Py_UNUSED(ignored))
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002017{
2018 return PyLong_FromSsize_t(self->ob_alloc);
2019}
2020
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002021/*[clinic input]
2022bytearray.join
2023
2024 iterable_of_bytes: object
2025 /
2026
2027Concatenate any number of bytes/bytearray objects.
2028
2029The bytearray whose method is called is inserted in between each pair.
2030
2031The result is returned as a new bytearray object.
2032[clinic start generated code]*/
2033
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002034static PyObject *
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002035bytearray_join(PyByteArrayObject *self, PyObject *iterable_of_bytes)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03002036/*[clinic end generated code: output=a8516370bf68ae08 input=aba6b1f9b30fcb8e]*/
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002037{
Martin v. Löwis0efea322014-07-27 17:29:17 +02002038 return stringlib_bytes_join((PyObject*)self, iterable_of_bytes);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002039}
2040
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002041/*[clinic input]
2042bytearray.splitlines
Antoine Pitrouf2c54842010-01-13 08:07:53 +00002043
Serhiy Storchaka202fda52017-03-12 10:10:47 +02002044 keepends: bool(accept={int}) = False
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002045
2046Return a list of the lines in the bytearray, breaking at line boundaries.
2047
2048Line breaks are not included in the resulting list unless keepends is given and
2049true.
2050[clinic start generated code]*/
2051
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002052static PyObject *
2053bytearray_splitlines_impl(PyByteArrayObject *self, int keepends)
Serhiy Storchaka202fda52017-03-12 10:10:47 +02002054/*[clinic end generated code: output=4223c94b895f6ad9 input=99a27ad959b9cf6b]*/
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002055{
Antoine Pitrouf2c54842010-01-13 08:07:53 +00002056 return stringlib_splitlines(
2057 (PyObject*) self, PyByteArray_AS_STRING(self),
2058 PyByteArray_GET_SIZE(self), keepends
2059 );
2060}
2061
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002062/*[clinic input]
2063@classmethod
2064bytearray.fromhex
2065
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002066 string: unicode
2067 /
2068
2069Create a bytearray object from a string of hexadecimal numbers.
2070
2071Spaces between two numbers are accepted.
2072Example: bytearray.fromhex('B9 01EF') -> bytearray(b'\\xb9\\x01\\xef')
2073[clinic start generated code]*/
2074
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002075static PyObject *
Serhiy Storchaka0855e702016-07-01 17:22:31 +03002076bytearray_fromhex_impl(PyTypeObject *type, PyObject *string)
2077/*[clinic end generated code: output=8f0f0b6d30fb3ba0 input=f033a16d1fb21f48]*/
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002078{
Serhiy Storchaka0855e702016-07-01 17:22:31 +03002079 PyObject *result = _PyBytes_FromHex(string, type == &PyByteArray_Type);
2080 if (type != &PyByteArray_Type && result != NULL) {
Petr Viktorinffd97532020-02-11 17:46:57 +01002081 Py_SETREF(result, PyObject_CallOneArg((PyObject *)type, result));
Serhiy Storchaka0855e702016-07-01 17:22:31 +03002082 }
2083 return result;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002084}
2085
Gregory P. Smith0c2f9302019-05-29 11:46:58 -07002086/*[clinic input]
2087bytearray.hex
2088
2089 sep: object = NULL
2090 An optional single character or byte to separate hex bytes.
2091 bytes_per_sep: int = 1
2092 How many bytes between separators. Positive values count from the
2093 right, negative values count from the left.
2094
2095Create a str of hexadecimal numbers from a bytearray object.
2096
2097Example:
2098>>> value = bytearray([0xb9, 0x01, 0xef])
2099>>> value.hex()
2100'b901ef'
2101>>> value.hex(':')
2102'b9:01:ef'
2103>>> value.hex(':', 2)
2104'b9:01ef'
2105>>> value.hex(':', -2)
2106'b901:ef'
2107[clinic start generated code]*/
Gregory P. Smith8cb65692015-04-25 23:22:26 +00002108
2109static PyObject *
Gregory P. Smith0c2f9302019-05-29 11:46:58 -07002110bytearray_hex_impl(PyByteArrayObject *self, PyObject *sep, int bytes_per_sep)
2111/*[clinic end generated code: output=29c4e5ef72c565a0 input=814c15830ac8c4b5]*/
Serhiy Storchakae09132f2016-07-03 13:57:48 +03002112{
2113 char* argbuf = PyByteArray_AS_STRING(self);
2114 Py_ssize_t arglen = PyByteArray_GET_SIZE(self);
Gregory P. Smith0c2f9302019-05-29 11:46:58 -07002115 return _Py_strhex_with_sep(argbuf, arglen, sep, bytes_per_sep);
Serhiy Storchakae09132f2016-07-03 13:57:48 +03002116}
2117
2118static PyObject *
Antoine Pitroub0e1f8b2011-12-05 20:40:08 +01002119_common_reduce(PyByteArrayObject *self, int proto)
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002120{
Antoine Pitroub0e1f8b2011-12-05 20:40:08 +01002121 PyObject *dict;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02002122 _Py_IDENTIFIER(__dict__);
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +02002123 char *buf;
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02002124
Serhiy Storchaka41c57b32019-09-01 12:03:39 +03002125 if (_PyObject_LookupAttrId((PyObject *)self, &PyId___dict__, &dict) < 0) {
2126 return NULL;
2127 }
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002128 if (dict == NULL) {
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002129 dict = Py_None;
2130 Py_INCREF(dict);
2131 }
2132
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +02002133 buf = PyByteArray_AS_STRING(self);
Antoine Pitroub0e1f8b2011-12-05 20:40:08 +01002134 if (proto < 3) {
2135 /* use str based reduction for backwards compatibility with Python 2.x */
2136 PyObject *latin1;
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +02002137 if (Py_SIZE(self))
2138 latin1 = PyUnicode_DecodeLatin1(buf, Py_SIZE(self), NULL);
Antoine Pitroub0e1f8b2011-12-05 20:40:08 +01002139 else
2140 latin1 = PyUnicode_FromString("");
2141 return Py_BuildValue("(O(Ns)N)", Py_TYPE(self), latin1, "latin-1", dict);
2142 }
2143 else {
2144 /* use more efficient byte based reduction */
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +02002145 if (Py_SIZE(self)) {
2146 return Py_BuildValue("(O(y#)N)", Py_TYPE(self), buf, Py_SIZE(self), dict);
Antoine Pitroub0e1f8b2011-12-05 20:40:08 +01002147 }
2148 else {
2149 return Py_BuildValue("(O()N)", Py_TYPE(self), dict);
2150 }
2151 }
2152}
2153
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002154/*[clinic input]
2155bytearray.__reduce__ as bytearray_reduce
2156
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002157Return state information for pickling.
2158[clinic start generated code]*/
2159
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002160static PyObject *
2161bytearray_reduce_impl(PyByteArrayObject *self)
Serhiy Storchaka7a9579c2016-05-02 13:45:20 +03002162/*[clinic end generated code: output=52bf304086464cab input=44b5737ada62dd3f]*/
Antoine Pitroub0e1f8b2011-12-05 20:40:08 +01002163{
2164 return _common_reduce(self, 2);
2165}
2166
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002167/*[clinic input]
2168bytearray.__reduce_ex__ as bytearray_reduce_ex
2169
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002170 proto: int = 0
2171 /
2172
2173Return state information for pickling.
2174[clinic start generated code]*/
2175
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002176static PyObject *
2177bytearray_reduce_ex_impl(PyByteArrayObject *self, int proto)
Serhiy Storchaka7a9579c2016-05-02 13:45:20 +03002178/*[clinic end generated code: output=52eac33377197520 input=f129bc1a1aa151ee]*/
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002179{
Antoine Pitroub0e1f8b2011-12-05 20:40:08 +01002180 return _common_reduce(self, proto);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002181}
2182
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002183/*[clinic input]
2184bytearray.__sizeof__ as bytearray_sizeof
2185
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002186Returns the size of the bytearray object in memory, in bytes.
2187[clinic start generated code]*/
2188
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002189static PyObject *
2190bytearray_sizeof_impl(PyByteArrayObject *self)
Serhiy Storchaka7a9579c2016-05-02 13:45:20 +03002191/*[clinic end generated code: output=738abdd17951c427 input=e27320fd98a4bc5a]*/
Robert Schuppeniesfbe94c52008-07-14 10:13:31 +00002192{
Benjamin Petersonef3e4c22009-04-11 19:48:14 +00002193 Py_ssize_t res;
Robert Schuppeniesfbe94c52008-07-14 10:13:31 +00002194
Serhiy Storchaka5c4064e2015-12-19 20:05:25 +02002195 res = _PyObject_SIZE(Py_TYPE(self)) + self->ob_alloc * sizeof(char);
Benjamin Petersonef3e4c22009-04-11 19:48:14 +00002196 return PyLong_FromSsize_t(res);
Robert Schuppeniesfbe94c52008-07-14 10:13:31 +00002197}
2198
Benjamin Peterson153c70f2009-04-18 15:42:12 +00002199static PySequenceMethods bytearray_as_sequence = {
2200 (lenfunc)bytearray_length, /* sq_length */
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002201 (binaryfunc)PyByteArray_Concat, /* sq_concat */
Benjamin Peterson153c70f2009-04-18 15:42:12 +00002202 (ssizeargfunc)bytearray_repeat, /* sq_repeat */
2203 (ssizeargfunc)bytearray_getitem, /* sq_item */
2204 0, /* sq_slice */
2205 (ssizeobjargproc)bytearray_setitem, /* sq_ass_item */
2206 0, /* sq_ass_slice */
Serhiy Storchakae09132f2016-07-03 13:57:48 +03002207 (objobjproc)bytearray_contains, /* sq_contains */
Benjamin Peterson153c70f2009-04-18 15:42:12 +00002208 (binaryfunc)bytearray_iconcat, /* sq_inplace_concat */
2209 (ssizeargfunc)bytearray_irepeat, /* sq_inplace_repeat */
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002210};
2211
Benjamin Peterson153c70f2009-04-18 15:42:12 +00002212static PyMappingMethods bytearray_as_mapping = {
2213 (lenfunc)bytearray_length,
2214 (binaryfunc)bytearray_subscript,
2215 (objobjargproc)bytearray_ass_subscript,
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002216};
2217
Benjamin Peterson153c70f2009-04-18 15:42:12 +00002218static PyBufferProcs bytearray_as_buffer = {
2219 (getbufferproc)bytearray_getbuffer,
2220 (releasebufferproc)bytearray_releasebuffer,
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002221};
2222
2223static PyMethodDef
Benjamin Peterson153c70f2009-04-18 15:42:12 +00002224bytearray_methods[] = {
2225 {"__alloc__", (PyCFunction)bytearray_alloc, METH_NOARGS, alloc_doc},
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002226 BYTEARRAY_REDUCE_METHODDEF
2227 BYTEARRAY_REDUCE_EX_METHODDEF
2228 BYTEARRAY_SIZEOF_METHODDEF
2229 BYTEARRAY_APPEND_METHODDEF
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05302230 {"capitalize", stringlib_capitalize, METH_NOARGS,
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002231 _Py_capitalize__doc__},
Tal Einatc929df32018-07-06 13:17:38 +03002232 STRINGLIB_CENTER_METHODDEF
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002233 BYTEARRAY_CLEAR_METHODDEF
2234 BYTEARRAY_COPY_METHODDEF
Serhiy Storchakae09132f2016-07-03 13:57:48 +03002235 {"count", (PyCFunction)bytearray_count, METH_VARARGS,
Serhiy Storchakadd40fc32016-05-04 22:23:26 +03002236 _Py_count__doc__},
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002237 BYTEARRAY_DECODE_METHODDEF
Serhiy Storchakae09132f2016-07-03 13:57:48 +03002238 {"endswith", (PyCFunction)bytearray_endswith, METH_VARARGS,
Serhiy Storchakadd40fc32016-05-04 22:23:26 +03002239 _Py_endswith__doc__},
Tal Einatc929df32018-07-06 13:17:38 +03002240 STRINGLIB_EXPANDTABS_METHODDEF
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002241 BYTEARRAY_EXTEND_METHODDEF
Serhiy Storchakae09132f2016-07-03 13:57:48 +03002242 {"find", (PyCFunction)bytearray_find, METH_VARARGS,
Serhiy Storchakadd40fc32016-05-04 22:23:26 +03002243 _Py_find__doc__},
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002244 BYTEARRAY_FROMHEX_METHODDEF
Gregory P. Smith0c2f9302019-05-29 11:46:58 -07002245 BYTEARRAY_HEX_METHODDEF
Serhiy Storchakae09132f2016-07-03 13:57:48 +03002246 {"index", (PyCFunction)bytearray_index, METH_VARARGS, _Py_index__doc__},
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002247 BYTEARRAY_INSERT_METHODDEF
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05302248 {"isalnum", stringlib_isalnum, METH_NOARGS,
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002249 _Py_isalnum__doc__},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05302250 {"isalpha", stringlib_isalpha, METH_NOARGS,
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002251 _Py_isalpha__doc__},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05302252 {"isascii", stringlib_isascii, METH_NOARGS,
INADA Naokia49ac992018-01-27 14:06:21 +09002253 _Py_isascii__doc__},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05302254 {"isdigit", stringlib_isdigit, METH_NOARGS,
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002255 _Py_isdigit__doc__},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05302256 {"islower", stringlib_islower, METH_NOARGS,
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002257 _Py_islower__doc__},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05302258 {"isspace", stringlib_isspace, METH_NOARGS,
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002259 _Py_isspace__doc__},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05302260 {"istitle", stringlib_istitle, METH_NOARGS,
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002261 _Py_istitle__doc__},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05302262 {"isupper", stringlib_isupper, METH_NOARGS,
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002263 _Py_isupper__doc__},
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002264 BYTEARRAY_JOIN_METHODDEF
Tal Einatc929df32018-07-06 13:17:38 +03002265 STRINGLIB_LJUST_METHODDEF
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05302266 {"lower", stringlib_lower, METH_NOARGS, _Py_lower__doc__},
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002267 BYTEARRAY_LSTRIP_METHODDEF
2268 BYTEARRAY_MAKETRANS_METHODDEF
2269 BYTEARRAY_PARTITION_METHODDEF
2270 BYTEARRAY_POP_METHODDEF
2271 BYTEARRAY_REMOVE_METHODDEF
2272 BYTEARRAY_REPLACE_METHODDEF
sweeneydea81849b2020-04-22 17:05:48 -04002273 BYTEARRAY_REMOVEPREFIX_METHODDEF
2274 BYTEARRAY_REMOVESUFFIX_METHODDEF
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002275 BYTEARRAY_REVERSE_METHODDEF
Serhiy Storchakae09132f2016-07-03 13:57:48 +03002276 {"rfind", (PyCFunction)bytearray_rfind, METH_VARARGS, _Py_rfind__doc__},
2277 {"rindex", (PyCFunction)bytearray_rindex, METH_VARARGS, _Py_rindex__doc__},
Tal Einatc929df32018-07-06 13:17:38 +03002278 STRINGLIB_RJUST_METHODDEF
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002279 BYTEARRAY_RPARTITION_METHODDEF
2280 BYTEARRAY_RSPLIT_METHODDEF
2281 BYTEARRAY_RSTRIP_METHODDEF
2282 BYTEARRAY_SPLIT_METHODDEF
2283 BYTEARRAY_SPLITLINES_METHODDEF
Serhiy Storchakae09132f2016-07-03 13:57:48 +03002284 {"startswith", (PyCFunction)bytearray_startswith, METH_VARARGS ,
Serhiy Storchakadd40fc32016-05-04 22:23:26 +03002285 _Py_startswith__doc__},
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002286 BYTEARRAY_STRIP_METHODDEF
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05302287 {"swapcase", stringlib_swapcase, METH_NOARGS,
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002288 _Py_swapcase__doc__},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05302289 {"title", stringlib_title, METH_NOARGS, _Py_title__doc__},
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002290 BYTEARRAY_TRANSLATE_METHODDEF
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05302291 {"upper", stringlib_upper, METH_NOARGS, _Py_upper__doc__},
Tal Einatc929df32018-07-06 13:17:38 +03002292 STRINGLIB_ZFILL_METHODDEF
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002293 {NULL}
2294};
2295
Ethan Furmanb95b5612015-01-23 20:05:18 -08002296static PyObject *
2297bytearray_mod(PyObject *v, PyObject *w)
2298{
2299 if (!PyByteArray_Check(v))
2300 Py_RETURN_NOTIMPLEMENTED;
Berker Peksag43de36d2016-04-16 01:20:47 +03002301 return _PyBytes_FormatEx(PyByteArray_AS_STRING(v), PyByteArray_GET_SIZE(v), w, 1);
Ethan Furmanb95b5612015-01-23 20:05:18 -08002302}
2303
2304static PyNumberMethods bytearray_as_number = {
2305 0, /*nb_add*/
2306 0, /*nb_subtract*/
2307 0, /*nb_multiply*/
2308 bytearray_mod, /*nb_remainder*/
2309};
2310
Benjamin Peterson153c70f2009-04-18 15:42:12 +00002311PyDoc_STRVAR(bytearray_doc,
Georg Brandl17cb8a82008-05-30 08:20:09 +00002312"bytearray(iterable_of_ints) -> bytearray\n\
2313bytearray(string, encoding[, errors]) -> bytearray\n\
Victor Stinnerbb2e9c42011-12-17 23:18:07 +01002314bytearray(bytes_or_buffer) -> mutable copy of bytes_or_buffer\n\
2315bytearray(int) -> bytes array of size given by the parameter initialized with null bytes\n\
2316bytearray() -> empty bytes array\n\
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002317\n\
Serhiy Storchaka6a7b3a72016-04-17 08:32:47 +03002318Construct a mutable bytearray object from:\n\
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002319 - an iterable yielding integers in range(256)\n\
2320 - a text string encoded using the specified encoding\n\
Victor Stinnerbb2e9c42011-12-17 23:18:07 +01002321 - a bytes or a buffer object\n\
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002322 - any object implementing the buffer API.\n\
Victor Stinnerbb2e9c42011-12-17 23:18:07 +01002323 - an integer");
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002324
2325
Benjamin Peterson153c70f2009-04-18 15:42:12 +00002326static PyObject *bytearray_iter(PyObject *seq);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002327
2328PyTypeObject PyByteArray_Type = {
2329 PyVarObject_HEAD_INIT(&PyType_Type, 0)
2330 "bytearray",
2331 sizeof(PyByteArrayObject),
2332 0,
Benjamin Peterson153c70f2009-04-18 15:42:12 +00002333 (destructor)bytearray_dealloc, /* tp_dealloc */
Jeroen Demeyer530f5062019-05-31 04:13:39 +02002334 0, /* tp_vectorcall_offset */
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002335 0, /* tp_getattr */
2336 0, /* tp_setattr */
Jeroen Demeyer530f5062019-05-31 04:13:39 +02002337 0, /* tp_as_async */
Benjamin Peterson153c70f2009-04-18 15:42:12 +00002338 (reprfunc)bytearray_repr, /* tp_repr */
Ethan Furmanb95b5612015-01-23 20:05:18 -08002339 &bytearray_as_number, /* tp_as_number */
Benjamin Peterson153c70f2009-04-18 15:42:12 +00002340 &bytearray_as_sequence, /* tp_as_sequence */
2341 &bytearray_as_mapping, /* tp_as_mapping */
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002342 0, /* tp_hash */
2343 0, /* tp_call */
Benjamin Peterson153c70f2009-04-18 15:42:12 +00002344 bytearray_str, /* tp_str */
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002345 PyObject_GenericGetAttr, /* tp_getattro */
2346 0, /* tp_setattro */
Benjamin Peterson153c70f2009-04-18 15:42:12 +00002347 &bytearray_as_buffer, /* tp_as_buffer */
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002348 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
Benjamin Peterson153c70f2009-04-18 15:42:12 +00002349 bytearray_doc, /* tp_doc */
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002350 0, /* tp_traverse */
2351 0, /* tp_clear */
Benjamin Peterson153c70f2009-04-18 15:42:12 +00002352 (richcmpfunc)bytearray_richcompare, /* tp_richcompare */
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002353 0, /* tp_weaklistoffset */
Benjamin Peterson153c70f2009-04-18 15:42:12 +00002354 bytearray_iter, /* tp_iter */
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002355 0, /* tp_iternext */
Benjamin Peterson153c70f2009-04-18 15:42:12 +00002356 bytearray_methods, /* tp_methods */
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002357 0, /* tp_members */
2358 0, /* tp_getset */
2359 0, /* tp_base */
2360 0, /* tp_dict */
2361 0, /* tp_descr_get */
2362 0, /* tp_descr_set */
2363 0, /* tp_dictoffset */
Benjamin Peterson153c70f2009-04-18 15:42:12 +00002364 (initproc)bytearray_init, /* tp_init */
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002365 PyType_GenericAlloc, /* tp_alloc */
2366 PyType_GenericNew, /* tp_new */
2367 PyObject_Del, /* tp_free */
2368};
2369
2370/*********************** Bytes Iterator ****************************/
2371
2372typedef struct {
2373 PyObject_HEAD
2374 Py_ssize_t it_index;
2375 PyByteArrayObject *it_seq; /* Set to NULL when iterator is exhausted */
2376} bytesiterobject;
2377
2378static void
Benjamin Peterson153c70f2009-04-18 15:42:12 +00002379bytearrayiter_dealloc(bytesiterobject *it)
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002380{
2381 _PyObject_GC_UNTRACK(it);
2382 Py_XDECREF(it->it_seq);
2383 PyObject_GC_Del(it);
2384}
2385
2386static int
Benjamin Peterson153c70f2009-04-18 15:42:12 +00002387bytearrayiter_traverse(bytesiterobject *it, visitproc visit, void *arg)
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002388{
2389 Py_VISIT(it->it_seq);
2390 return 0;
2391}
2392
2393static PyObject *
Benjamin Peterson153c70f2009-04-18 15:42:12 +00002394bytearrayiter_next(bytesiterobject *it)
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002395{
2396 PyByteArrayObject *seq;
2397 PyObject *item;
2398
2399 assert(it != NULL);
2400 seq = it->it_seq;
2401 if (seq == NULL)
2402 return NULL;
2403 assert(PyByteArray_Check(seq));
2404
2405 if (it->it_index < PyByteArray_GET_SIZE(seq)) {
2406 item = PyLong_FromLong(
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +02002407 (unsigned char)PyByteArray_AS_STRING(seq)[it->it_index]);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002408 if (item != NULL)
2409 ++it->it_index;
2410 return item;
2411 }
2412
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002413 it->it_seq = NULL;
Serhiy Storchakafbb1c5e2016-03-30 20:40:02 +03002414 Py_DECREF(seq);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002415 return NULL;
2416}
2417
2418static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05302419bytearrayiter_length_hint(bytesiterobject *it, PyObject *Py_UNUSED(ignored))
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002420{
2421 Py_ssize_t len = 0;
Serhiy Storchakaaf658722016-07-03 14:41:36 +03002422 if (it->it_seq) {
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002423 len = PyByteArray_GET_SIZE(it->it_seq) - it->it_index;
Serhiy Storchakaaf658722016-07-03 14:41:36 +03002424 if (len < 0) {
2425 len = 0;
2426 }
2427 }
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002428 return PyLong_FromSsize_t(len);
2429}
2430
2431PyDoc_STRVAR(length_hint_doc,
2432 "Private method returning an estimate of len(list(it)).");
2433
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00002434static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05302435bytearrayiter_reduce(bytesiterobject *it, PyObject *Py_UNUSED(ignored))
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00002436{
Serhiy Storchakabb86bf42018-12-11 08:28:18 +02002437 _Py_IDENTIFIER(iter);
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00002438 if (it->it_seq != NULL) {
Serhiy Storchakabb86bf42018-12-11 08:28:18 +02002439 return Py_BuildValue("N(O)n", _PyEval_GetBuiltinId(&PyId_iter),
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00002440 it->it_seq, it->it_index);
2441 } else {
Serhiy Storchakabb86bf42018-12-11 08:28:18 +02002442 return Py_BuildValue("N(())", _PyEval_GetBuiltinId(&PyId_iter));
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00002443 }
2444}
2445
2446static PyObject *
2447bytearrayiter_setstate(bytesiterobject *it, PyObject *state)
2448{
2449 Py_ssize_t index = PyLong_AsSsize_t(state);
2450 if (index == -1 && PyErr_Occurred())
2451 return NULL;
Kristján Valur Jónsson25dded02014-03-05 13:47:57 +00002452 if (it->it_seq != NULL) {
2453 if (index < 0)
2454 index = 0;
2455 else if (index > PyByteArray_GET_SIZE(it->it_seq))
2456 index = PyByteArray_GET_SIZE(it->it_seq); /* iterator exhausted */
2457 it->it_index = index;
2458 }
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00002459 Py_RETURN_NONE;
2460}
2461
2462PyDoc_STRVAR(setstate_doc, "Set state information for unpickling.");
2463
Benjamin Peterson153c70f2009-04-18 15:42:12 +00002464static PyMethodDef bytearrayiter_methods[] = {
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00002465 {"__length_hint__", (PyCFunction)bytearrayiter_length_hint, METH_NOARGS,
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002466 length_hint_doc},
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00002467 {"__reduce__", (PyCFunction)bytearrayiter_reduce, METH_NOARGS,
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002468 bytearray_reduce__doc__},
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00002469 {"__setstate__", (PyCFunction)bytearrayiter_setstate, METH_O,
2470 setstate_doc},
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002471 {NULL, NULL} /* sentinel */
2472};
2473
2474PyTypeObject PyByteArrayIter_Type = {
2475 PyVarObject_HEAD_INIT(&PyType_Type, 0)
2476 "bytearray_iterator", /* tp_name */
2477 sizeof(bytesiterobject), /* tp_basicsize */
2478 0, /* tp_itemsize */
2479 /* methods */
Benjamin Peterson153c70f2009-04-18 15:42:12 +00002480 (destructor)bytearrayiter_dealloc, /* tp_dealloc */
Jeroen Demeyer530f5062019-05-31 04:13:39 +02002481 0, /* tp_vectorcall_offset */
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002482 0, /* tp_getattr */
2483 0, /* tp_setattr */
Jeroen Demeyer530f5062019-05-31 04:13:39 +02002484 0, /* tp_as_async */
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002485 0, /* tp_repr */
2486 0, /* tp_as_number */
2487 0, /* tp_as_sequence */
2488 0, /* tp_as_mapping */
2489 0, /* tp_hash */
2490 0, /* tp_call */
2491 0, /* tp_str */
2492 PyObject_GenericGetAttr, /* tp_getattro */
2493 0, /* tp_setattro */
2494 0, /* tp_as_buffer */
2495 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC, /* tp_flags */
2496 0, /* tp_doc */
Benjamin Peterson153c70f2009-04-18 15:42:12 +00002497 (traverseproc)bytearrayiter_traverse, /* tp_traverse */
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002498 0, /* tp_clear */
2499 0, /* tp_richcompare */
2500 0, /* tp_weaklistoffset */
2501 PyObject_SelfIter, /* tp_iter */
Benjamin Peterson153c70f2009-04-18 15:42:12 +00002502 (iternextfunc)bytearrayiter_next, /* tp_iternext */
2503 bytearrayiter_methods, /* tp_methods */
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002504 0,
2505};
2506
2507static PyObject *
Benjamin Peterson153c70f2009-04-18 15:42:12 +00002508bytearray_iter(PyObject *seq)
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002509{
2510 bytesiterobject *it;
2511
2512 if (!PyByteArray_Check(seq)) {
2513 PyErr_BadInternalCall();
2514 return NULL;
2515 }
2516 it = PyObject_GC_New(bytesiterobject, &PyByteArrayIter_Type);
2517 if (it == NULL)
2518 return NULL;
2519 it->it_index = 0;
2520 Py_INCREF(seq);
2521 it->it_seq = (PyByteArrayObject *)seq;
2522 _PyObject_GC_TRACK(it);
2523 return (PyObject *)it;
2524}