blob: 840d5b0f9baaf339bb78712673184b211b8dc04b [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
107PyObject *
108PyByteArray_FromStringAndSize(const char *bytes, Py_ssize_t size)
109{
110 PyByteArrayObject *new;
111 Py_ssize_t alloc;
112
113 if (size < 0) {
114 PyErr_SetString(PyExc_SystemError,
115 "Negative size passed to PyByteArray_FromStringAndSize");
116 return NULL;
117 }
118
Neal Norwitz3ce5d922008-08-24 07:08:55 +0000119 /* Prevent buffer overflow when setting alloc to size+1. */
120 if (size == PY_SSIZE_T_MAX) {
121 return PyErr_NoMemory();
122 }
123
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000124 new = PyObject_New(PyByteArrayObject, &PyByteArray_Type);
125 if (new == NULL)
126 return NULL;
127
128 if (size == 0) {
129 new->ob_bytes = NULL;
130 alloc = 0;
131 }
132 else {
133 alloc = size + 1;
Antoine Pitrou39aba4f2011-11-12 21:15:28 +0100134 new->ob_bytes = PyObject_Malloc(alloc);
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000135 if (new->ob_bytes == NULL) {
136 Py_DECREF(new);
137 return PyErr_NoMemory();
138 }
Antoine Pitroufc8d6f42010-01-17 12:38:54 +0000139 if (bytes != NULL && size > 0)
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000140 memcpy(new->ob_bytes, bytes, size);
141 new->ob_bytes[size] = '\0'; /* Trailing null byte */
142 }
143 Py_SIZE(new) = size;
144 new->ob_alloc = alloc;
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200145 new->ob_start = new->ob_bytes;
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000146 new->ob_exports = 0;
147
148 return (PyObject *)new;
149}
150
151Py_ssize_t
152PyByteArray_Size(PyObject *self)
153{
154 assert(self != NULL);
155 assert(PyByteArray_Check(self));
156
157 return PyByteArray_GET_SIZE(self);
158}
159
160char *
161PyByteArray_AsString(PyObject *self)
162{
163 assert(self != NULL);
164 assert(PyByteArray_Check(self));
165
166 return PyByteArray_AS_STRING(self);
167}
168
169int
Antoine Pitroucc231542014-11-02 18:40:09 +0100170PyByteArray_Resize(PyObject *self, Py_ssize_t requested_size)
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000171{
172 void *sval;
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200173 PyByteArrayObject *obj = ((PyByteArrayObject *)self);
Antoine Pitroucc231542014-11-02 18:40:09 +0100174 /* All computations are done unsigned to avoid integer overflows
175 (see issue #22335). */
176 size_t alloc = (size_t) obj->ob_alloc;
177 size_t logical_offset = (size_t) (obj->ob_start - obj->ob_bytes);
178 size_t size = (size_t) requested_size;
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000179
180 assert(self != NULL);
181 assert(PyByteArray_Check(self));
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200182 assert(logical_offset <= alloc);
Antoine Pitroucc231542014-11-02 18:40:09 +0100183 assert(requested_size >= 0);
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000184
Antoine Pitroucc231542014-11-02 18:40:09 +0100185 if (requested_size == Py_SIZE(self)) {
Antoine Pitrou5504e892008-12-06 21:27:53 +0000186 return 0;
187 }
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200188 if (!_canresize(obj)) {
Antoine Pitrou5504e892008-12-06 21:27:53 +0000189 return -1;
190 }
191
Antoine Pitrou25454112015-05-19 20:52:27 +0200192 if (size + logical_offset + 1 <= alloc) {
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200193 /* Current buffer is large enough to host the requested size,
194 decide on a strategy. */
195 if (size < alloc / 2) {
196 /* Major downsize; resize down to exact size */
197 alloc = size + 1;
198 }
199 else {
200 /* Minor downsize; quick exit */
201 Py_SIZE(self) = size;
202 PyByteArray_AS_STRING(self)[size] = '\0'; /* Trailing null */
203 return 0;
204 }
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000205 }
206 else {
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200207 /* Need growing, decide on a strategy */
208 if (size <= alloc * 1.125) {
209 /* Moderate upsize; overallocate similar to list_resize() */
210 alloc = size + (size >> 3) + (size < 9 ? 3 : 6);
211 }
212 else {
213 /* Major upsize; resize up to exact size */
214 alloc = size + 1;
215 }
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000216 }
Antoine Pitroucc231542014-11-02 18:40:09 +0100217 if (alloc > PY_SSIZE_T_MAX) {
218 PyErr_NoMemory();
219 return -1;
220 }
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000221
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200222 if (logical_offset > 0) {
223 sval = PyObject_Malloc(alloc);
224 if (sval == NULL) {
225 PyErr_NoMemory();
226 return -1;
227 }
Antoine Pitroucc231542014-11-02 18:40:09 +0100228 memcpy(sval, PyByteArray_AS_STRING(self),
Stefan Krahdce65022017-08-25 20:12:05 +0200229 Py_MIN((size_t)requested_size, (size_t)Py_SIZE(self)));
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200230 PyObject_Free(obj->ob_bytes);
231 }
232 else {
233 sval = PyObject_Realloc(obj->ob_bytes, alloc);
234 if (sval == NULL) {
235 PyErr_NoMemory();
236 return -1;
237 }
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000238 }
239
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200240 obj->ob_bytes = obj->ob_start = sval;
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000241 Py_SIZE(self) = size;
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200242 obj->ob_alloc = alloc;
243 obj->ob_bytes[size] = '\0'; /* Trailing null byte */
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000244
245 return 0;
246}
247
248PyObject *
249PyByteArray_Concat(PyObject *a, PyObject *b)
250{
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000251 Py_buffer va, vb;
252 PyByteArrayObject *result = NULL;
253
254 va.len = -1;
255 vb.len = -1;
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +0200256 if (PyObject_GetBuffer(a, &va, PyBUF_SIMPLE) != 0 ||
257 PyObject_GetBuffer(b, &vb, PyBUF_SIMPLE) != 0) {
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000258 PyErr_Format(PyExc_TypeError, "can't concat %.100s to %.100s",
Serhiy Storchaka6b5a9ec2017-03-19 19:47:02 +0200259 Py_TYPE(b)->tp_name, Py_TYPE(a)->tp_name);
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000260 goto done;
261 }
262
Serhiy Storchaka06cfb0c2016-07-10 20:48:43 +0300263 if (va.len > PY_SSIZE_T_MAX - vb.len) {
264 PyErr_NoMemory();
265 goto done;
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000266 }
267
Serhiy Storchaka06cfb0c2016-07-10 20:48:43 +0300268 result = (PyByteArrayObject *) \
269 PyByteArray_FromStringAndSize(NULL, va.len + vb.len);
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000270 if (result != NULL) {
271 memcpy(result->ob_bytes, va.buf, va.len);
272 memcpy(result->ob_bytes + va.len, vb.buf, vb.len);
273 }
274
275 done:
276 if (va.len != -1)
Martin v. Löwis423be952008-08-13 15:53:07 +0000277 PyBuffer_Release(&va);
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000278 if (vb.len != -1)
Martin v. Löwis423be952008-08-13 15:53:07 +0000279 PyBuffer_Release(&vb);
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000280 return (PyObject *)result;
281}
282
283/* Functions stuffed into the type object */
284
285static Py_ssize_t
Benjamin Peterson153c70f2009-04-18 15:42:12 +0000286bytearray_length(PyByteArrayObject *self)
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000287{
288 return Py_SIZE(self);
289}
290
291static PyObject *
Benjamin Peterson153c70f2009-04-18 15:42:12 +0000292bytearray_iconcat(PyByteArrayObject *self, PyObject *other)
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000293{
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000294 Py_ssize_t size;
295 Py_buffer vo;
296
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +0200297 if (PyObject_GetBuffer(other, &vo, PyBUF_SIMPLE) != 0) {
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000298 PyErr_Format(PyExc_TypeError, "can't concat %.100s to %.100s",
299 Py_TYPE(other)->tp_name, Py_TYPE(self)->tp_name);
300 return NULL;
301 }
302
Serhiy Storchaka06cfb0c2016-07-10 20:48:43 +0300303 size = Py_SIZE(self);
304 if (size > PY_SSIZE_T_MAX - vo.len) {
Martin v. Löwis423be952008-08-13 15:53:07 +0000305 PyBuffer_Release(&vo);
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000306 return PyErr_NoMemory();
307 }
Serhiy Storchaka06cfb0c2016-07-10 20:48:43 +0300308 if (PyByteArray_Resize((PyObject *)self, size + vo.len) < 0) {
Martin v. Löwis423be952008-08-13 15:53:07 +0000309 PyBuffer_Release(&vo);
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000310 return NULL;
311 }
Serhiy Storchaka06cfb0c2016-07-10 20:48:43 +0300312 memcpy(PyByteArray_AS_STRING(self) + size, vo.buf, vo.len);
Martin v. Löwis423be952008-08-13 15:53:07 +0000313 PyBuffer_Release(&vo);
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000314 Py_INCREF(self);
315 return (PyObject *)self;
316}
317
318static PyObject *
Benjamin Peterson153c70f2009-04-18 15:42:12 +0000319bytearray_repeat(PyByteArrayObject *self, Py_ssize_t count)
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000320{
321 PyByteArrayObject *result;
322 Py_ssize_t mysize;
323 Py_ssize_t size;
324
325 if (count < 0)
326 count = 0;
327 mysize = Py_SIZE(self);
Mark Dickinsoncf940c72010-08-10 18:35:01 +0000328 if (count > 0 && mysize > PY_SSIZE_T_MAX / count)
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000329 return PyErr_NoMemory();
Mark Dickinsoncf940c72010-08-10 18:35:01 +0000330 size = mysize * count;
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000331 result = (PyByteArrayObject *)PyByteArray_FromStringAndSize(NULL, size);
332 if (result != NULL && size != 0) {
333 if (mysize == 1)
334 memset(result->ob_bytes, self->ob_bytes[0], size);
335 else {
336 Py_ssize_t i;
337 for (i = 0; i < count; i++)
338 memcpy(result->ob_bytes + i*mysize, self->ob_bytes, mysize);
339 }
340 }
341 return (PyObject *)result;
342}
343
344static PyObject *
Benjamin Peterson153c70f2009-04-18 15:42:12 +0000345bytearray_irepeat(PyByteArrayObject *self, Py_ssize_t count)
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000346{
347 Py_ssize_t mysize;
348 Py_ssize_t size;
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200349 char *buf;
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000350
351 if (count < 0)
352 count = 0;
353 mysize = Py_SIZE(self);
Mark Dickinsoncf940c72010-08-10 18:35:01 +0000354 if (count > 0 && mysize > PY_SSIZE_T_MAX / count)
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000355 return PyErr_NoMemory();
Mark Dickinsoncf940c72010-08-10 18:35:01 +0000356 size = mysize * count;
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200357 if (PyByteArray_Resize((PyObject *)self, size) < 0)
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000358 return NULL;
359
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200360 buf = PyByteArray_AS_STRING(self);
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000361 if (mysize == 1)
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200362 memset(buf, buf[0], size);
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000363 else {
364 Py_ssize_t i;
365 for (i = 1; i < count; i++)
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200366 memcpy(buf + i*mysize, buf, mysize);
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000367 }
368
369 Py_INCREF(self);
370 return (PyObject *)self;
371}
372
373static PyObject *
Benjamin Peterson153c70f2009-04-18 15:42:12 +0000374bytearray_getitem(PyByteArrayObject *self, Py_ssize_t i)
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000375{
376 if (i < 0)
377 i += Py_SIZE(self);
378 if (i < 0 || i >= Py_SIZE(self)) {
379 PyErr_SetString(PyExc_IndexError, "bytearray index out of range");
380 return NULL;
381 }
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200382 return PyLong_FromLong((unsigned char)(PyByteArray_AS_STRING(self)[i]));
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000383}
384
385static PyObject *
Benjamin Peterson153c70f2009-04-18 15:42:12 +0000386bytearray_subscript(PyByteArrayObject *self, PyObject *index)
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000387{
Georg Brandl9a54d7c2008-07-16 23:15:30 +0000388 if (PyIndex_Check(index)) {
389 Py_ssize_t i = PyNumber_AsSsize_t(index, PyExc_IndexError);
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000390
391 if (i == -1 && PyErr_Occurred())
392 return NULL;
393
394 if (i < 0)
395 i += PyByteArray_GET_SIZE(self);
396
397 if (i < 0 || i >= Py_SIZE(self)) {
398 PyErr_SetString(PyExc_IndexError, "bytearray index out of range");
399 return NULL;
400 }
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200401 return PyLong_FromLong((unsigned char)(PyByteArray_AS_STRING(self)[i]));
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000402 }
Georg Brandl9a54d7c2008-07-16 23:15:30 +0000403 else if (PySlice_Check(index)) {
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000404 Py_ssize_t start, stop, step, slicelength, cur, i;
Serhiy Storchakab879fe82017-04-08 09:53:51 +0300405 if (PySlice_Unpack(index, &start, &stop, &step) < 0) {
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000406 return NULL;
407 }
Serhiy Storchakab879fe82017-04-08 09:53:51 +0300408 slicelength = PySlice_AdjustIndices(PyByteArray_GET_SIZE(self),
409 &start, &stop, step);
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000410
411 if (slicelength <= 0)
412 return PyByteArray_FromStringAndSize("", 0);
413 else if (step == 1) {
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200414 return PyByteArray_FromStringAndSize(
415 PyByteArray_AS_STRING(self) + start, slicelength);
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000416 }
417 else {
418 char *source_buf = PyByteArray_AS_STRING(self);
Alexandre Vassalottie2641f42009-04-03 06:38:02 +0000419 char *result_buf;
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000420 PyObject *result;
421
Alexandre Vassalottie2641f42009-04-03 06:38:02 +0000422 result = PyByteArray_FromStringAndSize(NULL, slicelength);
423 if (result == NULL)
424 return NULL;
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000425
Alexandre Vassalottie2641f42009-04-03 06:38:02 +0000426 result_buf = PyByteArray_AS_STRING(result);
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000427 for (cur = start, i = 0; i < slicelength;
428 cur += step, i++) {
429 result_buf[i] = source_buf[cur];
430 }
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000431 return result;
432 }
433 }
434 else {
Terry Jan Reedyffff1442014-08-02 01:30:37 -0400435 PyErr_Format(PyExc_TypeError,
436 "bytearray indices must be integers or slices, not %.200s",
437 Py_TYPE(index)->tp_name);
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000438 return NULL;
439 }
440}
441
442static int
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200443bytearray_setslice_linear(PyByteArrayObject *self,
444 Py_ssize_t lo, Py_ssize_t hi,
445 char *bytes, Py_ssize_t bytes_len)
446{
447 Py_ssize_t avail = hi - lo;
448 char *buf = PyByteArray_AS_STRING(self);
449 Py_ssize_t growth = bytes_len - avail;
Victor Stinner84557232013-11-21 12:29:51 +0100450 int res = 0;
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200451 assert(avail >= 0);
452
Victor Stinner84557232013-11-21 12:29:51 +0100453 if (growth < 0) {
454 if (!_canresize(self))
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200455 return -1;
Victor Stinner84557232013-11-21 12:29:51 +0100456
457 if (lo == 0) {
458 /* Shrink the buffer by advancing its logical start */
459 self->ob_start -= growth;
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200460 /*
Victor Stinner84557232013-11-21 12:29:51 +0100461 0 lo hi old_size
462 | |<----avail----->|<-----tail------>|
463 | |<-bytes_len->|<-----tail------>|
464 0 new_lo new_hi new_size
465 */
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200466 }
Victor Stinner84557232013-11-21 12:29:51 +0100467 else {
468 /*
469 0 lo hi old_size
470 | |<----avail----->|<-----tomove------>|
471 | |<-bytes_len->|<-----tomove------>|
472 0 lo new_hi new_size
473 */
474 memmove(buf + lo + bytes_len, buf + hi,
475 Py_SIZE(self) - hi);
476 }
477 if (PyByteArray_Resize((PyObject *)self,
478 Py_SIZE(self) + growth) < 0) {
479 /* Issue #19578: Handling the memory allocation failure here is
480 tricky here because the bytearray object has already been
481 modified. Depending on growth and lo, the behaviour is
482 different.
483
484 If growth < 0 and lo != 0, the operation is completed, but a
485 MemoryError is still raised and the memory block is not
Raymond Hettinger15f44ab2016-08-30 10:47:49 -0700486 shrunk. Otherwise, the bytearray is restored in its previous
Victor Stinner84557232013-11-21 12:29:51 +0100487 state and a MemoryError is raised. */
488 if (lo == 0) {
489 self->ob_start += growth;
490 return -1;
491 }
492 /* memmove() removed bytes, the bytearray object cannot be
493 restored in its previous state. */
494 Py_SIZE(self) += growth;
495 res = -1;
496 }
497 buf = PyByteArray_AS_STRING(self);
498 }
499 else if (growth > 0) {
500 if (Py_SIZE(self) > (Py_ssize_t)PY_SSIZE_T_MAX - growth) {
501 PyErr_NoMemory();
502 return -1;
503 }
504
505 if (PyByteArray_Resize((PyObject *)self,
506 Py_SIZE(self) + growth) < 0) {
507 return -1;
508 }
509 buf = PyByteArray_AS_STRING(self);
510 /* Make the place for the additional bytes */
511 /*
512 0 lo hi old_size
513 | |<-avail->|<-----tomove------>|
514 | |<---bytes_len-->|<-----tomove------>|
515 0 lo new_hi new_size
516 */
517 memmove(buf + lo + bytes_len, buf + hi,
518 Py_SIZE(self) - lo - bytes_len);
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200519 }
520
521 if (bytes_len > 0)
522 memcpy(buf + lo, bytes, bytes_len);
Victor Stinner84557232013-11-21 12:29:51 +0100523 return res;
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200524}
525
526static int
Benjamin Peterson153c70f2009-04-18 15:42:12 +0000527bytearray_setslice(PyByteArrayObject *self, Py_ssize_t lo, Py_ssize_t hi,
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000528 PyObject *values)
529{
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200530 Py_ssize_t needed;
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000531 void *bytes;
532 Py_buffer vbytes;
533 int res = 0;
534
535 vbytes.len = -1;
536 if (values == (PyObject *)self) {
537 /* Make a copy and call this function recursively */
538 int err;
539 values = PyByteArray_FromObject(values);
540 if (values == NULL)
541 return -1;
Benjamin Peterson153c70f2009-04-18 15:42:12 +0000542 err = bytearray_setslice(self, lo, hi, values);
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000543 Py_DECREF(values);
544 return err;
545 }
546 if (values == NULL) {
547 /* del b[lo:hi] */
548 bytes = NULL;
549 needed = 0;
550 }
551 else {
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +0200552 if (PyObject_GetBuffer(values, &vbytes, PyBUF_SIMPLE) != 0) {
553 PyErr_Format(PyExc_TypeError,
554 "can't set bytearray slice from %.100s",
555 Py_TYPE(values)->tp_name);
556 return -1;
557 }
558 needed = vbytes.len;
559 bytes = vbytes.buf;
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000560 }
561
562 if (lo < 0)
563 lo = 0;
564 if (hi < lo)
565 hi = lo;
566 if (hi > Py_SIZE(self))
567 hi = Py_SIZE(self);
568
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200569 res = bytearray_setslice_linear(self, lo, hi, bytes, needed);
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000570 if (vbytes.len != -1)
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200571 PyBuffer_Release(&vbytes);
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000572 return res;
573}
574
575static int
Benjamin Peterson153c70f2009-04-18 15:42:12 +0000576bytearray_setitem(PyByteArrayObject *self, Py_ssize_t i, PyObject *value)
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000577{
Georg Brandl9a54d7c2008-07-16 23:15:30 +0000578 int ival;
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000579
580 if (i < 0)
581 i += Py_SIZE(self);
582
583 if (i < 0 || i >= Py_SIZE(self)) {
584 PyErr_SetString(PyExc_IndexError, "bytearray index out of range");
585 return -1;
586 }
587
588 if (value == NULL)
Benjamin Peterson153c70f2009-04-18 15:42:12 +0000589 return bytearray_setslice(self, i, i+1, NULL);
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000590
Georg Brandl9a54d7c2008-07-16 23:15:30 +0000591 if (!_getbytevalue(value, &ival))
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000592 return -1;
593
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200594 PyByteArray_AS_STRING(self)[i] = ival;
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000595 return 0;
596}
597
598static int
Benjamin Peterson153c70f2009-04-18 15:42:12 +0000599bytearray_ass_subscript(PyByteArrayObject *self, PyObject *index, PyObject *values)
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000600{
601 Py_ssize_t start, stop, step, slicelen, needed;
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200602 char *buf, *bytes;
603 buf = PyByteArray_AS_STRING(self);
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000604
Georg Brandl9a54d7c2008-07-16 23:15:30 +0000605 if (PyIndex_Check(index)) {
606 Py_ssize_t i = PyNumber_AsSsize_t(index, PyExc_IndexError);
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000607
608 if (i == -1 && PyErr_Occurred())
609 return -1;
610
611 if (i < 0)
612 i += PyByteArray_GET_SIZE(self);
613
614 if (i < 0 || i >= Py_SIZE(self)) {
615 PyErr_SetString(PyExc_IndexError, "bytearray index out of range");
616 return -1;
617 }
618
619 if (values == NULL) {
620 /* Fall through to slice assignment */
621 start = i;
622 stop = i + 1;
623 step = 1;
624 slicelen = 1;
625 }
626 else {
Georg Brandl9a54d7c2008-07-16 23:15:30 +0000627 int ival;
628 if (!_getbytevalue(values, &ival))
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000629 return -1;
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200630 buf[i] = (char)ival;
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000631 return 0;
632 }
633 }
Georg Brandl9a54d7c2008-07-16 23:15:30 +0000634 else if (PySlice_Check(index)) {
Serhiy Storchakab879fe82017-04-08 09:53:51 +0300635 if (PySlice_Unpack(index, &start, &stop, &step) < 0) {
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000636 return -1;
637 }
Serhiy Storchakab879fe82017-04-08 09:53:51 +0300638 slicelen = PySlice_AdjustIndices(PyByteArray_GET_SIZE(self), &start,
639 &stop, step);
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000640 }
641 else {
Terry Jan Reedyffff1442014-08-02 01:30:37 -0400642 PyErr_Format(PyExc_TypeError,
643 "bytearray indices must be integers or slices, not %.200s",
644 Py_TYPE(index)->tp_name);
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000645 return -1;
646 }
647
648 if (values == NULL) {
649 bytes = NULL;
650 needed = 0;
651 }
652 else if (values == (PyObject *)self || !PyByteArray_Check(values)) {
Christian Heimes6d26ade2012-11-03 23:07:59 +0100653 int err;
Ezio Melottic64bcbe2012-11-03 21:19:06 +0200654 if (PyNumber_Check(values) || PyUnicode_Check(values)) {
655 PyErr_SetString(PyExc_TypeError,
656 "can assign only bytes, buffers, or iterables "
657 "of ints in range(0, 256)");
658 return -1;
659 }
Georg Brandlf3fa5682010-12-04 17:09:30 +0000660 /* Make a copy and call this function recursively */
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000661 values = PyByteArray_FromObject(values);
662 if (values == NULL)
663 return -1;
Benjamin Peterson153c70f2009-04-18 15:42:12 +0000664 err = bytearray_ass_subscript(self, index, values);
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000665 Py_DECREF(values);
666 return err;
667 }
668 else {
669 assert(PyByteArray_Check(values));
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200670 bytes = PyByteArray_AS_STRING(values);
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000671 needed = Py_SIZE(values);
672 }
673 /* Make sure b[5:2] = ... inserts before 5, not before 2. */
674 if ((step < 0 && start < stop) ||
675 (step > 0 && start > stop))
676 stop = start;
677 if (step == 1) {
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200678 return bytearray_setslice_linear(self, start, stop, bytes, needed);
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000679 }
680 else {
681 if (needed == 0) {
682 /* Delete slice */
Mark Dickinsonbc099642010-01-29 17:27:24 +0000683 size_t cur;
684 Py_ssize_t i;
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000685
Antoine Pitrou5504e892008-12-06 21:27:53 +0000686 if (!_canresize(self))
687 return -1;
Mark Dickinson7e3b9482010-08-06 21:33:18 +0000688
689 if (slicelen == 0)
690 /* Nothing to do here. */
691 return 0;
692
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000693 if (step < 0) {
694 stop = start + 1;
695 start = stop + step * (slicelen - 1) - 1;
696 step = -step;
697 }
698 for (cur = start, i = 0;
699 i < slicelen; cur += step, i++) {
700 Py_ssize_t lim = step - 1;
701
Mark Dickinson66f575b2010-02-14 12:53:32 +0000702 if (cur + step >= (size_t)PyByteArray_GET_SIZE(self))
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000703 lim = PyByteArray_GET_SIZE(self) - cur - 1;
704
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200705 memmove(buf + cur - i,
706 buf + cur + 1, lim);
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000707 }
708 /* Move the tail of the bytes, in one chunk */
Mark Dickinson7e3b9482010-08-06 21:33:18 +0000709 cur = start + (size_t)slicelen*step;
Mark Dickinson66f575b2010-02-14 12:53:32 +0000710 if (cur < (size_t)PyByteArray_GET_SIZE(self)) {
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200711 memmove(buf + cur - slicelen,
712 buf + cur,
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000713 PyByteArray_GET_SIZE(self) - cur);
714 }
715 if (PyByteArray_Resize((PyObject *)self,
716 PyByteArray_GET_SIZE(self) - slicelen) < 0)
717 return -1;
718
719 return 0;
720 }
721 else {
722 /* Assign slice */
Mark Dickinson7e3b9482010-08-06 21:33:18 +0000723 Py_ssize_t i;
724 size_t cur;
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000725
726 if (needed != slicelen) {
727 PyErr_Format(PyExc_ValueError,
728 "attempt to assign bytes of size %zd "
729 "to extended slice of size %zd",
730 needed, slicelen);
731 return -1;
732 }
733 for (cur = start, i = 0; i < slicelen; cur += step, i++)
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200734 buf[cur] = bytes[i];
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000735 return 0;
736 }
737 }
738}
739
740static int
Benjamin Peterson153c70f2009-04-18 15:42:12 +0000741bytearray_init(PyByteArrayObject *self, PyObject *args, PyObject *kwds)
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000742{
743 static char *kwlist[] = {"source", "encoding", "errors", 0};
744 PyObject *arg = NULL;
745 const char *encoding = NULL;
746 const char *errors = NULL;
747 Py_ssize_t count;
748 PyObject *it;
749 PyObject *(*iternext)(PyObject *);
750
751 if (Py_SIZE(self) != 0) {
752 /* Empty previous contents (yes, do this first of all!) */
753 if (PyByteArray_Resize((PyObject *)self, 0) < 0)
754 return -1;
755 }
756
757 /* Parse arguments */
Georg Brandl3dbca812008-07-23 16:10:53 +0000758 if (!PyArg_ParseTupleAndKeywords(args, kwds, "|Oss:bytearray", kwlist,
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000759 &arg, &encoding, &errors))
760 return -1;
761
762 /* Make a quick exit if no first argument */
763 if (arg == NULL) {
764 if (encoding != NULL || errors != NULL) {
765 PyErr_SetString(PyExc_TypeError,
766 "encoding or errors without sequence argument");
767 return -1;
768 }
769 return 0;
770 }
771
772 if (PyUnicode_Check(arg)) {
773 /* Encode via the codec registry */
774 PyObject *encoded, *new;
775 if (encoding == NULL) {
776 PyErr_SetString(PyExc_TypeError,
777 "string argument without an encoding");
778 return -1;
779 }
Marc-André Lemburgb2750b52008-06-06 12:18:17 +0000780 encoded = PyUnicode_AsEncodedString(arg, encoding, errors);
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000781 if (encoded == NULL)
782 return -1;
783 assert(PyBytes_Check(encoded));
Benjamin Peterson153c70f2009-04-18 15:42:12 +0000784 new = bytearray_iconcat(self, encoded);
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000785 Py_DECREF(encoded);
786 if (new == NULL)
787 return -1;
788 Py_DECREF(new);
789 return 0;
790 }
791
792 /* If it's not unicode, there can't be encoding or errors */
793 if (encoding != NULL || errors != NULL) {
794 PyErr_SetString(PyExc_TypeError,
795 "encoding or errors without a string argument");
796 return -1;
797 }
798
799 /* Is it an int? */
Serhiy Storchakaeb249882016-08-15 09:46:07 +0300800 if (PyIndex_Check(arg)) {
801 count = PyNumber_AsSsize_t(arg, PyExc_OverflowError);
802 if (count == -1 && PyErr_Occurred()) {
INADA Naokia634e232017-01-06 17:32:01 +0900803 if (PyErr_ExceptionMatches(PyExc_OverflowError))
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000804 return -1;
INADA Naokia634e232017-01-06 17:32:01 +0900805 PyErr_Clear(); /* fall through */
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000806 }
INADA Naokia634e232017-01-06 17:32:01 +0900807 else {
808 if (count < 0) {
809 PyErr_SetString(PyExc_ValueError, "negative count");
810 return -1;
811 }
812 if (count > 0) {
813 if (PyByteArray_Resize((PyObject *)self, count))
814 return -1;
815 memset(PyByteArray_AS_STRING(self), 0, count);
816 }
817 return 0;
818 }
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000819 }
820
821 /* Use the buffer API */
822 if (PyObject_CheckBuffer(arg)) {
823 Py_ssize_t size;
824 Py_buffer view;
825 if (PyObject_GetBuffer(arg, &view, PyBUF_FULL_RO) < 0)
826 return -1;
827 size = view.len;
828 if (PyByteArray_Resize((PyObject *)self, size) < 0) goto fail;
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200829 if (PyBuffer_ToContiguous(PyByteArray_AS_STRING(self),
830 &view, size, 'C') < 0)
Stefan Krah7d12d9d2012-07-28 12:25:55 +0200831 goto fail;
Martin v. Löwis423be952008-08-13 15:53:07 +0000832 PyBuffer_Release(&view);
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000833 return 0;
834 fail:
Martin v. Löwis423be952008-08-13 15:53:07 +0000835 PyBuffer_Release(&view);
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000836 return -1;
837 }
838
839 /* XXX Optimize this if the arguments is a list, tuple */
840
841 /* Get the iterator */
842 it = PyObject_GetIter(arg);
843 if (it == NULL)
844 return -1;
845 iternext = *Py_TYPE(it)->tp_iternext;
846
847 /* Run the iterator to exhaustion */
848 for (;;) {
849 PyObject *item;
Georg Brandl9a54d7c2008-07-16 23:15:30 +0000850 int rc, value;
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000851
852 /* Get the next item */
853 item = iternext(it);
854 if (item == NULL) {
855 if (PyErr_Occurred()) {
856 if (!PyErr_ExceptionMatches(PyExc_StopIteration))
857 goto error;
858 PyErr_Clear();
859 }
860 break;
861 }
862
863 /* Interpret it as an int (__index__) */
Georg Brandl9a54d7c2008-07-16 23:15:30 +0000864 rc = _getbytevalue(item, &value);
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000865 Py_DECREF(item);
Georg Brandl9a54d7c2008-07-16 23:15:30 +0000866 if (!rc)
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000867 goto error;
868
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000869 /* Append the byte */
Serhiy Storchaka7b6e3b92015-06-29 21:14:06 +0300870 if (Py_SIZE(self) + 1 < self->ob_alloc) {
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000871 Py_SIZE(self)++;
Serhiy Storchaka7b6e3b92015-06-29 21:14:06 +0300872 PyByteArray_AS_STRING(self)[Py_SIZE(self)] = '\0';
873 }
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000874 else if (PyByteArray_Resize((PyObject *)self, Py_SIZE(self)+1) < 0)
875 goto error;
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200876 PyByteArray_AS_STRING(self)[Py_SIZE(self)-1] = value;
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000877 }
878
879 /* Clean up and return success */
880 Py_DECREF(it);
881 return 0;
882
883 error:
884 /* Error handling when it != NULL */
885 Py_DECREF(it);
886 return -1;
887}
888
889/* Mostly copied from string_repr, but without the
890 "smart quote" functionality. */
891static PyObject *
Benjamin Peterson153c70f2009-04-18 15:42:12 +0000892bytearray_repr(PyByteArrayObject *self)
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000893{
Serhiy Storchakab3a77962017-09-21 14:24:13 +0300894 const char *className = _PyType_Name(Py_TYPE(self));
895 const char *quote_prefix = "(b";
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000896 const char *quote_postfix = ")";
897 Py_ssize_t length = Py_SIZE(self);
Serhiy Storchakab3a77962017-09-21 14:24:13 +0300898 /* 6 == strlen(quote_prefix) + 2 + strlen(quote_postfix) + 1 */
899 Py_ssize_t newsize;
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000900 PyObject *v;
Antoine Pitrou9ed5f272013-08-13 20:18:52 +0200901 Py_ssize_t i;
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200902 char *bytes;
Antoine Pitrou9ed5f272013-08-13 20:18:52 +0200903 char c;
904 char *p;
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200905 int quote;
906 char *test, *start;
907 char *buffer;
908
Serhiy Storchakab3a77962017-09-21 14:24:13 +0300909 newsize = strlen(className);
910 if (length > (PY_SSIZE_T_MAX - 6 - newsize) / 4) {
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000911 PyErr_SetString(PyExc_OverflowError,
912 "bytearray object is too large to make repr");
913 return NULL;
914 }
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200915
Serhiy Storchakab3a77962017-09-21 14:24:13 +0300916 newsize += 6 + length * 4;
Antoine Pitrou39aba4f2011-11-12 21:15:28 +0100917 buffer = PyObject_Malloc(newsize);
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200918 if (buffer == NULL) {
919 PyErr_NoMemory();
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000920 return NULL;
921 }
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000922
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200923 /* Figure out which quote to use; single is preferred */
924 quote = '\'';
925 start = PyByteArray_AS_STRING(self);
926 for (test = start; test < start+length; ++test) {
927 if (*test == '"') {
928 quote = '\''; /* back to single */
929 break;
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000930 }
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200931 else if (*test == '\'')
932 quote = '"';
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000933 }
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200934
935 p = buffer;
Serhiy Storchakab3a77962017-09-21 14:24:13 +0300936 while (*className)
937 *p++ = *className++;
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200938 while (*quote_prefix)
939 *p++ = *quote_prefix++;
940 *p++ = quote;
941
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200942 bytes = PyByteArray_AS_STRING(self);
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200943 for (i = 0; i < length; i++) {
944 /* There's at least enough room for a hex escape
945 and a closing quote. */
946 assert(newsize - (p - buffer) >= 5);
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200947 c = bytes[i];
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200948 if (c == '\'' || c == '\\')
949 *p++ = '\\', *p++ = c;
950 else if (c == '\t')
951 *p++ = '\\', *p++ = 't';
952 else if (c == '\n')
953 *p++ = '\\', *p++ = 'n';
954 else if (c == '\r')
955 *p++ = '\\', *p++ = 'r';
956 else if (c == 0)
957 *p++ = '\\', *p++ = 'x', *p++ = '0', *p++ = '0';
958 else if (c < ' ' || c >= 0x7f) {
959 *p++ = '\\';
960 *p++ = 'x';
Victor Stinnerf5cff562011-10-14 02:13:11 +0200961 *p++ = Py_hexdigits[(c & 0xf0) >> 4];
962 *p++ = Py_hexdigits[c & 0xf];
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200963 }
964 else
965 *p++ = c;
966 }
967 assert(newsize - (p - buffer) >= 1);
968 *p++ = quote;
969 while (*quote_postfix) {
970 *p++ = *quote_postfix++;
971 }
972
Serhiy Storchakab3a77962017-09-21 14:24:13 +0300973 v = PyUnicode_FromStringAndSize(buffer, p - buffer);
Antoine Pitrou39aba4f2011-11-12 21:15:28 +0100974 PyObject_Free(buffer);
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200975 return v;
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000976}
977
978static PyObject *
Benjamin Peterson153c70f2009-04-18 15:42:12 +0000979bytearray_str(PyObject *op)
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000980{
Alexander Belopolskyf0f45142010-08-11 17:31:17 +0000981 if (Py_BytesWarningFlag) {
982 if (PyErr_WarnEx(PyExc_BytesWarning,
983 "str() on a bytearray instance", 1))
984 return NULL;
985 }
986 return bytearray_repr((PyByteArrayObject*)op);
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000987}
988
989static PyObject *
Benjamin Peterson153c70f2009-04-18 15:42:12 +0000990bytearray_richcompare(PyObject *self, PyObject *other, int op)
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000991{
992 Py_ssize_t self_size, other_size;
993 Py_buffer self_bytes, other_bytes;
994 PyObject *res;
995 Py_ssize_t minsize;
Serhiy Storchakafa494fd2015-05-30 17:45:22 +0300996 int cmp, rc;
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000997
998 /* Bytes can be compared to anything that supports the (binary)
999 buffer API. Except that a comparison with Unicode is always an
1000 error, even if the comparison is for equality. */
Serhiy Storchakafa494fd2015-05-30 17:45:22 +03001001 rc = PyObject_IsInstance(self, (PyObject*)&PyUnicode_Type);
1002 if (!rc)
1003 rc = PyObject_IsInstance(other, (PyObject*)&PyUnicode_Type);
1004 if (rc < 0)
1005 return NULL;
1006 if (rc) {
Barry Warsaw9e9dcd62008-10-17 01:50:37 +00001007 if (Py_BytesWarningFlag && (op == Py_EQ || op == Py_NE)) {
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001008 if (PyErr_WarnEx(PyExc_BytesWarning,
Georg Brandle5d68ac2008-06-04 11:30:26 +00001009 "Comparison between bytearray and string", 1))
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001010 return NULL;
1011 }
1012
Brian Curtindfc80e32011-08-10 20:28:54 -05001013 Py_RETURN_NOTIMPLEMENTED;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001014 }
1015
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +02001016 if (PyObject_GetBuffer(self, &self_bytes, PyBUF_SIMPLE) != 0) {
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001017 PyErr_Clear();
Brian Curtindfc80e32011-08-10 20:28:54 -05001018 Py_RETURN_NOTIMPLEMENTED;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001019 }
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +02001020 self_size = self_bytes.len;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001021
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +02001022 if (PyObject_GetBuffer(other, &other_bytes, PyBUF_SIMPLE) != 0) {
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001023 PyErr_Clear();
Martin v. Löwis423be952008-08-13 15:53:07 +00001024 PyBuffer_Release(&self_bytes);
Brian Curtindfc80e32011-08-10 20:28:54 -05001025 Py_RETURN_NOTIMPLEMENTED;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001026 }
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +02001027 other_size = other_bytes.len;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001028
1029 if (self_size != other_size && (op == Py_EQ || op == Py_NE)) {
1030 /* Shortcut: if the lengths differ, the objects differ */
1031 cmp = (op == Py_NE);
1032 }
1033 else {
1034 minsize = self_size;
1035 if (other_size < minsize)
1036 minsize = other_size;
1037
1038 cmp = memcmp(self_bytes.buf, other_bytes.buf, minsize);
1039 /* In ISO C, memcmp() guarantees to use unsigned bytes! */
1040
1041 if (cmp == 0) {
1042 if (self_size < other_size)
1043 cmp = -1;
1044 else if (self_size > other_size)
1045 cmp = 1;
1046 }
1047
1048 switch (op) {
1049 case Py_LT: cmp = cmp < 0; break;
1050 case Py_LE: cmp = cmp <= 0; break;
1051 case Py_EQ: cmp = cmp == 0; break;
1052 case Py_NE: cmp = cmp != 0; break;
1053 case Py_GT: cmp = cmp > 0; break;
1054 case Py_GE: cmp = cmp >= 0; break;
1055 }
1056 }
1057
1058 res = cmp ? Py_True : Py_False;
Martin v. Löwis423be952008-08-13 15:53:07 +00001059 PyBuffer_Release(&self_bytes);
1060 PyBuffer_Release(&other_bytes);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001061 Py_INCREF(res);
1062 return res;
1063}
1064
1065static void
Benjamin Peterson153c70f2009-04-18 15:42:12 +00001066bytearray_dealloc(PyByteArrayObject *self)
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001067{
Benjamin Petersone0124bd2009-03-09 21:04:33 +00001068 if (self->ob_exports > 0) {
1069 PyErr_SetString(PyExc_SystemError,
Benjamin Petersonef3e4c22009-04-11 19:48:14 +00001070 "deallocated bytearray object has exported buffers");
Benjamin Petersone0124bd2009-03-09 21:04:33 +00001071 PyErr_Print();
1072 }
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001073 if (self->ob_bytes != 0) {
Antoine Pitrou39aba4f2011-11-12 21:15:28 +01001074 PyObject_Free(self->ob_bytes);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001075 }
1076 Py_TYPE(self)->tp_free((PyObject *)self);
1077}
1078
1079
1080/* -------------------------------------------------------------------- */
1081/* Methods */
1082
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02001083#define FASTSEARCH fastsearch
1084#define STRINGLIB(F) stringlib_##F
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001085#define STRINGLIB_CHAR char
Antoine Pitroucfc22b42012-10-16 21:07:23 +02001086#define STRINGLIB_SIZEOF_CHAR 1
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001087#define STRINGLIB_LEN PyByteArray_GET_SIZE
1088#define STRINGLIB_STR PyByteArray_AS_STRING
1089#define STRINGLIB_NEW PyByteArray_FromStringAndSize
Antoine Pitrouf2c54842010-01-13 08:07:53 +00001090#define STRINGLIB_ISSPACE Py_ISSPACE
1091#define STRINGLIB_ISLINEBREAK(x) ((x == '\n') || (x == '\r'))
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001092#define STRINGLIB_CHECK_EXACT PyByteArray_CheckExact
1093#define STRINGLIB_MUTABLE 1
1094
1095#include "stringlib/fastsearch.h"
1096#include "stringlib/count.h"
1097#include "stringlib/find.h"
Antoine Pitroucfc22b42012-10-16 21:07:23 +02001098#include "stringlib/join.h"
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001099#include "stringlib/partition.h"
Antoine Pitrouf2c54842010-01-13 08:07:53 +00001100#include "stringlib/split.h"
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001101#include "stringlib/ctype.h"
1102#include "stringlib/transmogrify.h"
1103
1104
Serhiy Storchakae09132f2016-07-03 13:57:48 +03001105static PyObject *
1106bytearray_find(PyByteArrayObject *self, PyObject *args)
1107{
1108 return _Py_bytes_find(PyByteArray_AS_STRING(self), PyByteArray_GET_SIZE(self), args);
1109}
1110
1111static PyObject *
1112bytearray_count(PyByteArrayObject *self, PyObject *args)
1113{
1114 return _Py_bytes_count(PyByteArray_AS_STRING(self), PyByteArray_GET_SIZE(self), args);
1115}
1116
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001117/*[clinic input]
1118bytearray.clear
1119
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001120Remove all items from the bytearray.
1121[clinic start generated code]*/
1122
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001123static PyObject *
1124bytearray_clear_impl(PyByteArrayObject *self)
Serhiy Storchaka7a9579c2016-05-02 13:45:20 +03001125/*[clinic end generated code: output=85c2fe6aede0956c input=ed6edae9de447ac4]*/
Eli Bendersky4db28d32011-03-03 18:21:02 +00001126{
1127 if (PyByteArray_Resize((PyObject *)self, 0) < 0)
1128 return NULL;
1129 Py_RETURN_NONE;
1130}
1131
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001132/*[clinic input]
1133bytearray.copy
1134
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001135Return a copy of B.
1136[clinic start generated code]*/
1137
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001138static PyObject *
1139bytearray_copy_impl(PyByteArrayObject *self)
Serhiy Storchaka7a9579c2016-05-02 13:45:20 +03001140/*[clinic end generated code: output=68cfbcfed484c132 input=6597b0c01bccaa9e]*/
Eli Bendersky4db28d32011-03-03 18:21:02 +00001141{
1142 return PyByteArray_FromStringAndSize(PyByteArray_AS_STRING((PyObject *)self),
1143 PyByteArray_GET_SIZE(self));
1144}
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001145
Serhiy Storchakae09132f2016-07-03 13:57:48 +03001146static PyObject *
1147bytearray_index(PyByteArrayObject *self, PyObject *args)
1148{
1149 return _Py_bytes_index(PyByteArray_AS_STRING(self), PyByteArray_GET_SIZE(self), args);
1150}
1151
1152static PyObject *
1153bytearray_rfind(PyByteArrayObject *self, PyObject *args)
1154{
1155 return _Py_bytes_rfind(PyByteArray_AS_STRING(self), PyByteArray_GET_SIZE(self), args);
1156}
1157
1158static PyObject *
1159bytearray_rindex(PyByteArrayObject *self, PyObject *args)
1160{
1161 return _Py_bytes_rindex(PyByteArray_AS_STRING(self), PyByteArray_GET_SIZE(self), args);
1162}
1163
1164static int
1165bytearray_contains(PyObject *self, PyObject *arg)
1166{
1167 return _Py_bytes_contains(PyByteArray_AS_STRING(self), PyByteArray_GET_SIZE(self), arg);
1168}
1169
1170static PyObject *
1171bytearray_startswith(PyByteArrayObject *self, PyObject *args)
1172{
1173 return _Py_bytes_startswith(PyByteArray_AS_STRING(self), PyByteArray_GET_SIZE(self), args);
1174}
1175
1176static PyObject *
1177bytearray_endswith(PyByteArrayObject *self, PyObject *args)
1178{
1179 return _Py_bytes_endswith(PyByteArray_AS_STRING(self), PyByteArray_GET_SIZE(self), args);
1180}
1181
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001182
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001183/*[clinic input]
1184bytearray.translate
1185
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001186 table: object
1187 Translation table, which must be a bytes object of length 256.
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001188 /
Martin Panter1b6c6da2016-08-27 08:35:02 +00001189 delete as deletechars: object(c_default="NULL") = b''
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001190
1191Return a copy with each character mapped by the given translation table.
1192
Martin Panter1b6c6da2016-08-27 08:35:02 +00001193All characters occurring in the optional argument delete are removed.
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001194The remaining characters are mapped through the given translation table.
1195[clinic start generated code]*/
1196
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001197static PyObject *
Larry Hastings89964c42015-04-14 18:07:59 -04001198bytearray_translate_impl(PyByteArrayObject *self, PyObject *table,
Martin Panter1b6c6da2016-08-27 08:35:02 +00001199 PyObject *deletechars)
1200/*[clinic end generated code: output=b6a8f01c2a74e446 input=cfff956d4d127a9b]*/
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001201{
Antoine Pitrou9ed5f272013-08-13 20:18:52 +02001202 char *input, *output;
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001203 const char *table_chars;
Antoine Pitrou9ed5f272013-08-13 20:18:52 +02001204 Py_ssize_t i, c;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001205 PyObject *input_obj = (PyObject*)self;
1206 const char *output_start;
1207 Py_ssize_t inlen;
Georg Brandlccc47b62008-12-28 11:44:14 +00001208 PyObject *result = NULL;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001209 int trans_table[256];
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001210 Py_buffer vtable, vdel;
1211
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001212 if (table == Py_None) {
1213 table_chars = NULL;
Georg Brandlccc47b62008-12-28 11:44:14 +00001214 table = NULL;
Serhiy Storchaka3dd3e262015-02-03 01:25:42 +02001215 } else if (PyObject_GetBuffer(table, &vtable, PyBUF_SIMPLE) != 0) {
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001216 return NULL;
Georg Brandlccc47b62008-12-28 11:44:14 +00001217 } else {
1218 if (vtable.len != 256) {
1219 PyErr_SetString(PyExc_ValueError,
1220 "translation table must be 256 characters long");
Georg Brandl953152f2009-07-22 12:03:59 +00001221 PyBuffer_Release(&vtable);
1222 return NULL;
Georg Brandlccc47b62008-12-28 11:44:14 +00001223 }
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001224 table_chars = (const char*)vtable.buf;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001225 }
1226
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001227 if (deletechars != NULL) {
Serhiy Storchaka3dd3e262015-02-03 01:25:42 +02001228 if (PyObject_GetBuffer(deletechars, &vdel, PyBUF_SIMPLE) != 0) {
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001229 if (table != NULL)
Georg Brandl953152f2009-07-22 12:03:59 +00001230 PyBuffer_Release(&vtable);
1231 return NULL;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001232 }
1233 }
1234 else {
1235 vdel.buf = NULL;
1236 vdel.len = 0;
1237 }
1238
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001239 inlen = PyByteArray_GET_SIZE(input_obj);
1240 result = PyByteArray_FromStringAndSize((char *)NULL, inlen);
1241 if (result == NULL)
1242 goto done;
Serhiy Storchakadd40fc32016-05-04 22:23:26 +03001243 output_start = output = PyByteArray_AS_STRING(result);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001244 input = PyByteArray_AS_STRING(input_obj);
1245
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001246 if (vdel.len == 0 && table_chars != NULL) {
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001247 /* If no deletions are required, use faster code */
1248 for (i = inlen; --i >= 0; ) {
1249 c = Py_CHARMASK(*input++);
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001250 *output++ = table_chars[c];
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001251 }
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001252 goto done;
1253 }
Georg Brandlccc47b62008-12-28 11:44:14 +00001254
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001255 if (table_chars == NULL) {
Georg Brandlccc47b62008-12-28 11:44:14 +00001256 for (i = 0; i < 256; i++)
1257 trans_table[i] = Py_CHARMASK(i);
1258 } else {
1259 for (i = 0; i < 256; i++)
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001260 trans_table[i] = Py_CHARMASK(table_chars[i]);
Georg Brandlccc47b62008-12-28 11:44:14 +00001261 }
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001262
1263 for (i = 0; i < vdel.len; i++)
1264 trans_table[(int) Py_CHARMASK( ((unsigned char*)vdel.buf)[i] )] = -1;
1265
1266 for (i = inlen; --i >= 0; ) {
1267 c = Py_CHARMASK(*input++);
1268 if (trans_table[c] != -1)
Martin Panter1b6c6da2016-08-27 08:35:02 +00001269 *output++ = (char)trans_table[c];
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001270 }
1271 /* Fix the size of the resulting string */
1272 if (inlen > 0)
Christian Heimesc731bbe2013-07-21 02:04:35 +02001273 if (PyByteArray_Resize(result, output - output_start) < 0) {
1274 Py_CLEAR(result);
1275 goto done;
1276 }
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001277
1278done:
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001279 if (table != NULL)
Georg Brandlccc47b62008-12-28 11:44:14 +00001280 PyBuffer_Release(&vtable);
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001281 if (deletechars != NULL)
Martin v. Löwis423be952008-08-13 15:53:07 +00001282 PyBuffer_Release(&vdel);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001283 return result;
1284}
1285
1286
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001287/*[clinic input]
1288
1289@staticmethod
1290bytearray.maketrans
1291
Serhiy Storchaka3dd3e262015-02-03 01:25:42 +02001292 frm: Py_buffer
1293 to: Py_buffer
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001294 /
1295
1296Return a translation table useable for the bytes or bytearray translate method.
1297
1298The returned table will be one where each byte in frm is mapped to the byte at
1299the same position in to.
1300
1301The bytes objects frm and to must be of the same length.
1302[clinic start generated code]*/
1303
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001304static PyObject *
Serhiy Storchaka3dd3e262015-02-03 01:25:42 +02001305bytearray_maketrans_impl(Py_buffer *frm, Py_buffer *to)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03001306/*[clinic end generated code: output=1df267d99f56b15e input=5925a81d2fbbf151]*/
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001307{
1308 return _Py_bytes_maketrans(frm, to);
Georg Brandlabc38772009-04-12 15:51:51 +00001309}
1310
1311
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001312/*[clinic input]
1313bytearray.replace
1314
Serhiy Storchaka3dd3e262015-02-03 01:25:42 +02001315 old: Py_buffer
1316 new: Py_buffer
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001317 count: Py_ssize_t = -1
1318 Maximum number of occurrences to replace.
1319 -1 (the default value) means replace all occurrences.
1320 /
1321
1322Return a copy with all occurrences of substring old replaced by new.
1323
1324If the optional argument count is given, only the first count occurrences are
1325replaced.
1326[clinic start generated code]*/
1327
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001328static PyObject *
Larry Hastings89964c42015-04-14 18:07:59 -04001329bytearray_replace_impl(PyByteArrayObject *self, Py_buffer *old,
1330 Py_buffer *new, Py_ssize_t count)
1331/*[clinic end generated code: output=d39884c4dc59412a input=aa379d988637c7fb]*/
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001332{
Serhiy Storchakafb81d3c2016-05-05 09:26:07 +03001333 return stringlib_replace((PyObject *)self,
Serhiy Storchakae09132f2016-07-03 13:57:48 +03001334 (const char *)old->buf, old->len,
1335 (const char *)new->buf, new->len, count);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001336}
1337
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001338/*[clinic input]
1339bytearray.split
1340
1341 sep: object = None
1342 The delimiter according which to split the bytearray.
1343 None (the default value) means split on ASCII whitespace characters
1344 (space, tab, return, newline, formfeed, vertical tab).
1345 maxsplit: Py_ssize_t = -1
1346 Maximum number of splits to do.
1347 -1 (the default value) means no limit.
1348
1349Return a list of the sections in the bytearray, using sep as the delimiter.
1350[clinic start generated code]*/
1351
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001352static PyObject *
Larry Hastings89964c42015-04-14 18:07:59 -04001353bytearray_split_impl(PyByteArrayObject *self, PyObject *sep,
1354 Py_ssize_t maxsplit)
1355/*[clinic end generated code: output=833e2cf385d9a04d input=24f82669f41bf523]*/
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001356{
1357 Py_ssize_t len = PyByteArray_GET_SIZE(self), n;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001358 const char *s = PyByteArray_AS_STRING(self), *sub;
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001359 PyObject *list;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001360 Py_buffer vsub;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001361
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001362 if (maxsplit < 0)
1363 maxsplit = PY_SSIZE_T_MAX;
1364
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001365 if (sep == Py_None)
Antoine Pitrouf2c54842010-01-13 08:07:53 +00001366 return stringlib_split_whitespace((PyObject*) self, s, len, maxsplit);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001367
Serhiy Storchaka3dd3e262015-02-03 01:25:42 +02001368 if (PyObject_GetBuffer(sep, &vsub, PyBUF_SIMPLE) != 0)
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001369 return NULL;
1370 sub = vsub.buf;
1371 n = vsub.len;
1372
Antoine Pitrouf2c54842010-01-13 08:07:53 +00001373 list = stringlib_split(
1374 (PyObject*) self, s, len, sub, n, maxsplit
1375 );
Martin v. Löwis423be952008-08-13 15:53:07 +00001376 PyBuffer_Release(&vsub);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001377 return list;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001378}
1379
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001380/*[clinic input]
1381bytearray.partition
1382
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001383 sep: object
1384 /
1385
1386Partition the bytearray into three parts using the given separator.
1387
1388This will search for the separator sep in the bytearray. If the separator is
1389found, returns a 3-tuple containing the part before the separator, the
1390separator itself, and the part after it.
1391
1392If the separator is not found, returns a 3-tuple containing the original
1393bytearray object and two empty bytearray objects.
1394[clinic start generated code]*/
1395
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001396static PyObject *
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001397bytearray_partition(PyByteArrayObject *self, PyObject *sep)
Serhiy Storchaka7a9579c2016-05-02 13:45:20 +03001398/*[clinic end generated code: output=45d2525ddd35f957 input=86f89223892b70b5]*/
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001399{
1400 PyObject *bytesep, *result;
1401
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001402 bytesep = PyByteArray_FromObject(sep);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001403 if (! bytesep)
1404 return NULL;
1405
1406 result = stringlib_partition(
1407 (PyObject*) self,
1408 PyByteArray_AS_STRING(self), PyByteArray_GET_SIZE(self),
1409 bytesep,
1410 PyByteArray_AS_STRING(bytesep), PyByteArray_GET_SIZE(bytesep)
1411 );
1412
1413 Py_DECREF(bytesep);
Antoine Pitrouf2c54842010-01-13 08:07:53 +00001414 return result;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001415}
1416
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001417/*[clinic input]
1418bytearray.rpartition
1419
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001420 sep: object
1421 /
1422
1423Partition the bytes into three parts using the given separator.
1424
1425This will search for the separator sep in the bytearray, starting and the end.
1426If the separator is found, returns a 3-tuple containing the part before the
1427separator, the separator itself, and the part after it.
1428
1429If the separator is not found, returns a 3-tuple containing two empty bytearray
1430objects and the original bytearray object.
1431[clinic start generated code]*/
1432
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001433static PyObject *
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001434bytearray_rpartition(PyByteArrayObject *self, PyObject *sep)
Serhiy Storchaka7a9579c2016-05-02 13:45:20 +03001435/*[clinic end generated code: output=440de3c9426115e8 input=5f4094f2de87c8f3]*/
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001436{
1437 PyObject *bytesep, *result;
1438
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001439 bytesep = PyByteArray_FromObject(sep);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001440 if (! bytesep)
1441 return NULL;
1442
1443 result = stringlib_rpartition(
1444 (PyObject*) self,
1445 PyByteArray_AS_STRING(self), PyByteArray_GET_SIZE(self),
1446 bytesep,
1447 PyByteArray_AS_STRING(bytesep), PyByteArray_GET_SIZE(bytesep)
1448 );
1449
1450 Py_DECREF(bytesep);
Antoine Pitrouf2c54842010-01-13 08:07:53 +00001451 return result;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001452}
1453
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001454/*[clinic input]
1455bytearray.rsplit = bytearray.split
1456
1457Return a list of the sections in the bytearray, using sep as the delimiter.
1458
1459Splitting is done starting at the end of the bytearray and working to the front.
1460[clinic start generated code]*/
1461
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001462static PyObject *
Larry Hastings89964c42015-04-14 18:07:59 -04001463bytearray_rsplit_impl(PyByteArrayObject *self, PyObject *sep,
1464 Py_ssize_t maxsplit)
1465/*[clinic end generated code: output=a55e0b5a03cb6190 input=a68286e4dd692ffe]*/
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001466{
1467 Py_ssize_t len = PyByteArray_GET_SIZE(self), n;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001468 const char *s = PyByteArray_AS_STRING(self), *sub;
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001469 PyObject *list;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001470 Py_buffer vsub;
1471
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001472 if (maxsplit < 0)
1473 maxsplit = PY_SSIZE_T_MAX;
1474
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001475 if (sep == Py_None)
Antoine Pitrouf2c54842010-01-13 08:07:53 +00001476 return stringlib_rsplit_whitespace((PyObject*) self, s, len, maxsplit);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001477
Serhiy Storchaka3dd3e262015-02-03 01:25:42 +02001478 if (PyObject_GetBuffer(sep, &vsub, PyBUF_SIMPLE) != 0)
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001479 return NULL;
1480 sub = vsub.buf;
1481 n = vsub.len;
1482
Antoine Pitrouf2c54842010-01-13 08:07:53 +00001483 list = stringlib_rsplit(
1484 (PyObject*) self, s, len, sub, n, maxsplit
1485 );
Martin v. Löwis423be952008-08-13 15:53:07 +00001486 PyBuffer_Release(&vsub);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001487 return list;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001488}
1489
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001490/*[clinic input]
1491bytearray.reverse
1492
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001493Reverse the order of the values in B in place.
1494[clinic start generated code]*/
1495
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001496static PyObject *
1497bytearray_reverse_impl(PyByteArrayObject *self)
Serhiy Storchaka7a9579c2016-05-02 13:45:20 +03001498/*[clinic end generated code: output=9f7616f29ab309d3 input=543356319fc78557]*/
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001499{
1500 char swap, *head, *tail;
1501 Py_ssize_t i, j, n = Py_SIZE(self);
1502
1503 j = n / 2;
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +02001504 head = PyByteArray_AS_STRING(self);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001505 tail = head + n - 1;
1506 for (i = 0; i < j; i++) {
1507 swap = *head;
1508 *head++ = *tail;
1509 *tail-- = swap;
1510 }
1511
1512 Py_RETURN_NONE;
1513}
1514
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001515
1516/*[python input]
1517class bytesvalue_converter(CConverter):
1518 type = 'int'
1519 converter = '_getbytevalue'
1520[python start generated code]*/
1521/*[python end generated code: output=da39a3ee5e6b4b0d input=29c2e7c26c212812]*/
1522
1523
1524/*[clinic input]
1525bytearray.insert
1526
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001527 index: Py_ssize_t
1528 The index where the value is to be inserted.
1529 item: bytesvalue
1530 The item to be inserted.
1531 /
1532
1533Insert a single item into the bytearray before the given index.
1534[clinic start generated code]*/
1535
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001536static PyObject *
1537bytearray_insert_impl(PyByteArrayObject *self, Py_ssize_t index, int item)
Serhiy Storchaka7a9579c2016-05-02 13:45:20 +03001538/*[clinic end generated code: output=76c775a70e7b07b7 input=b2b5d07e9de6c070]*/
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001539{
1540 Py_ssize_t n = Py_SIZE(self);
1541 char *buf;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001542
1543 if (n == PY_SSIZE_T_MAX) {
1544 PyErr_SetString(PyExc_OverflowError,
Mark Dickinson2b6705f2009-09-06 10:34:47 +00001545 "cannot add more objects to bytearray");
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001546 return NULL;
1547 }
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001548 if (PyByteArray_Resize((PyObject *)self, n + 1) < 0)
1549 return NULL;
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +02001550 buf = PyByteArray_AS_STRING(self);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001551
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001552 if (index < 0) {
1553 index += n;
1554 if (index < 0)
1555 index = 0;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001556 }
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001557 if (index > n)
1558 index = n;
1559 memmove(buf + index + 1, buf + index, n - index);
1560 buf[index] = item;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001561
1562 Py_RETURN_NONE;
1563}
1564
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001565/*[clinic input]
1566bytearray.append
1567
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001568 item: bytesvalue
1569 The item to be appended.
1570 /
1571
1572Append a single item to the end of the bytearray.
1573[clinic start generated code]*/
1574
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001575static PyObject *
1576bytearray_append_impl(PyByteArrayObject *self, int item)
Serhiy Storchaka7a9579c2016-05-02 13:45:20 +03001577/*[clinic end generated code: output=a154e19ed1886cb6 input=20d6bec3d1340593]*/
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001578{
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001579 Py_ssize_t n = Py_SIZE(self);
1580
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001581 if (n == PY_SSIZE_T_MAX) {
1582 PyErr_SetString(PyExc_OverflowError,
Mark Dickinson2b6705f2009-09-06 10:34:47 +00001583 "cannot add more objects to bytearray");
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001584 return NULL;
1585 }
1586 if (PyByteArray_Resize((PyObject *)self, n + 1) < 0)
1587 return NULL;
1588
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001589 PyByteArray_AS_STRING(self)[n] = item;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001590
1591 Py_RETURN_NONE;
1592}
1593
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001594/*[clinic input]
1595bytearray.extend
1596
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001597 iterable_of_ints: object
1598 The iterable of items to append.
1599 /
1600
1601Append all the items from the iterator or sequence to the end of the bytearray.
1602[clinic start generated code]*/
1603
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001604static PyObject *
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001605bytearray_extend(PyByteArrayObject *self, PyObject *iterable_of_ints)
Serhiy Storchaka7a9579c2016-05-02 13:45:20 +03001606/*[clinic end generated code: output=98155dbe249170b1 input=c617b3a93249ba28]*/
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001607{
Benjamin Peterson153c70f2009-04-18 15:42:12 +00001608 PyObject *it, *item, *bytearray_obj;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001609 Py_ssize_t buf_size = 0, len = 0;
1610 int value;
1611 char *buf;
1612
Benjamin Peterson153c70f2009-04-18 15:42:12 +00001613 /* bytearray_setslice code only accepts something supporting PEP 3118. */
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001614 if (PyObject_CheckBuffer(iterable_of_ints)) {
1615 if (bytearray_setslice(self, Py_SIZE(self), Py_SIZE(self), iterable_of_ints) == -1)
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001616 return NULL;
1617
1618 Py_RETURN_NONE;
1619 }
1620
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001621 it = PyObject_GetIter(iterable_of_ints);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001622 if (it == NULL)
1623 return NULL;
1624
Ezio Melotti42da6632011-03-15 05:18:48 +02001625 /* Try to determine the length of the argument. 32 is arbitrary. */
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001626 buf_size = PyObject_LengthHint(iterable_of_ints, 32);
Benjamin Petersonef3e4c22009-04-11 19:48:14 +00001627 if (buf_size == -1) {
1628 Py_DECREF(it);
1629 return NULL;
1630 }
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001631
Benjamin Peterson153c70f2009-04-18 15:42:12 +00001632 bytearray_obj = PyByteArray_FromStringAndSize(NULL, buf_size);
Antoine Pitrou58bb82e2012-04-01 16:05:46 +02001633 if (bytearray_obj == NULL) {
1634 Py_DECREF(it);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001635 return NULL;
Antoine Pitrou58bb82e2012-04-01 16:05:46 +02001636 }
Benjamin Peterson153c70f2009-04-18 15:42:12 +00001637 buf = PyByteArray_AS_STRING(bytearray_obj);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001638
1639 while ((item = PyIter_Next(it)) != NULL) {
1640 if (! _getbytevalue(item, &value)) {
1641 Py_DECREF(item);
1642 Py_DECREF(it);
Benjamin Peterson153c70f2009-04-18 15:42:12 +00001643 Py_DECREF(bytearray_obj);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001644 return NULL;
1645 }
1646 buf[len++] = value;
1647 Py_DECREF(item);
1648
1649 if (len >= buf_size) {
Martin Panter371731e2016-07-18 07:53:13 +00001650 Py_ssize_t addition;
1651 if (len == PY_SSIZE_T_MAX) {
1652 Py_DECREF(it);
1653 Py_DECREF(bytearray_obj);
1654 return PyErr_NoMemory();
1655 }
1656 addition = len >> 1;
1657 if (addition > PY_SSIZE_T_MAX - len - 1)
1658 buf_size = PY_SSIZE_T_MAX;
1659 else
1660 buf_size = len + addition + 1;
Benjamin Peterson153c70f2009-04-18 15:42:12 +00001661 if (PyByteArray_Resize((PyObject *)bytearray_obj, buf_size) < 0) {
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001662 Py_DECREF(it);
Benjamin Peterson153c70f2009-04-18 15:42:12 +00001663 Py_DECREF(bytearray_obj);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001664 return NULL;
1665 }
1666 /* Recompute the `buf' pointer, since the resizing operation may
1667 have invalidated it. */
Benjamin Peterson153c70f2009-04-18 15:42:12 +00001668 buf = PyByteArray_AS_STRING(bytearray_obj);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001669 }
1670 }
1671 Py_DECREF(it);
1672
1673 /* Resize down to exact size. */
Benjamin Peterson153c70f2009-04-18 15:42:12 +00001674 if (PyByteArray_Resize((PyObject *)bytearray_obj, len) < 0) {
1675 Py_DECREF(bytearray_obj);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001676 return NULL;
1677 }
1678
Antoine Pitrou58bb82e2012-04-01 16:05:46 +02001679 if (bytearray_setslice(self, Py_SIZE(self), Py_SIZE(self), bytearray_obj) == -1) {
1680 Py_DECREF(bytearray_obj);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001681 return NULL;
Antoine Pitrou58bb82e2012-04-01 16:05:46 +02001682 }
Benjamin Peterson153c70f2009-04-18 15:42:12 +00001683 Py_DECREF(bytearray_obj);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001684
1685 Py_RETURN_NONE;
1686}
1687
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001688/*[clinic input]
1689bytearray.pop
1690
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001691 index: Py_ssize_t = -1
1692 The index from where to remove the item.
1693 -1 (the default value) means remove the last item.
1694 /
1695
1696Remove and return a single item from B.
1697
1698If no index argument is given, will pop the last item.
1699[clinic start generated code]*/
1700
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001701static PyObject *
1702bytearray_pop_impl(PyByteArrayObject *self, Py_ssize_t index)
Serhiy Storchaka7a9579c2016-05-02 13:45:20 +03001703/*[clinic end generated code: output=e0ccd401f8021da8 input=3591df2d06c0d237]*/
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001704{
1705 int value;
1706 Py_ssize_t n = Py_SIZE(self);
1707 char *buf;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001708
1709 if (n == 0) {
Eli Bendersky1bc4f192011-03-04 04:55:25 +00001710 PyErr_SetString(PyExc_IndexError,
1711 "pop from empty bytearray");
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001712 return NULL;
1713 }
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001714 if (index < 0)
1715 index += Py_SIZE(self);
1716 if (index < 0 || index >= Py_SIZE(self)) {
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001717 PyErr_SetString(PyExc_IndexError, "pop index out of range");
1718 return NULL;
1719 }
Antoine Pitrou5504e892008-12-06 21:27:53 +00001720 if (!_canresize(self))
1721 return NULL;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001722
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +02001723 buf = PyByteArray_AS_STRING(self);
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001724 value = buf[index];
1725 memmove(buf + index, buf + index + 1, n - index);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001726 if (PyByteArray_Resize((PyObject *)self, n - 1) < 0)
1727 return NULL;
1728
Mark Dickinson54a3db92009-09-06 10:19:23 +00001729 return PyLong_FromLong((unsigned char)value);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001730}
1731
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001732/*[clinic input]
1733bytearray.remove
1734
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001735 value: bytesvalue
1736 The value to remove.
1737 /
1738
1739Remove the first occurrence of a value in the bytearray.
1740[clinic start generated code]*/
1741
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001742static PyObject *
1743bytearray_remove_impl(PyByteArrayObject *self, int value)
Serhiy Storchaka7a9579c2016-05-02 13:45:20 +03001744/*[clinic end generated code: output=d659e37866709c13 input=121831240cd51ddf]*/
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001745{
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001746 Py_ssize_t where, n = Py_SIZE(self);
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +02001747 char *buf = PyByteArray_AS_STRING(self);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001748
Serhiy Storchaka4b234942016-05-16 22:24:03 +03001749 where = stringlib_find_char(buf, n, value);
1750 if (where < 0) {
Mark Dickinson2b6705f2009-09-06 10:34:47 +00001751 PyErr_SetString(PyExc_ValueError, "value not found in bytearray");
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001752 return NULL;
1753 }
Antoine Pitrou5504e892008-12-06 21:27:53 +00001754 if (!_canresize(self))
1755 return NULL;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001756
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +02001757 memmove(buf + where, buf + where + 1, n - where);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001758 if (PyByteArray_Resize((PyObject *)self, n - 1) < 0)
1759 return NULL;
1760
1761 Py_RETURN_NONE;
1762}
1763
1764/* XXX These two helpers could be optimized if argsize == 1 */
1765
1766static Py_ssize_t
Serhiy Storchakaef1585e2015-12-25 20:01:53 +02001767lstrip_helper(const char *myptr, Py_ssize_t mysize,
1768 const void *argptr, Py_ssize_t argsize)
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001769{
1770 Py_ssize_t i = 0;
Antoine Pitrou5b720752013-10-05 21:24:10 +02001771 while (i < mysize && memchr(argptr, (unsigned char) myptr[i], argsize))
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001772 i++;
1773 return i;
1774}
1775
1776static Py_ssize_t
Serhiy Storchakaef1585e2015-12-25 20:01:53 +02001777rstrip_helper(const char *myptr, Py_ssize_t mysize,
1778 const void *argptr, Py_ssize_t argsize)
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001779{
1780 Py_ssize_t i = mysize - 1;
Antoine Pitrou5b720752013-10-05 21:24:10 +02001781 while (i >= 0 && memchr(argptr, (unsigned char) myptr[i], argsize))
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001782 i--;
1783 return i + 1;
1784}
1785
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001786/*[clinic input]
1787bytearray.strip
1788
1789 bytes: object = None
1790 /
1791
1792Strip leading and trailing bytes contained in the argument.
1793
1794If the argument is omitted or None, strip leading and trailing ASCII whitespace.
1795[clinic start generated code]*/
1796
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001797static PyObject *
1798bytearray_strip_impl(PyByteArrayObject *self, PyObject *bytes)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03001799/*[clinic end generated code: output=760412661a34ad5a input=ef7bb59b09c21d62]*/
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001800{
1801 Py_ssize_t left, right, mysize, byteslen;
1802 char *myptr, *bytesptr;
1803 Py_buffer vbytes;
1804
1805 if (bytes == Py_None) {
1806 bytesptr = "\t\n\r\f\v ";
1807 byteslen = 6;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001808 }
1809 else {
Serhiy Storchaka3dd3e262015-02-03 01:25:42 +02001810 if (PyObject_GetBuffer(bytes, &vbytes, PyBUF_SIMPLE) != 0)
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001811 return NULL;
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001812 bytesptr = (char *) vbytes.buf;
1813 byteslen = vbytes.len;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001814 }
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +02001815 myptr = PyByteArray_AS_STRING(self);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001816 mysize = Py_SIZE(self);
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001817 left = lstrip_helper(myptr, mysize, bytesptr, byteslen);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001818 if (left == mysize)
1819 right = left;
1820 else
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001821 right = rstrip_helper(myptr, mysize, bytesptr, byteslen);
1822 if (bytes != Py_None)
1823 PyBuffer_Release(&vbytes);
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +02001824 return PyByteArray_FromStringAndSize(myptr + left, right - left);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001825}
1826
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001827/*[clinic input]
1828bytearray.lstrip
1829
1830 bytes: object = None
1831 /
1832
1833Strip leading bytes contained in the argument.
1834
1835If the argument is omitted or None, strip leading ASCII whitespace.
1836[clinic start generated code]*/
1837
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001838static PyObject *
1839bytearray_lstrip_impl(PyByteArrayObject *self, PyObject *bytes)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03001840/*[clinic end generated code: output=d005c9d0ab909e66 input=80843f975dd7c480]*/
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001841{
1842 Py_ssize_t left, right, mysize, byteslen;
1843 char *myptr, *bytesptr;
1844 Py_buffer vbytes;
1845
1846 if (bytes == Py_None) {
1847 bytesptr = "\t\n\r\f\v ";
1848 byteslen = 6;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001849 }
1850 else {
Serhiy Storchaka3dd3e262015-02-03 01:25:42 +02001851 if (PyObject_GetBuffer(bytes, &vbytes, PyBUF_SIMPLE) != 0)
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001852 return NULL;
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001853 bytesptr = (char *) vbytes.buf;
1854 byteslen = vbytes.len;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001855 }
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +02001856 myptr = PyByteArray_AS_STRING(self);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001857 mysize = Py_SIZE(self);
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001858 left = lstrip_helper(myptr, mysize, bytesptr, byteslen);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001859 right = mysize;
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001860 if (bytes != Py_None)
1861 PyBuffer_Release(&vbytes);
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +02001862 return PyByteArray_FromStringAndSize(myptr + left, right - left);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001863}
1864
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001865/*[clinic input]
1866bytearray.rstrip
1867
1868 bytes: object = None
1869 /
1870
1871Strip trailing bytes contained in the argument.
1872
1873If the argument is omitted or None, strip trailing ASCII whitespace.
1874[clinic start generated code]*/
1875
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001876static PyObject *
1877bytearray_rstrip_impl(PyByteArrayObject *self, PyObject *bytes)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03001878/*[clinic end generated code: output=030e2fbd2f7276bd input=e728b994954cfd91]*/
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001879{
1880 Py_ssize_t right, mysize, byteslen;
1881 char *myptr, *bytesptr;
1882 Py_buffer vbytes;
1883
1884 if (bytes == Py_None) {
1885 bytesptr = "\t\n\r\f\v ";
1886 byteslen = 6;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001887 }
1888 else {
Serhiy Storchaka3dd3e262015-02-03 01:25:42 +02001889 if (PyObject_GetBuffer(bytes, &vbytes, PyBUF_SIMPLE) != 0)
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001890 return NULL;
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001891 bytesptr = (char *) vbytes.buf;
1892 byteslen = vbytes.len;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001893 }
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +02001894 myptr = PyByteArray_AS_STRING(self);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001895 mysize = Py_SIZE(self);
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001896 right = rstrip_helper(myptr, mysize, bytesptr, byteslen);
1897 if (bytes != Py_None)
1898 PyBuffer_Release(&vbytes);
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +02001899 return PyByteArray_FromStringAndSize(myptr, right);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001900}
1901
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001902/*[clinic input]
1903bytearray.decode
1904
1905 encoding: str(c_default="NULL") = 'utf-8'
1906 The encoding with which to decode the bytearray.
1907 errors: str(c_default="NULL") = 'strict'
1908 The error handling scheme to use for the handling of decoding errors.
1909 The default is 'strict' meaning that decoding errors raise a
1910 UnicodeDecodeError. Other possible values are 'ignore' and 'replace'
1911 as well as any other name registered with codecs.register_error that
1912 can handle UnicodeDecodeErrors.
1913
1914Decode the bytearray using the codec registered for encoding.
1915[clinic start generated code]*/
1916
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001917static PyObject *
Larry Hastings89964c42015-04-14 18:07:59 -04001918bytearray_decode_impl(PyByteArrayObject *self, const char *encoding,
1919 const char *errors)
1920/*[clinic end generated code: output=f57d43f4a00b42c5 input=f28d8f903020257b]*/
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001921{
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001922 if (encoding == NULL)
1923 encoding = PyUnicode_GetDefaultEncoding();
Martin v. Löwis0efea322014-07-27 17:29:17 +02001924 return PyUnicode_FromEncodedObject((PyObject*)self, encoding, errors);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001925}
1926
1927PyDoc_STRVAR(alloc_doc,
1928"B.__alloc__() -> int\n\
1929\n\
Georg Brandl17cb8a82008-05-30 08:20:09 +00001930Return the number of bytes actually allocated.");
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001931
1932static PyObject *
Benjamin Peterson153c70f2009-04-18 15:42:12 +00001933bytearray_alloc(PyByteArrayObject *self)
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001934{
1935 return PyLong_FromSsize_t(self->ob_alloc);
1936}
1937
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001938/*[clinic input]
1939bytearray.join
1940
1941 iterable_of_bytes: object
1942 /
1943
1944Concatenate any number of bytes/bytearray objects.
1945
1946The bytearray whose method is called is inserted in between each pair.
1947
1948The result is returned as a new bytearray object.
1949[clinic start generated code]*/
1950
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001951static PyObject *
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001952bytearray_join(PyByteArrayObject *self, PyObject *iterable_of_bytes)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03001953/*[clinic end generated code: output=a8516370bf68ae08 input=aba6b1f9b30fcb8e]*/
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001954{
Martin v. Löwis0efea322014-07-27 17:29:17 +02001955 return stringlib_bytes_join((PyObject*)self, iterable_of_bytes);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001956}
1957
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001958/*[clinic input]
1959bytearray.splitlines
Antoine Pitrouf2c54842010-01-13 08:07:53 +00001960
Serhiy Storchaka202fda52017-03-12 10:10:47 +02001961 keepends: bool(accept={int}) = False
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001962
1963Return a list of the lines in the bytearray, breaking at line boundaries.
1964
1965Line breaks are not included in the resulting list unless keepends is given and
1966true.
1967[clinic start generated code]*/
1968
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001969static PyObject *
1970bytearray_splitlines_impl(PyByteArrayObject *self, int keepends)
Serhiy Storchaka202fda52017-03-12 10:10:47 +02001971/*[clinic end generated code: output=4223c94b895f6ad9 input=99a27ad959b9cf6b]*/
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001972{
Antoine Pitrouf2c54842010-01-13 08:07:53 +00001973 return stringlib_splitlines(
1974 (PyObject*) self, PyByteArray_AS_STRING(self),
1975 PyByteArray_GET_SIZE(self), keepends
1976 );
1977}
1978
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001979/*[clinic input]
1980@classmethod
1981bytearray.fromhex
1982
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001983 string: unicode
1984 /
1985
1986Create a bytearray object from a string of hexadecimal numbers.
1987
1988Spaces between two numbers are accepted.
1989Example: bytearray.fromhex('B9 01EF') -> bytearray(b'\\xb9\\x01\\xef')
1990[clinic start generated code]*/
1991
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001992static PyObject *
Serhiy Storchaka0855e702016-07-01 17:22:31 +03001993bytearray_fromhex_impl(PyTypeObject *type, PyObject *string)
1994/*[clinic end generated code: output=8f0f0b6d30fb3ba0 input=f033a16d1fb21f48]*/
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001995{
Serhiy Storchaka0855e702016-07-01 17:22:31 +03001996 PyObject *result = _PyBytes_FromHex(string, type == &PyByteArray_Type);
1997 if (type != &PyByteArray_Type && result != NULL) {
Victor Stinnerde4ae3d2016-12-04 22:59:09 +01001998 Py_SETREF(result, PyObject_CallFunctionObjArgs((PyObject *)type,
1999 result, NULL));
Serhiy Storchaka0855e702016-07-01 17:22:31 +03002000 }
2001 return result;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002002}
2003
Gregory P. Smith8cb65692015-04-25 23:22:26 +00002004PyDoc_STRVAR(hex__doc__,
2005"B.hex() -> string\n\
2006\n\
2007Create a string of hexadecimal numbers from a bytearray object.\n\
2008Example: bytearray([0xb9, 0x01, 0xef]).hex() -> 'b901ef'.");
2009
2010static PyObject *
Serhiy Storchakae09132f2016-07-03 13:57:48 +03002011bytearray_hex(PyBytesObject *self)
2012{
2013 char* argbuf = PyByteArray_AS_STRING(self);
2014 Py_ssize_t arglen = PyByteArray_GET_SIZE(self);
2015 return _Py_strhex(argbuf, arglen);
2016}
2017
2018static PyObject *
Antoine Pitroub0e1f8b2011-12-05 20:40:08 +01002019_common_reduce(PyByteArrayObject *self, int proto)
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002020{
Antoine Pitroub0e1f8b2011-12-05 20:40:08 +01002021 PyObject *dict;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02002022 _Py_IDENTIFIER(__dict__);
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +02002023 char *buf;
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02002024
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02002025 dict = _PyObject_GetAttrId((PyObject *)self, &PyId___dict__);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002026 if (dict == NULL) {
2027 PyErr_Clear();
2028 dict = Py_None;
2029 Py_INCREF(dict);
2030 }
2031
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +02002032 buf = PyByteArray_AS_STRING(self);
Antoine Pitroub0e1f8b2011-12-05 20:40:08 +01002033 if (proto < 3) {
2034 /* use str based reduction for backwards compatibility with Python 2.x */
2035 PyObject *latin1;
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +02002036 if (Py_SIZE(self))
2037 latin1 = PyUnicode_DecodeLatin1(buf, Py_SIZE(self), NULL);
Antoine Pitroub0e1f8b2011-12-05 20:40:08 +01002038 else
2039 latin1 = PyUnicode_FromString("");
2040 return Py_BuildValue("(O(Ns)N)", Py_TYPE(self), latin1, "latin-1", dict);
2041 }
2042 else {
2043 /* use more efficient byte based reduction */
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +02002044 if (Py_SIZE(self)) {
2045 return Py_BuildValue("(O(y#)N)", Py_TYPE(self), buf, Py_SIZE(self), dict);
Antoine Pitroub0e1f8b2011-12-05 20:40:08 +01002046 }
2047 else {
2048 return Py_BuildValue("(O()N)", Py_TYPE(self), dict);
2049 }
2050 }
2051}
2052
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002053/*[clinic input]
2054bytearray.__reduce__ as bytearray_reduce
2055
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002056Return state information for pickling.
2057[clinic start generated code]*/
2058
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002059static PyObject *
2060bytearray_reduce_impl(PyByteArrayObject *self)
Serhiy Storchaka7a9579c2016-05-02 13:45:20 +03002061/*[clinic end generated code: output=52bf304086464cab input=44b5737ada62dd3f]*/
Antoine Pitroub0e1f8b2011-12-05 20:40:08 +01002062{
2063 return _common_reduce(self, 2);
2064}
2065
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002066/*[clinic input]
2067bytearray.__reduce_ex__ as bytearray_reduce_ex
2068
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002069 proto: int = 0
2070 /
2071
2072Return state information for pickling.
2073[clinic start generated code]*/
2074
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002075static PyObject *
2076bytearray_reduce_ex_impl(PyByteArrayObject *self, int proto)
Serhiy Storchaka7a9579c2016-05-02 13:45:20 +03002077/*[clinic end generated code: output=52eac33377197520 input=f129bc1a1aa151ee]*/
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002078{
Antoine Pitroub0e1f8b2011-12-05 20:40:08 +01002079 return _common_reduce(self, proto);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002080}
2081
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002082/*[clinic input]
2083bytearray.__sizeof__ as bytearray_sizeof
2084
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002085Returns the size of the bytearray object in memory, in bytes.
2086[clinic start generated code]*/
2087
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002088static PyObject *
2089bytearray_sizeof_impl(PyByteArrayObject *self)
Serhiy Storchaka7a9579c2016-05-02 13:45:20 +03002090/*[clinic end generated code: output=738abdd17951c427 input=e27320fd98a4bc5a]*/
Robert Schuppeniesfbe94c52008-07-14 10:13:31 +00002091{
Benjamin Petersonef3e4c22009-04-11 19:48:14 +00002092 Py_ssize_t res;
Robert Schuppeniesfbe94c52008-07-14 10:13:31 +00002093
Serhiy Storchaka5c4064e2015-12-19 20:05:25 +02002094 res = _PyObject_SIZE(Py_TYPE(self)) + self->ob_alloc * sizeof(char);
Benjamin Petersonef3e4c22009-04-11 19:48:14 +00002095 return PyLong_FromSsize_t(res);
Robert Schuppeniesfbe94c52008-07-14 10:13:31 +00002096}
2097
Benjamin Peterson153c70f2009-04-18 15:42:12 +00002098static PySequenceMethods bytearray_as_sequence = {
2099 (lenfunc)bytearray_length, /* sq_length */
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002100 (binaryfunc)PyByteArray_Concat, /* sq_concat */
Benjamin Peterson153c70f2009-04-18 15:42:12 +00002101 (ssizeargfunc)bytearray_repeat, /* sq_repeat */
2102 (ssizeargfunc)bytearray_getitem, /* sq_item */
2103 0, /* sq_slice */
2104 (ssizeobjargproc)bytearray_setitem, /* sq_ass_item */
2105 0, /* sq_ass_slice */
Serhiy Storchakae09132f2016-07-03 13:57:48 +03002106 (objobjproc)bytearray_contains, /* sq_contains */
Benjamin Peterson153c70f2009-04-18 15:42:12 +00002107 (binaryfunc)bytearray_iconcat, /* sq_inplace_concat */
2108 (ssizeargfunc)bytearray_irepeat, /* sq_inplace_repeat */
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002109};
2110
Benjamin Peterson153c70f2009-04-18 15:42:12 +00002111static PyMappingMethods bytearray_as_mapping = {
2112 (lenfunc)bytearray_length,
2113 (binaryfunc)bytearray_subscript,
2114 (objobjargproc)bytearray_ass_subscript,
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002115};
2116
Benjamin Peterson153c70f2009-04-18 15:42:12 +00002117static PyBufferProcs bytearray_as_buffer = {
2118 (getbufferproc)bytearray_getbuffer,
2119 (releasebufferproc)bytearray_releasebuffer,
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002120};
2121
2122static PyMethodDef
Benjamin Peterson153c70f2009-04-18 15:42:12 +00002123bytearray_methods[] = {
2124 {"__alloc__", (PyCFunction)bytearray_alloc, METH_NOARGS, alloc_doc},
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002125 BYTEARRAY_REDUCE_METHODDEF
2126 BYTEARRAY_REDUCE_EX_METHODDEF
2127 BYTEARRAY_SIZEOF_METHODDEF
2128 BYTEARRAY_APPEND_METHODDEF
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002129 {"capitalize", (PyCFunction)stringlib_capitalize, METH_NOARGS,
2130 _Py_capitalize__doc__},
Serhiy Storchakadd40fc32016-05-04 22:23:26 +03002131 {"center", (PyCFunction)stringlib_center, METH_VARARGS, _Py_center__doc__},
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002132 BYTEARRAY_CLEAR_METHODDEF
2133 BYTEARRAY_COPY_METHODDEF
Serhiy Storchakae09132f2016-07-03 13:57:48 +03002134 {"count", (PyCFunction)bytearray_count, METH_VARARGS,
Serhiy Storchakadd40fc32016-05-04 22:23:26 +03002135 _Py_count__doc__},
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002136 BYTEARRAY_DECODE_METHODDEF
Serhiy Storchakae09132f2016-07-03 13:57:48 +03002137 {"endswith", (PyCFunction)bytearray_endswith, METH_VARARGS,
Serhiy Storchakadd40fc32016-05-04 22:23:26 +03002138 _Py_endswith__doc__},
Ezio Melotti745d54d2013-11-16 19:10:57 +02002139 {"expandtabs", (PyCFunction)stringlib_expandtabs, METH_VARARGS | METH_KEYWORDS,
Serhiy Storchakadd40fc32016-05-04 22:23:26 +03002140 _Py_expandtabs__doc__},
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002141 BYTEARRAY_EXTEND_METHODDEF
Serhiy Storchakae09132f2016-07-03 13:57:48 +03002142 {"find", (PyCFunction)bytearray_find, METH_VARARGS,
Serhiy Storchakadd40fc32016-05-04 22:23:26 +03002143 _Py_find__doc__},
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002144 BYTEARRAY_FROMHEX_METHODDEF
Serhiy Storchakae09132f2016-07-03 13:57:48 +03002145 {"hex", (PyCFunction)bytearray_hex, METH_NOARGS, hex__doc__},
2146 {"index", (PyCFunction)bytearray_index, METH_VARARGS, _Py_index__doc__},
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002147 BYTEARRAY_INSERT_METHODDEF
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002148 {"isalnum", (PyCFunction)stringlib_isalnum, METH_NOARGS,
2149 _Py_isalnum__doc__},
2150 {"isalpha", (PyCFunction)stringlib_isalpha, METH_NOARGS,
2151 _Py_isalpha__doc__},
2152 {"isdigit", (PyCFunction)stringlib_isdigit, METH_NOARGS,
2153 _Py_isdigit__doc__},
2154 {"islower", (PyCFunction)stringlib_islower, METH_NOARGS,
2155 _Py_islower__doc__},
2156 {"isspace", (PyCFunction)stringlib_isspace, METH_NOARGS,
2157 _Py_isspace__doc__},
2158 {"istitle", (PyCFunction)stringlib_istitle, METH_NOARGS,
2159 _Py_istitle__doc__},
2160 {"isupper", (PyCFunction)stringlib_isupper, METH_NOARGS,
2161 _Py_isupper__doc__},
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002162 BYTEARRAY_JOIN_METHODDEF
Serhiy Storchakadd40fc32016-05-04 22:23:26 +03002163 {"ljust", (PyCFunction)stringlib_ljust, METH_VARARGS, _Py_ljust__doc__},
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002164 {"lower", (PyCFunction)stringlib_lower, METH_NOARGS, _Py_lower__doc__},
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002165 BYTEARRAY_LSTRIP_METHODDEF
2166 BYTEARRAY_MAKETRANS_METHODDEF
2167 BYTEARRAY_PARTITION_METHODDEF
2168 BYTEARRAY_POP_METHODDEF
2169 BYTEARRAY_REMOVE_METHODDEF
2170 BYTEARRAY_REPLACE_METHODDEF
2171 BYTEARRAY_REVERSE_METHODDEF
Serhiy Storchakae09132f2016-07-03 13:57:48 +03002172 {"rfind", (PyCFunction)bytearray_rfind, METH_VARARGS, _Py_rfind__doc__},
2173 {"rindex", (PyCFunction)bytearray_rindex, METH_VARARGS, _Py_rindex__doc__},
Serhiy Storchakadd40fc32016-05-04 22:23:26 +03002174 {"rjust", (PyCFunction)stringlib_rjust, METH_VARARGS, _Py_rjust__doc__},
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002175 BYTEARRAY_RPARTITION_METHODDEF
2176 BYTEARRAY_RSPLIT_METHODDEF
2177 BYTEARRAY_RSTRIP_METHODDEF
2178 BYTEARRAY_SPLIT_METHODDEF
2179 BYTEARRAY_SPLITLINES_METHODDEF
Serhiy Storchakae09132f2016-07-03 13:57:48 +03002180 {"startswith", (PyCFunction)bytearray_startswith, METH_VARARGS ,
Serhiy Storchakadd40fc32016-05-04 22:23:26 +03002181 _Py_startswith__doc__},
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002182 BYTEARRAY_STRIP_METHODDEF
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002183 {"swapcase", (PyCFunction)stringlib_swapcase, METH_NOARGS,
2184 _Py_swapcase__doc__},
2185 {"title", (PyCFunction)stringlib_title, METH_NOARGS, _Py_title__doc__},
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002186 BYTEARRAY_TRANSLATE_METHODDEF
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002187 {"upper", (PyCFunction)stringlib_upper, METH_NOARGS, _Py_upper__doc__},
Serhiy Storchakadd40fc32016-05-04 22:23:26 +03002188 {"zfill", (PyCFunction)stringlib_zfill, METH_VARARGS, _Py_zfill__doc__},
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002189 {NULL}
2190};
2191
Ethan Furmanb95b5612015-01-23 20:05:18 -08002192static PyObject *
2193bytearray_mod(PyObject *v, PyObject *w)
2194{
2195 if (!PyByteArray_Check(v))
2196 Py_RETURN_NOTIMPLEMENTED;
Berker Peksag43de36d2016-04-16 01:20:47 +03002197 return _PyBytes_FormatEx(PyByteArray_AS_STRING(v), PyByteArray_GET_SIZE(v), w, 1);
Ethan Furmanb95b5612015-01-23 20:05:18 -08002198}
2199
2200static PyNumberMethods bytearray_as_number = {
2201 0, /*nb_add*/
2202 0, /*nb_subtract*/
2203 0, /*nb_multiply*/
2204 bytearray_mod, /*nb_remainder*/
2205};
2206
Benjamin Peterson153c70f2009-04-18 15:42:12 +00002207PyDoc_STRVAR(bytearray_doc,
Georg Brandl17cb8a82008-05-30 08:20:09 +00002208"bytearray(iterable_of_ints) -> bytearray\n\
2209bytearray(string, encoding[, errors]) -> bytearray\n\
Victor Stinnerbb2e9c42011-12-17 23:18:07 +01002210bytearray(bytes_or_buffer) -> mutable copy of bytes_or_buffer\n\
2211bytearray(int) -> bytes array of size given by the parameter initialized with null bytes\n\
2212bytearray() -> empty bytes array\n\
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002213\n\
Serhiy Storchaka6a7b3a72016-04-17 08:32:47 +03002214Construct a mutable bytearray object from:\n\
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002215 - an iterable yielding integers in range(256)\n\
2216 - a text string encoded using the specified encoding\n\
Victor Stinnerbb2e9c42011-12-17 23:18:07 +01002217 - a bytes or a buffer object\n\
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002218 - any object implementing the buffer API.\n\
Victor Stinnerbb2e9c42011-12-17 23:18:07 +01002219 - an integer");
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002220
2221
Benjamin Peterson153c70f2009-04-18 15:42:12 +00002222static PyObject *bytearray_iter(PyObject *seq);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002223
2224PyTypeObject PyByteArray_Type = {
2225 PyVarObject_HEAD_INIT(&PyType_Type, 0)
2226 "bytearray",
2227 sizeof(PyByteArrayObject),
2228 0,
Benjamin Peterson153c70f2009-04-18 15:42:12 +00002229 (destructor)bytearray_dealloc, /* tp_dealloc */
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002230 0, /* tp_print */
2231 0, /* tp_getattr */
2232 0, /* tp_setattr */
Mark Dickinsone94c6792009-02-02 20:36:42 +00002233 0, /* tp_reserved */
Benjamin Peterson153c70f2009-04-18 15:42:12 +00002234 (reprfunc)bytearray_repr, /* tp_repr */
Ethan Furmanb95b5612015-01-23 20:05:18 -08002235 &bytearray_as_number, /* tp_as_number */
Benjamin Peterson153c70f2009-04-18 15:42:12 +00002236 &bytearray_as_sequence, /* tp_as_sequence */
2237 &bytearray_as_mapping, /* tp_as_mapping */
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002238 0, /* tp_hash */
2239 0, /* tp_call */
Benjamin Peterson153c70f2009-04-18 15:42:12 +00002240 bytearray_str, /* tp_str */
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002241 PyObject_GenericGetAttr, /* tp_getattro */
2242 0, /* tp_setattro */
Benjamin Peterson153c70f2009-04-18 15:42:12 +00002243 &bytearray_as_buffer, /* tp_as_buffer */
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002244 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
Benjamin Peterson153c70f2009-04-18 15:42:12 +00002245 bytearray_doc, /* tp_doc */
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002246 0, /* tp_traverse */
2247 0, /* tp_clear */
Benjamin Peterson153c70f2009-04-18 15:42:12 +00002248 (richcmpfunc)bytearray_richcompare, /* tp_richcompare */
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002249 0, /* tp_weaklistoffset */
Benjamin Peterson153c70f2009-04-18 15:42:12 +00002250 bytearray_iter, /* tp_iter */
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002251 0, /* tp_iternext */
Benjamin Peterson153c70f2009-04-18 15:42:12 +00002252 bytearray_methods, /* tp_methods */
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002253 0, /* tp_members */
2254 0, /* tp_getset */
2255 0, /* tp_base */
2256 0, /* tp_dict */
2257 0, /* tp_descr_get */
2258 0, /* tp_descr_set */
2259 0, /* tp_dictoffset */
Benjamin Peterson153c70f2009-04-18 15:42:12 +00002260 (initproc)bytearray_init, /* tp_init */
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002261 PyType_GenericAlloc, /* tp_alloc */
2262 PyType_GenericNew, /* tp_new */
2263 PyObject_Del, /* tp_free */
2264};
2265
2266/*********************** Bytes Iterator ****************************/
2267
2268typedef struct {
2269 PyObject_HEAD
2270 Py_ssize_t it_index;
2271 PyByteArrayObject *it_seq; /* Set to NULL when iterator is exhausted */
2272} bytesiterobject;
2273
2274static void
Benjamin Peterson153c70f2009-04-18 15:42:12 +00002275bytearrayiter_dealloc(bytesiterobject *it)
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002276{
2277 _PyObject_GC_UNTRACK(it);
2278 Py_XDECREF(it->it_seq);
2279 PyObject_GC_Del(it);
2280}
2281
2282static int
Benjamin Peterson153c70f2009-04-18 15:42:12 +00002283bytearrayiter_traverse(bytesiterobject *it, visitproc visit, void *arg)
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002284{
2285 Py_VISIT(it->it_seq);
2286 return 0;
2287}
2288
2289static PyObject *
Benjamin Peterson153c70f2009-04-18 15:42:12 +00002290bytearrayiter_next(bytesiterobject *it)
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002291{
2292 PyByteArrayObject *seq;
2293 PyObject *item;
2294
2295 assert(it != NULL);
2296 seq = it->it_seq;
2297 if (seq == NULL)
2298 return NULL;
2299 assert(PyByteArray_Check(seq));
2300
2301 if (it->it_index < PyByteArray_GET_SIZE(seq)) {
2302 item = PyLong_FromLong(
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +02002303 (unsigned char)PyByteArray_AS_STRING(seq)[it->it_index]);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002304 if (item != NULL)
2305 ++it->it_index;
2306 return item;
2307 }
2308
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002309 it->it_seq = NULL;
Serhiy Storchakafbb1c5e2016-03-30 20:40:02 +03002310 Py_DECREF(seq);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002311 return NULL;
2312}
2313
2314static PyObject *
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00002315bytearrayiter_length_hint(bytesiterobject *it)
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002316{
2317 Py_ssize_t len = 0;
Serhiy Storchakaaf658722016-07-03 14:41:36 +03002318 if (it->it_seq) {
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002319 len = PyByteArray_GET_SIZE(it->it_seq) - it->it_index;
Serhiy Storchakaaf658722016-07-03 14:41:36 +03002320 if (len < 0) {
2321 len = 0;
2322 }
2323 }
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002324 return PyLong_FromSsize_t(len);
2325}
2326
2327PyDoc_STRVAR(length_hint_doc,
2328 "Private method returning an estimate of len(list(it)).");
2329
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00002330static PyObject *
2331bytearrayiter_reduce(bytesiterobject *it)
2332{
2333 if (it->it_seq != NULL) {
Antoine Pitroua7013882012-04-05 00:04:20 +02002334 return Py_BuildValue("N(O)n", _PyObject_GetBuiltin("iter"),
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00002335 it->it_seq, it->it_index);
2336 } else {
Serhiy Storchaka460bd0d2016-11-20 12:16:46 +02002337 return Py_BuildValue("N(())", _PyObject_GetBuiltin("iter"));
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00002338 }
2339}
2340
2341static PyObject *
2342bytearrayiter_setstate(bytesiterobject *it, PyObject *state)
2343{
2344 Py_ssize_t index = PyLong_AsSsize_t(state);
2345 if (index == -1 && PyErr_Occurred())
2346 return NULL;
Kristján Valur Jónsson25dded02014-03-05 13:47:57 +00002347 if (it->it_seq != NULL) {
2348 if (index < 0)
2349 index = 0;
2350 else if (index > PyByteArray_GET_SIZE(it->it_seq))
2351 index = PyByteArray_GET_SIZE(it->it_seq); /* iterator exhausted */
2352 it->it_index = index;
2353 }
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00002354 Py_RETURN_NONE;
2355}
2356
2357PyDoc_STRVAR(setstate_doc, "Set state information for unpickling.");
2358
Benjamin Peterson153c70f2009-04-18 15:42:12 +00002359static PyMethodDef bytearrayiter_methods[] = {
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00002360 {"__length_hint__", (PyCFunction)bytearrayiter_length_hint, METH_NOARGS,
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002361 length_hint_doc},
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00002362 {"__reduce__", (PyCFunction)bytearrayiter_reduce, METH_NOARGS,
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002363 bytearray_reduce__doc__},
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00002364 {"__setstate__", (PyCFunction)bytearrayiter_setstate, METH_O,
2365 setstate_doc},
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002366 {NULL, NULL} /* sentinel */
2367};
2368
2369PyTypeObject PyByteArrayIter_Type = {
2370 PyVarObject_HEAD_INIT(&PyType_Type, 0)
2371 "bytearray_iterator", /* tp_name */
2372 sizeof(bytesiterobject), /* tp_basicsize */
2373 0, /* tp_itemsize */
2374 /* methods */
Benjamin Peterson153c70f2009-04-18 15:42:12 +00002375 (destructor)bytearrayiter_dealloc, /* tp_dealloc */
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002376 0, /* tp_print */
2377 0, /* tp_getattr */
2378 0, /* tp_setattr */
Mark Dickinsone94c6792009-02-02 20:36:42 +00002379 0, /* tp_reserved */
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002380 0, /* tp_repr */
2381 0, /* tp_as_number */
2382 0, /* tp_as_sequence */
2383 0, /* tp_as_mapping */
2384 0, /* tp_hash */
2385 0, /* tp_call */
2386 0, /* tp_str */
2387 PyObject_GenericGetAttr, /* tp_getattro */
2388 0, /* tp_setattro */
2389 0, /* tp_as_buffer */
2390 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC, /* tp_flags */
2391 0, /* tp_doc */
Benjamin Peterson153c70f2009-04-18 15:42:12 +00002392 (traverseproc)bytearrayiter_traverse, /* tp_traverse */
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002393 0, /* tp_clear */
2394 0, /* tp_richcompare */
2395 0, /* tp_weaklistoffset */
2396 PyObject_SelfIter, /* tp_iter */
Benjamin Peterson153c70f2009-04-18 15:42:12 +00002397 (iternextfunc)bytearrayiter_next, /* tp_iternext */
2398 bytearrayiter_methods, /* tp_methods */
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002399 0,
2400};
2401
2402static PyObject *
Benjamin Peterson153c70f2009-04-18 15:42:12 +00002403bytearray_iter(PyObject *seq)
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002404{
2405 bytesiterobject *it;
2406
2407 if (!PyByteArray_Check(seq)) {
2408 PyErr_BadInternalCall();
2409 return NULL;
2410 }
2411 it = PyObject_GC_New(bytesiterobject, &PyByteArrayIter_Type);
2412 if (it == NULL)
2413 return NULL;
2414 it->it_index = 0;
2415 Py_INCREF(seq);
2416 it->it_seq = (PyByteArrayObject *)seq;
2417 _PyObject_GC_TRACK(it);
2418 return (PyObject *)it;
2419}