blob: 4e2bb603151b92f2715ef148414a5763994be802 [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"
Eric Snow2ebc5ce2017-09-07 23:51:28 -06005#include "internal/mem.h"
6#include "internal/pystate.h"
Christian Heimes2c9c7a52008-05-26 13:42:13 +00007#include "structmember.h"
8#include "bytes_methods.h"
Ethan Furmanb95b5612015-01-23 20:05:18 -08009#include "bytesobject.h"
Gregory P. Smith8cb65692015-04-25 23:22:26 +000010#include "pystrhex.h"
Christian Heimes2c9c7a52008-05-26 13:42:13 +000011
Martin v. Löwis7252a6e2014-07-27 16:25:09 +020012/*[clinic input]
13class bytearray "PyByteArrayObject *" "&PyByteArray_Type"
14[clinic start generated code]*/
15/*[clinic end generated code: output=da39a3ee5e6b4b0d input=5535b77c37a119e0]*/
16
Antoine Pitroufc8d6f42010-01-17 12:38:54 +000017char _PyByteArray_empty_string[] = "";
Christian Heimes2c9c7a52008-05-26 13:42:13 +000018
19void
20PyByteArray_Fini(void)
21{
Christian Heimes2c9c7a52008-05-26 13:42:13 +000022}
23
24int
25PyByteArray_Init(void)
26{
Christian Heimes2c9c7a52008-05-26 13:42:13 +000027 return 1;
28}
29
30/* end nullbytes support */
31
32/* Helpers */
33
34static int
35_getbytevalue(PyObject* arg, int *value)
36{
37 long face_value;
38
39 if (PyLong_Check(arg)) {
40 face_value = PyLong_AsLong(arg);
Georg Brandl9a54d7c2008-07-16 23:15:30 +000041 } else {
42 PyObject *index = PyNumber_Index(arg);
43 if (index == NULL) {
44 PyErr_Format(PyExc_TypeError, "an integer is required");
Mark Dickinson10de93a2010-07-09 19:25:48 +000045 *value = -1;
Christian Heimes2c9c7a52008-05-26 13:42:13 +000046 return 0;
47 }
Georg Brandl9a54d7c2008-07-16 23:15:30 +000048 face_value = PyLong_AsLong(index);
49 Py_DECREF(index);
50 }
51
52 if (face_value < 0 || face_value >= 256) {
53 /* this includes the OverflowError in case the long is too large */
54 PyErr_SetString(PyExc_ValueError, "byte must be in range(0, 256)");
Mark Dickinson10de93a2010-07-09 19:25:48 +000055 *value = -1;
Christian Heimes2c9c7a52008-05-26 13:42:13 +000056 return 0;
57 }
58
59 *value = face_value;
60 return 1;
61}
62
63static int
Benjamin Peterson153c70f2009-04-18 15:42:12 +000064bytearray_getbuffer(PyByteArrayObject *obj, Py_buffer *view, int flags)
Christian Heimes2c9c7a52008-05-26 13:42:13 +000065{
Christian Heimes2c9c7a52008-05-26 13:42:13 +000066 void *ptr;
67 if (view == NULL) {
Stefan Krah5178d912015-02-03 16:57:21 +010068 PyErr_SetString(PyExc_BufferError,
69 "bytearray_getbuffer: view==NULL argument is obsolete");
70 return -1;
Christian Heimes2c9c7a52008-05-26 13:42:13 +000071 }
Antoine Pitroufc8d6f42010-01-17 12:38:54 +000072 ptr = (void *) PyByteArray_AS_STRING(obj);
Stefan Krah5178d912015-02-03 16:57:21 +010073 /* cannot fail if view != NULL and readonly == 0 */
74 (void)PyBuffer_FillInfo(view, (PyObject*)obj, ptr, Py_SIZE(obj), 0, flags);
75 obj->ob_exports++;
76 return 0;
Christian Heimes2c9c7a52008-05-26 13:42:13 +000077}
78
79static void
Benjamin Peterson153c70f2009-04-18 15:42:12 +000080bytearray_releasebuffer(PyByteArrayObject *obj, Py_buffer *view)
Christian Heimes2c9c7a52008-05-26 13:42:13 +000081{
82 obj->ob_exports--;
83}
84
Antoine Pitrou5504e892008-12-06 21:27:53 +000085static int
86_canresize(PyByteArrayObject *self)
87{
88 if (self->ob_exports > 0) {
89 PyErr_SetString(PyExc_BufferError,
90 "Existing exports of data: object cannot be re-sized");
91 return 0;
92 }
93 return 1;
94}
95
Serhiy Storchaka1009bf12015-04-03 23:53:51 +030096#include "clinic/bytearrayobject.c.h"
97
Christian Heimes2c9c7a52008-05-26 13:42:13 +000098/* Direct API functions */
99
100PyObject *
101PyByteArray_FromObject(PyObject *input)
102{
Victor Stinnerde4ae3d2016-12-04 22:59:09 +0100103 return PyObject_CallFunctionObjArgs((PyObject *)&PyByteArray_Type,
104 input, NULL);
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000105}
106
Serhiy Storchakaa2314282017-10-29 02:11:54 +0300107static PyObject *
108_PyByteArray_FromBufferObject(PyObject *obj)
109{
110 PyObject *result;
111 Py_buffer view;
112
113 if (PyObject_GetBuffer(obj, &view, PyBUF_FULL_RO) < 0) {
114 return NULL;
115 }
116 result = PyByteArray_FromStringAndSize(NULL, view.len);
117 if (result != NULL &&
118 PyBuffer_ToContiguous(PyByteArray_AS_STRING(result),
119 &view, view.len, 'C') < 0)
120 {
121 Py_CLEAR(result);
122 }
123 PyBuffer_Release(&view);
124 return result;
125}
126
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000127PyObject *
128PyByteArray_FromStringAndSize(const char *bytes, Py_ssize_t size)
129{
130 PyByteArrayObject *new;
131 Py_ssize_t alloc;
132
133 if (size < 0) {
134 PyErr_SetString(PyExc_SystemError,
135 "Negative size passed to PyByteArray_FromStringAndSize");
136 return NULL;
137 }
138
Neal Norwitz3ce5d922008-08-24 07:08:55 +0000139 /* Prevent buffer overflow when setting alloc to size+1. */
140 if (size == PY_SSIZE_T_MAX) {
141 return PyErr_NoMemory();
142 }
143
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000144 new = PyObject_New(PyByteArrayObject, &PyByteArray_Type);
145 if (new == NULL)
146 return NULL;
147
148 if (size == 0) {
149 new->ob_bytes = NULL;
150 alloc = 0;
151 }
152 else {
153 alloc = size + 1;
Antoine Pitrou39aba4f2011-11-12 21:15:28 +0100154 new->ob_bytes = PyObject_Malloc(alloc);
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000155 if (new->ob_bytes == NULL) {
156 Py_DECREF(new);
157 return PyErr_NoMemory();
158 }
Antoine Pitroufc8d6f42010-01-17 12:38:54 +0000159 if (bytes != NULL && size > 0)
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000160 memcpy(new->ob_bytes, bytes, size);
161 new->ob_bytes[size] = '\0'; /* Trailing null byte */
162 }
163 Py_SIZE(new) = size;
164 new->ob_alloc = alloc;
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200165 new->ob_start = new->ob_bytes;
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000166 new->ob_exports = 0;
167
168 return (PyObject *)new;
169}
170
171Py_ssize_t
172PyByteArray_Size(PyObject *self)
173{
174 assert(self != NULL);
175 assert(PyByteArray_Check(self));
176
177 return PyByteArray_GET_SIZE(self);
178}
179
180char *
181PyByteArray_AsString(PyObject *self)
182{
183 assert(self != NULL);
184 assert(PyByteArray_Check(self));
185
186 return PyByteArray_AS_STRING(self);
187}
188
189int
Antoine Pitroucc231542014-11-02 18:40:09 +0100190PyByteArray_Resize(PyObject *self, Py_ssize_t requested_size)
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000191{
192 void *sval;
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200193 PyByteArrayObject *obj = ((PyByteArrayObject *)self);
Antoine Pitroucc231542014-11-02 18:40:09 +0100194 /* All computations are done unsigned to avoid integer overflows
195 (see issue #22335). */
196 size_t alloc = (size_t) obj->ob_alloc;
197 size_t logical_offset = (size_t) (obj->ob_start - obj->ob_bytes);
198 size_t size = (size_t) requested_size;
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000199
200 assert(self != NULL);
201 assert(PyByteArray_Check(self));
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200202 assert(logical_offset <= alloc);
Antoine Pitroucc231542014-11-02 18:40:09 +0100203 assert(requested_size >= 0);
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000204
Antoine Pitroucc231542014-11-02 18:40:09 +0100205 if (requested_size == Py_SIZE(self)) {
Antoine Pitrou5504e892008-12-06 21:27:53 +0000206 return 0;
207 }
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200208 if (!_canresize(obj)) {
Antoine Pitrou5504e892008-12-06 21:27:53 +0000209 return -1;
210 }
211
Antoine Pitrou25454112015-05-19 20:52:27 +0200212 if (size + logical_offset + 1 <= alloc) {
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200213 /* Current buffer is large enough to host the requested size,
214 decide on a strategy. */
215 if (size < alloc / 2) {
216 /* Major downsize; resize down to exact size */
217 alloc = size + 1;
218 }
219 else {
220 /* Minor downsize; quick exit */
221 Py_SIZE(self) = size;
222 PyByteArray_AS_STRING(self)[size] = '\0'; /* Trailing null */
223 return 0;
224 }
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000225 }
226 else {
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200227 /* Need growing, decide on a strategy */
228 if (size <= alloc * 1.125) {
229 /* Moderate upsize; overallocate similar to list_resize() */
230 alloc = size + (size >> 3) + (size < 9 ? 3 : 6);
231 }
232 else {
233 /* Major upsize; resize up to exact size */
234 alloc = size + 1;
235 }
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000236 }
Antoine Pitroucc231542014-11-02 18:40:09 +0100237 if (alloc > PY_SSIZE_T_MAX) {
238 PyErr_NoMemory();
239 return -1;
240 }
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000241
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200242 if (logical_offset > 0) {
243 sval = PyObject_Malloc(alloc);
244 if (sval == NULL) {
245 PyErr_NoMemory();
246 return -1;
247 }
Antoine Pitroucc231542014-11-02 18:40:09 +0100248 memcpy(sval, PyByteArray_AS_STRING(self),
Stefan Krahdce65022017-08-25 20:12:05 +0200249 Py_MIN((size_t)requested_size, (size_t)Py_SIZE(self)));
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200250 PyObject_Free(obj->ob_bytes);
251 }
252 else {
253 sval = PyObject_Realloc(obj->ob_bytes, alloc);
254 if (sval == NULL) {
255 PyErr_NoMemory();
256 return -1;
257 }
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000258 }
259
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200260 obj->ob_bytes = obj->ob_start = sval;
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000261 Py_SIZE(self) = size;
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200262 obj->ob_alloc = alloc;
263 obj->ob_bytes[size] = '\0'; /* Trailing null byte */
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000264
265 return 0;
266}
267
268PyObject *
269PyByteArray_Concat(PyObject *a, PyObject *b)
270{
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000271 Py_buffer va, vb;
272 PyByteArrayObject *result = NULL;
273
274 va.len = -1;
275 vb.len = -1;
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +0200276 if (PyObject_GetBuffer(a, &va, PyBUF_SIMPLE) != 0 ||
277 PyObject_GetBuffer(b, &vb, PyBUF_SIMPLE) != 0) {
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000278 PyErr_Format(PyExc_TypeError, "can't concat %.100s to %.100s",
Serhiy Storchaka6b5a9ec2017-03-19 19:47:02 +0200279 Py_TYPE(b)->tp_name, Py_TYPE(a)->tp_name);
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000280 goto done;
281 }
282
Serhiy Storchaka06cfb0c2016-07-10 20:48:43 +0300283 if (va.len > PY_SSIZE_T_MAX - vb.len) {
284 PyErr_NoMemory();
285 goto done;
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000286 }
287
Serhiy Storchaka06cfb0c2016-07-10 20:48:43 +0300288 result = (PyByteArrayObject *) \
289 PyByteArray_FromStringAndSize(NULL, va.len + vb.len);
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000290 if (result != NULL) {
291 memcpy(result->ob_bytes, va.buf, va.len);
292 memcpy(result->ob_bytes + va.len, vb.buf, vb.len);
293 }
294
295 done:
296 if (va.len != -1)
Martin v. Löwis423be952008-08-13 15:53:07 +0000297 PyBuffer_Release(&va);
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000298 if (vb.len != -1)
Martin v. Löwis423be952008-08-13 15:53:07 +0000299 PyBuffer_Release(&vb);
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000300 return (PyObject *)result;
301}
302
303/* Functions stuffed into the type object */
304
305static Py_ssize_t
Benjamin Peterson153c70f2009-04-18 15:42:12 +0000306bytearray_length(PyByteArrayObject *self)
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000307{
308 return Py_SIZE(self);
309}
310
311static PyObject *
Benjamin Peterson153c70f2009-04-18 15:42:12 +0000312bytearray_iconcat(PyByteArrayObject *self, PyObject *other)
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000313{
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000314 Py_ssize_t size;
315 Py_buffer vo;
316
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +0200317 if (PyObject_GetBuffer(other, &vo, PyBUF_SIMPLE) != 0) {
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000318 PyErr_Format(PyExc_TypeError, "can't concat %.100s to %.100s",
319 Py_TYPE(other)->tp_name, Py_TYPE(self)->tp_name);
320 return NULL;
321 }
322
Serhiy Storchaka06cfb0c2016-07-10 20:48:43 +0300323 size = Py_SIZE(self);
324 if (size > PY_SSIZE_T_MAX - vo.len) {
Martin v. Löwis423be952008-08-13 15:53:07 +0000325 PyBuffer_Release(&vo);
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000326 return PyErr_NoMemory();
327 }
Serhiy Storchaka06cfb0c2016-07-10 20:48:43 +0300328 if (PyByteArray_Resize((PyObject *)self, size + vo.len) < 0) {
Martin v. Löwis423be952008-08-13 15:53:07 +0000329 PyBuffer_Release(&vo);
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000330 return NULL;
331 }
Serhiy Storchaka06cfb0c2016-07-10 20:48:43 +0300332 memcpy(PyByteArray_AS_STRING(self) + size, vo.buf, vo.len);
Martin v. Löwis423be952008-08-13 15:53:07 +0000333 PyBuffer_Release(&vo);
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000334 Py_INCREF(self);
335 return (PyObject *)self;
336}
337
338static PyObject *
Benjamin Peterson153c70f2009-04-18 15:42:12 +0000339bytearray_repeat(PyByteArrayObject *self, Py_ssize_t count)
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000340{
341 PyByteArrayObject *result;
342 Py_ssize_t mysize;
343 Py_ssize_t size;
344
345 if (count < 0)
346 count = 0;
347 mysize = Py_SIZE(self);
Mark Dickinsoncf940c72010-08-10 18:35:01 +0000348 if (count > 0 && mysize > PY_SSIZE_T_MAX / count)
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000349 return PyErr_NoMemory();
Mark Dickinsoncf940c72010-08-10 18:35:01 +0000350 size = mysize * count;
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000351 result = (PyByteArrayObject *)PyByteArray_FromStringAndSize(NULL, size);
352 if (result != NULL && size != 0) {
353 if (mysize == 1)
354 memset(result->ob_bytes, self->ob_bytes[0], size);
355 else {
356 Py_ssize_t i;
357 for (i = 0; i < count; i++)
358 memcpy(result->ob_bytes + i*mysize, self->ob_bytes, mysize);
359 }
360 }
361 return (PyObject *)result;
362}
363
364static PyObject *
Benjamin Peterson153c70f2009-04-18 15:42:12 +0000365bytearray_irepeat(PyByteArrayObject *self, Py_ssize_t count)
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000366{
367 Py_ssize_t mysize;
368 Py_ssize_t size;
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200369 char *buf;
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000370
371 if (count < 0)
372 count = 0;
373 mysize = Py_SIZE(self);
Mark Dickinsoncf940c72010-08-10 18:35:01 +0000374 if (count > 0 && mysize > PY_SSIZE_T_MAX / count)
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000375 return PyErr_NoMemory();
Mark Dickinsoncf940c72010-08-10 18:35:01 +0000376 size = mysize * count;
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200377 if (PyByteArray_Resize((PyObject *)self, size) < 0)
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000378 return NULL;
379
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200380 buf = PyByteArray_AS_STRING(self);
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000381 if (mysize == 1)
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200382 memset(buf, buf[0], size);
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000383 else {
384 Py_ssize_t i;
385 for (i = 1; i < count; i++)
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200386 memcpy(buf + i*mysize, buf, mysize);
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000387 }
388
389 Py_INCREF(self);
390 return (PyObject *)self;
391}
392
393static PyObject *
Benjamin Peterson153c70f2009-04-18 15:42:12 +0000394bytearray_getitem(PyByteArrayObject *self, Py_ssize_t i)
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000395{
396 if (i < 0)
397 i += Py_SIZE(self);
398 if (i < 0 || i >= Py_SIZE(self)) {
399 PyErr_SetString(PyExc_IndexError, "bytearray index out of range");
400 return NULL;
401 }
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200402 return PyLong_FromLong((unsigned char)(PyByteArray_AS_STRING(self)[i]));
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000403}
404
405static PyObject *
Benjamin Peterson153c70f2009-04-18 15:42:12 +0000406bytearray_subscript(PyByteArrayObject *self, PyObject *index)
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000407{
Georg Brandl9a54d7c2008-07-16 23:15:30 +0000408 if (PyIndex_Check(index)) {
409 Py_ssize_t i = PyNumber_AsSsize_t(index, PyExc_IndexError);
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000410
411 if (i == -1 && PyErr_Occurred())
412 return NULL;
413
414 if (i < 0)
415 i += PyByteArray_GET_SIZE(self);
416
417 if (i < 0 || i >= Py_SIZE(self)) {
418 PyErr_SetString(PyExc_IndexError, "bytearray index out of range");
419 return NULL;
420 }
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200421 return PyLong_FromLong((unsigned char)(PyByteArray_AS_STRING(self)[i]));
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000422 }
Georg Brandl9a54d7c2008-07-16 23:15:30 +0000423 else if (PySlice_Check(index)) {
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000424 Py_ssize_t start, stop, step, slicelength, cur, i;
Serhiy Storchakab879fe82017-04-08 09:53:51 +0300425 if (PySlice_Unpack(index, &start, &stop, &step) < 0) {
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000426 return NULL;
427 }
Serhiy Storchakab879fe82017-04-08 09:53:51 +0300428 slicelength = PySlice_AdjustIndices(PyByteArray_GET_SIZE(self),
429 &start, &stop, step);
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000430
431 if (slicelength <= 0)
432 return PyByteArray_FromStringAndSize("", 0);
433 else if (step == 1) {
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200434 return PyByteArray_FromStringAndSize(
435 PyByteArray_AS_STRING(self) + start, slicelength);
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000436 }
437 else {
438 char *source_buf = PyByteArray_AS_STRING(self);
Alexandre Vassalottie2641f42009-04-03 06:38:02 +0000439 char *result_buf;
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000440 PyObject *result;
441
Alexandre Vassalottie2641f42009-04-03 06:38:02 +0000442 result = PyByteArray_FromStringAndSize(NULL, slicelength);
443 if (result == NULL)
444 return NULL;
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000445
Alexandre Vassalottie2641f42009-04-03 06:38:02 +0000446 result_buf = PyByteArray_AS_STRING(result);
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000447 for (cur = start, i = 0; i < slicelength;
448 cur += step, i++) {
449 result_buf[i] = source_buf[cur];
450 }
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000451 return result;
452 }
453 }
454 else {
Terry Jan Reedyffff1442014-08-02 01:30:37 -0400455 PyErr_Format(PyExc_TypeError,
456 "bytearray indices must be integers or slices, not %.200s",
457 Py_TYPE(index)->tp_name);
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000458 return NULL;
459 }
460}
461
462static int
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200463bytearray_setslice_linear(PyByteArrayObject *self,
464 Py_ssize_t lo, Py_ssize_t hi,
465 char *bytes, Py_ssize_t bytes_len)
466{
467 Py_ssize_t avail = hi - lo;
468 char *buf = PyByteArray_AS_STRING(self);
469 Py_ssize_t growth = bytes_len - avail;
Victor Stinner84557232013-11-21 12:29:51 +0100470 int res = 0;
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200471 assert(avail >= 0);
472
Victor Stinner84557232013-11-21 12:29:51 +0100473 if (growth < 0) {
474 if (!_canresize(self))
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200475 return -1;
Victor Stinner84557232013-11-21 12:29:51 +0100476
477 if (lo == 0) {
478 /* Shrink the buffer by advancing its logical start */
479 self->ob_start -= growth;
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200480 /*
Victor Stinner84557232013-11-21 12:29:51 +0100481 0 lo hi old_size
482 | |<----avail----->|<-----tail------>|
483 | |<-bytes_len->|<-----tail------>|
484 0 new_lo new_hi new_size
485 */
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200486 }
Victor Stinner84557232013-11-21 12:29:51 +0100487 else {
488 /*
489 0 lo hi old_size
490 | |<----avail----->|<-----tomove------>|
491 | |<-bytes_len->|<-----tomove------>|
492 0 lo new_hi new_size
493 */
494 memmove(buf + lo + bytes_len, buf + hi,
495 Py_SIZE(self) - hi);
496 }
497 if (PyByteArray_Resize((PyObject *)self,
498 Py_SIZE(self) + growth) < 0) {
499 /* Issue #19578: Handling the memory allocation failure here is
500 tricky here because the bytearray object has already been
501 modified. Depending on growth and lo, the behaviour is
502 different.
503
504 If growth < 0 and lo != 0, the operation is completed, but a
505 MemoryError is still raised and the memory block is not
Raymond Hettinger15f44ab2016-08-30 10:47:49 -0700506 shrunk. Otherwise, the bytearray is restored in its previous
Victor Stinner84557232013-11-21 12:29:51 +0100507 state and a MemoryError is raised. */
508 if (lo == 0) {
509 self->ob_start += growth;
510 return -1;
511 }
512 /* memmove() removed bytes, the bytearray object cannot be
513 restored in its previous state. */
514 Py_SIZE(self) += growth;
515 res = -1;
516 }
517 buf = PyByteArray_AS_STRING(self);
518 }
519 else if (growth > 0) {
520 if (Py_SIZE(self) > (Py_ssize_t)PY_SSIZE_T_MAX - growth) {
521 PyErr_NoMemory();
522 return -1;
523 }
524
525 if (PyByteArray_Resize((PyObject *)self,
526 Py_SIZE(self) + growth) < 0) {
527 return -1;
528 }
529 buf = PyByteArray_AS_STRING(self);
530 /* Make the place for the additional bytes */
531 /*
532 0 lo hi old_size
533 | |<-avail->|<-----tomove------>|
534 | |<---bytes_len-->|<-----tomove------>|
535 0 lo new_hi new_size
536 */
537 memmove(buf + lo + bytes_len, buf + hi,
538 Py_SIZE(self) - lo - bytes_len);
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200539 }
540
541 if (bytes_len > 0)
542 memcpy(buf + lo, bytes, bytes_len);
Victor Stinner84557232013-11-21 12:29:51 +0100543 return res;
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200544}
545
546static int
Benjamin Peterson153c70f2009-04-18 15:42:12 +0000547bytearray_setslice(PyByteArrayObject *self, Py_ssize_t lo, Py_ssize_t hi,
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000548 PyObject *values)
549{
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200550 Py_ssize_t needed;
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000551 void *bytes;
552 Py_buffer vbytes;
553 int res = 0;
554
555 vbytes.len = -1;
556 if (values == (PyObject *)self) {
557 /* Make a copy and call this function recursively */
558 int err;
Serhiy Storchakaa2314282017-10-29 02:11:54 +0300559 values = PyByteArray_FromStringAndSize(PyByteArray_AS_STRING(values),
560 PyByteArray_GET_SIZE(values));
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000561 if (values == NULL)
562 return -1;
Benjamin Peterson153c70f2009-04-18 15:42:12 +0000563 err = bytearray_setslice(self, lo, hi, values);
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000564 Py_DECREF(values);
565 return err;
566 }
567 if (values == NULL) {
568 /* del b[lo:hi] */
569 bytes = NULL;
570 needed = 0;
571 }
572 else {
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +0200573 if (PyObject_GetBuffer(values, &vbytes, PyBUF_SIMPLE) != 0) {
574 PyErr_Format(PyExc_TypeError,
575 "can't set bytearray slice from %.100s",
576 Py_TYPE(values)->tp_name);
577 return -1;
578 }
579 needed = vbytes.len;
580 bytes = vbytes.buf;
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000581 }
582
583 if (lo < 0)
584 lo = 0;
585 if (hi < lo)
586 hi = lo;
587 if (hi > Py_SIZE(self))
588 hi = Py_SIZE(self);
589
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200590 res = bytearray_setslice_linear(self, lo, hi, bytes, needed);
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000591 if (vbytes.len != -1)
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200592 PyBuffer_Release(&vbytes);
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000593 return res;
594}
595
596static int
Benjamin Peterson153c70f2009-04-18 15:42:12 +0000597bytearray_setitem(PyByteArrayObject *self, Py_ssize_t i, PyObject *value)
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000598{
Georg Brandl9a54d7c2008-07-16 23:15:30 +0000599 int ival;
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000600
601 if (i < 0)
602 i += Py_SIZE(self);
603
604 if (i < 0 || i >= Py_SIZE(self)) {
605 PyErr_SetString(PyExc_IndexError, "bytearray index out of range");
606 return -1;
607 }
608
609 if (value == NULL)
Benjamin Peterson153c70f2009-04-18 15:42:12 +0000610 return bytearray_setslice(self, i, i+1, NULL);
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000611
Georg Brandl9a54d7c2008-07-16 23:15:30 +0000612 if (!_getbytevalue(value, &ival))
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000613 return -1;
614
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200615 PyByteArray_AS_STRING(self)[i] = ival;
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000616 return 0;
617}
618
619static int
Benjamin Peterson153c70f2009-04-18 15:42:12 +0000620bytearray_ass_subscript(PyByteArrayObject *self, PyObject *index, PyObject *values)
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000621{
622 Py_ssize_t start, stop, step, slicelen, needed;
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200623 char *buf, *bytes;
624 buf = PyByteArray_AS_STRING(self);
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000625
Georg Brandl9a54d7c2008-07-16 23:15:30 +0000626 if (PyIndex_Check(index)) {
627 Py_ssize_t i = PyNumber_AsSsize_t(index, PyExc_IndexError);
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000628
629 if (i == -1 && PyErr_Occurred())
630 return -1;
631
632 if (i < 0)
633 i += PyByteArray_GET_SIZE(self);
634
635 if (i < 0 || i >= Py_SIZE(self)) {
636 PyErr_SetString(PyExc_IndexError, "bytearray index out of range");
637 return -1;
638 }
639
640 if (values == NULL) {
641 /* Fall through to slice assignment */
642 start = i;
643 stop = i + 1;
644 step = 1;
645 slicelen = 1;
646 }
647 else {
Georg Brandl9a54d7c2008-07-16 23:15:30 +0000648 int ival;
649 if (!_getbytevalue(values, &ival))
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000650 return -1;
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200651 buf[i] = (char)ival;
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000652 return 0;
653 }
654 }
Georg Brandl9a54d7c2008-07-16 23:15:30 +0000655 else if (PySlice_Check(index)) {
Serhiy Storchakab879fe82017-04-08 09:53:51 +0300656 if (PySlice_Unpack(index, &start, &stop, &step) < 0) {
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000657 return -1;
658 }
Serhiy Storchakab879fe82017-04-08 09:53:51 +0300659 slicelen = PySlice_AdjustIndices(PyByteArray_GET_SIZE(self), &start,
660 &stop, step);
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000661 }
662 else {
Terry Jan Reedyffff1442014-08-02 01:30:37 -0400663 PyErr_Format(PyExc_TypeError,
664 "bytearray indices must be integers or slices, not %.200s",
665 Py_TYPE(index)->tp_name);
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000666 return -1;
667 }
668
669 if (values == NULL) {
670 bytes = NULL;
671 needed = 0;
672 }
673 else if (values == (PyObject *)self || !PyByteArray_Check(values)) {
Christian Heimes6d26ade2012-11-03 23:07:59 +0100674 int err;
Ezio Melottic64bcbe2012-11-03 21:19:06 +0200675 if (PyNumber_Check(values) || PyUnicode_Check(values)) {
676 PyErr_SetString(PyExc_TypeError,
677 "can assign only bytes, buffers, or iterables "
678 "of ints in range(0, 256)");
679 return -1;
680 }
Georg Brandlf3fa5682010-12-04 17:09:30 +0000681 /* Make a copy and call this function recursively */
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000682 values = PyByteArray_FromObject(values);
683 if (values == NULL)
684 return -1;
Benjamin Peterson153c70f2009-04-18 15:42:12 +0000685 err = bytearray_ass_subscript(self, index, values);
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000686 Py_DECREF(values);
687 return err;
688 }
689 else {
690 assert(PyByteArray_Check(values));
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200691 bytes = PyByteArray_AS_STRING(values);
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000692 needed = Py_SIZE(values);
693 }
694 /* Make sure b[5:2] = ... inserts before 5, not before 2. */
695 if ((step < 0 && start < stop) ||
696 (step > 0 && start > stop))
697 stop = start;
698 if (step == 1) {
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200699 return bytearray_setslice_linear(self, start, stop, bytes, needed);
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000700 }
701 else {
702 if (needed == 0) {
703 /* Delete slice */
Mark Dickinsonbc099642010-01-29 17:27:24 +0000704 size_t cur;
705 Py_ssize_t i;
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000706
Antoine Pitrou5504e892008-12-06 21:27:53 +0000707 if (!_canresize(self))
708 return -1;
Mark Dickinson7e3b9482010-08-06 21:33:18 +0000709
710 if (slicelen == 0)
711 /* Nothing to do here. */
712 return 0;
713
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000714 if (step < 0) {
715 stop = start + 1;
716 start = stop + step * (slicelen - 1) - 1;
717 step = -step;
718 }
719 for (cur = start, i = 0;
720 i < slicelen; cur += step, i++) {
721 Py_ssize_t lim = step - 1;
722
Mark Dickinson66f575b2010-02-14 12:53:32 +0000723 if (cur + step >= (size_t)PyByteArray_GET_SIZE(self))
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000724 lim = PyByteArray_GET_SIZE(self) - cur - 1;
725
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200726 memmove(buf + cur - i,
727 buf + cur + 1, lim);
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000728 }
729 /* Move the tail of the bytes, in one chunk */
Mark Dickinson7e3b9482010-08-06 21:33:18 +0000730 cur = start + (size_t)slicelen*step;
Mark Dickinson66f575b2010-02-14 12:53:32 +0000731 if (cur < (size_t)PyByteArray_GET_SIZE(self)) {
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200732 memmove(buf + cur - slicelen,
733 buf + cur,
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000734 PyByteArray_GET_SIZE(self) - cur);
735 }
736 if (PyByteArray_Resize((PyObject *)self,
737 PyByteArray_GET_SIZE(self) - slicelen) < 0)
738 return -1;
739
740 return 0;
741 }
742 else {
743 /* Assign slice */
Mark Dickinson7e3b9482010-08-06 21:33:18 +0000744 Py_ssize_t i;
745 size_t cur;
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000746
747 if (needed != slicelen) {
748 PyErr_Format(PyExc_ValueError,
749 "attempt to assign bytes of size %zd "
750 "to extended slice of size %zd",
751 needed, slicelen);
752 return -1;
753 }
754 for (cur = start, i = 0; i < slicelen; cur += step, i++)
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200755 buf[cur] = bytes[i];
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000756 return 0;
757 }
758 }
759}
760
761static int
Benjamin Peterson153c70f2009-04-18 15:42:12 +0000762bytearray_init(PyByteArrayObject *self, PyObject *args, PyObject *kwds)
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000763{
764 static char *kwlist[] = {"source", "encoding", "errors", 0};
765 PyObject *arg = NULL;
766 const char *encoding = NULL;
767 const char *errors = NULL;
768 Py_ssize_t count;
769 PyObject *it;
770 PyObject *(*iternext)(PyObject *);
771
772 if (Py_SIZE(self) != 0) {
773 /* Empty previous contents (yes, do this first of all!) */
774 if (PyByteArray_Resize((PyObject *)self, 0) < 0)
775 return -1;
776 }
777
778 /* Parse arguments */
Georg Brandl3dbca812008-07-23 16:10:53 +0000779 if (!PyArg_ParseTupleAndKeywords(args, kwds, "|Oss:bytearray", kwlist,
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000780 &arg, &encoding, &errors))
781 return -1;
782
783 /* Make a quick exit if no first argument */
784 if (arg == NULL) {
785 if (encoding != NULL || errors != NULL) {
786 PyErr_SetString(PyExc_TypeError,
787 "encoding or errors without sequence argument");
788 return -1;
789 }
790 return 0;
791 }
792
793 if (PyUnicode_Check(arg)) {
794 /* Encode via the codec registry */
795 PyObject *encoded, *new;
796 if (encoding == NULL) {
797 PyErr_SetString(PyExc_TypeError,
798 "string argument without an encoding");
799 return -1;
800 }
Marc-André Lemburgb2750b52008-06-06 12:18:17 +0000801 encoded = PyUnicode_AsEncodedString(arg, encoding, errors);
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000802 if (encoded == NULL)
803 return -1;
804 assert(PyBytes_Check(encoded));
Benjamin Peterson153c70f2009-04-18 15:42:12 +0000805 new = bytearray_iconcat(self, encoded);
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000806 Py_DECREF(encoded);
807 if (new == NULL)
808 return -1;
809 Py_DECREF(new);
810 return 0;
811 }
812
813 /* If it's not unicode, there can't be encoding or errors */
814 if (encoding != NULL || errors != NULL) {
815 PyErr_SetString(PyExc_TypeError,
816 "encoding or errors without a string argument");
817 return -1;
818 }
819
820 /* Is it an int? */
Serhiy Storchakaeb249882016-08-15 09:46:07 +0300821 if (PyIndex_Check(arg)) {
822 count = PyNumber_AsSsize_t(arg, PyExc_OverflowError);
823 if (count == -1 && PyErr_Occurred()) {
INADA Naokia634e232017-01-06 17:32:01 +0900824 if (PyErr_ExceptionMatches(PyExc_OverflowError))
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000825 return -1;
INADA Naokia634e232017-01-06 17:32:01 +0900826 PyErr_Clear(); /* fall through */
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000827 }
INADA Naokia634e232017-01-06 17:32:01 +0900828 else {
829 if (count < 0) {
830 PyErr_SetString(PyExc_ValueError, "negative count");
831 return -1;
832 }
833 if (count > 0) {
834 if (PyByteArray_Resize((PyObject *)self, count))
835 return -1;
836 memset(PyByteArray_AS_STRING(self), 0, count);
837 }
838 return 0;
839 }
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000840 }
841
842 /* Use the buffer API */
843 if (PyObject_CheckBuffer(arg)) {
844 Py_ssize_t size;
845 Py_buffer view;
846 if (PyObject_GetBuffer(arg, &view, PyBUF_FULL_RO) < 0)
847 return -1;
848 size = view.len;
849 if (PyByteArray_Resize((PyObject *)self, size) < 0) goto fail;
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200850 if (PyBuffer_ToContiguous(PyByteArray_AS_STRING(self),
851 &view, size, 'C') < 0)
Stefan Krah7d12d9d2012-07-28 12:25:55 +0200852 goto fail;
Martin v. Löwis423be952008-08-13 15:53:07 +0000853 PyBuffer_Release(&view);
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000854 return 0;
855 fail:
Martin v. Löwis423be952008-08-13 15:53:07 +0000856 PyBuffer_Release(&view);
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000857 return -1;
858 }
859
860 /* XXX Optimize this if the arguments is a list, tuple */
861
862 /* Get the iterator */
863 it = PyObject_GetIter(arg);
864 if (it == NULL)
865 return -1;
866 iternext = *Py_TYPE(it)->tp_iternext;
867
868 /* Run the iterator to exhaustion */
869 for (;;) {
870 PyObject *item;
Georg Brandl9a54d7c2008-07-16 23:15:30 +0000871 int rc, value;
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000872
873 /* Get the next item */
874 item = iternext(it);
875 if (item == NULL) {
876 if (PyErr_Occurred()) {
877 if (!PyErr_ExceptionMatches(PyExc_StopIteration))
878 goto error;
879 PyErr_Clear();
880 }
881 break;
882 }
883
884 /* Interpret it as an int (__index__) */
Georg Brandl9a54d7c2008-07-16 23:15:30 +0000885 rc = _getbytevalue(item, &value);
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000886 Py_DECREF(item);
Georg Brandl9a54d7c2008-07-16 23:15:30 +0000887 if (!rc)
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000888 goto error;
889
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000890 /* Append the byte */
Serhiy Storchaka7b6e3b92015-06-29 21:14:06 +0300891 if (Py_SIZE(self) + 1 < self->ob_alloc) {
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000892 Py_SIZE(self)++;
Serhiy Storchaka7b6e3b92015-06-29 21:14:06 +0300893 PyByteArray_AS_STRING(self)[Py_SIZE(self)] = '\0';
894 }
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000895 else if (PyByteArray_Resize((PyObject *)self, Py_SIZE(self)+1) < 0)
896 goto error;
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200897 PyByteArray_AS_STRING(self)[Py_SIZE(self)-1] = value;
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000898 }
899
900 /* Clean up and return success */
901 Py_DECREF(it);
902 return 0;
903
904 error:
905 /* Error handling when it != NULL */
906 Py_DECREF(it);
907 return -1;
908}
909
910/* Mostly copied from string_repr, but without the
911 "smart quote" functionality. */
912static PyObject *
Benjamin Peterson153c70f2009-04-18 15:42:12 +0000913bytearray_repr(PyByteArrayObject *self)
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000914{
Serhiy Storchakab3a77962017-09-21 14:24:13 +0300915 const char *className = _PyType_Name(Py_TYPE(self));
916 const char *quote_prefix = "(b";
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000917 const char *quote_postfix = ")";
918 Py_ssize_t length = Py_SIZE(self);
Serhiy Storchakab3a77962017-09-21 14:24:13 +0300919 /* 6 == strlen(quote_prefix) + 2 + strlen(quote_postfix) + 1 */
920 Py_ssize_t newsize;
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000921 PyObject *v;
Antoine Pitrou9ed5f272013-08-13 20:18:52 +0200922 Py_ssize_t i;
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200923 char *bytes;
Antoine Pitrou9ed5f272013-08-13 20:18:52 +0200924 char c;
925 char *p;
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200926 int quote;
927 char *test, *start;
928 char *buffer;
929
Serhiy Storchakab3a77962017-09-21 14:24:13 +0300930 newsize = strlen(className);
931 if (length > (PY_SSIZE_T_MAX - 6 - newsize) / 4) {
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000932 PyErr_SetString(PyExc_OverflowError,
933 "bytearray object is too large to make repr");
934 return NULL;
935 }
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200936
Serhiy Storchakab3a77962017-09-21 14:24:13 +0300937 newsize += 6 + length * 4;
Antoine Pitrou39aba4f2011-11-12 21:15:28 +0100938 buffer = PyObject_Malloc(newsize);
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200939 if (buffer == NULL) {
940 PyErr_NoMemory();
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000941 return NULL;
942 }
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000943
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200944 /* Figure out which quote to use; single is preferred */
945 quote = '\'';
946 start = PyByteArray_AS_STRING(self);
947 for (test = start; test < start+length; ++test) {
948 if (*test == '"') {
949 quote = '\''; /* back to single */
950 break;
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000951 }
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200952 else if (*test == '\'')
953 quote = '"';
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000954 }
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200955
956 p = buffer;
Serhiy Storchakab3a77962017-09-21 14:24:13 +0300957 while (*className)
958 *p++ = *className++;
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200959 while (*quote_prefix)
960 *p++ = *quote_prefix++;
961 *p++ = quote;
962
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200963 bytes = PyByteArray_AS_STRING(self);
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200964 for (i = 0; i < length; i++) {
965 /* There's at least enough room for a hex escape
966 and a closing quote. */
967 assert(newsize - (p - buffer) >= 5);
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200968 c = bytes[i];
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200969 if (c == '\'' || c == '\\')
970 *p++ = '\\', *p++ = c;
971 else if (c == '\t')
972 *p++ = '\\', *p++ = 't';
973 else if (c == '\n')
974 *p++ = '\\', *p++ = 'n';
975 else if (c == '\r')
976 *p++ = '\\', *p++ = 'r';
977 else if (c == 0)
978 *p++ = '\\', *p++ = 'x', *p++ = '0', *p++ = '0';
979 else if (c < ' ' || c >= 0x7f) {
980 *p++ = '\\';
981 *p++ = 'x';
Victor Stinnerf5cff562011-10-14 02:13:11 +0200982 *p++ = Py_hexdigits[(c & 0xf0) >> 4];
983 *p++ = Py_hexdigits[c & 0xf];
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200984 }
985 else
986 *p++ = c;
987 }
988 assert(newsize - (p - buffer) >= 1);
989 *p++ = quote;
990 while (*quote_postfix) {
991 *p++ = *quote_postfix++;
992 }
993
Serhiy Storchakab3a77962017-09-21 14:24:13 +0300994 v = PyUnicode_FromStringAndSize(buffer, p - buffer);
Antoine Pitrou39aba4f2011-11-12 21:15:28 +0100995 PyObject_Free(buffer);
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200996 return v;
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000997}
998
999static PyObject *
Benjamin Peterson153c70f2009-04-18 15:42:12 +00001000bytearray_str(PyObject *op)
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001001{
Victor Stinner53b7d4e2018-07-25 01:37:05 +02001002 if (Py_BytesWarningFlag) {
1003 if (PyErr_WarnEx(PyExc_BytesWarning,
1004 "str() on a bytearray instance", 1)) {
1005 return NULL;
Alexander Belopolskyf0f45142010-08-11 17:31:17 +00001006 }
Victor Stinner53b7d4e2018-07-25 01:37:05 +02001007 }
1008 return bytearray_repr((PyByteArrayObject*)op);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001009}
1010
1011static PyObject *
Benjamin Peterson153c70f2009-04-18 15:42:12 +00001012bytearray_richcompare(PyObject *self, PyObject *other, int op)
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001013{
1014 Py_ssize_t self_size, other_size;
1015 Py_buffer self_bytes, other_bytes;
Serhiy Storchakafa494fd2015-05-30 17:45:22 +03001016 int cmp, rc;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001017
1018 /* Bytes can be compared to anything that supports the (binary)
1019 buffer API. Except that a comparison with Unicode is always an
1020 error, even if the comparison is for equality. */
Serhiy Storchakafa494fd2015-05-30 17:45:22 +03001021 rc = PyObject_IsInstance(self, (PyObject*)&PyUnicode_Type);
1022 if (!rc)
1023 rc = PyObject_IsInstance(other, (PyObject*)&PyUnicode_Type);
1024 if (rc < 0)
1025 return NULL;
1026 if (rc) {
Barry Warsaw9e9dcd62008-10-17 01:50:37 +00001027 if (Py_BytesWarningFlag && (op == Py_EQ || op == Py_NE)) {
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001028 if (PyErr_WarnEx(PyExc_BytesWarning,
Georg Brandle5d68ac2008-06-04 11:30:26 +00001029 "Comparison between bytearray and string", 1))
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001030 return NULL;
1031 }
1032
Brian Curtindfc80e32011-08-10 20:28:54 -05001033 Py_RETURN_NOTIMPLEMENTED;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001034 }
1035
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +02001036 if (PyObject_GetBuffer(self, &self_bytes, PyBUF_SIMPLE) != 0) {
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001037 PyErr_Clear();
Brian Curtindfc80e32011-08-10 20:28:54 -05001038 Py_RETURN_NOTIMPLEMENTED;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001039 }
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +02001040 self_size = self_bytes.len;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001041
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +02001042 if (PyObject_GetBuffer(other, &other_bytes, PyBUF_SIMPLE) != 0) {
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001043 PyErr_Clear();
Martin v. Löwis423be952008-08-13 15:53:07 +00001044 PyBuffer_Release(&self_bytes);
Brian Curtindfc80e32011-08-10 20:28:54 -05001045 Py_RETURN_NOTIMPLEMENTED;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001046 }
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +02001047 other_size = other_bytes.len;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001048
1049 if (self_size != other_size && (op == Py_EQ || op == Py_NE)) {
1050 /* Shortcut: if the lengths differ, the objects differ */
stratakise8b19652017-11-02 11:32:54 +01001051 PyBuffer_Release(&self_bytes);
1052 PyBuffer_Release(&other_bytes);
1053 return PyBool_FromLong((op == Py_NE));
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001054 }
1055 else {
stratakise8b19652017-11-02 11:32:54 +01001056 cmp = memcmp(self_bytes.buf, other_bytes.buf,
1057 Py_MIN(self_size, other_size));
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001058 /* In ISO C, memcmp() guarantees to use unsigned bytes! */
1059
stratakise8b19652017-11-02 11:32:54 +01001060 PyBuffer_Release(&self_bytes);
1061 PyBuffer_Release(&other_bytes);
1062
1063 if (cmp != 0) {
1064 Py_RETURN_RICHCOMPARE(cmp, 0, op);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001065 }
1066
stratakise8b19652017-11-02 11:32:54 +01001067 Py_RETURN_RICHCOMPARE(self_size, other_size, op);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001068 }
1069
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001070}
1071
1072static void
Benjamin Peterson153c70f2009-04-18 15:42:12 +00001073bytearray_dealloc(PyByteArrayObject *self)
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001074{
Benjamin Petersone0124bd2009-03-09 21:04:33 +00001075 if (self->ob_exports > 0) {
1076 PyErr_SetString(PyExc_SystemError,
Benjamin Petersonef3e4c22009-04-11 19:48:14 +00001077 "deallocated bytearray object has exported buffers");
Benjamin Petersone0124bd2009-03-09 21:04:33 +00001078 PyErr_Print();
1079 }
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001080 if (self->ob_bytes != 0) {
Antoine Pitrou39aba4f2011-11-12 21:15:28 +01001081 PyObject_Free(self->ob_bytes);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001082 }
1083 Py_TYPE(self)->tp_free((PyObject *)self);
1084}
1085
1086
1087/* -------------------------------------------------------------------- */
1088/* Methods */
1089
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02001090#define FASTSEARCH fastsearch
1091#define STRINGLIB(F) stringlib_##F
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001092#define STRINGLIB_CHAR char
Antoine Pitroucfc22b42012-10-16 21:07:23 +02001093#define STRINGLIB_SIZEOF_CHAR 1
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001094#define STRINGLIB_LEN PyByteArray_GET_SIZE
1095#define STRINGLIB_STR PyByteArray_AS_STRING
1096#define STRINGLIB_NEW PyByteArray_FromStringAndSize
Antoine Pitrouf2c54842010-01-13 08:07:53 +00001097#define STRINGLIB_ISSPACE Py_ISSPACE
1098#define STRINGLIB_ISLINEBREAK(x) ((x == '\n') || (x == '\r'))
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001099#define STRINGLIB_CHECK_EXACT PyByteArray_CheckExact
1100#define STRINGLIB_MUTABLE 1
1101
1102#include "stringlib/fastsearch.h"
1103#include "stringlib/count.h"
1104#include "stringlib/find.h"
Antoine Pitroucfc22b42012-10-16 21:07:23 +02001105#include "stringlib/join.h"
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001106#include "stringlib/partition.h"
Antoine Pitrouf2c54842010-01-13 08:07:53 +00001107#include "stringlib/split.h"
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001108#include "stringlib/ctype.h"
1109#include "stringlib/transmogrify.h"
1110
1111
Serhiy Storchakae09132f2016-07-03 13:57:48 +03001112static PyObject *
1113bytearray_find(PyByteArrayObject *self, PyObject *args)
1114{
1115 return _Py_bytes_find(PyByteArray_AS_STRING(self), PyByteArray_GET_SIZE(self), args);
1116}
1117
1118static PyObject *
1119bytearray_count(PyByteArrayObject *self, PyObject *args)
1120{
1121 return _Py_bytes_count(PyByteArray_AS_STRING(self), PyByteArray_GET_SIZE(self), args);
1122}
1123
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001124/*[clinic input]
1125bytearray.clear
1126
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001127Remove all items from the bytearray.
1128[clinic start generated code]*/
1129
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001130static PyObject *
1131bytearray_clear_impl(PyByteArrayObject *self)
Serhiy Storchaka7a9579c2016-05-02 13:45:20 +03001132/*[clinic end generated code: output=85c2fe6aede0956c input=ed6edae9de447ac4]*/
Eli Bendersky4db28d32011-03-03 18:21:02 +00001133{
1134 if (PyByteArray_Resize((PyObject *)self, 0) < 0)
1135 return NULL;
1136 Py_RETURN_NONE;
1137}
1138
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001139/*[clinic input]
1140bytearray.copy
1141
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001142Return a copy of B.
1143[clinic start generated code]*/
1144
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001145static PyObject *
1146bytearray_copy_impl(PyByteArrayObject *self)
Serhiy Storchaka7a9579c2016-05-02 13:45:20 +03001147/*[clinic end generated code: output=68cfbcfed484c132 input=6597b0c01bccaa9e]*/
Eli Bendersky4db28d32011-03-03 18:21:02 +00001148{
1149 return PyByteArray_FromStringAndSize(PyByteArray_AS_STRING((PyObject *)self),
1150 PyByteArray_GET_SIZE(self));
1151}
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001152
Serhiy Storchakae09132f2016-07-03 13:57:48 +03001153static PyObject *
1154bytearray_index(PyByteArrayObject *self, PyObject *args)
1155{
1156 return _Py_bytes_index(PyByteArray_AS_STRING(self), PyByteArray_GET_SIZE(self), args);
1157}
1158
1159static PyObject *
1160bytearray_rfind(PyByteArrayObject *self, PyObject *args)
1161{
1162 return _Py_bytes_rfind(PyByteArray_AS_STRING(self), PyByteArray_GET_SIZE(self), args);
1163}
1164
1165static PyObject *
1166bytearray_rindex(PyByteArrayObject *self, PyObject *args)
1167{
1168 return _Py_bytes_rindex(PyByteArray_AS_STRING(self), PyByteArray_GET_SIZE(self), args);
1169}
1170
1171static int
1172bytearray_contains(PyObject *self, PyObject *arg)
1173{
1174 return _Py_bytes_contains(PyByteArray_AS_STRING(self), PyByteArray_GET_SIZE(self), arg);
1175}
1176
1177static PyObject *
1178bytearray_startswith(PyByteArrayObject *self, PyObject *args)
1179{
1180 return _Py_bytes_startswith(PyByteArray_AS_STRING(self), PyByteArray_GET_SIZE(self), args);
1181}
1182
1183static PyObject *
1184bytearray_endswith(PyByteArrayObject *self, PyObject *args)
1185{
1186 return _Py_bytes_endswith(PyByteArray_AS_STRING(self), PyByteArray_GET_SIZE(self), args);
1187}
1188
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001189
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001190/*[clinic input]
1191bytearray.translate
1192
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001193 table: object
1194 Translation table, which must be a bytes object of length 256.
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001195 /
Martin Panter1b6c6da2016-08-27 08:35:02 +00001196 delete as deletechars: object(c_default="NULL") = b''
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001197
1198Return a copy with each character mapped by the given translation table.
1199
Martin Panter1b6c6da2016-08-27 08:35:02 +00001200All characters occurring in the optional argument delete are removed.
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001201The remaining characters are mapped through the given translation table.
1202[clinic start generated code]*/
1203
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001204static PyObject *
Larry Hastings89964c42015-04-14 18:07:59 -04001205bytearray_translate_impl(PyByteArrayObject *self, PyObject *table,
Martin Panter1b6c6da2016-08-27 08:35:02 +00001206 PyObject *deletechars)
1207/*[clinic end generated code: output=b6a8f01c2a74e446 input=cfff956d4d127a9b]*/
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001208{
Antoine Pitrou9ed5f272013-08-13 20:18:52 +02001209 char *input, *output;
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001210 const char *table_chars;
Antoine Pitrou9ed5f272013-08-13 20:18:52 +02001211 Py_ssize_t i, c;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001212 PyObject *input_obj = (PyObject*)self;
1213 const char *output_start;
1214 Py_ssize_t inlen;
Georg Brandlccc47b62008-12-28 11:44:14 +00001215 PyObject *result = NULL;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001216 int trans_table[256];
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001217 Py_buffer vtable, vdel;
1218
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001219 if (table == Py_None) {
1220 table_chars = NULL;
Georg Brandlccc47b62008-12-28 11:44:14 +00001221 table = NULL;
Serhiy Storchaka3dd3e262015-02-03 01:25:42 +02001222 } else if (PyObject_GetBuffer(table, &vtable, PyBUF_SIMPLE) != 0) {
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001223 return NULL;
Georg Brandlccc47b62008-12-28 11:44:14 +00001224 } else {
1225 if (vtable.len != 256) {
1226 PyErr_SetString(PyExc_ValueError,
1227 "translation table must be 256 characters long");
Georg Brandl953152f2009-07-22 12:03:59 +00001228 PyBuffer_Release(&vtable);
1229 return NULL;
Georg Brandlccc47b62008-12-28 11:44:14 +00001230 }
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001231 table_chars = (const char*)vtable.buf;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001232 }
1233
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001234 if (deletechars != NULL) {
Serhiy Storchaka3dd3e262015-02-03 01:25:42 +02001235 if (PyObject_GetBuffer(deletechars, &vdel, PyBUF_SIMPLE) != 0) {
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001236 if (table != NULL)
Georg Brandl953152f2009-07-22 12:03:59 +00001237 PyBuffer_Release(&vtable);
1238 return NULL;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001239 }
1240 }
1241 else {
1242 vdel.buf = NULL;
1243 vdel.len = 0;
1244 }
1245
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001246 inlen = PyByteArray_GET_SIZE(input_obj);
1247 result = PyByteArray_FromStringAndSize((char *)NULL, inlen);
1248 if (result == NULL)
1249 goto done;
Serhiy Storchakadd40fc32016-05-04 22:23:26 +03001250 output_start = output = PyByteArray_AS_STRING(result);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001251 input = PyByteArray_AS_STRING(input_obj);
1252
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001253 if (vdel.len == 0 && table_chars != NULL) {
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001254 /* If no deletions are required, use faster code */
1255 for (i = inlen; --i >= 0; ) {
1256 c = Py_CHARMASK(*input++);
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001257 *output++ = table_chars[c];
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001258 }
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001259 goto done;
1260 }
Georg Brandlccc47b62008-12-28 11:44:14 +00001261
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001262 if (table_chars == NULL) {
Georg Brandlccc47b62008-12-28 11:44:14 +00001263 for (i = 0; i < 256; i++)
1264 trans_table[i] = Py_CHARMASK(i);
1265 } else {
1266 for (i = 0; i < 256; i++)
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001267 trans_table[i] = Py_CHARMASK(table_chars[i]);
Georg Brandlccc47b62008-12-28 11:44:14 +00001268 }
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001269
1270 for (i = 0; i < vdel.len; i++)
1271 trans_table[(int) Py_CHARMASK( ((unsigned char*)vdel.buf)[i] )] = -1;
1272
1273 for (i = inlen; --i >= 0; ) {
1274 c = Py_CHARMASK(*input++);
1275 if (trans_table[c] != -1)
Martin Panter1b6c6da2016-08-27 08:35:02 +00001276 *output++ = (char)trans_table[c];
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001277 }
1278 /* Fix the size of the resulting string */
1279 if (inlen > 0)
Christian Heimesc731bbe2013-07-21 02:04:35 +02001280 if (PyByteArray_Resize(result, output - output_start) < 0) {
1281 Py_CLEAR(result);
1282 goto done;
1283 }
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001284
1285done:
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001286 if (table != NULL)
Georg Brandlccc47b62008-12-28 11:44:14 +00001287 PyBuffer_Release(&vtable);
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001288 if (deletechars != NULL)
Martin v. Löwis423be952008-08-13 15:53:07 +00001289 PyBuffer_Release(&vdel);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001290 return result;
1291}
1292
1293
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001294/*[clinic input]
1295
1296@staticmethod
1297bytearray.maketrans
1298
Serhiy Storchaka3dd3e262015-02-03 01:25:42 +02001299 frm: Py_buffer
1300 to: Py_buffer
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001301 /
1302
1303Return a translation table useable for the bytes or bytearray translate method.
1304
1305The returned table will be one where each byte in frm is mapped to the byte at
1306the same position in to.
1307
1308The bytes objects frm and to must be of the same length.
1309[clinic start generated code]*/
1310
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001311static PyObject *
Serhiy Storchaka3dd3e262015-02-03 01:25:42 +02001312bytearray_maketrans_impl(Py_buffer *frm, Py_buffer *to)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03001313/*[clinic end generated code: output=1df267d99f56b15e input=5925a81d2fbbf151]*/
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001314{
1315 return _Py_bytes_maketrans(frm, to);
Georg Brandlabc38772009-04-12 15:51:51 +00001316}
1317
1318
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001319/*[clinic input]
1320bytearray.replace
1321
Serhiy Storchaka3dd3e262015-02-03 01:25:42 +02001322 old: Py_buffer
1323 new: Py_buffer
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001324 count: Py_ssize_t = -1
1325 Maximum number of occurrences to replace.
1326 -1 (the default value) means replace all occurrences.
1327 /
1328
1329Return a copy with all occurrences of substring old replaced by new.
1330
1331If the optional argument count is given, only the first count occurrences are
1332replaced.
1333[clinic start generated code]*/
1334
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001335static PyObject *
Larry Hastings89964c42015-04-14 18:07:59 -04001336bytearray_replace_impl(PyByteArrayObject *self, Py_buffer *old,
1337 Py_buffer *new, Py_ssize_t count)
1338/*[clinic end generated code: output=d39884c4dc59412a input=aa379d988637c7fb]*/
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001339{
Serhiy Storchakafb81d3c2016-05-05 09:26:07 +03001340 return stringlib_replace((PyObject *)self,
Serhiy Storchakae09132f2016-07-03 13:57:48 +03001341 (const char *)old->buf, old->len,
1342 (const char *)new->buf, new->len, count);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001343}
1344
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001345/*[clinic input]
1346bytearray.split
1347
1348 sep: object = None
1349 The delimiter according which to split the bytearray.
1350 None (the default value) means split on ASCII whitespace characters
1351 (space, tab, return, newline, formfeed, vertical tab).
1352 maxsplit: Py_ssize_t = -1
1353 Maximum number of splits to do.
1354 -1 (the default value) means no limit.
1355
1356Return a list of the sections in the bytearray, using sep as the delimiter.
1357[clinic start generated code]*/
1358
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001359static PyObject *
Larry Hastings89964c42015-04-14 18:07:59 -04001360bytearray_split_impl(PyByteArrayObject *self, PyObject *sep,
1361 Py_ssize_t maxsplit)
1362/*[clinic end generated code: output=833e2cf385d9a04d input=24f82669f41bf523]*/
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001363{
1364 Py_ssize_t len = PyByteArray_GET_SIZE(self), n;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001365 const char *s = PyByteArray_AS_STRING(self), *sub;
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001366 PyObject *list;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001367 Py_buffer vsub;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001368
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001369 if (maxsplit < 0)
1370 maxsplit = PY_SSIZE_T_MAX;
1371
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001372 if (sep == Py_None)
Antoine Pitrouf2c54842010-01-13 08:07:53 +00001373 return stringlib_split_whitespace((PyObject*) self, s, len, maxsplit);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001374
Serhiy Storchaka3dd3e262015-02-03 01:25:42 +02001375 if (PyObject_GetBuffer(sep, &vsub, PyBUF_SIMPLE) != 0)
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001376 return NULL;
1377 sub = vsub.buf;
1378 n = vsub.len;
1379
Antoine Pitrouf2c54842010-01-13 08:07:53 +00001380 list = stringlib_split(
1381 (PyObject*) self, s, len, sub, n, maxsplit
1382 );
Martin v. Löwis423be952008-08-13 15:53:07 +00001383 PyBuffer_Release(&vsub);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001384 return list;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001385}
1386
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001387/*[clinic input]
1388bytearray.partition
1389
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001390 sep: object
1391 /
1392
1393Partition the bytearray into three parts using the given separator.
1394
1395This will search for the separator sep in the bytearray. If the separator is
1396found, returns a 3-tuple containing the part before the separator, the
Serhiy Storchakaa2314282017-10-29 02:11:54 +03001397separator itself, and the part after it as new bytearray objects.
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001398
Serhiy Storchakaa2314282017-10-29 02:11:54 +03001399If the separator is not found, returns a 3-tuple containing the copy of the
1400original bytearray object and two empty bytearray objects.
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001401[clinic start generated code]*/
1402
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001403static PyObject *
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001404bytearray_partition(PyByteArrayObject *self, PyObject *sep)
Serhiy Storchakaa2314282017-10-29 02:11:54 +03001405/*[clinic end generated code: output=45d2525ddd35f957 input=8f644749ee4fc83a]*/
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001406{
1407 PyObject *bytesep, *result;
1408
Serhiy Storchakaa2314282017-10-29 02:11:54 +03001409 bytesep = _PyByteArray_FromBufferObject(sep);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001410 if (! bytesep)
1411 return NULL;
1412
1413 result = stringlib_partition(
1414 (PyObject*) self,
1415 PyByteArray_AS_STRING(self), PyByteArray_GET_SIZE(self),
1416 bytesep,
1417 PyByteArray_AS_STRING(bytesep), PyByteArray_GET_SIZE(bytesep)
1418 );
1419
1420 Py_DECREF(bytesep);
Antoine Pitrouf2c54842010-01-13 08:07:53 +00001421 return result;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001422}
1423
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001424/*[clinic input]
1425bytearray.rpartition
1426
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001427 sep: object
1428 /
1429
Serhiy Storchakaa2314282017-10-29 02:11:54 +03001430Partition the bytearray into three parts using the given separator.
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001431
Serhiy Storchakaa2314282017-10-29 02:11:54 +03001432This will search for the separator sep in the bytearray, starting at the end.
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001433If the separator is found, returns a 3-tuple containing the part before the
Serhiy Storchakaa2314282017-10-29 02:11:54 +03001434separator, the separator itself, and the part after it as new bytearray
1435objects.
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001436
1437If the separator is not found, returns a 3-tuple containing two empty bytearray
Serhiy Storchakaa2314282017-10-29 02:11:54 +03001438objects and the copy of the original bytearray object.
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001439[clinic start generated code]*/
1440
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001441static PyObject *
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001442bytearray_rpartition(PyByteArrayObject *self, PyObject *sep)
Serhiy Storchakaa2314282017-10-29 02:11:54 +03001443/*[clinic end generated code: output=440de3c9426115e8 input=7e3df3e6cb8fa0ac]*/
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001444{
1445 PyObject *bytesep, *result;
1446
Serhiy Storchakaa2314282017-10-29 02:11:54 +03001447 bytesep = _PyByteArray_FromBufferObject(sep);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001448 if (! bytesep)
1449 return NULL;
1450
1451 result = stringlib_rpartition(
1452 (PyObject*) self,
1453 PyByteArray_AS_STRING(self), PyByteArray_GET_SIZE(self),
1454 bytesep,
1455 PyByteArray_AS_STRING(bytesep), PyByteArray_GET_SIZE(bytesep)
1456 );
1457
1458 Py_DECREF(bytesep);
Antoine Pitrouf2c54842010-01-13 08:07:53 +00001459 return result;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001460}
1461
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001462/*[clinic input]
1463bytearray.rsplit = bytearray.split
1464
1465Return a list of the sections in the bytearray, using sep as the delimiter.
1466
1467Splitting is done starting at the end of the bytearray and working to the front.
1468[clinic start generated code]*/
1469
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001470static PyObject *
Larry Hastings89964c42015-04-14 18:07:59 -04001471bytearray_rsplit_impl(PyByteArrayObject *self, PyObject *sep,
1472 Py_ssize_t maxsplit)
1473/*[clinic end generated code: output=a55e0b5a03cb6190 input=a68286e4dd692ffe]*/
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001474{
1475 Py_ssize_t len = PyByteArray_GET_SIZE(self), n;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001476 const char *s = PyByteArray_AS_STRING(self), *sub;
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001477 PyObject *list;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001478 Py_buffer vsub;
1479
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001480 if (maxsplit < 0)
1481 maxsplit = PY_SSIZE_T_MAX;
1482
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001483 if (sep == Py_None)
Antoine Pitrouf2c54842010-01-13 08:07:53 +00001484 return stringlib_rsplit_whitespace((PyObject*) self, s, len, maxsplit);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001485
Serhiy Storchaka3dd3e262015-02-03 01:25:42 +02001486 if (PyObject_GetBuffer(sep, &vsub, PyBUF_SIMPLE) != 0)
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001487 return NULL;
1488 sub = vsub.buf;
1489 n = vsub.len;
1490
Antoine Pitrouf2c54842010-01-13 08:07:53 +00001491 list = stringlib_rsplit(
1492 (PyObject*) self, s, len, sub, n, maxsplit
1493 );
Martin v. Löwis423be952008-08-13 15:53:07 +00001494 PyBuffer_Release(&vsub);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001495 return list;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001496}
1497
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001498/*[clinic input]
1499bytearray.reverse
1500
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001501Reverse the order of the values in B in place.
1502[clinic start generated code]*/
1503
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001504static PyObject *
1505bytearray_reverse_impl(PyByteArrayObject *self)
Serhiy Storchaka7a9579c2016-05-02 13:45:20 +03001506/*[clinic end generated code: output=9f7616f29ab309d3 input=543356319fc78557]*/
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001507{
1508 char swap, *head, *tail;
1509 Py_ssize_t i, j, n = Py_SIZE(self);
1510
1511 j = n / 2;
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +02001512 head = PyByteArray_AS_STRING(self);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001513 tail = head + n - 1;
1514 for (i = 0; i < j; i++) {
1515 swap = *head;
1516 *head++ = *tail;
1517 *tail-- = swap;
1518 }
1519
1520 Py_RETURN_NONE;
1521}
1522
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001523
1524/*[python input]
1525class bytesvalue_converter(CConverter):
1526 type = 'int'
1527 converter = '_getbytevalue'
1528[python start generated code]*/
1529/*[python end generated code: output=da39a3ee5e6b4b0d input=29c2e7c26c212812]*/
1530
1531
1532/*[clinic input]
1533bytearray.insert
1534
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001535 index: Py_ssize_t
1536 The index where the value is to be inserted.
1537 item: bytesvalue
1538 The item to be inserted.
1539 /
1540
1541Insert a single item into the bytearray before the given index.
1542[clinic start generated code]*/
1543
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001544static PyObject *
1545bytearray_insert_impl(PyByteArrayObject *self, Py_ssize_t index, int item)
Serhiy Storchaka7a9579c2016-05-02 13:45:20 +03001546/*[clinic end generated code: output=76c775a70e7b07b7 input=b2b5d07e9de6c070]*/
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001547{
1548 Py_ssize_t n = Py_SIZE(self);
1549 char *buf;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001550
1551 if (n == PY_SSIZE_T_MAX) {
1552 PyErr_SetString(PyExc_OverflowError,
Mark Dickinson2b6705f2009-09-06 10:34:47 +00001553 "cannot add more objects to bytearray");
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001554 return NULL;
1555 }
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001556 if (PyByteArray_Resize((PyObject *)self, n + 1) < 0)
1557 return NULL;
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +02001558 buf = PyByteArray_AS_STRING(self);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001559
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001560 if (index < 0) {
1561 index += n;
1562 if (index < 0)
1563 index = 0;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001564 }
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001565 if (index > n)
1566 index = n;
1567 memmove(buf + index + 1, buf + index, n - index);
1568 buf[index] = item;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001569
1570 Py_RETURN_NONE;
1571}
1572
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001573/*[clinic input]
1574bytearray.append
1575
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001576 item: bytesvalue
1577 The item to be appended.
1578 /
1579
1580Append a single item to the end of the bytearray.
1581[clinic start generated code]*/
1582
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001583static PyObject *
1584bytearray_append_impl(PyByteArrayObject *self, int item)
Serhiy Storchaka7a9579c2016-05-02 13:45:20 +03001585/*[clinic end generated code: output=a154e19ed1886cb6 input=20d6bec3d1340593]*/
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001586{
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001587 Py_ssize_t n = Py_SIZE(self);
1588
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001589 if (n == PY_SSIZE_T_MAX) {
1590 PyErr_SetString(PyExc_OverflowError,
Mark Dickinson2b6705f2009-09-06 10:34:47 +00001591 "cannot add more objects to bytearray");
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001592 return NULL;
1593 }
1594 if (PyByteArray_Resize((PyObject *)self, n + 1) < 0)
1595 return NULL;
1596
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001597 PyByteArray_AS_STRING(self)[n] = item;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001598
1599 Py_RETURN_NONE;
1600}
1601
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001602/*[clinic input]
1603bytearray.extend
1604
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001605 iterable_of_ints: object
1606 The iterable of items to append.
1607 /
1608
1609Append all the items from the iterator or sequence to the end of the bytearray.
1610[clinic start generated code]*/
1611
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001612static PyObject *
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001613bytearray_extend(PyByteArrayObject *self, PyObject *iterable_of_ints)
Serhiy Storchaka7a9579c2016-05-02 13:45:20 +03001614/*[clinic end generated code: output=98155dbe249170b1 input=c617b3a93249ba28]*/
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001615{
Benjamin Peterson153c70f2009-04-18 15:42:12 +00001616 PyObject *it, *item, *bytearray_obj;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001617 Py_ssize_t buf_size = 0, len = 0;
1618 int value;
1619 char *buf;
1620
Benjamin Peterson153c70f2009-04-18 15:42:12 +00001621 /* bytearray_setslice code only accepts something supporting PEP 3118. */
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001622 if (PyObject_CheckBuffer(iterable_of_ints)) {
1623 if (bytearray_setslice(self, Py_SIZE(self), Py_SIZE(self), iterable_of_ints) == -1)
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001624 return NULL;
1625
1626 Py_RETURN_NONE;
1627 }
1628
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001629 it = PyObject_GetIter(iterable_of_ints);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001630 if (it == NULL)
1631 return NULL;
1632
Ezio Melotti42da6632011-03-15 05:18:48 +02001633 /* Try to determine the length of the argument. 32 is arbitrary. */
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001634 buf_size = PyObject_LengthHint(iterable_of_ints, 32);
Benjamin Petersonef3e4c22009-04-11 19:48:14 +00001635 if (buf_size == -1) {
1636 Py_DECREF(it);
1637 return NULL;
1638 }
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001639
Benjamin Peterson153c70f2009-04-18 15:42:12 +00001640 bytearray_obj = PyByteArray_FromStringAndSize(NULL, buf_size);
Antoine Pitrou58bb82e2012-04-01 16:05:46 +02001641 if (bytearray_obj == NULL) {
1642 Py_DECREF(it);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001643 return NULL;
Antoine Pitrou58bb82e2012-04-01 16:05:46 +02001644 }
Benjamin Peterson153c70f2009-04-18 15:42:12 +00001645 buf = PyByteArray_AS_STRING(bytearray_obj);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001646
1647 while ((item = PyIter_Next(it)) != NULL) {
1648 if (! _getbytevalue(item, &value)) {
1649 Py_DECREF(item);
1650 Py_DECREF(it);
Benjamin Peterson153c70f2009-04-18 15:42:12 +00001651 Py_DECREF(bytearray_obj);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001652 return NULL;
1653 }
1654 buf[len++] = value;
1655 Py_DECREF(item);
1656
1657 if (len >= buf_size) {
Martin Panter371731e2016-07-18 07:53:13 +00001658 Py_ssize_t addition;
1659 if (len == PY_SSIZE_T_MAX) {
1660 Py_DECREF(it);
1661 Py_DECREF(bytearray_obj);
1662 return PyErr_NoMemory();
1663 }
1664 addition = len >> 1;
1665 if (addition > PY_SSIZE_T_MAX - len - 1)
1666 buf_size = PY_SSIZE_T_MAX;
1667 else
1668 buf_size = len + addition + 1;
Benjamin Peterson153c70f2009-04-18 15:42:12 +00001669 if (PyByteArray_Resize((PyObject *)bytearray_obj, buf_size) < 0) {
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001670 Py_DECREF(it);
Benjamin Peterson153c70f2009-04-18 15:42:12 +00001671 Py_DECREF(bytearray_obj);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001672 return NULL;
1673 }
1674 /* Recompute the `buf' pointer, since the resizing operation may
1675 have invalidated it. */
Benjamin Peterson153c70f2009-04-18 15:42:12 +00001676 buf = PyByteArray_AS_STRING(bytearray_obj);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001677 }
1678 }
1679 Py_DECREF(it);
1680
1681 /* Resize down to exact size. */
Benjamin Peterson153c70f2009-04-18 15:42:12 +00001682 if (PyByteArray_Resize((PyObject *)bytearray_obj, len) < 0) {
1683 Py_DECREF(bytearray_obj);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001684 return NULL;
1685 }
1686
Antoine Pitrou58bb82e2012-04-01 16:05:46 +02001687 if (bytearray_setslice(self, Py_SIZE(self), Py_SIZE(self), bytearray_obj) == -1) {
1688 Py_DECREF(bytearray_obj);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001689 return NULL;
Antoine Pitrou58bb82e2012-04-01 16:05:46 +02001690 }
Benjamin Peterson153c70f2009-04-18 15:42:12 +00001691 Py_DECREF(bytearray_obj);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001692
1693 Py_RETURN_NONE;
1694}
1695
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001696/*[clinic input]
1697bytearray.pop
1698
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001699 index: Py_ssize_t = -1
1700 The index from where to remove the item.
1701 -1 (the default value) means remove the last item.
1702 /
1703
1704Remove and return a single item from B.
1705
1706If no index argument is given, will pop the last item.
1707[clinic start generated code]*/
1708
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001709static PyObject *
1710bytearray_pop_impl(PyByteArrayObject *self, Py_ssize_t index)
Serhiy Storchaka7a9579c2016-05-02 13:45:20 +03001711/*[clinic end generated code: output=e0ccd401f8021da8 input=3591df2d06c0d237]*/
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001712{
1713 int value;
1714 Py_ssize_t n = Py_SIZE(self);
1715 char *buf;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001716
1717 if (n == 0) {
Eli Bendersky1bc4f192011-03-04 04:55:25 +00001718 PyErr_SetString(PyExc_IndexError,
1719 "pop from empty bytearray");
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001720 return NULL;
1721 }
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001722 if (index < 0)
1723 index += Py_SIZE(self);
1724 if (index < 0 || index >= Py_SIZE(self)) {
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001725 PyErr_SetString(PyExc_IndexError, "pop index out of range");
1726 return NULL;
1727 }
Antoine Pitrou5504e892008-12-06 21:27:53 +00001728 if (!_canresize(self))
1729 return NULL;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001730
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +02001731 buf = PyByteArray_AS_STRING(self);
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001732 value = buf[index];
1733 memmove(buf + index, buf + index + 1, n - index);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001734 if (PyByteArray_Resize((PyObject *)self, n - 1) < 0)
1735 return NULL;
1736
Mark Dickinson54a3db92009-09-06 10:19:23 +00001737 return PyLong_FromLong((unsigned char)value);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001738}
1739
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001740/*[clinic input]
1741bytearray.remove
1742
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001743 value: bytesvalue
1744 The value to remove.
1745 /
1746
1747Remove the first occurrence of a value in the bytearray.
1748[clinic start generated code]*/
1749
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001750static PyObject *
1751bytearray_remove_impl(PyByteArrayObject *self, int value)
Serhiy Storchaka7a9579c2016-05-02 13:45:20 +03001752/*[clinic end generated code: output=d659e37866709c13 input=121831240cd51ddf]*/
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001753{
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001754 Py_ssize_t where, n = Py_SIZE(self);
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +02001755 char *buf = PyByteArray_AS_STRING(self);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001756
Serhiy Storchaka4b234942016-05-16 22:24:03 +03001757 where = stringlib_find_char(buf, n, value);
1758 if (where < 0) {
Mark Dickinson2b6705f2009-09-06 10:34:47 +00001759 PyErr_SetString(PyExc_ValueError, "value not found in bytearray");
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001760 return NULL;
1761 }
Antoine Pitrou5504e892008-12-06 21:27:53 +00001762 if (!_canresize(self))
1763 return NULL;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001764
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +02001765 memmove(buf + where, buf + where + 1, n - where);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001766 if (PyByteArray_Resize((PyObject *)self, n - 1) < 0)
1767 return NULL;
1768
1769 Py_RETURN_NONE;
1770}
1771
1772/* XXX These two helpers could be optimized if argsize == 1 */
1773
1774static Py_ssize_t
Serhiy Storchakaef1585e2015-12-25 20:01:53 +02001775lstrip_helper(const char *myptr, Py_ssize_t mysize,
1776 const void *argptr, Py_ssize_t argsize)
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001777{
1778 Py_ssize_t i = 0;
Antoine Pitrou5b720752013-10-05 21:24:10 +02001779 while (i < mysize && memchr(argptr, (unsigned char) myptr[i], argsize))
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001780 i++;
1781 return i;
1782}
1783
1784static Py_ssize_t
Serhiy Storchakaef1585e2015-12-25 20:01:53 +02001785rstrip_helper(const char *myptr, Py_ssize_t mysize,
1786 const void *argptr, Py_ssize_t argsize)
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001787{
1788 Py_ssize_t i = mysize - 1;
Antoine Pitrou5b720752013-10-05 21:24:10 +02001789 while (i >= 0 && memchr(argptr, (unsigned char) myptr[i], argsize))
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001790 i--;
1791 return i + 1;
1792}
1793
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001794/*[clinic input]
1795bytearray.strip
1796
1797 bytes: object = None
1798 /
1799
1800Strip leading and trailing bytes contained in the argument.
1801
1802If the argument is omitted or None, strip leading and trailing ASCII whitespace.
1803[clinic start generated code]*/
1804
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001805static PyObject *
1806bytearray_strip_impl(PyByteArrayObject *self, PyObject *bytes)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03001807/*[clinic end generated code: output=760412661a34ad5a input=ef7bb59b09c21d62]*/
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001808{
1809 Py_ssize_t left, right, mysize, byteslen;
Serhiy Storchakae2f92de2017-11-11 13:06:26 +02001810 char *myptr;
1811 const char *bytesptr;
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001812 Py_buffer vbytes;
1813
1814 if (bytes == Py_None) {
1815 bytesptr = "\t\n\r\f\v ";
1816 byteslen = 6;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001817 }
1818 else {
Serhiy Storchaka3dd3e262015-02-03 01:25:42 +02001819 if (PyObject_GetBuffer(bytes, &vbytes, PyBUF_SIMPLE) != 0)
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001820 return NULL;
Serhiy Storchakae2f92de2017-11-11 13:06:26 +02001821 bytesptr = (const char *) vbytes.buf;
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001822 byteslen = vbytes.len;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001823 }
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +02001824 myptr = PyByteArray_AS_STRING(self);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001825 mysize = Py_SIZE(self);
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001826 left = lstrip_helper(myptr, mysize, bytesptr, byteslen);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001827 if (left == mysize)
1828 right = left;
1829 else
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001830 right = rstrip_helper(myptr, mysize, bytesptr, byteslen);
1831 if (bytes != Py_None)
1832 PyBuffer_Release(&vbytes);
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +02001833 return PyByteArray_FromStringAndSize(myptr + left, right - left);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001834}
1835
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001836/*[clinic input]
1837bytearray.lstrip
1838
1839 bytes: object = None
1840 /
1841
1842Strip leading bytes contained in the argument.
1843
1844If the argument is omitted or None, strip leading ASCII whitespace.
1845[clinic start generated code]*/
1846
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001847static PyObject *
1848bytearray_lstrip_impl(PyByteArrayObject *self, PyObject *bytes)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03001849/*[clinic end generated code: output=d005c9d0ab909e66 input=80843f975dd7c480]*/
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001850{
1851 Py_ssize_t left, right, mysize, byteslen;
Serhiy Storchakae2f92de2017-11-11 13:06:26 +02001852 char *myptr;
1853 const char *bytesptr;
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001854 Py_buffer vbytes;
1855
1856 if (bytes == Py_None) {
1857 bytesptr = "\t\n\r\f\v ";
1858 byteslen = 6;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001859 }
1860 else {
Serhiy Storchaka3dd3e262015-02-03 01:25:42 +02001861 if (PyObject_GetBuffer(bytes, &vbytes, PyBUF_SIMPLE) != 0)
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001862 return NULL;
Serhiy Storchakae2f92de2017-11-11 13:06:26 +02001863 bytesptr = (const char *) vbytes.buf;
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001864 byteslen = vbytes.len;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001865 }
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +02001866 myptr = PyByteArray_AS_STRING(self);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001867 mysize = Py_SIZE(self);
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001868 left = lstrip_helper(myptr, mysize, bytesptr, byteslen);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001869 right = mysize;
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001870 if (bytes != Py_None)
1871 PyBuffer_Release(&vbytes);
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +02001872 return PyByteArray_FromStringAndSize(myptr + left, right - left);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001873}
1874
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001875/*[clinic input]
1876bytearray.rstrip
1877
1878 bytes: object = None
1879 /
1880
1881Strip trailing bytes contained in the argument.
1882
1883If the argument is omitted or None, strip trailing ASCII whitespace.
1884[clinic start generated code]*/
1885
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001886static PyObject *
1887bytearray_rstrip_impl(PyByteArrayObject *self, PyObject *bytes)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03001888/*[clinic end generated code: output=030e2fbd2f7276bd input=e728b994954cfd91]*/
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001889{
1890 Py_ssize_t right, mysize, byteslen;
Serhiy Storchakae2f92de2017-11-11 13:06:26 +02001891 char *myptr;
1892 const char *bytesptr;
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001893 Py_buffer vbytes;
1894
1895 if (bytes == Py_None) {
1896 bytesptr = "\t\n\r\f\v ";
1897 byteslen = 6;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001898 }
1899 else {
Serhiy Storchaka3dd3e262015-02-03 01:25:42 +02001900 if (PyObject_GetBuffer(bytes, &vbytes, PyBUF_SIMPLE) != 0)
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001901 return NULL;
Serhiy Storchakae2f92de2017-11-11 13:06:26 +02001902 bytesptr = (const char *) vbytes.buf;
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001903 byteslen = vbytes.len;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001904 }
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +02001905 myptr = PyByteArray_AS_STRING(self);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001906 mysize = Py_SIZE(self);
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001907 right = rstrip_helper(myptr, mysize, bytesptr, byteslen);
1908 if (bytes != Py_None)
1909 PyBuffer_Release(&vbytes);
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +02001910 return PyByteArray_FromStringAndSize(myptr, right);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001911}
1912
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001913/*[clinic input]
1914bytearray.decode
1915
1916 encoding: str(c_default="NULL") = 'utf-8'
1917 The encoding with which to decode the bytearray.
1918 errors: str(c_default="NULL") = 'strict'
1919 The error handling scheme to use for the handling of decoding errors.
1920 The default is 'strict' meaning that decoding errors raise a
1921 UnicodeDecodeError. Other possible values are 'ignore' and 'replace'
1922 as well as any other name registered with codecs.register_error that
1923 can handle UnicodeDecodeErrors.
1924
1925Decode the bytearray using the codec registered for encoding.
1926[clinic start generated code]*/
1927
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001928static PyObject *
Larry Hastings89964c42015-04-14 18:07:59 -04001929bytearray_decode_impl(PyByteArrayObject *self, const char *encoding,
1930 const char *errors)
1931/*[clinic end generated code: output=f57d43f4a00b42c5 input=f28d8f903020257b]*/
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001932{
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001933 if (encoding == NULL)
1934 encoding = PyUnicode_GetDefaultEncoding();
Martin v. Löwis0efea322014-07-27 17:29:17 +02001935 return PyUnicode_FromEncodedObject((PyObject*)self, encoding, errors);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001936}
1937
1938PyDoc_STRVAR(alloc_doc,
1939"B.__alloc__() -> int\n\
1940\n\
Georg Brandl17cb8a82008-05-30 08:20:09 +00001941Return the number of bytes actually allocated.");
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001942
1943static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05301944bytearray_alloc(PyByteArrayObject *self, PyObject *Py_UNUSED(ignored))
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001945{
1946 return PyLong_FromSsize_t(self->ob_alloc);
1947}
1948
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001949/*[clinic input]
1950bytearray.join
1951
1952 iterable_of_bytes: object
1953 /
1954
1955Concatenate any number of bytes/bytearray objects.
1956
1957The bytearray whose method is called is inserted in between each pair.
1958
1959The result is returned as a new bytearray object.
1960[clinic start generated code]*/
1961
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001962static PyObject *
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001963bytearray_join(PyByteArrayObject *self, PyObject *iterable_of_bytes)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03001964/*[clinic end generated code: output=a8516370bf68ae08 input=aba6b1f9b30fcb8e]*/
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001965{
Martin v. Löwis0efea322014-07-27 17:29:17 +02001966 return stringlib_bytes_join((PyObject*)self, iterable_of_bytes);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001967}
1968
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001969/*[clinic input]
1970bytearray.splitlines
Antoine Pitrouf2c54842010-01-13 08:07:53 +00001971
Serhiy Storchaka202fda52017-03-12 10:10:47 +02001972 keepends: bool(accept={int}) = False
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001973
1974Return a list of the lines in the bytearray, breaking at line boundaries.
1975
1976Line breaks are not included in the resulting list unless keepends is given and
1977true.
1978[clinic start generated code]*/
1979
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001980static PyObject *
1981bytearray_splitlines_impl(PyByteArrayObject *self, int keepends)
Serhiy Storchaka202fda52017-03-12 10:10:47 +02001982/*[clinic end generated code: output=4223c94b895f6ad9 input=99a27ad959b9cf6b]*/
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001983{
Antoine Pitrouf2c54842010-01-13 08:07:53 +00001984 return stringlib_splitlines(
1985 (PyObject*) self, PyByteArray_AS_STRING(self),
1986 PyByteArray_GET_SIZE(self), keepends
1987 );
1988}
1989
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001990/*[clinic input]
1991@classmethod
1992bytearray.fromhex
1993
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001994 string: unicode
1995 /
1996
1997Create a bytearray object from a string of hexadecimal numbers.
1998
1999Spaces between two numbers are accepted.
2000Example: bytearray.fromhex('B9 01EF') -> bytearray(b'\\xb9\\x01\\xef')
2001[clinic start generated code]*/
2002
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002003static PyObject *
Serhiy Storchaka0855e702016-07-01 17:22:31 +03002004bytearray_fromhex_impl(PyTypeObject *type, PyObject *string)
2005/*[clinic end generated code: output=8f0f0b6d30fb3ba0 input=f033a16d1fb21f48]*/
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002006{
Serhiy Storchaka0855e702016-07-01 17:22:31 +03002007 PyObject *result = _PyBytes_FromHex(string, type == &PyByteArray_Type);
2008 if (type != &PyByteArray_Type && result != NULL) {
Victor Stinnerde4ae3d2016-12-04 22:59:09 +01002009 Py_SETREF(result, PyObject_CallFunctionObjArgs((PyObject *)type,
2010 result, NULL));
Serhiy Storchaka0855e702016-07-01 17:22:31 +03002011 }
2012 return result;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002013}
2014
Gregory P. Smith8cb65692015-04-25 23:22:26 +00002015PyDoc_STRVAR(hex__doc__,
2016"B.hex() -> string\n\
2017\n\
2018Create a string of hexadecimal numbers from a bytearray object.\n\
2019Example: bytearray([0xb9, 0x01, 0xef]).hex() -> 'b901ef'.");
2020
2021static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05302022bytearray_hex(PyBytesObject *self, PyObject *Py_UNUSED(ignored))
Serhiy Storchakae09132f2016-07-03 13:57:48 +03002023{
2024 char* argbuf = PyByteArray_AS_STRING(self);
2025 Py_ssize_t arglen = PyByteArray_GET_SIZE(self);
2026 return _Py_strhex(argbuf, arglen);
2027}
2028
2029static PyObject *
Antoine Pitroub0e1f8b2011-12-05 20:40:08 +01002030_common_reduce(PyByteArrayObject *self, int proto)
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002031{
Antoine Pitroub0e1f8b2011-12-05 20:40:08 +01002032 PyObject *dict;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02002033 _Py_IDENTIFIER(__dict__);
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +02002034 char *buf;
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02002035
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02002036 dict = _PyObject_GetAttrId((PyObject *)self, &PyId___dict__);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002037 if (dict == NULL) {
2038 PyErr_Clear();
2039 dict = Py_None;
2040 Py_INCREF(dict);
2041 }
2042
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +02002043 buf = PyByteArray_AS_STRING(self);
Antoine Pitroub0e1f8b2011-12-05 20:40:08 +01002044 if (proto < 3) {
2045 /* use str based reduction for backwards compatibility with Python 2.x */
2046 PyObject *latin1;
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +02002047 if (Py_SIZE(self))
2048 latin1 = PyUnicode_DecodeLatin1(buf, Py_SIZE(self), NULL);
Antoine Pitroub0e1f8b2011-12-05 20:40:08 +01002049 else
2050 latin1 = PyUnicode_FromString("");
2051 return Py_BuildValue("(O(Ns)N)", Py_TYPE(self), latin1, "latin-1", dict);
2052 }
2053 else {
2054 /* use more efficient byte based reduction */
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +02002055 if (Py_SIZE(self)) {
2056 return Py_BuildValue("(O(y#)N)", Py_TYPE(self), buf, Py_SIZE(self), dict);
Antoine Pitroub0e1f8b2011-12-05 20:40:08 +01002057 }
2058 else {
2059 return Py_BuildValue("(O()N)", Py_TYPE(self), dict);
2060 }
2061 }
2062}
2063
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002064/*[clinic input]
2065bytearray.__reduce__ as bytearray_reduce
2066
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002067Return state information for pickling.
2068[clinic start generated code]*/
2069
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002070static PyObject *
2071bytearray_reduce_impl(PyByteArrayObject *self)
Serhiy Storchaka7a9579c2016-05-02 13:45:20 +03002072/*[clinic end generated code: output=52bf304086464cab input=44b5737ada62dd3f]*/
Antoine Pitroub0e1f8b2011-12-05 20:40:08 +01002073{
2074 return _common_reduce(self, 2);
2075}
2076
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002077/*[clinic input]
2078bytearray.__reduce_ex__ as bytearray_reduce_ex
2079
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002080 proto: int = 0
2081 /
2082
2083Return state information for pickling.
2084[clinic start generated code]*/
2085
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002086static PyObject *
2087bytearray_reduce_ex_impl(PyByteArrayObject *self, int proto)
Serhiy Storchaka7a9579c2016-05-02 13:45:20 +03002088/*[clinic end generated code: output=52eac33377197520 input=f129bc1a1aa151ee]*/
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002089{
Antoine Pitroub0e1f8b2011-12-05 20:40:08 +01002090 return _common_reduce(self, proto);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002091}
2092
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002093/*[clinic input]
2094bytearray.__sizeof__ as bytearray_sizeof
2095
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002096Returns the size of the bytearray object in memory, in bytes.
2097[clinic start generated code]*/
2098
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002099static PyObject *
2100bytearray_sizeof_impl(PyByteArrayObject *self)
Serhiy Storchaka7a9579c2016-05-02 13:45:20 +03002101/*[clinic end generated code: output=738abdd17951c427 input=e27320fd98a4bc5a]*/
Robert Schuppeniesfbe94c52008-07-14 10:13:31 +00002102{
Benjamin Petersonef3e4c22009-04-11 19:48:14 +00002103 Py_ssize_t res;
Robert Schuppeniesfbe94c52008-07-14 10:13:31 +00002104
Serhiy Storchaka5c4064e2015-12-19 20:05:25 +02002105 res = _PyObject_SIZE(Py_TYPE(self)) + self->ob_alloc * sizeof(char);
Benjamin Petersonef3e4c22009-04-11 19:48:14 +00002106 return PyLong_FromSsize_t(res);
Robert Schuppeniesfbe94c52008-07-14 10:13:31 +00002107}
2108
Benjamin Peterson153c70f2009-04-18 15:42:12 +00002109static PySequenceMethods bytearray_as_sequence = {
2110 (lenfunc)bytearray_length, /* sq_length */
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002111 (binaryfunc)PyByteArray_Concat, /* sq_concat */
Benjamin Peterson153c70f2009-04-18 15:42:12 +00002112 (ssizeargfunc)bytearray_repeat, /* sq_repeat */
2113 (ssizeargfunc)bytearray_getitem, /* sq_item */
2114 0, /* sq_slice */
2115 (ssizeobjargproc)bytearray_setitem, /* sq_ass_item */
2116 0, /* sq_ass_slice */
Serhiy Storchakae09132f2016-07-03 13:57:48 +03002117 (objobjproc)bytearray_contains, /* sq_contains */
Benjamin Peterson153c70f2009-04-18 15:42:12 +00002118 (binaryfunc)bytearray_iconcat, /* sq_inplace_concat */
2119 (ssizeargfunc)bytearray_irepeat, /* sq_inplace_repeat */
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002120};
2121
Benjamin Peterson153c70f2009-04-18 15:42:12 +00002122static PyMappingMethods bytearray_as_mapping = {
2123 (lenfunc)bytearray_length,
2124 (binaryfunc)bytearray_subscript,
2125 (objobjargproc)bytearray_ass_subscript,
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002126};
2127
Benjamin Peterson153c70f2009-04-18 15:42:12 +00002128static PyBufferProcs bytearray_as_buffer = {
2129 (getbufferproc)bytearray_getbuffer,
2130 (releasebufferproc)bytearray_releasebuffer,
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002131};
2132
2133static PyMethodDef
Benjamin Peterson153c70f2009-04-18 15:42:12 +00002134bytearray_methods[] = {
2135 {"__alloc__", (PyCFunction)bytearray_alloc, METH_NOARGS, alloc_doc},
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002136 BYTEARRAY_REDUCE_METHODDEF
2137 BYTEARRAY_REDUCE_EX_METHODDEF
2138 BYTEARRAY_SIZEOF_METHODDEF
2139 BYTEARRAY_APPEND_METHODDEF
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05302140 {"capitalize", stringlib_capitalize, METH_NOARGS,
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002141 _Py_capitalize__doc__},
Tal Einatc929df32018-07-06 13:17:38 +03002142 STRINGLIB_CENTER_METHODDEF
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002143 BYTEARRAY_CLEAR_METHODDEF
2144 BYTEARRAY_COPY_METHODDEF
Serhiy Storchakae09132f2016-07-03 13:57:48 +03002145 {"count", (PyCFunction)bytearray_count, METH_VARARGS,
Serhiy Storchakadd40fc32016-05-04 22:23:26 +03002146 _Py_count__doc__},
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002147 BYTEARRAY_DECODE_METHODDEF
Serhiy Storchakae09132f2016-07-03 13:57:48 +03002148 {"endswith", (PyCFunction)bytearray_endswith, METH_VARARGS,
Serhiy Storchakadd40fc32016-05-04 22:23:26 +03002149 _Py_endswith__doc__},
Tal Einatc929df32018-07-06 13:17:38 +03002150 STRINGLIB_EXPANDTABS_METHODDEF
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002151 BYTEARRAY_EXTEND_METHODDEF
Serhiy Storchakae09132f2016-07-03 13:57:48 +03002152 {"find", (PyCFunction)bytearray_find, METH_VARARGS,
Serhiy Storchakadd40fc32016-05-04 22:23:26 +03002153 _Py_find__doc__},
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002154 BYTEARRAY_FROMHEX_METHODDEF
Serhiy Storchakae09132f2016-07-03 13:57:48 +03002155 {"hex", (PyCFunction)bytearray_hex, METH_NOARGS, hex__doc__},
2156 {"index", (PyCFunction)bytearray_index, METH_VARARGS, _Py_index__doc__},
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002157 BYTEARRAY_INSERT_METHODDEF
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05302158 {"isalnum", stringlib_isalnum, METH_NOARGS,
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002159 _Py_isalnum__doc__},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05302160 {"isalpha", stringlib_isalpha, METH_NOARGS,
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002161 _Py_isalpha__doc__},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05302162 {"isascii", stringlib_isascii, METH_NOARGS,
INADA Naokia49ac992018-01-27 14:06:21 +09002163 _Py_isascii__doc__},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05302164 {"isdigit", stringlib_isdigit, METH_NOARGS,
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002165 _Py_isdigit__doc__},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05302166 {"islower", stringlib_islower, METH_NOARGS,
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002167 _Py_islower__doc__},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05302168 {"isspace", stringlib_isspace, METH_NOARGS,
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002169 _Py_isspace__doc__},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05302170 {"istitle", stringlib_istitle, METH_NOARGS,
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002171 _Py_istitle__doc__},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05302172 {"isupper", stringlib_isupper, METH_NOARGS,
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002173 _Py_isupper__doc__},
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002174 BYTEARRAY_JOIN_METHODDEF
Tal Einatc929df32018-07-06 13:17:38 +03002175 STRINGLIB_LJUST_METHODDEF
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05302176 {"lower", stringlib_lower, METH_NOARGS, _Py_lower__doc__},
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002177 BYTEARRAY_LSTRIP_METHODDEF
2178 BYTEARRAY_MAKETRANS_METHODDEF
2179 BYTEARRAY_PARTITION_METHODDEF
2180 BYTEARRAY_POP_METHODDEF
2181 BYTEARRAY_REMOVE_METHODDEF
2182 BYTEARRAY_REPLACE_METHODDEF
2183 BYTEARRAY_REVERSE_METHODDEF
Serhiy Storchakae09132f2016-07-03 13:57:48 +03002184 {"rfind", (PyCFunction)bytearray_rfind, METH_VARARGS, _Py_rfind__doc__},
2185 {"rindex", (PyCFunction)bytearray_rindex, METH_VARARGS, _Py_rindex__doc__},
Tal Einatc929df32018-07-06 13:17:38 +03002186 STRINGLIB_RJUST_METHODDEF
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002187 BYTEARRAY_RPARTITION_METHODDEF
2188 BYTEARRAY_RSPLIT_METHODDEF
2189 BYTEARRAY_RSTRIP_METHODDEF
2190 BYTEARRAY_SPLIT_METHODDEF
2191 BYTEARRAY_SPLITLINES_METHODDEF
Serhiy Storchakae09132f2016-07-03 13:57:48 +03002192 {"startswith", (PyCFunction)bytearray_startswith, METH_VARARGS ,
Serhiy Storchakadd40fc32016-05-04 22:23:26 +03002193 _Py_startswith__doc__},
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002194 BYTEARRAY_STRIP_METHODDEF
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05302195 {"swapcase", stringlib_swapcase, METH_NOARGS,
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002196 _Py_swapcase__doc__},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05302197 {"title", stringlib_title, METH_NOARGS, _Py_title__doc__},
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002198 BYTEARRAY_TRANSLATE_METHODDEF
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05302199 {"upper", stringlib_upper, METH_NOARGS, _Py_upper__doc__},
Tal Einatc929df32018-07-06 13:17:38 +03002200 STRINGLIB_ZFILL_METHODDEF
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002201 {NULL}
2202};
2203
Ethan Furmanb95b5612015-01-23 20:05:18 -08002204static PyObject *
2205bytearray_mod(PyObject *v, PyObject *w)
2206{
2207 if (!PyByteArray_Check(v))
2208 Py_RETURN_NOTIMPLEMENTED;
Berker Peksag43de36d2016-04-16 01:20:47 +03002209 return _PyBytes_FormatEx(PyByteArray_AS_STRING(v), PyByteArray_GET_SIZE(v), w, 1);
Ethan Furmanb95b5612015-01-23 20:05:18 -08002210}
2211
2212static PyNumberMethods bytearray_as_number = {
2213 0, /*nb_add*/
2214 0, /*nb_subtract*/
2215 0, /*nb_multiply*/
2216 bytearray_mod, /*nb_remainder*/
2217};
2218
Benjamin Peterson153c70f2009-04-18 15:42:12 +00002219PyDoc_STRVAR(bytearray_doc,
Georg Brandl17cb8a82008-05-30 08:20:09 +00002220"bytearray(iterable_of_ints) -> bytearray\n\
2221bytearray(string, encoding[, errors]) -> bytearray\n\
Victor Stinnerbb2e9c42011-12-17 23:18:07 +01002222bytearray(bytes_or_buffer) -> mutable copy of bytes_or_buffer\n\
2223bytearray(int) -> bytes array of size given by the parameter initialized with null bytes\n\
2224bytearray() -> empty bytes array\n\
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002225\n\
Serhiy Storchaka6a7b3a72016-04-17 08:32:47 +03002226Construct a mutable bytearray object from:\n\
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002227 - an iterable yielding integers in range(256)\n\
2228 - a text string encoded using the specified encoding\n\
Victor Stinnerbb2e9c42011-12-17 23:18:07 +01002229 - a bytes or a buffer object\n\
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002230 - any object implementing the buffer API.\n\
Victor Stinnerbb2e9c42011-12-17 23:18:07 +01002231 - an integer");
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002232
2233
Benjamin Peterson153c70f2009-04-18 15:42:12 +00002234static PyObject *bytearray_iter(PyObject *seq);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002235
2236PyTypeObject PyByteArray_Type = {
2237 PyVarObject_HEAD_INIT(&PyType_Type, 0)
2238 "bytearray",
2239 sizeof(PyByteArrayObject),
2240 0,
Benjamin Peterson153c70f2009-04-18 15:42:12 +00002241 (destructor)bytearray_dealloc, /* tp_dealloc */
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002242 0, /* tp_print */
2243 0, /* tp_getattr */
2244 0, /* tp_setattr */
Mark Dickinsone94c6792009-02-02 20:36:42 +00002245 0, /* tp_reserved */
Benjamin Peterson153c70f2009-04-18 15:42:12 +00002246 (reprfunc)bytearray_repr, /* tp_repr */
Ethan Furmanb95b5612015-01-23 20:05:18 -08002247 &bytearray_as_number, /* tp_as_number */
Benjamin Peterson153c70f2009-04-18 15:42:12 +00002248 &bytearray_as_sequence, /* tp_as_sequence */
2249 &bytearray_as_mapping, /* tp_as_mapping */
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002250 0, /* tp_hash */
2251 0, /* tp_call */
Benjamin Peterson153c70f2009-04-18 15:42:12 +00002252 bytearray_str, /* tp_str */
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002253 PyObject_GenericGetAttr, /* tp_getattro */
2254 0, /* tp_setattro */
Benjamin Peterson153c70f2009-04-18 15:42:12 +00002255 &bytearray_as_buffer, /* tp_as_buffer */
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002256 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
Benjamin Peterson153c70f2009-04-18 15:42:12 +00002257 bytearray_doc, /* tp_doc */
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002258 0, /* tp_traverse */
2259 0, /* tp_clear */
Benjamin Peterson153c70f2009-04-18 15:42:12 +00002260 (richcmpfunc)bytearray_richcompare, /* tp_richcompare */
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002261 0, /* tp_weaklistoffset */
Benjamin Peterson153c70f2009-04-18 15:42:12 +00002262 bytearray_iter, /* tp_iter */
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002263 0, /* tp_iternext */
Benjamin Peterson153c70f2009-04-18 15:42:12 +00002264 bytearray_methods, /* tp_methods */
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002265 0, /* tp_members */
2266 0, /* tp_getset */
2267 0, /* tp_base */
2268 0, /* tp_dict */
2269 0, /* tp_descr_get */
2270 0, /* tp_descr_set */
2271 0, /* tp_dictoffset */
Benjamin Peterson153c70f2009-04-18 15:42:12 +00002272 (initproc)bytearray_init, /* tp_init */
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002273 PyType_GenericAlloc, /* tp_alloc */
2274 PyType_GenericNew, /* tp_new */
2275 PyObject_Del, /* tp_free */
2276};
2277
2278/*********************** Bytes Iterator ****************************/
2279
2280typedef struct {
2281 PyObject_HEAD
2282 Py_ssize_t it_index;
2283 PyByteArrayObject *it_seq; /* Set to NULL when iterator is exhausted */
2284} bytesiterobject;
2285
2286static void
Benjamin Peterson153c70f2009-04-18 15:42:12 +00002287bytearrayiter_dealloc(bytesiterobject *it)
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002288{
2289 _PyObject_GC_UNTRACK(it);
2290 Py_XDECREF(it->it_seq);
2291 PyObject_GC_Del(it);
2292}
2293
2294static int
Benjamin Peterson153c70f2009-04-18 15:42:12 +00002295bytearrayiter_traverse(bytesiterobject *it, visitproc visit, void *arg)
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002296{
2297 Py_VISIT(it->it_seq);
2298 return 0;
2299}
2300
2301static PyObject *
Benjamin Peterson153c70f2009-04-18 15:42:12 +00002302bytearrayiter_next(bytesiterobject *it)
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002303{
2304 PyByteArrayObject *seq;
2305 PyObject *item;
2306
2307 assert(it != NULL);
2308 seq = it->it_seq;
2309 if (seq == NULL)
2310 return NULL;
2311 assert(PyByteArray_Check(seq));
2312
2313 if (it->it_index < PyByteArray_GET_SIZE(seq)) {
2314 item = PyLong_FromLong(
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +02002315 (unsigned char)PyByteArray_AS_STRING(seq)[it->it_index]);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002316 if (item != NULL)
2317 ++it->it_index;
2318 return item;
2319 }
2320
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002321 it->it_seq = NULL;
Serhiy Storchakafbb1c5e2016-03-30 20:40:02 +03002322 Py_DECREF(seq);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002323 return NULL;
2324}
2325
2326static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05302327bytearrayiter_length_hint(bytesiterobject *it, PyObject *Py_UNUSED(ignored))
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002328{
2329 Py_ssize_t len = 0;
Serhiy Storchakaaf658722016-07-03 14:41:36 +03002330 if (it->it_seq) {
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002331 len = PyByteArray_GET_SIZE(it->it_seq) - it->it_index;
Serhiy Storchakaaf658722016-07-03 14:41:36 +03002332 if (len < 0) {
2333 len = 0;
2334 }
2335 }
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002336 return PyLong_FromSsize_t(len);
2337}
2338
2339PyDoc_STRVAR(length_hint_doc,
2340 "Private method returning an estimate of len(list(it)).");
2341
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00002342static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05302343bytearrayiter_reduce(bytesiterobject *it, PyObject *Py_UNUSED(ignored))
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00002344{
2345 if (it->it_seq != NULL) {
Antoine Pitroua7013882012-04-05 00:04:20 +02002346 return Py_BuildValue("N(O)n", _PyObject_GetBuiltin("iter"),
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00002347 it->it_seq, it->it_index);
2348 } else {
Serhiy Storchaka460bd0d2016-11-20 12:16:46 +02002349 return Py_BuildValue("N(())", _PyObject_GetBuiltin("iter"));
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00002350 }
2351}
2352
2353static PyObject *
2354bytearrayiter_setstate(bytesiterobject *it, PyObject *state)
2355{
2356 Py_ssize_t index = PyLong_AsSsize_t(state);
2357 if (index == -1 && PyErr_Occurred())
2358 return NULL;
Kristján Valur Jónsson25dded02014-03-05 13:47:57 +00002359 if (it->it_seq != NULL) {
2360 if (index < 0)
2361 index = 0;
2362 else if (index > PyByteArray_GET_SIZE(it->it_seq))
2363 index = PyByteArray_GET_SIZE(it->it_seq); /* iterator exhausted */
2364 it->it_index = index;
2365 }
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00002366 Py_RETURN_NONE;
2367}
2368
2369PyDoc_STRVAR(setstate_doc, "Set state information for unpickling.");
2370
Benjamin Peterson153c70f2009-04-18 15:42:12 +00002371static PyMethodDef bytearrayiter_methods[] = {
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00002372 {"__length_hint__", (PyCFunction)bytearrayiter_length_hint, METH_NOARGS,
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002373 length_hint_doc},
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00002374 {"__reduce__", (PyCFunction)bytearrayiter_reduce, METH_NOARGS,
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002375 bytearray_reduce__doc__},
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00002376 {"__setstate__", (PyCFunction)bytearrayiter_setstate, METH_O,
2377 setstate_doc},
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002378 {NULL, NULL} /* sentinel */
2379};
2380
2381PyTypeObject PyByteArrayIter_Type = {
2382 PyVarObject_HEAD_INIT(&PyType_Type, 0)
2383 "bytearray_iterator", /* tp_name */
2384 sizeof(bytesiterobject), /* tp_basicsize */
2385 0, /* tp_itemsize */
2386 /* methods */
Benjamin Peterson153c70f2009-04-18 15:42:12 +00002387 (destructor)bytearrayiter_dealloc, /* tp_dealloc */
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002388 0, /* tp_print */
2389 0, /* tp_getattr */
2390 0, /* tp_setattr */
Mark Dickinsone94c6792009-02-02 20:36:42 +00002391 0, /* tp_reserved */
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002392 0, /* tp_repr */
2393 0, /* tp_as_number */
2394 0, /* tp_as_sequence */
2395 0, /* tp_as_mapping */
2396 0, /* tp_hash */
2397 0, /* tp_call */
2398 0, /* tp_str */
2399 PyObject_GenericGetAttr, /* tp_getattro */
2400 0, /* tp_setattro */
2401 0, /* tp_as_buffer */
2402 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC, /* tp_flags */
2403 0, /* tp_doc */
Benjamin Peterson153c70f2009-04-18 15:42:12 +00002404 (traverseproc)bytearrayiter_traverse, /* tp_traverse */
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002405 0, /* tp_clear */
2406 0, /* tp_richcompare */
2407 0, /* tp_weaklistoffset */
2408 PyObject_SelfIter, /* tp_iter */
Benjamin Peterson153c70f2009-04-18 15:42:12 +00002409 (iternextfunc)bytearrayiter_next, /* tp_iternext */
2410 bytearrayiter_methods, /* tp_methods */
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002411 0,
2412};
2413
2414static PyObject *
Benjamin Peterson153c70f2009-04-18 15:42:12 +00002415bytearray_iter(PyObject *seq)
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002416{
2417 bytesiterobject *it;
2418
2419 if (!PyByteArray_Check(seq)) {
2420 PyErr_BadInternalCall();
2421 return NULL;
2422 }
2423 it = PyObject_GC_New(bytesiterobject, &PyByteArrayIter_Type);
2424 if (it == NULL)
2425 return NULL;
2426 it->it_index = 0;
2427 Py_INCREF(seq);
2428 it->it_seq = (PyByteArrayObject *)seq;
2429 _PyObject_GC_TRACK(it);
2430 return (PyObject *)it;
2431}