blob: 692b7be739245579607c6c7b05cac88ed288355f [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{
Alexander Belopolskyf0f45142010-08-11 17:31:17 +00001002 if (Py_BytesWarningFlag) {
1003 if (PyErr_WarnEx(PyExc_BytesWarning,
1004 "str() on a bytearray instance", 1))
1005 return NULL;
1006 }
1007 return bytearray_repr((PyByteArrayObject*)op);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001008}
1009
1010static PyObject *
Benjamin Peterson153c70f2009-04-18 15:42:12 +00001011bytearray_richcompare(PyObject *self, PyObject *other, int op)
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001012{
1013 Py_ssize_t self_size, other_size;
1014 Py_buffer self_bytes, other_bytes;
Serhiy Storchakafa494fd2015-05-30 17:45:22 +03001015 int cmp, rc;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001016
1017 /* Bytes can be compared to anything that supports the (binary)
1018 buffer API. Except that a comparison with Unicode is always an
1019 error, even if the comparison is for equality. */
Serhiy Storchakafa494fd2015-05-30 17:45:22 +03001020 rc = PyObject_IsInstance(self, (PyObject*)&PyUnicode_Type);
1021 if (!rc)
1022 rc = PyObject_IsInstance(other, (PyObject*)&PyUnicode_Type);
1023 if (rc < 0)
1024 return NULL;
1025 if (rc) {
Barry Warsaw9e9dcd62008-10-17 01:50:37 +00001026 if (Py_BytesWarningFlag && (op == Py_EQ || op == Py_NE)) {
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001027 if (PyErr_WarnEx(PyExc_BytesWarning,
Georg Brandle5d68ac2008-06-04 11:30:26 +00001028 "Comparison between bytearray and string", 1))
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001029 return NULL;
1030 }
1031
Brian Curtindfc80e32011-08-10 20:28:54 -05001032 Py_RETURN_NOTIMPLEMENTED;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001033 }
1034
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +02001035 if (PyObject_GetBuffer(self, &self_bytes, PyBUF_SIMPLE) != 0) {
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001036 PyErr_Clear();
Brian Curtindfc80e32011-08-10 20:28:54 -05001037 Py_RETURN_NOTIMPLEMENTED;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001038 }
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +02001039 self_size = self_bytes.len;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001040
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +02001041 if (PyObject_GetBuffer(other, &other_bytes, PyBUF_SIMPLE) != 0) {
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001042 PyErr_Clear();
Martin v. Löwis423be952008-08-13 15:53:07 +00001043 PyBuffer_Release(&self_bytes);
Brian Curtindfc80e32011-08-10 20:28:54 -05001044 Py_RETURN_NOTIMPLEMENTED;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001045 }
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +02001046 other_size = other_bytes.len;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001047
1048 if (self_size != other_size && (op == Py_EQ || op == Py_NE)) {
1049 /* Shortcut: if the lengths differ, the objects differ */
stratakise8b19652017-11-02 11:32:54 +01001050 PyBuffer_Release(&self_bytes);
1051 PyBuffer_Release(&other_bytes);
1052 return PyBool_FromLong((op == Py_NE));
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001053 }
1054 else {
stratakise8b19652017-11-02 11:32:54 +01001055 cmp = memcmp(self_bytes.buf, other_bytes.buf,
1056 Py_MIN(self_size, other_size));
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001057 /* In ISO C, memcmp() guarantees to use unsigned bytes! */
1058
stratakise8b19652017-11-02 11:32:54 +01001059 PyBuffer_Release(&self_bytes);
1060 PyBuffer_Release(&other_bytes);
1061
1062 if (cmp != 0) {
1063 Py_RETURN_RICHCOMPARE(cmp, 0, op);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001064 }
1065
stratakise8b19652017-11-02 11:32:54 +01001066 Py_RETURN_RICHCOMPARE(self_size, other_size, op);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001067 }
1068
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001069}
1070
1071static void
Benjamin Peterson153c70f2009-04-18 15:42:12 +00001072bytearray_dealloc(PyByteArrayObject *self)
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001073{
Benjamin Petersone0124bd2009-03-09 21:04:33 +00001074 if (self->ob_exports > 0) {
1075 PyErr_SetString(PyExc_SystemError,
Benjamin Petersonef3e4c22009-04-11 19:48:14 +00001076 "deallocated bytearray object has exported buffers");
Benjamin Petersone0124bd2009-03-09 21:04:33 +00001077 PyErr_Print();
1078 }
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001079 if (self->ob_bytes != 0) {
Antoine Pitrou39aba4f2011-11-12 21:15:28 +01001080 PyObject_Free(self->ob_bytes);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001081 }
1082 Py_TYPE(self)->tp_free((PyObject *)self);
1083}
1084
1085
1086/* -------------------------------------------------------------------- */
1087/* Methods */
1088
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02001089#define FASTSEARCH fastsearch
1090#define STRINGLIB(F) stringlib_##F
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001091#define STRINGLIB_CHAR char
Antoine Pitroucfc22b42012-10-16 21:07:23 +02001092#define STRINGLIB_SIZEOF_CHAR 1
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001093#define STRINGLIB_LEN PyByteArray_GET_SIZE
1094#define STRINGLIB_STR PyByteArray_AS_STRING
1095#define STRINGLIB_NEW PyByteArray_FromStringAndSize
Antoine Pitrouf2c54842010-01-13 08:07:53 +00001096#define STRINGLIB_ISSPACE Py_ISSPACE
1097#define STRINGLIB_ISLINEBREAK(x) ((x == '\n') || (x == '\r'))
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001098#define STRINGLIB_CHECK_EXACT PyByteArray_CheckExact
1099#define STRINGLIB_MUTABLE 1
1100
1101#include "stringlib/fastsearch.h"
1102#include "stringlib/count.h"
1103#include "stringlib/find.h"
Antoine Pitroucfc22b42012-10-16 21:07:23 +02001104#include "stringlib/join.h"
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001105#include "stringlib/partition.h"
Antoine Pitrouf2c54842010-01-13 08:07:53 +00001106#include "stringlib/split.h"
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001107#include "stringlib/ctype.h"
1108#include "stringlib/transmogrify.h"
1109
1110
Serhiy Storchakae09132f2016-07-03 13:57:48 +03001111static PyObject *
1112bytearray_find(PyByteArrayObject *self, PyObject *args)
1113{
1114 return _Py_bytes_find(PyByteArray_AS_STRING(self), PyByteArray_GET_SIZE(self), args);
1115}
1116
1117static PyObject *
1118bytearray_count(PyByteArrayObject *self, PyObject *args)
1119{
1120 return _Py_bytes_count(PyByteArray_AS_STRING(self), PyByteArray_GET_SIZE(self), args);
1121}
1122
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001123/*[clinic input]
1124bytearray.clear
1125
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001126Remove all items from the bytearray.
1127[clinic start generated code]*/
1128
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001129static PyObject *
1130bytearray_clear_impl(PyByteArrayObject *self)
Serhiy Storchaka7a9579c2016-05-02 13:45:20 +03001131/*[clinic end generated code: output=85c2fe6aede0956c input=ed6edae9de447ac4]*/
Eli Bendersky4db28d32011-03-03 18:21:02 +00001132{
1133 if (PyByteArray_Resize((PyObject *)self, 0) < 0)
1134 return NULL;
1135 Py_RETURN_NONE;
1136}
1137
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001138/*[clinic input]
1139bytearray.copy
1140
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001141Return a copy of B.
1142[clinic start generated code]*/
1143
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001144static PyObject *
1145bytearray_copy_impl(PyByteArrayObject *self)
Serhiy Storchaka7a9579c2016-05-02 13:45:20 +03001146/*[clinic end generated code: output=68cfbcfed484c132 input=6597b0c01bccaa9e]*/
Eli Bendersky4db28d32011-03-03 18:21:02 +00001147{
1148 return PyByteArray_FromStringAndSize(PyByteArray_AS_STRING((PyObject *)self),
1149 PyByteArray_GET_SIZE(self));
1150}
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001151
Serhiy Storchakae09132f2016-07-03 13:57:48 +03001152static PyObject *
1153bytearray_index(PyByteArrayObject *self, PyObject *args)
1154{
1155 return _Py_bytes_index(PyByteArray_AS_STRING(self), PyByteArray_GET_SIZE(self), args);
1156}
1157
1158static PyObject *
1159bytearray_rfind(PyByteArrayObject *self, PyObject *args)
1160{
1161 return _Py_bytes_rfind(PyByteArray_AS_STRING(self), PyByteArray_GET_SIZE(self), args);
1162}
1163
1164static PyObject *
1165bytearray_rindex(PyByteArrayObject *self, PyObject *args)
1166{
1167 return _Py_bytes_rindex(PyByteArray_AS_STRING(self), PyByteArray_GET_SIZE(self), args);
1168}
1169
1170static int
1171bytearray_contains(PyObject *self, PyObject *arg)
1172{
1173 return _Py_bytes_contains(PyByteArray_AS_STRING(self), PyByteArray_GET_SIZE(self), arg);
1174}
1175
1176static PyObject *
1177bytearray_startswith(PyByteArrayObject *self, PyObject *args)
1178{
1179 return _Py_bytes_startswith(PyByteArray_AS_STRING(self), PyByteArray_GET_SIZE(self), args);
1180}
1181
1182static PyObject *
1183bytearray_endswith(PyByteArrayObject *self, PyObject *args)
1184{
1185 return _Py_bytes_endswith(PyByteArray_AS_STRING(self), PyByteArray_GET_SIZE(self), args);
1186}
1187
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001188
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001189/*[clinic input]
1190bytearray.translate
1191
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001192 table: object
1193 Translation table, which must be a bytes object of length 256.
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001194 /
Martin Panter1b6c6da2016-08-27 08:35:02 +00001195 delete as deletechars: object(c_default="NULL") = b''
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001196
1197Return a copy with each character mapped by the given translation table.
1198
Martin Panter1b6c6da2016-08-27 08:35:02 +00001199All characters occurring in the optional argument delete are removed.
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001200The remaining characters are mapped through the given translation table.
1201[clinic start generated code]*/
1202
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001203static PyObject *
Larry Hastings89964c42015-04-14 18:07:59 -04001204bytearray_translate_impl(PyByteArrayObject *self, PyObject *table,
Martin Panter1b6c6da2016-08-27 08:35:02 +00001205 PyObject *deletechars)
1206/*[clinic end generated code: output=b6a8f01c2a74e446 input=cfff956d4d127a9b]*/
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001207{
Antoine Pitrou9ed5f272013-08-13 20:18:52 +02001208 char *input, *output;
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001209 const char *table_chars;
Antoine Pitrou9ed5f272013-08-13 20:18:52 +02001210 Py_ssize_t i, c;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001211 PyObject *input_obj = (PyObject*)self;
1212 const char *output_start;
1213 Py_ssize_t inlen;
Georg Brandlccc47b62008-12-28 11:44:14 +00001214 PyObject *result = NULL;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001215 int trans_table[256];
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001216 Py_buffer vtable, vdel;
1217
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001218 if (table == Py_None) {
1219 table_chars = NULL;
Georg Brandlccc47b62008-12-28 11:44:14 +00001220 table = NULL;
Serhiy Storchaka3dd3e262015-02-03 01:25:42 +02001221 } else if (PyObject_GetBuffer(table, &vtable, PyBUF_SIMPLE) != 0) {
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001222 return NULL;
Georg Brandlccc47b62008-12-28 11:44:14 +00001223 } else {
1224 if (vtable.len != 256) {
1225 PyErr_SetString(PyExc_ValueError,
1226 "translation table must be 256 characters long");
Georg Brandl953152f2009-07-22 12:03:59 +00001227 PyBuffer_Release(&vtable);
1228 return NULL;
Georg Brandlccc47b62008-12-28 11:44:14 +00001229 }
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001230 table_chars = (const char*)vtable.buf;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001231 }
1232
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001233 if (deletechars != NULL) {
Serhiy Storchaka3dd3e262015-02-03 01:25:42 +02001234 if (PyObject_GetBuffer(deletechars, &vdel, PyBUF_SIMPLE) != 0) {
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001235 if (table != NULL)
Georg Brandl953152f2009-07-22 12:03:59 +00001236 PyBuffer_Release(&vtable);
1237 return NULL;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001238 }
1239 }
1240 else {
1241 vdel.buf = NULL;
1242 vdel.len = 0;
1243 }
1244
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001245 inlen = PyByteArray_GET_SIZE(input_obj);
1246 result = PyByteArray_FromStringAndSize((char *)NULL, inlen);
1247 if (result == NULL)
1248 goto done;
Serhiy Storchakadd40fc32016-05-04 22:23:26 +03001249 output_start = output = PyByteArray_AS_STRING(result);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001250 input = PyByteArray_AS_STRING(input_obj);
1251
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001252 if (vdel.len == 0 && table_chars != NULL) {
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001253 /* If no deletions are required, use faster code */
1254 for (i = inlen; --i >= 0; ) {
1255 c = Py_CHARMASK(*input++);
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001256 *output++ = table_chars[c];
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001257 }
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001258 goto done;
1259 }
Georg Brandlccc47b62008-12-28 11:44:14 +00001260
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001261 if (table_chars == NULL) {
Georg Brandlccc47b62008-12-28 11:44:14 +00001262 for (i = 0; i < 256; i++)
1263 trans_table[i] = Py_CHARMASK(i);
1264 } else {
1265 for (i = 0; i < 256; i++)
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001266 trans_table[i] = Py_CHARMASK(table_chars[i]);
Georg Brandlccc47b62008-12-28 11:44:14 +00001267 }
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001268
1269 for (i = 0; i < vdel.len; i++)
1270 trans_table[(int) Py_CHARMASK( ((unsigned char*)vdel.buf)[i] )] = -1;
1271
1272 for (i = inlen; --i >= 0; ) {
1273 c = Py_CHARMASK(*input++);
1274 if (trans_table[c] != -1)
Martin Panter1b6c6da2016-08-27 08:35:02 +00001275 *output++ = (char)trans_table[c];
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001276 }
1277 /* Fix the size of the resulting string */
1278 if (inlen > 0)
Christian Heimesc731bbe2013-07-21 02:04:35 +02001279 if (PyByteArray_Resize(result, output - output_start) < 0) {
1280 Py_CLEAR(result);
1281 goto done;
1282 }
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001283
1284done:
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001285 if (table != NULL)
Georg Brandlccc47b62008-12-28 11:44:14 +00001286 PyBuffer_Release(&vtable);
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001287 if (deletechars != NULL)
Martin v. Löwis423be952008-08-13 15:53:07 +00001288 PyBuffer_Release(&vdel);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001289 return result;
1290}
1291
1292
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001293/*[clinic input]
1294
1295@staticmethod
1296bytearray.maketrans
1297
Serhiy Storchaka3dd3e262015-02-03 01:25:42 +02001298 frm: Py_buffer
1299 to: Py_buffer
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001300 /
1301
1302Return a translation table useable for the bytes or bytearray translate method.
1303
1304The returned table will be one where each byte in frm is mapped to the byte at
1305the same position in to.
1306
1307The bytes objects frm and to must be of the same length.
1308[clinic start generated code]*/
1309
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001310static PyObject *
Serhiy Storchaka3dd3e262015-02-03 01:25:42 +02001311bytearray_maketrans_impl(Py_buffer *frm, Py_buffer *to)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03001312/*[clinic end generated code: output=1df267d99f56b15e input=5925a81d2fbbf151]*/
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001313{
1314 return _Py_bytes_maketrans(frm, to);
Georg Brandlabc38772009-04-12 15:51:51 +00001315}
1316
1317
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001318/*[clinic input]
1319bytearray.replace
1320
Serhiy Storchaka3dd3e262015-02-03 01:25:42 +02001321 old: Py_buffer
1322 new: Py_buffer
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001323 count: Py_ssize_t = -1
1324 Maximum number of occurrences to replace.
1325 -1 (the default value) means replace all occurrences.
1326 /
1327
1328Return a copy with all occurrences of substring old replaced by new.
1329
1330If the optional argument count is given, only the first count occurrences are
1331replaced.
1332[clinic start generated code]*/
1333
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001334static PyObject *
Larry Hastings89964c42015-04-14 18:07:59 -04001335bytearray_replace_impl(PyByteArrayObject *self, Py_buffer *old,
1336 Py_buffer *new, Py_ssize_t count)
1337/*[clinic end generated code: output=d39884c4dc59412a input=aa379d988637c7fb]*/
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001338{
Serhiy Storchakafb81d3c2016-05-05 09:26:07 +03001339 return stringlib_replace((PyObject *)self,
Serhiy Storchakae09132f2016-07-03 13:57:48 +03001340 (const char *)old->buf, old->len,
1341 (const char *)new->buf, new->len, count);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001342}
1343
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001344/*[clinic input]
1345bytearray.split
1346
1347 sep: object = None
1348 The delimiter according which to split the bytearray.
1349 None (the default value) means split on ASCII whitespace characters
1350 (space, tab, return, newline, formfeed, vertical tab).
1351 maxsplit: Py_ssize_t = -1
1352 Maximum number of splits to do.
1353 -1 (the default value) means no limit.
1354
1355Return a list of the sections in the bytearray, using sep as the delimiter.
1356[clinic start generated code]*/
1357
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001358static PyObject *
Larry Hastings89964c42015-04-14 18:07:59 -04001359bytearray_split_impl(PyByteArrayObject *self, PyObject *sep,
1360 Py_ssize_t maxsplit)
1361/*[clinic end generated code: output=833e2cf385d9a04d input=24f82669f41bf523]*/
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001362{
1363 Py_ssize_t len = PyByteArray_GET_SIZE(self), n;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001364 const char *s = PyByteArray_AS_STRING(self), *sub;
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001365 PyObject *list;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001366 Py_buffer vsub;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001367
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001368 if (maxsplit < 0)
1369 maxsplit = PY_SSIZE_T_MAX;
1370
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001371 if (sep == Py_None)
Antoine Pitrouf2c54842010-01-13 08:07:53 +00001372 return stringlib_split_whitespace((PyObject*) self, s, len, maxsplit);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001373
Serhiy Storchaka3dd3e262015-02-03 01:25:42 +02001374 if (PyObject_GetBuffer(sep, &vsub, PyBUF_SIMPLE) != 0)
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001375 return NULL;
1376 sub = vsub.buf;
1377 n = vsub.len;
1378
Antoine Pitrouf2c54842010-01-13 08:07:53 +00001379 list = stringlib_split(
1380 (PyObject*) self, s, len, sub, n, maxsplit
1381 );
Martin v. Löwis423be952008-08-13 15:53:07 +00001382 PyBuffer_Release(&vsub);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001383 return list;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001384}
1385
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001386/*[clinic input]
1387bytearray.partition
1388
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001389 sep: object
1390 /
1391
1392Partition the bytearray into three parts using the given separator.
1393
1394This will search for the separator sep in the bytearray. If the separator is
1395found, returns a 3-tuple containing the part before the separator, the
Serhiy Storchakaa2314282017-10-29 02:11:54 +03001396separator itself, and the part after it as new bytearray objects.
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001397
Serhiy Storchakaa2314282017-10-29 02:11:54 +03001398If the separator is not found, returns a 3-tuple containing the copy of the
1399original bytearray object and two empty bytearray objects.
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001400[clinic start generated code]*/
1401
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001402static PyObject *
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001403bytearray_partition(PyByteArrayObject *self, PyObject *sep)
Serhiy Storchakaa2314282017-10-29 02:11:54 +03001404/*[clinic end generated code: output=45d2525ddd35f957 input=8f644749ee4fc83a]*/
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001405{
1406 PyObject *bytesep, *result;
1407
Serhiy Storchakaa2314282017-10-29 02:11:54 +03001408 bytesep = _PyByteArray_FromBufferObject(sep);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001409 if (! bytesep)
1410 return NULL;
1411
1412 result = stringlib_partition(
1413 (PyObject*) self,
1414 PyByteArray_AS_STRING(self), PyByteArray_GET_SIZE(self),
1415 bytesep,
1416 PyByteArray_AS_STRING(bytesep), PyByteArray_GET_SIZE(bytesep)
1417 );
1418
1419 Py_DECREF(bytesep);
Antoine Pitrouf2c54842010-01-13 08:07:53 +00001420 return result;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001421}
1422
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001423/*[clinic input]
1424bytearray.rpartition
1425
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001426 sep: object
1427 /
1428
Serhiy Storchakaa2314282017-10-29 02:11:54 +03001429Partition the bytearray into three parts using the given separator.
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001430
Serhiy Storchakaa2314282017-10-29 02:11:54 +03001431This will search for the separator sep in the bytearray, starting at the end.
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001432If the separator is found, returns a 3-tuple containing the part before the
Serhiy Storchakaa2314282017-10-29 02:11:54 +03001433separator, the separator itself, and the part after it as new bytearray
1434objects.
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001435
1436If the separator is not found, returns a 3-tuple containing two empty bytearray
Serhiy Storchakaa2314282017-10-29 02:11:54 +03001437objects and the copy of the original bytearray object.
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001438[clinic start generated code]*/
1439
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001440static PyObject *
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001441bytearray_rpartition(PyByteArrayObject *self, PyObject *sep)
Serhiy Storchakaa2314282017-10-29 02:11:54 +03001442/*[clinic end generated code: output=440de3c9426115e8 input=7e3df3e6cb8fa0ac]*/
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001443{
1444 PyObject *bytesep, *result;
1445
Serhiy Storchakaa2314282017-10-29 02:11:54 +03001446 bytesep = _PyByteArray_FromBufferObject(sep);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001447 if (! bytesep)
1448 return NULL;
1449
1450 result = stringlib_rpartition(
1451 (PyObject*) self,
1452 PyByteArray_AS_STRING(self), PyByteArray_GET_SIZE(self),
1453 bytesep,
1454 PyByteArray_AS_STRING(bytesep), PyByteArray_GET_SIZE(bytesep)
1455 );
1456
1457 Py_DECREF(bytesep);
Antoine Pitrouf2c54842010-01-13 08:07:53 +00001458 return result;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001459}
1460
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001461/*[clinic input]
1462bytearray.rsplit = bytearray.split
1463
1464Return a list of the sections in the bytearray, using sep as the delimiter.
1465
1466Splitting is done starting at the end of the bytearray and working to the front.
1467[clinic start generated code]*/
1468
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001469static PyObject *
Larry Hastings89964c42015-04-14 18:07:59 -04001470bytearray_rsplit_impl(PyByteArrayObject *self, PyObject *sep,
1471 Py_ssize_t maxsplit)
1472/*[clinic end generated code: output=a55e0b5a03cb6190 input=a68286e4dd692ffe]*/
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001473{
1474 Py_ssize_t len = PyByteArray_GET_SIZE(self), n;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001475 const char *s = PyByteArray_AS_STRING(self), *sub;
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001476 PyObject *list;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001477 Py_buffer vsub;
1478
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001479 if (maxsplit < 0)
1480 maxsplit = PY_SSIZE_T_MAX;
1481
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001482 if (sep == Py_None)
Antoine Pitrouf2c54842010-01-13 08:07:53 +00001483 return stringlib_rsplit_whitespace((PyObject*) self, s, len, maxsplit);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001484
Serhiy Storchaka3dd3e262015-02-03 01:25:42 +02001485 if (PyObject_GetBuffer(sep, &vsub, PyBUF_SIMPLE) != 0)
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001486 return NULL;
1487 sub = vsub.buf;
1488 n = vsub.len;
1489
Antoine Pitrouf2c54842010-01-13 08:07:53 +00001490 list = stringlib_rsplit(
1491 (PyObject*) self, s, len, sub, n, maxsplit
1492 );
Martin v. Löwis423be952008-08-13 15:53:07 +00001493 PyBuffer_Release(&vsub);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001494 return list;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001495}
1496
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001497/*[clinic input]
1498bytearray.reverse
1499
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001500Reverse the order of the values in B in place.
1501[clinic start generated code]*/
1502
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001503static PyObject *
1504bytearray_reverse_impl(PyByteArrayObject *self)
Serhiy Storchaka7a9579c2016-05-02 13:45:20 +03001505/*[clinic end generated code: output=9f7616f29ab309d3 input=543356319fc78557]*/
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001506{
1507 char swap, *head, *tail;
1508 Py_ssize_t i, j, n = Py_SIZE(self);
1509
1510 j = n / 2;
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +02001511 head = PyByteArray_AS_STRING(self);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001512 tail = head + n - 1;
1513 for (i = 0; i < j; i++) {
1514 swap = *head;
1515 *head++ = *tail;
1516 *tail-- = swap;
1517 }
1518
1519 Py_RETURN_NONE;
1520}
1521
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001522
1523/*[python input]
1524class bytesvalue_converter(CConverter):
1525 type = 'int'
1526 converter = '_getbytevalue'
1527[python start generated code]*/
1528/*[python end generated code: output=da39a3ee5e6b4b0d input=29c2e7c26c212812]*/
1529
1530
1531/*[clinic input]
1532bytearray.insert
1533
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001534 index: Py_ssize_t
1535 The index where the value is to be inserted.
1536 item: bytesvalue
1537 The item to be inserted.
1538 /
1539
1540Insert a single item into the bytearray before the given index.
1541[clinic start generated code]*/
1542
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001543static PyObject *
1544bytearray_insert_impl(PyByteArrayObject *self, Py_ssize_t index, int item)
Serhiy Storchaka7a9579c2016-05-02 13:45:20 +03001545/*[clinic end generated code: output=76c775a70e7b07b7 input=b2b5d07e9de6c070]*/
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001546{
1547 Py_ssize_t n = Py_SIZE(self);
1548 char *buf;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001549
1550 if (n == PY_SSIZE_T_MAX) {
1551 PyErr_SetString(PyExc_OverflowError,
Mark Dickinson2b6705f2009-09-06 10:34:47 +00001552 "cannot add more objects to bytearray");
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001553 return NULL;
1554 }
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001555 if (PyByteArray_Resize((PyObject *)self, n + 1) < 0)
1556 return NULL;
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +02001557 buf = PyByteArray_AS_STRING(self);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001558
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001559 if (index < 0) {
1560 index += n;
1561 if (index < 0)
1562 index = 0;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001563 }
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001564 if (index > n)
1565 index = n;
1566 memmove(buf + index + 1, buf + index, n - index);
1567 buf[index] = item;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001568
1569 Py_RETURN_NONE;
1570}
1571
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001572/*[clinic input]
1573bytearray.append
1574
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001575 item: bytesvalue
1576 The item to be appended.
1577 /
1578
1579Append a single item to the end of the bytearray.
1580[clinic start generated code]*/
1581
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001582static PyObject *
1583bytearray_append_impl(PyByteArrayObject *self, int item)
Serhiy Storchaka7a9579c2016-05-02 13:45:20 +03001584/*[clinic end generated code: output=a154e19ed1886cb6 input=20d6bec3d1340593]*/
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001585{
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001586 Py_ssize_t n = Py_SIZE(self);
1587
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001588 if (n == PY_SSIZE_T_MAX) {
1589 PyErr_SetString(PyExc_OverflowError,
Mark Dickinson2b6705f2009-09-06 10:34:47 +00001590 "cannot add more objects to bytearray");
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001591 return NULL;
1592 }
1593 if (PyByteArray_Resize((PyObject *)self, n + 1) < 0)
1594 return NULL;
1595
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001596 PyByteArray_AS_STRING(self)[n] = item;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001597
1598 Py_RETURN_NONE;
1599}
1600
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001601/*[clinic input]
1602bytearray.extend
1603
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001604 iterable_of_ints: object
1605 The iterable of items to append.
1606 /
1607
1608Append all the items from the iterator or sequence to the end of the bytearray.
1609[clinic start generated code]*/
1610
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001611static PyObject *
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001612bytearray_extend(PyByteArrayObject *self, PyObject *iterable_of_ints)
Serhiy Storchaka7a9579c2016-05-02 13:45:20 +03001613/*[clinic end generated code: output=98155dbe249170b1 input=c617b3a93249ba28]*/
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001614{
Benjamin Peterson153c70f2009-04-18 15:42:12 +00001615 PyObject *it, *item, *bytearray_obj;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001616 Py_ssize_t buf_size = 0, len = 0;
1617 int value;
1618 char *buf;
1619
Benjamin Peterson153c70f2009-04-18 15:42:12 +00001620 /* bytearray_setslice code only accepts something supporting PEP 3118. */
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001621 if (PyObject_CheckBuffer(iterable_of_ints)) {
1622 if (bytearray_setslice(self, Py_SIZE(self), Py_SIZE(self), iterable_of_ints) == -1)
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001623 return NULL;
1624
1625 Py_RETURN_NONE;
1626 }
1627
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001628 it = PyObject_GetIter(iterable_of_ints);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001629 if (it == NULL)
1630 return NULL;
1631
Ezio Melotti42da6632011-03-15 05:18:48 +02001632 /* Try to determine the length of the argument. 32 is arbitrary. */
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001633 buf_size = PyObject_LengthHint(iterable_of_ints, 32);
Benjamin Petersonef3e4c22009-04-11 19:48:14 +00001634 if (buf_size == -1) {
1635 Py_DECREF(it);
1636 return NULL;
1637 }
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001638
Benjamin Peterson153c70f2009-04-18 15:42:12 +00001639 bytearray_obj = PyByteArray_FromStringAndSize(NULL, buf_size);
Antoine Pitrou58bb82e2012-04-01 16:05:46 +02001640 if (bytearray_obj == NULL) {
1641 Py_DECREF(it);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001642 return NULL;
Antoine Pitrou58bb82e2012-04-01 16:05:46 +02001643 }
Benjamin Peterson153c70f2009-04-18 15:42:12 +00001644 buf = PyByteArray_AS_STRING(bytearray_obj);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001645
1646 while ((item = PyIter_Next(it)) != NULL) {
1647 if (! _getbytevalue(item, &value)) {
1648 Py_DECREF(item);
1649 Py_DECREF(it);
Benjamin Peterson153c70f2009-04-18 15:42:12 +00001650 Py_DECREF(bytearray_obj);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001651 return NULL;
1652 }
1653 buf[len++] = value;
1654 Py_DECREF(item);
1655
1656 if (len >= buf_size) {
Martin Panter371731e2016-07-18 07:53:13 +00001657 Py_ssize_t addition;
1658 if (len == PY_SSIZE_T_MAX) {
1659 Py_DECREF(it);
1660 Py_DECREF(bytearray_obj);
1661 return PyErr_NoMemory();
1662 }
1663 addition = len >> 1;
1664 if (addition > PY_SSIZE_T_MAX - len - 1)
1665 buf_size = PY_SSIZE_T_MAX;
1666 else
1667 buf_size = len + addition + 1;
Benjamin Peterson153c70f2009-04-18 15:42:12 +00001668 if (PyByteArray_Resize((PyObject *)bytearray_obj, buf_size) < 0) {
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001669 Py_DECREF(it);
Benjamin Peterson153c70f2009-04-18 15:42:12 +00001670 Py_DECREF(bytearray_obj);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001671 return NULL;
1672 }
1673 /* Recompute the `buf' pointer, since the resizing operation may
1674 have invalidated it. */
Benjamin Peterson153c70f2009-04-18 15:42:12 +00001675 buf = PyByteArray_AS_STRING(bytearray_obj);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001676 }
1677 }
1678 Py_DECREF(it);
1679
1680 /* Resize down to exact size. */
Benjamin Peterson153c70f2009-04-18 15:42:12 +00001681 if (PyByteArray_Resize((PyObject *)bytearray_obj, len) < 0) {
1682 Py_DECREF(bytearray_obj);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001683 return NULL;
1684 }
1685
Antoine Pitrou58bb82e2012-04-01 16:05:46 +02001686 if (bytearray_setslice(self, Py_SIZE(self), Py_SIZE(self), bytearray_obj) == -1) {
1687 Py_DECREF(bytearray_obj);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001688 return NULL;
Antoine Pitrou58bb82e2012-04-01 16:05:46 +02001689 }
Benjamin Peterson153c70f2009-04-18 15:42:12 +00001690 Py_DECREF(bytearray_obj);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001691
1692 Py_RETURN_NONE;
1693}
1694
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001695/*[clinic input]
1696bytearray.pop
1697
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001698 index: Py_ssize_t = -1
1699 The index from where to remove the item.
1700 -1 (the default value) means remove the last item.
1701 /
1702
1703Remove and return a single item from B.
1704
1705If no index argument is given, will pop the last item.
1706[clinic start generated code]*/
1707
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001708static PyObject *
1709bytearray_pop_impl(PyByteArrayObject *self, Py_ssize_t index)
Serhiy Storchaka7a9579c2016-05-02 13:45:20 +03001710/*[clinic end generated code: output=e0ccd401f8021da8 input=3591df2d06c0d237]*/
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001711{
1712 int value;
1713 Py_ssize_t n = Py_SIZE(self);
1714 char *buf;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001715
1716 if (n == 0) {
Eli Bendersky1bc4f192011-03-04 04:55:25 +00001717 PyErr_SetString(PyExc_IndexError,
1718 "pop from empty bytearray");
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001719 return NULL;
1720 }
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001721 if (index < 0)
1722 index += Py_SIZE(self);
1723 if (index < 0 || index >= Py_SIZE(self)) {
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001724 PyErr_SetString(PyExc_IndexError, "pop index out of range");
1725 return NULL;
1726 }
Antoine Pitrou5504e892008-12-06 21:27:53 +00001727 if (!_canresize(self))
1728 return NULL;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001729
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +02001730 buf = PyByteArray_AS_STRING(self);
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001731 value = buf[index];
1732 memmove(buf + index, buf + index + 1, n - index);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001733 if (PyByteArray_Resize((PyObject *)self, n - 1) < 0)
1734 return NULL;
1735
Mark Dickinson54a3db92009-09-06 10:19:23 +00001736 return PyLong_FromLong((unsigned char)value);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001737}
1738
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001739/*[clinic input]
1740bytearray.remove
1741
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001742 value: bytesvalue
1743 The value to remove.
1744 /
1745
1746Remove the first occurrence of a value in the bytearray.
1747[clinic start generated code]*/
1748
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001749static PyObject *
1750bytearray_remove_impl(PyByteArrayObject *self, int value)
Serhiy Storchaka7a9579c2016-05-02 13:45:20 +03001751/*[clinic end generated code: output=d659e37866709c13 input=121831240cd51ddf]*/
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001752{
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001753 Py_ssize_t where, n = Py_SIZE(self);
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +02001754 char *buf = PyByteArray_AS_STRING(self);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001755
Serhiy Storchaka4b234942016-05-16 22:24:03 +03001756 where = stringlib_find_char(buf, n, value);
1757 if (where < 0) {
Mark Dickinson2b6705f2009-09-06 10:34:47 +00001758 PyErr_SetString(PyExc_ValueError, "value not found in bytearray");
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001759 return NULL;
1760 }
Antoine Pitrou5504e892008-12-06 21:27:53 +00001761 if (!_canresize(self))
1762 return NULL;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001763
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +02001764 memmove(buf + where, buf + where + 1, n - where);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001765 if (PyByteArray_Resize((PyObject *)self, n - 1) < 0)
1766 return NULL;
1767
1768 Py_RETURN_NONE;
1769}
1770
1771/* XXX These two helpers could be optimized if argsize == 1 */
1772
1773static Py_ssize_t
Serhiy Storchakaef1585e2015-12-25 20:01:53 +02001774lstrip_helper(const char *myptr, Py_ssize_t mysize,
1775 const void *argptr, Py_ssize_t argsize)
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001776{
1777 Py_ssize_t i = 0;
Antoine Pitrou5b720752013-10-05 21:24:10 +02001778 while (i < mysize && memchr(argptr, (unsigned char) myptr[i], argsize))
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001779 i++;
1780 return i;
1781}
1782
1783static Py_ssize_t
Serhiy Storchakaef1585e2015-12-25 20:01:53 +02001784rstrip_helper(const char *myptr, Py_ssize_t mysize,
1785 const void *argptr, Py_ssize_t argsize)
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001786{
1787 Py_ssize_t i = mysize - 1;
Antoine Pitrou5b720752013-10-05 21:24:10 +02001788 while (i >= 0 && memchr(argptr, (unsigned char) myptr[i], argsize))
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001789 i--;
1790 return i + 1;
1791}
1792
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001793/*[clinic input]
1794bytearray.strip
1795
1796 bytes: object = None
1797 /
1798
1799Strip leading and trailing bytes contained in the argument.
1800
1801If the argument is omitted or None, strip leading and trailing ASCII whitespace.
1802[clinic start generated code]*/
1803
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001804static PyObject *
1805bytearray_strip_impl(PyByteArrayObject *self, PyObject *bytes)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03001806/*[clinic end generated code: output=760412661a34ad5a input=ef7bb59b09c21d62]*/
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001807{
1808 Py_ssize_t left, right, mysize, byteslen;
Serhiy Storchakae2f92de2017-11-11 13:06:26 +02001809 char *myptr;
1810 const char *bytesptr;
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001811 Py_buffer vbytes;
1812
1813 if (bytes == Py_None) {
1814 bytesptr = "\t\n\r\f\v ";
1815 byteslen = 6;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001816 }
1817 else {
Serhiy Storchaka3dd3e262015-02-03 01:25:42 +02001818 if (PyObject_GetBuffer(bytes, &vbytes, PyBUF_SIMPLE) != 0)
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001819 return NULL;
Serhiy Storchakae2f92de2017-11-11 13:06:26 +02001820 bytesptr = (const char *) vbytes.buf;
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001821 byteslen = vbytes.len;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001822 }
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +02001823 myptr = PyByteArray_AS_STRING(self);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001824 mysize = Py_SIZE(self);
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001825 left = lstrip_helper(myptr, mysize, bytesptr, byteslen);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001826 if (left == mysize)
1827 right = left;
1828 else
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001829 right = rstrip_helper(myptr, mysize, bytesptr, byteslen);
1830 if (bytes != Py_None)
1831 PyBuffer_Release(&vbytes);
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +02001832 return PyByteArray_FromStringAndSize(myptr + left, right - left);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001833}
1834
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001835/*[clinic input]
1836bytearray.lstrip
1837
1838 bytes: object = None
1839 /
1840
1841Strip leading bytes contained in the argument.
1842
1843If the argument is omitted or None, strip leading ASCII whitespace.
1844[clinic start generated code]*/
1845
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001846static PyObject *
1847bytearray_lstrip_impl(PyByteArrayObject *self, PyObject *bytes)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03001848/*[clinic end generated code: output=d005c9d0ab909e66 input=80843f975dd7c480]*/
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001849{
1850 Py_ssize_t left, right, mysize, byteslen;
Serhiy Storchakae2f92de2017-11-11 13:06:26 +02001851 char *myptr;
1852 const char *bytesptr;
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001853 Py_buffer vbytes;
1854
1855 if (bytes == Py_None) {
1856 bytesptr = "\t\n\r\f\v ";
1857 byteslen = 6;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001858 }
1859 else {
Serhiy Storchaka3dd3e262015-02-03 01:25:42 +02001860 if (PyObject_GetBuffer(bytes, &vbytes, PyBUF_SIMPLE) != 0)
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001861 return NULL;
Serhiy Storchakae2f92de2017-11-11 13:06:26 +02001862 bytesptr = (const char *) vbytes.buf;
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001863 byteslen = vbytes.len;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001864 }
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +02001865 myptr = PyByteArray_AS_STRING(self);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001866 mysize = Py_SIZE(self);
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001867 left = lstrip_helper(myptr, mysize, bytesptr, byteslen);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001868 right = mysize;
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001869 if (bytes != Py_None)
1870 PyBuffer_Release(&vbytes);
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +02001871 return PyByteArray_FromStringAndSize(myptr + left, right - left);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001872}
1873
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001874/*[clinic input]
1875bytearray.rstrip
1876
1877 bytes: object = None
1878 /
1879
1880Strip trailing bytes contained in the argument.
1881
1882If the argument is omitted or None, strip trailing ASCII whitespace.
1883[clinic start generated code]*/
1884
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001885static PyObject *
1886bytearray_rstrip_impl(PyByteArrayObject *self, PyObject *bytes)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03001887/*[clinic end generated code: output=030e2fbd2f7276bd input=e728b994954cfd91]*/
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001888{
1889 Py_ssize_t right, mysize, byteslen;
Serhiy Storchakae2f92de2017-11-11 13:06:26 +02001890 char *myptr;
1891 const char *bytesptr;
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001892 Py_buffer vbytes;
1893
1894 if (bytes == Py_None) {
1895 bytesptr = "\t\n\r\f\v ";
1896 byteslen = 6;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001897 }
1898 else {
Serhiy Storchaka3dd3e262015-02-03 01:25:42 +02001899 if (PyObject_GetBuffer(bytes, &vbytes, PyBUF_SIMPLE) != 0)
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001900 return NULL;
Serhiy Storchakae2f92de2017-11-11 13:06:26 +02001901 bytesptr = (const char *) vbytes.buf;
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001902 byteslen = vbytes.len;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001903 }
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +02001904 myptr = PyByteArray_AS_STRING(self);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001905 mysize = Py_SIZE(self);
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001906 right = rstrip_helper(myptr, mysize, bytesptr, byteslen);
1907 if (bytes != Py_None)
1908 PyBuffer_Release(&vbytes);
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +02001909 return PyByteArray_FromStringAndSize(myptr, right);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001910}
1911
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001912/*[clinic input]
1913bytearray.decode
1914
1915 encoding: str(c_default="NULL") = 'utf-8'
1916 The encoding with which to decode the bytearray.
1917 errors: str(c_default="NULL") = 'strict'
1918 The error handling scheme to use for the handling of decoding errors.
1919 The default is 'strict' meaning that decoding errors raise a
1920 UnicodeDecodeError. Other possible values are 'ignore' and 'replace'
1921 as well as any other name registered with codecs.register_error that
1922 can handle UnicodeDecodeErrors.
1923
1924Decode the bytearray using the codec registered for encoding.
1925[clinic start generated code]*/
1926
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001927static PyObject *
Larry Hastings89964c42015-04-14 18:07:59 -04001928bytearray_decode_impl(PyByteArrayObject *self, const char *encoding,
1929 const char *errors)
1930/*[clinic end generated code: output=f57d43f4a00b42c5 input=f28d8f903020257b]*/
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001931{
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001932 if (encoding == NULL)
1933 encoding = PyUnicode_GetDefaultEncoding();
Martin v. Löwis0efea322014-07-27 17:29:17 +02001934 return PyUnicode_FromEncodedObject((PyObject*)self, encoding, errors);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001935}
1936
1937PyDoc_STRVAR(alloc_doc,
1938"B.__alloc__() -> int\n\
1939\n\
Georg Brandl17cb8a82008-05-30 08:20:09 +00001940Return the number of bytes actually allocated.");
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001941
1942static PyObject *
Benjamin Peterson153c70f2009-04-18 15:42:12 +00001943bytearray_alloc(PyByteArrayObject *self)
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001944{
1945 return PyLong_FromSsize_t(self->ob_alloc);
1946}
1947
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001948/*[clinic input]
1949bytearray.join
1950
1951 iterable_of_bytes: object
1952 /
1953
1954Concatenate any number of bytes/bytearray objects.
1955
1956The bytearray whose method is called is inserted in between each pair.
1957
1958The result is returned as a new bytearray object.
1959[clinic start generated code]*/
1960
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001961static PyObject *
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001962bytearray_join(PyByteArrayObject *self, PyObject *iterable_of_bytes)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03001963/*[clinic end generated code: output=a8516370bf68ae08 input=aba6b1f9b30fcb8e]*/
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001964{
Martin v. Löwis0efea322014-07-27 17:29:17 +02001965 return stringlib_bytes_join((PyObject*)self, iterable_of_bytes);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001966}
1967
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001968/*[clinic input]
1969bytearray.splitlines
Antoine Pitrouf2c54842010-01-13 08:07:53 +00001970
Serhiy Storchaka202fda52017-03-12 10:10:47 +02001971 keepends: bool(accept={int}) = False
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001972
1973Return a list of the lines in the bytearray, breaking at line boundaries.
1974
1975Line breaks are not included in the resulting list unless keepends is given and
1976true.
1977[clinic start generated code]*/
1978
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001979static PyObject *
1980bytearray_splitlines_impl(PyByteArrayObject *self, int keepends)
Serhiy Storchaka202fda52017-03-12 10:10:47 +02001981/*[clinic end generated code: output=4223c94b895f6ad9 input=99a27ad959b9cf6b]*/
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001982{
Antoine Pitrouf2c54842010-01-13 08:07:53 +00001983 return stringlib_splitlines(
1984 (PyObject*) self, PyByteArray_AS_STRING(self),
1985 PyByteArray_GET_SIZE(self), keepends
1986 );
1987}
1988
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001989/*[clinic input]
1990@classmethod
1991bytearray.fromhex
1992
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001993 string: unicode
1994 /
1995
1996Create a bytearray object from a string of hexadecimal numbers.
1997
1998Spaces between two numbers are accepted.
1999Example: bytearray.fromhex('B9 01EF') -> bytearray(b'\\xb9\\x01\\xef')
2000[clinic start generated code]*/
2001
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002002static PyObject *
Serhiy Storchaka0855e702016-07-01 17:22:31 +03002003bytearray_fromhex_impl(PyTypeObject *type, PyObject *string)
2004/*[clinic end generated code: output=8f0f0b6d30fb3ba0 input=f033a16d1fb21f48]*/
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002005{
Serhiy Storchaka0855e702016-07-01 17:22:31 +03002006 PyObject *result = _PyBytes_FromHex(string, type == &PyByteArray_Type);
2007 if (type != &PyByteArray_Type && result != NULL) {
Victor Stinnerde4ae3d2016-12-04 22:59:09 +01002008 Py_SETREF(result, PyObject_CallFunctionObjArgs((PyObject *)type,
2009 result, NULL));
Serhiy Storchaka0855e702016-07-01 17:22:31 +03002010 }
2011 return result;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002012}
2013
Gregory P. Smith8cb65692015-04-25 23:22:26 +00002014PyDoc_STRVAR(hex__doc__,
2015"B.hex() -> string\n\
2016\n\
2017Create a string of hexadecimal numbers from a bytearray object.\n\
2018Example: bytearray([0xb9, 0x01, 0xef]).hex() -> 'b901ef'.");
2019
2020static PyObject *
Serhiy Storchakae09132f2016-07-03 13:57:48 +03002021bytearray_hex(PyBytesObject *self)
2022{
2023 char* argbuf = PyByteArray_AS_STRING(self);
2024 Py_ssize_t arglen = PyByteArray_GET_SIZE(self);
2025 return _Py_strhex(argbuf, arglen);
2026}
2027
2028static PyObject *
Antoine Pitroub0e1f8b2011-12-05 20:40:08 +01002029_common_reduce(PyByteArrayObject *self, int proto)
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002030{
Antoine Pitroub0e1f8b2011-12-05 20:40:08 +01002031 PyObject *dict;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02002032 _Py_IDENTIFIER(__dict__);
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +02002033 char *buf;
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02002034
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02002035 dict = _PyObject_GetAttrId((PyObject *)self, &PyId___dict__);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002036 if (dict == NULL) {
2037 PyErr_Clear();
2038 dict = Py_None;
2039 Py_INCREF(dict);
2040 }
2041
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +02002042 buf = PyByteArray_AS_STRING(self);
Antoine Pitroub0e1f8b2011-12-05 20:40:08 +01002043 if (proto < 3) {
2044 /* use str based reduction for backwards compatibility with Python 2.x */
2045 PyObject *latin1;
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +02002046 if (Py_SIZE(self))
2047 latin1 = PyUnicode_DecodeLatin1(buf, Py_SIZE(self), NULL);
Antoine Pitroub0e1f8b2011-12-05 20:40:08 +01002048 else
2049 latin1 = PyUnicode_FromString("");
2050 return Py_BuildValue("(O(Ns)N)", Py_TYPE(self), latin1, "latin-1", dict);
2051 }
2052 else {
2053 /* use more efficient byte based reduction */
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +02002054 if (Py_SIZE(self)) {
2055 return Py_BuildValue("(O(y#)N)", Py_TYPE(self), buf, Py_SIZE(self), dict);
Antoine Pitroub0e1f8b2011-12-05 20:40:08 +01002056 }
2057 else {
2058 return Py_BuildValue("(O()N)", Py_TYPE(self), dict);
2059 }
2060 }
2061}
2062
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002063/*[clinic input]
2064bytearray.__reduce__ as bytearray_reduce
2065
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002066Return state information for pickling.
2067[clinic start generated code]*/
2068
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002069static PyObject *
2070bytearray_reduce_impl(PyByteArrayObject *self)
Serhiy Storchaka7a9579c2016-05-02 13:45:20 +03002071/*[clinic end generated code: output=52bf304086464cab input=44b5737ada62dd3f]*/
Antoine Pitroub0e1f8b2011-12-05 20:40:08 +01002072{
2073 return _common_reduce(self, 2);
2074}
2075
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002076/*[clinic input]
2077bytearray.__reduce_ex__ as bytearray_reduce_ex
2078
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002079 proto: int = 0
2080 /
2081
2082Return state information for pickling.
2083[clinic start generated code]*/
2084
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002085static PyObject *
2086bytearray_reduce_ex_impl(PyByteArrayObject *self, int proto)
Serhiy Storchaka7a9579c2016-05-02 13:45:20 +03002087/*[clinic end generated code: output=52eac33377197520 input=f129bc1a1aa151ee]*/
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002088{
Antoine Pitroub0e1f8b2011-12-05 20:40:08 +01002089 return _common_reduce(self, proto);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002090}
2091
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002092/*[clinic input]
2093bytearray.__sizeof__ as bytearray_sizeof
2094
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002095Returns the size of the bytearray object in memory, in bytes.
2096[clinic start generated code]*/
2097
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002098static PyObject *
2099bytearray_sizeof_impl(PyByteArrayObject *self)
Serhiy Storchaka7a9579c2016-05-02 13:45:20 +03002100/*[clinic end generated code: output=738abdd17951c427 input=e27320fd98a4bc5a]*/
Robert Schuppeniesfbe94c52008-07-14 10:13:31 +00002101{
Benjamin Petersonef3e4c22009-04-11 19:48:14 +00002102 Py_ssize_t res;
Robert Schuppeniesfbe94c52008-07-14 10:13:31 +00002103
Serhiy Storchaka5c4064e2015-12-19 20:05:25 +02002104 res = _PyObject_SIZE(Py_TYPE(self)) + self->ob_alloc * sizeof(char);
Benjamin Petersonef3e4c22009-04-11 19:48:14 +00002105 return PyLong_FromSsize_t(res);
Robert Schuppeniesfbe94c52008-07-14 10:13:31 +00002106}
2107
Benjamin Peterson153c70f2009-04-18 15:42:12 +00002108static PySequenceMethods bytearray_as_sequence = {
2109 (lenfunc)bytearray_length, /* sq_length */
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002110 (binaryfunc)PyByteArray_Concat, /* sq_concat */
Benjamin Peterson153c70f2009-04-18 15:42:12 +00002111 (ssizeargfunc)bytearray_repeat, /* sq_repeat */
2112 (ssizeargfunc)bytearray_getitem, /* sq_item */
2113 0, /* sq_slice */
2114 (ssizeobjargproc)bytearray_setitem, /* sq_ass_item */
2115 0, /* sq_ass_slice */
Serhiy Storchakae09132f2016-07-03 13:57:48 +03002116 (objobjproc)bytearray_contains, /* sq_contains */
Benjamin Peterson153c70f2009-04-18 15:42:12 +00002117 (binaryfunc)bytearray_iconcat, /* sq_inplace_concat */
2118 (ssizeargfunc)bytearray_irepeat, /* sq_inplace_repeat */
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002119};
2120
Benjamin Peterson153c70f2009-04-18 15:42:12 +00002121static PyMappingMethods bytearray_as_mapping = {
2122 (lenfunc)bytearray_length,
2123 (binaryfunc)bytearray_subscript,
2124 (objobjargproc)bytearray_ass_subscript,
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002125};
2126
Benjamin Peterson153c70f2009-04-18 15:42:12 +00002127static PyBufferProcs bytearray_as_buffer = {
2128 (getbufferproc)bytearray_getbuffer,
2129 (releasebufferproc)bytearray_releasebuffer,
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002130};
2131
2132static PyMethodDef
Benjamin Peterson153c70f2009-04-18 15:42:12 +00002133bytearray_methods[] = {
2134 {"__alloc__", (PyCFunction)bytearray_alloc, METH_NOARGS, alloc_doc},
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002135 BYTEARRAY_REDUCE_METHODDEF
2136 BYTEARRAY_REDUCE_EX_METHODDEF
2137 BYTEARRAY_SIZEOF_METHODDEF
2138 BYTEARRAY_APPEND_METHODDEF
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002139 {"capitalize", (PyCFunction)stringlib_capitalize, METH_NOARGS,
2140 _Py_capitalize__doc__},
Serhiy Storchakadd40fc32016-05-04 22:23:26 +03002141 {"center", (PyCFunction)stringlib_center, METH_VARARGS, _Py_center__doc__},
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002142 BYTEARRAY_CLEAR_METHODDEF
2143 BYTEARRAY_COPY_METHODDEF
Serhiy Storchakae09132f2016-07-03 13:57:48 +03002144 {"count", (PyCFunction)bytearray_count, METH_VARARGS,
Serhiy Storchakadd40fc32016-05-04 22:23:26 +03002145 _Py_count__doc__},
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002146 BYTEARRAY_DECODE_METHODDEF
Serhiy Storchakae09132f2016-07-03 13:57:48 +03002147 {"endswith", (PyCFunction)bytearray_endswith, METH_VARARGS,
Serhiy Storchakadd40fc32016-05-04 22:23:26 +03002148 _Py_endswith__doc__},
Ezio Melotti745d54d2013-11-16 19:10:57 +02002149 {"expandtabs", (PyCFunction)stringlib_expandtabs, METH_VARARGS | METH_KEYWORDS,
Serhiy Storchakadd40fc32016-05-04 22:23:26 +03002150 _Py_expandtabs__doc__},
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
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002158 {"isalnum", (PyCFunction)stringlib_isalnum, METH_NOARGS,
2159 _Py_isalnum__doc__},
2160 {"isalpha", (PyCFunction)stringlib_isalpha, METH_NOARGS,
2161 _Py_isalpha__doc__},
INADA Naokia49ac992018-01-27 14:06:21 +09002162 {"isascii", (PyCFunction)stringlib_isascii, METH_NOARGS,
2163 _Py_isascii__doc__},
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002164 {"isdigit", (PyCFunction)stringlib_isdigit, METH_NOARGS,
2165 _Py_isdigit__doc__},
2166 {"islower", (PyCFunction)stringlib_islower, METH_NOARGS,
2167 _Py_islower__doc__},
2168 {"isspace", (PyCFunction)stringlib_isspace, METH_NOARGS,
2169 _Py_isspace__doc__},
2170 {"istitle", (PyCFunction)stringlib_istitle, METH_NOARGS,
2171 _Py_istitle__doc__},
2172 {"isupper", (PyCFunction)stringlib_isupper, METH_NOARGS,
2173 _Py_isupper__doc__},
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002174 BYTEARRAY_JOIN_METHODDEF
Serhiy Storchakadd40fc32016-05-04 22:23:26 +03002175 {"ljust", (PyCFunction)stringlib_ljust, METH_VARARGS, _Py_ljust__doc__},
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002176 {"lower", (PyCFunction)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__},
Serhiy Storchakadd40fc32016-05-04 22:23:26 +03002186 {"rjust", (PyCFunction)stringlib_rjust, METH_VARARGS, _Py_rjust__doc__},
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
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002195 {"swapcase", (PyCFunction)stringlib_swapcase, METH_NOARGS,
2196 _Py_swapcase__doc__},
2197 {"title", (PyCFunction)stringlib_title, METH_NOARGS, _Py_title__doc__},
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002198 BYTEARRAY_TRANSLATE_METHODDEF
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002199 {"upper", (PyCFunction)stringlib_upper, METH_NOARGS, _Py_upper__doc__},
Serhiy Storchakadd40fc32016-05-04 22:23:26 +03002200 {"zfill", (PyCFunction)stringlib_zfill, METH_VARARGS, _Py_zfill__doc__},
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 *
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00002327bytearrayiter_length_hint(bytesiterobject *it)
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 *
2343bytearrayiter_reduce(bytesiterobject *it)
2344{
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}