blob: f8c21d4e623c15561868f1a74a7924588cbd82ee [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"
5#include "structmember.h"
6#include "bytes_methods.h"
Ethan Furmanb95b5612015-01-23 20:05:18 -08007#include "bytesobject.h"
Gregory P. Smith8cb65692015-04-25 23:22:26 +00008#include "pystrhex.h"
Christian Heimes2c9c7a52008-05-26 13:42:13 +00009
Martin v. Löwis7252a6e2014-07-27 16:25:09 +020010/*[clinic input]
11class bytearray "PyByteArrayObject *" "&PyByteArray_Type"
12[clinic start generated code]*/
13/*[clinic end generated code: output=da39a3ee5e6b4b0d input=5535b77c37a119e0]*/
14
Antoine Pitroufc8d6f42010-01-17 12:38:54 +000015char _PyByteArray_empty_string[] = "";
Christian Heimes2c9c7a52008-05-26 13:42:13 +000016
17void
18PyByteArray_Fini(void)
19{
Christian Heimes2c9c7a52008-05-26 13:42:13 +000020}
21
22int
23PyByteArray_Init(void)
24{
Christian Heimes2c9c7a52008-05-26 13:42:13 +000025 return 1;
26}
27
28/* end nullbytes support */
29
30/* Helpers */
31
32static int
33_getbytevalue(PyObject* arg, int *value)
34{
35 long face_value;
36
37 if (PyLong_Check(arg)) {
38 face_value = PyLong_AsLong(arg);
Georg Brandl9a54d7c2008-07-16 23:15:30 +000039 } else {
40 PyObject *index = PyNumber_Index(arg);
41 if (index == NULL) {
42 PyErr_Format(PyExc_TypeError, "an integer is required");
Mark Dickinson10de93a2010-07-09 19:25:48 +000043 *value = -1;
Christian Heimes2c9c7a52008-05-26 13:42:13 +000044 return 0;
45 }
Georg Brandl9a54d7c2008-07-16 23:15:30 +000046 face_value = PyLong_AsLong(index);
47 Py_DECREF(index);
48 }
49
50 if (face_value < 0 || face_value >= 256) {
51 /* this includes the OverflowError in case the long is too large */
52 PyErr_SetString(PyExc_ValueError, "byte must be in range(0, 256)");
Mark Dickinson10de93a2010-07-09 19:25:48 +000053 *value = -1;
Christian Heimes2c9c7a52008-05-26 13:42:13 +000054 return 0;
55 }
56
57 *value = face_value;
58 return 1;
59}
60
61static int
Benjamin Peterson153c70f2009-04-18 15:42:12 +000062bytearray_getbuffer(PyByteArrayObject *obj, Py_buffer *view, int flags)
Christian Heimes2c9c7a52008-05-26 13:42:13 +000063{
Christian Heimes2c9c7a52008-05-26 13:42:13 +000064 void *ptr;
65 if (view == NULL) {
Stefan Krah5178d912015-02-03 16:57:21 +010066 PyErr_SetString(PyExc_BufferError,
67 "bytearray_getbuffer: view==NULL argument is obsolete");
68 return -1;
Christian Heimes2c9c7a52008-05-26 13:42:13 +000069 }
Antoine Pitroufc8d6f42010-01-17 12:38:54 +000070 ptr = (void *) PyByteArray_AS_STRING(obj);
Stefan Krah5178d912015-02-03 16:57:21 +010071 /* cannot fail if view != NULL and readonly == 0 */
72 (void)PyBuffer_FillInfo(view, (PyObject*)obj, ptr, Py_SIZE(obj), 0, flags);
73 obj->ob_exports++;
74 return 0;
Christian Heimes2c9c7a52008-05-26 13:42:13 +000075}
76
77static void
Benjamin Peterson153c70f2009-04-18 15:42:12 +000078bytearray_releasebuffer(PyByteArrayObject *obj, Py_buffer *view)
Christian Heimes2c9c7a52008-05-26 13:42:13 +000079{
80 obj->ob_exports--;
81}
82
Antoine Pitrou5504e892008-12-06 21:27:53 +000083static int
84_canresize(PyByteArrayObject *self)
85{
86 if (self->ob_exports > 0) {
87 PyErr_SetString(PyExc_BufferError,
88 "Existing exports of data: object cannot be re-sized");
89 return 0;
90 }
91 return 1;
92}
93
Serhiy Storchaka1009bf12015-04-03 23:53:51 +030094#include "clinic/bytearrayobject.c.h"
95
Christian Heimes2c9c7a52008-05-26 13:42:13 +000096/* Direct API functions */
97
98PyObject *
99PyByteArray_FromObject(PyObject *input)
100{
101 return PyObject_CallFunctionObjArgs((PyObject *)&PyByteArray_Type,
102 input, NULL);
103}
104
105PyObject *
106PyByteArray_FromStringAndSize(const char *bytes, Py_ssize_t size)
107{
108 PyByteArrayObject *new;
109 Py_ssize_t alloc;
110
111 if (size < 0) {
112 PyErr_SetString(PyExc_SystemError,
113 "Negative size passed to PyByteArray_FromStringAndSize");
114 return NULL;
115 }
116
Neal Norwitz3ce5d922008-08-24 07:08:55 +0000117 /* Prevent buffer overflow when setting alloc to size+1. */
118 if (size == PY_SSIZE_T_MAX) {
119 return PyErr_NoMemory();
120 }
121
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000122 new = PyObject_New(PyByteArrayObject, &PyByteArray_Type);
123 if (new == NULL)
124 return NULL;
125
126 if (size == 0) {
127 new->ob_bytes = NULL;
128 alloc = 0;
129 }
130 else {
131 alloc = size + 1;
Antoine Pitrou39aba4f2011-11-12 21:15:28 +0100132 new->ob_bytes = PyObject_Malloc(alloc);
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000133 if (new->ob_bytes == NULL) {
134 Py_DECREF(new);
135 return PyErr_NoMemory();
136 }
Antoine Pitroufc8d6f42010-01-17 12:38:54 +0000137 if (bytes != NULL && size > 0)
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000138 memcpy(new->ob_bytes, bytes, size);
139 new->ob_bytes[size] = '\0'; /* Trailing null byte */
140 }
141 Py_SIZE(new) = size;
142 new->ob_alloc = alloc;
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200143 new->ob_start = new->ob_bytes;
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000144 new->ob_exports = 0;
145
146 return (PyObject *)new;
147}
148
149Py_ssize_t
150PyByteArray_Size(PyObject *self)
151{
152 assert(self != NULL);
153 assert(PyByteArray_Check(self));
154
155 return PyByteArray_GET_SIZE(self);
156}
157
158char *
159PyByteArray_AsString(PyObject *self)
160{
161 assert(self != NULL);
162 assert(PyByteArray_Check(self));
163
164 return PyByteArray_AS_STRING(self);
165}
166
167int
Antoine Pitroucc231542014-11-02 18:40:09 +0100168PyByteArray_Resize(PyObject *self, Py_ssize_t requested_size)
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000169{
170 void *sval;
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200171 PyByteArrayObject *obj = ((PyByteArrayObject *)self);
Antoine Pitroucc231542014-11-02 18:40:09 +0100172 /* All computations are done unsigned to avoid integer overflows
173 (see issue #22335). */
174 size_t alloc = (size_t) obj->ob_alloc;
175 size_t logical_offset = (size_t) (obj->ob_start - obj->ob_bytes);
176 size_t size = (size_t) requested_size;
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000177
178 assert(self != NULL);
179 assert(PyByteArray_Check(self));
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200180 assert(logical_offset <= alloc);
Antoine Pitroucc231542014-11-02 18:40:09 +0100181 assert(requested_size >= 0);
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000182
Antoine Pitroucc231542014-11-02 18:40:09 +0100183 if (requested_size == Py_SIZE(self)) {
Antoine Pitrou5504e892008-12-06 21:27:53 +0000184 return 0;
185 }
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200186 if (!_canresize(obj)) {
Antoine Pitrou5504e892008-12-06 21:27:53 +0000187 return -1;
188 }
189
Antoine Pitrou25454112015-05-19 20:52:27 +0200190 if (size + logical_offset + 1 <= alloc) {
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200191 /* Current buffer is large enough to host the requested size,
192 decide on a strategy. */
193 if (size < alloc / 2) {
194 /* Major downsize; resize down to exact size */
195 alloc = size + 1;
196 }
197 else {
198 /* Minor downsize; quick exit */
199 Py_SIZE(self) = size;
200 PyByteArray_AS_STRING(self)[size] = '\0'; /* Trailing null */
201 return 0;
202 }
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000203 }
204 else {
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200205 /* Need growing, decide on a strategy */
206 if (size <= alloc * 1.125) {
207 /* Moderate upsize; overallocate similar to list_resize() */
208 alloc = size + (size >> 3) + (size < 9 ? 3 : 6);
209 }
210 else {
211 /* Major upsize; resize up to exact size */
212 alloc = size + 1;
213 }
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000214 }
Antoine Pitroucc231542014-11-02 18:40:09 +0100215 if (alloc > PY_SSIZE_T_MAX) {
216 PyErr_NoMemory();
217 return -1;
218 }
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000219
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200220 if (logical_offset > 0) {
221 sval = PyObject_Malloc(alloc);
222 if (sval == NULL) {
223 PyErr_NoMemory();
224 return -1;
225 }
Antoine Pitroucc231542014-11-02 18:40:09 +0100226 memcpy(sval, PyByteArray_AS_STRING(self),
227 Py_MIN(requested_size, Py_SIZE(self)));
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200228 PyObject_Free(obj->ob_bytes);
229 }
230 else {
231 sval = PyObject_Realloc(obj->ob_bytes, alloc);
232 if (sval == NULL) {
233 PyErr_NoMemory();
234 return -1;
235 }
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000236 }
237
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200238 obj->ob_bytes = obj->ob_start = sval;
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000239 Py_SIZE(self) = size;
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200240 obj->ob_alloc = alloc;
241 obj->ob_bytes[size] = '\0'; /* Trailing null byte */
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000242
243 return 0;
244}
245
246PyObject *
247PyByteArray_Concat(PyObject *a, PyObject *b)
248{
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000249 Py_buffer va, vb;
250 PyByteArrayObject *result = NULL;
251
252 va.len = -1;
253 vb.len = -1;
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +0200254 if (PyObject_GetBuffer(a, &va, PyBUF_SIMPLE) != 0 ||
255 PyObject_GetBuffer(b, &vb, PyBUF_SIMPLE) != 0) {
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000256 PyErr_Format(PyExc_TypeError, "can't concat %.100s to %.100s",
257 Py_TYPE(a)->tp_name, Py_TYPE(b)->tp_name);
258 goto done;
259 }
260
Serhiy Storchaka06cfb0c2016-07-10 20:48:43 +0300261 if (va.len > PY_SSIZE_T_MAX - vb.len) {
262 PyErr_NoMemory();
263 goto done;
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000264 }
265
Serhiy Storchaka06cfb0c2016-07-10 20:48:43 +0300266 result = (PyByteArrayObject *) \
267 PyByteArray_FromStringAndSize(NULL, va.len + vb.len);
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000268 if (result != NULL) {
269 memcpy(result->ob_bytes, va.buf, va.len);
270 memcpy(result->ob_bytes + va.len, vb.buf, vb.len);
271 }
272
273 done:
274 if (va.len != -1)
Martin v. Löwis423be952008-08-13 15:53:07 +0000275 PyBuffer_Release(&va);
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000276 if (vb.len != -1)
Martin v. Löwis423be952008-08-13 15:53:07 +0000277 PyBuffer_Release(&vb);
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000278 return (PyObject *)result;
279}
280
281/* Functions stuffed into the type object */
282
283static Py_ssize_t
Benjamin Peterson153c70f2009-04-18 15:42:12 +0000284bytearray_length(PyByteArrayObject *self)
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000285{
286 return Py_SIZE(self);
287}
288
289static PyObject *
Benjamin Peterson153c70f2009-04-18 15:42:12 +0000290bytearray_iconcat(PyByteArrayObject *self, PyObject *other)
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000291{
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000292 Py_ssize_t size;
293 Py_buffer vo;
294
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +0200295 if (PyObject_GetBuffer(other, &vo, PyBUF_SIMPLE) != 0) {
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000296 PyErr_Format(PyExc_TypeError, "can't concat %.100s to %.100s",
297 Py_TYPE(other)->tp_name, Py_TYPE(self)->tp_name);
298 return NULL;
299 }
300
Serhiy Storchaka06cfb0c2016-07-10 20:48:43 +0300301 size = Py_SIZE(self);
302 if (size > PY_SSIZE_T_MAX - vo.len) {
Martin v. Löwis423be952008-08-13 15:53:07 +0000303 PyBuffer_Release(&vo);
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000304 return PyErr_NoMemory();
305 }
Serhiy Storchaka06cfb0c2016-07-10 20:48:43 +0300306 if (PyByteArray_Resize((PyObject *)self, size + vo.len) < 0) {
Martin v. Löwis423be952008-08-13 15:53:07 +0000307 PyBuffer_Release(&vo);
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000308 return NULL;
309 }
Serhiy Storchaka06cfb0c2016-07-10 20:48:43 +0300310 memcpy(PyByteArray_AS_STRING(self) + size, vo.buf, vo.len);
Martin v. Löwis423be952008-08-13 15:53:07 +0000311 PyBuffer_Release(&vo);
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000312 Py_INCREF(self);
313 return (PyObject *)self;
314}
315
316static PyObject *
Benjamin Peterson153c70f2009-04-18 15:42:12 +0000317bytearray_repeat(PyByteArrayObject *self, Py_ssize_t count)
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000318{
319 PyByteArrayObject *result;
320 Py_ssize_t mysize;
321 Py_ssize_t size;
322
323 if (count < 0)
324 count = 0;
325 mysize = Py_SIZE(self);
Mark Dickinsoncf940c72010-08-10 18:35:01 +0000326 if (count > 0 && mysize > PY_SSIZE_T_MAX / count)
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000327 return PyErr_NoMemory();
Mark Dickinsoncf940c72010-08-10 18:35:01 +0000328 size = mysize * count;
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000329 result = (PyByteArrayObject *)PyByteArray_FromStringAndSize(NULL, size);
330 if (result != NULL && size != 0) {
331 if (mysize == 1)
332 memset(result->ob_bytes, self->ob_bytes[0], size);
333 else {
334 Py_ssize_t i;
335 for (i = 0; i < count; i++)
336 memcpy(result->ob_bytes + i*mysize, self->ob_bytes, mysize);
337 }
338 }
339 return (PyObject *)result;
340}
341
342static PyObject *
Benjamin Peterson153c70f2009-04-18 15:42:12 +0000343bytearray_irepeat(PyByteArrayObject *self, Py_ssize_t count)
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000344{
345 Py_ssize_t mysize;
346 Py_ssize_t size;
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200347 char *buf;
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000348
349 if (count < 0)
350 count = 0;
351 mysize = Py_SIZE(self);
Mark Dickinsoncf940c72010-08-10 18:35:01 +0000352 if (count > 0 && mysize > PY_SSIZE_T_MAX / count)
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000353 return PyErr_NoMemory();
Mark Dickinsoncf940c72010-08-10 18:35:01 +0000354 size = mysize * count;
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200355 if (PyByteArray_Resize((PyObject *)self, size) < 0)
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000356 return NULL;
357
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200358 buf = PyByteArray_AS_STRING(self);
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000359 if (mysize == 1)
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200360 memset(buf, buf[0], size);
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000361 else {
362 Py_ssize_t i;
363 for (i = 1; i < count; i++)
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200364 memcpy(buf + i*mysize, buf, mysize);
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000365 }
366
367 Py_INCREF(self);
368 return (PyObject *)self;
369}
370
371static PyObject *
Benjamin Peterson153c70f2009-04-18 15:42:12 +0000372bytearray_getitem(PyByteArrayObject *self, Py_ssize_t i)
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000373{
374 if (i < 0)
375 i += Py_SIZE(self);
376 if (i < 0 || i >= Py_SIZE(self)) {
377 PyErr_SetString(PyExc_IndexError, "bytearray index out of range");
378 return NULL;
379 }
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200380 return PyLong_FromLong((unsigned char)(PyByteArray_AS_STRING(self)[i]));
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000381}
382
383static PyObject *
Benjamin Peterson153c70f2009-04-18 15:42:12 +0000384bytearray_subscript(PyByteArrayObject *self, PyObject *index)
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000385{
Georg Brandl9a54d7c2008-07-16 23:15:30 +0000386 if (PyIndex_Check(index)) {
387 Py_ssize_t i = PyNumber_AsSsize_t(index, PyExc_IndexError);
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000388
389 if (i == -1 && PyErr_Occurred())
390 return NULL;
391
392 if (i < 0)
393 i += PyByteArray_GET_SIZE(self);
394
395 if (i < 0 || i >= Py_SIZE(self)) {
396 PyErr_SetString(PyExc_IndexError, "bytearray index out of range");
397 return NULL;
398 }
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200399 return PyLong_FromLong((unsigned char)(PyByteArray_AS_STRING(self)[i]));
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000400 }
Georg Brandl9a54d7c2008-07-16 23:15:30 +0000401 else if (PySlice_Check(index)) {
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000402 Py_ssize_t start, stop, step, slicelength, cur, i;
Martin v. Löwis4d0d4712010-12-03 20:14:31 +0000403 if (PySlice_GetIndicesEx(index,
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000404 PyByteArray_GET_SIZE(self),
405 &start, &stop, &step, &slicelength) < 0) {
406 return NULL;
407 }
408
409 if (slicelength <= 0)
410 return PyByteArray_FromStringAndSize("", 0);
411 else if (step == 1) {
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200412 return PyByteArray_FromStringAndSize(
413 PyByteArray_AS_STRING(self) + start, slicelength);
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000414 }
415 else {
416 char *source_buf = PyByteArray_AS_STRING(self);
Alexandre Vassalottie2641f42009-04-03 06:38:02 +0000417 char *result_buf;
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000418 PyObject *result;
419
Alexandre Vassalottie2641f42009-04-03 06:38:02 +0000420 result = PyByteArray_FromStringAndSize(NULL, slicelength);
421 if (result == NULL)
422 return NULL;
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000423
Alexandre Vassalottie2641f42009-04-03 06:38:02 +0000424 result_buf = PyByteArray_AS_STRING(result);
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000425 for (cur = start, i = 0; i < slicelength;
426 cur += step, i++) {
427 result_buf[i] = source_buf[cur];
428 }
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000429 return result;
430 }
431 }
432 else {
Terry Jan Reedyffff1442014-08-02 01:30:37 -0400433 PyErr_Format(PyExc_TypeError,
434 "bytearray indices must be integers or slices, not %.200s",
435 Py_TYPE(index)->tp_name);
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000436 return NULL;
437 }
438}
439
440static int
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200441bytearray_setslice_linear(PyByteArrayObject *self,
442 Py_ssize_t lo, Py_ssize_t hi,
443 char *bytes, Py_ssize_t bytes_len)
444{
445 Py_ssize_t avail = hi - lo;
446 char *buf = PyByteArray_AS_STRING(self);
447 Py_ssize_t growth = bytes_len - avail;
Victor Stinner84557232013-11-21 12:29:51 +0100448 int res = 0;
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200449 assert(avail >= 0);
450
Victor Stinner84557232013-11-21 12:29:51 +0100451 if (growth < 0) {
452 if (!_canresize(self))
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200453 return -1;
Victor Stinner84557232013-11-21 12:29:51 +0100454
455 if (lo == 0) {
456 /* Shrink the buffer by advancing its logical start */
457 self->ob_start -= growth;
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200458 /*
Victor Stinner84557232013-11-21 12:29:51 +0100459 0 lo hi old_size
460 | |<----avail----->|<-----tail------>|
461 | |<-bytes_len->|<-----tail------>|
462 0 new_lo new_hi new_size
463 */
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200464 }
Victor Stinner84557232013-11-21 12:29:51 +0100465 else {
466 /*
467 0 lo hi old_size
468 | |<----avail----->|<-----tomove------>|
469 | |<-bytes_len->|<-----tomove------>|
470 0 lo new_hi new_size
471 */
472 memmove(buf + lo + bytes_len, buf + hi,
473 Py_SIZE(self) - hi);
474 }
475 if (PyByteArray_Resize((PyObject *)self,
476 Py_SIZE(self) + growth) < 0) {
477 /* Issue #19578: Handling the memory allocation failure here is
478 tricky here because the bytearray object has already been
479 modified. Depending on growth and lo, the behaviour is
480 different.
481
482 If growth < 0 and lo != 0, the operation is completed, but a
483 MemoryError is still raised and the memory block is not
484 shrinked. Otherwise, the bytearray is restored in its previous
485 state and a MemoryError is raised. */
486 if (lo == 0) {
487 self->ob_start += growth;
488 return -1;
489 }
490 /* memmove() removed bytes, the bytearray object cannot be
491 restored in its previous state. */
492 Py_SIZE(self) += growth;
493 res = -1;
494 }
495 buf = PyByteArray_AS_STRING(self);
496 }
497 else if (growth > 0) {
498 if (Py_SIZE(self) > (Py_ssize_t)PY_SSIZE_T_MAX - growth) {
499 PyErr_NoMemory();
500 return -1;
501 }
502
503 if (PyByteArray_Resize((PyObject *)self,
504 Py_SIZE(self) + growth) < 0) {
505 return -1;
506 }
507 buf = PyByteArray_AS_STRING(self);
508 /* Make the place for the additional bytes */
509 /*
510 0 lo hi old_size
511 | |<-avail->|<-----tomove------>|
512 | |<---bytes_len-->|<-----tomove------>|
513 0 lo new_hi new_size
514 */
515 memmove(buf + lo + bytes_len, buf + hi,
516 Py_SIZE(self) - lo - bytes_len);
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200517 }
518
519 if (bytes_len > 0)
520 memcpy(buf + lo, bytes, bytes_len);
Victor Stinner84557232013-11-21 12:29:51 +0100521 return res;
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200522}
523
524static int
Benjamin Peterson153c70f2009-04-18 15:42:12 +0000525bytearray_setslice(PyByteArrayObject *self, Py_ssize_t lo, Py_ssize_t hi,
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000526 PyObject *values)
527{
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200528 Py_ssize_t needed;
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000529 void *bytes;
530 Py_buffer vbytes;
531 int res = 0;
532
533 vbytes.len = -1;
534 if (values == (PyObject *)self) {
535 /* Make a copy and call this function recursively */
536 int err;
537 values = PyByteArray_FromObject(values);
538 if (values == NULL)
539 return -1;
Benjamin Peterson153c70f2009-04-18 15:42:12 +0000540 err = bytearray_setslice(self, lo, hi, values);
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000541 Py_DECREF(values);
542 return err;
543 }
544 if (values == NULL) {
545 /* del b[lo:hi] */
546 bytes = NULL;
547 needed = 0;
548 }
549 else {
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +0200550 if (PyObject_GetBuffer(values, &vbytes, PyBUF_SIMPLE) != 0) {
551 PyErr_Format(PyExc_TypeError,
552 "can't set bytearray slice from %.100s",
553 Py_TYPE(values)->tp_name);
554 return -1;
555 }
556 needed = vbytes.len;
557 bytes = vbytes.buf;
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000558 }
559
560 if (lo < 0)
561 lo = 0;
562 if (hi < lo)
563 hi = lo;
564 if (hi > Py_SIZE(self))
565 hi = Py_SIZE(self);
566
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200567 res = bytearray_setslice_linear(self, lo, hi, bytes, needed);
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000568 if (vbytes.len != -1)
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200569 PyBuffer_Release(&vbytes);
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000570 return res;
571}
572
573static int
Benjamin Peterson153c70f2009-04-18 15:42:12 +0000574bytearray_setitem(PyByteArrayObject *self, Py_ssize_t i, PyObject *value)
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000575{
Georg Brandl9a54d7c2008-07-16 23:15:30 +0000576 int ival;
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000577
578 if (i < 0)
579 i += Py_SIZE(self);
580
581 if (i < 0 || i >= Py_SIZE(self)) {
582 PyErr_SetString(PyExc_IndexError, "bytearray index out of range");
583 return -1;
584 }
585
586 if (value == NULL)
Benjamin Peterson153c70f2009-04-18 15:42:12 +0000587 return bytearray_setslice(self, i, i+1, NULL);
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000588
Georg Brandl9a54d7c2008-07-16 23:15:30 +0000589 if (!_getbytevalue(value, &ival))
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000590 return -1;
591
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200592 PyByteArray_AS_STRING(self)[i] = ival;
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000593 return 0;
594}
595
596static int
Benjamin Peterson153c70f2009-04-18 15:42:12 +0000597bytearray_ass_subscript(PyByteArrayObject *self, PyObject *index, PyObject *values)
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000598{
599 Py_ssize_t start, stop, step, slicelen, needed;
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200600 char *buf, *bytes;
601 buf = PyByteArray_AS_STRING(self);
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000602
Georg Brandl9a54d7c2008-07-16 23:15:30 +0000603 if (PyIndex_Check(index)) {
604 Py_ssize_t i = PyNumber_AsSsize_t(index, PyExc_IndexError);
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000605
606 if (i == -1 && PyErr_Occurred())
607 return -1;
608
609 if (i < 0)
610 i += PyByteArray_GET_SIZE(self);
611
612 if (i < 0 || i >= Py_SIZE(self)) {
613 PyErr_SetString(PyExc_IndexError, "bytearray index out of range");
614 return -1;
615 }
616
617 if (values == NULL) {
618 /* Fall through to slice assignment */
619 start = i;
620 stop = i + 1;
621 step = 1;
622 slicelen = 1;
623 }
624 else {
Georg Brandl9a54d7c2008-07-16 23:15:30 +0000625 int ival;
626 if (!_getbytevalue(values, &ival))
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000627 return -1;
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200628 buf[i] = (char)ival;
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000629 return 0;
630 }
631 }
Georg Brandl9a54d7c2008-07-16 23:15:30 +0000632 else if (PySlice_Check(index)) {
Martin v. Löwis4d0d4712010-12-03 20:14:31 +0000633 if (PySlice_GetIndicesEx(index,
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000634 PyByteArray_GET_SIZE(self),
635 &start, &stop, &step, &slicelen) < 0) {
636 return -1;
637 }
638 }
639 else {
Terry Jan Reedyffff1442014-08-02 01:30:37 -0400640 PyErr_Format(PyExc_TypeError,
641 "bytearray indices must be integers or slices, not %.200s",
642 Py_TYPE(index)->tp_name);
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000643 return -1;
644 }
645
646 if (values == NULL) {
647 bytes = NULL;
648 needed = 0;
649 }
650 else if (values == (PyObject *)self || !PyByteArray_Check(values)) {
Christian Heimes6d26ade2012-11-03 23:07:59 +0100651 int err;
Ezio Melottic64bcbe2012-11-03 21:19:06 +0200652 if (PyNumber_Check(values) || PyUnicode_Check(values)) {
653 PyErr_SetString(PyExc_TypeError,
654 "can assign only bytes, buffers, or iterables "
655 "of ints in range(0, 256)");
656 return -1;
657 }
Georg Brandlf3fa5682010-12-04 17:09:30 +0000658 /* Make a copy and call this function recursively */
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000659 values = PyByteArray_FromObject(values);
660 if (values == NULL)
661 return -1;
Benjamin Peterson153c70f2009-04-18 15:42:12 +0000662 err = bytearray_ass_subscript(self, index, values);
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000663 Py_DECREF(values);
664 return err;
665 }
666 else {
667 assert(PyByteArray_Check(values));
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200668 bytes = PyByteArray_AS_STRING(values);
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000669 needed = Py_SIZE(values);
670 }
671 /* Make sure b[5:2] = ... inserts before 5, not before 2. */
672 if ((step < 0 && start < stop) ||
673 (step > 0 && start > stop))
674 stop = start;
675 if (step == 1) {
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200676 return bytearray_setslice_linear(self, start, stop, bytes, needed);
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000677 }
678 else {
679 if (needed == 0) {
680 /* Delete slice */
Mark Dickinsonbc099642010-01-29 17:27:24 +0000681 size_t cur;
682 Py_ssize_t i;
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000683
Antoine Pitrou5504e892008-12-06 21:27:53 +0000684 if (!_canresize(self))
685 return -1;
Mark Dickinson7e3b9482010-08-06 21:33:18 +0000686
687 if (slicelen == 0)
688 /* Nothing to do here. */
689 return 0;
690
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000691 if (step < 0) {
692 stop = start + 1;
693 start = stop + step * (slicelen - 1) - 1;
694 step = -step;
695 }
696 for (cur = start, i = 0;
697 i < slicelen; cur += step, i++) {
698 Py_ssize_t lim = step - 1;
699
Mark Dickinson66f575b2010-02-14 12:53:32 +0000700 if (cur + step >= (size_t)PyByteArray_GET_SIZE(self))
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000701 lim = PyByteArray_GET_SIZE(self) - cur - 1;
702
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200703 memmove(buf + cur - i,
704 buf + cur + 1, lim);
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000705 }
706 /* Move the tail of the bytes, in one chunk */
Mark Dickinson7e3b9482010-08-06 21:33:18 +0000707 cur = start + (size_t)slicelen*step;
Mark Dickinson66f575b2010-02-14 12:53:32 +0000708 if (cur < (size_t)PyByteArray_GET_SIZE(self)) {
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200709 memmove(buf + cur - slicelen,
710 buf + cur,
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000711 PyByteArray_GET_SIZE(self) - cur);
712 }
713 if (PyByteArray_Resize((PyObject *)self,
714 PyByteArray_GET_SIZE(self) - slicelen) < 0)
715 return -1;
716
717 return 0;
718 }
719 else {
720 /* Assign slice */
Mark Dickinson7e3b9482010-08-06 21:33:18 +0000721 Py_ssize_t i;
722 size_t cur;
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000723
724 if (needed != slicelen) {
725 PyErr_Format(PyExc_ValueError,
726 "attempt to assign bytes of size %zd "
727 "to extended slice of size %zd",
728 needed, slicelen);
729 return -1;
730 }
731 for (cur = start, i = 0; i < slicelen; cur += step, i++)
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200732 buf[cur] = bytes[i];
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000733 return 0;
734 }
735 }
736}
737
738static int
Benjamin Peterson153c70f2009-04-18 15:42:12 +0000739bytearray_init(PyByteArrayObject *self, PyObject *args, PyObject *kwds)
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000740{
741 static char *kwlist[] = {"source", "encoding", "errors", 0};
742 PyObject *arg = NULL;
743 const char *encoding = NULL;
744 const char *errors = NULL;
745 Py_ssize_t count;
746 PyObject *it;
747 PyObject *(*iternext)(PyObject *);
748
749 if (Py_SIZE(self) != 0) {
750 /* Empty previous contents (yes, do this first of all!) */
751 if (PyByteArray_Resize((PyObject *)self, 0) < 0)
752 return -1;
753 }
754
755 /* Parse arguments */
Georg Brandl3dbca812008-07-23 16:10:53 +0000756 if (!PyArg_ParseTupleAndKeywords(args, kwds, "|Oss:bytearray", kwlist,
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000757 &arg, &encoding, &errors))
758 return -1;
759
760 /* Make a quick exit if no first argument */
761 if (arg == NULL) {
762 if (encoding != NULL || errors != NULL) {
763 PyErr_SetString(PyExc_TypeError,
764 "encoding or errors without sequence argument");
765 return -1;
766 }
767 return 0;
768 }
769
770 if (PyUnicode_Check(arg)) {
771 /* Encode via the codec registry */
772 PyObject *encoded, *new;
773 if (encoding == NULL) {
774 PyErr_SetString(PyExc_TypeError,
775 "string argument without an encoding");
776 return -1;
777 }
Marc-André Lemburgb2750b52008-06-06 12:18:17 +0000778 encoded = PyUnicode_AsEncodedString(arg, encoding, errors);
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000779 if (encoded == NULL)
780 return -1;
781 assert(PyBytes_Check(encoded));
Benjamin Peterson153c70f2009-04-18 15:42:12 +0000782 new = bytearray_iconcat(self, encoded);
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000783 Py_DECREF(encoded);
784 if (new == NULL)
785 return -1;
786 Py_DECREF(new);
787 return 0;
788 }
789
790 /* If it's not unicode, there can't be encoding or errors */
791 if (encoding != NULL || errors != NULL) {
792 PyErr_SetString(PyExc_TypeError,
793 "encoding or errors without a string argument");
794 return -1;
795 }
796
797 /* Is it an int? */
Benjamin Peterson8380dd52010-04-16 22:51:37 +0000798 count = PyNumber_AsSsize_t(arg, PyExc_OverflowError);
799 if (count == -1 && PyErr_Occurred()) {
800 if (PyErr_ExceptionMatches(PyExc_OverflowError))
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000801 return -1;
Benjamin Peterson9c0e94f2010-04-16 23:00:53 +0000802 PyErr_Clear();
Benjamin Peterson8380dd52010-04-16 22:51:37 +0000803 }
804 else if (count < 0) {
805 PyErr_SetString(PyExc_ValueError, "negative count");
806 return -1;
807 }
808 else {
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000809 if (count > 0) {
Victor Stinner2bc4d952014-06-02 22:22:42 +0200810 if (PyByteArray_Resize((PyObject *)self, count))
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000811 return -1;
Victor Stinner2bc4d952014-06-02 22:22:42 +0200812 memset(PyByteArray_AS_STRING(self), 0, count);
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000813 }
814 return 0;
815 }
816
817 /* Use the buffer API */
818 if (PyObject_CheckBuffer(arg)) {
819 Py_ssize_t size;
820 Py_buffer view;
821 if (PyObject_GetBuffer(arg, &view, PyBUF_FULL_RO) < 0)
822 return -1;
823 size = view.len;
824 if (PyByteArray_Resize((PyObject *)self, size) < 0) goto fail;
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200825 if (PyBuffer_ToContiguous(PyByteArray_AS_STRING(self),
826 &view, size, 'C') < 0)
Stefan Krah7d12d9d2012-07-28 12:25:55 +0200827 goto fail;
Martin v. Löwis423be952008-08-13 15:53:07 +0000828 PyBuffer_Release(&view);
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000829 return 0;
830 fail:
Martin v. Löwis423be952008-08-13 15:53:07 +0000831 PyBuffer_Release(&view);
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000832 return -1;
833 }
834
835 /* XXX Optimize this if the arguments is a list, tuple */
836
837 /* Get the iterator */
838 it = PyObject_GetIter(arg);
839 if (it == NULL)
840 return -1;
841 iternext = *Py_TYPE(it)->tp_iternext;
842
843 /* Run the iterator to exhaustion */
844 for (;;) {
845 PyObject *item;
Georg Brandl9a54d7c2008-07-16 23:15:30 +0000846 int rc, value;
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000847
848 /* Get the next item */
849 item = iternext(it);
850 if (item == NULL) {
851 if (PyErr_Occurred()) {
852 if (!PyErr_ExceptionMatches(PyExc_StopIteration))
853 goto error;
854 PyErr_Clear();
855 }
856 break;
857 }
858
859 /* Interpret it as an int (__index__) */
Georg Brandl9a54d7c2008-07-16 23:15:30 +0000860 rc = _getbytevalue(item, &value);
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000861 Py_DECREF(item);
Georg Brandl9a54d7c2008-07-16 23:15:30 +0000862 if (!rc)
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000863 goto error;
864
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000865 /* Append the byte */
Serhiy Storchaka7b6e3b92015-06-29 21:14:06 +0300866 if (Py_SIZE(self) + 1 < self->ob_alloc) {
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000867 Py_SIZE(self)++;
Serhiy Storchaka7b6e3b92015-06-29 21:14:06 +0300868 PyByteArray_AS_STRING(self)[Py_SIZE(self)] = '\0';
869 }
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000870 else if (PyByteArray_Resize((PyObject *)self, Py_SIZE(self)+1) < 0)
871 goto error;
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200872 PyByteArray_AS_STRING(self)[Py_SIZE(self)-1] = value;
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000873 }
874
875 /* Clean up and return success */
876 Py_DECREF(it);
877 return 0;
878
879 error:
880 /* Error handling when it != NULL */
881 Py_DECREF(it);
882 return -1;
883}
884
885/* Mostly copied from string_repr, but without the
886 "smart quote" functionality. */
887static PyObject *
Benjamin Peterson153c70f2009-04-18 15:42:12 +0000888bytearray_repr(PyByteArrayObject *self)
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000889{
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000890 const char *quote_prefix = "bytearray(b";
891 const char *quote_postfix = ")";
892 Py_ssize_t length = Py_SIZE(self);
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200893 /* 15 == strlen(quote_prefix) + 2 + strlen(quote_postfix) + 1 */
Mark Dickinson66f575b2010-02-14 12:53:32 +0000894 size_t newsize;
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000895 PyObject *v;
Antoine Pitrou9ed5f272013-08-13 20:18:52 +0200896 Py_ssize_t i;
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200897 char *bytes;
Antoine Pitrou9ed5f272013-08-13 20:18:52 +0200898 char c;
899 char *p;
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200900 int quote;
901 char *test, *start;
902 char *buffer;
903
904 if (length > (PY_SSIZE_T_MAX - 15) / 4) {
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000905 PyErr_SetString(PyExc_OverflowError,
906 "bytearray object is too large to make repr");
907 return NULL;
908 }
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200909
910 newsize = 15 + length * 4;
Antoine Pitrou39aba4f2011-11-12 21:15:28 +0100911 buffer = PyObject_Malloc(newsize);
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200912 if (buffer == NULL) {
913 PyErr_NoMemory();
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000914 return NULL;
915 }
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000916
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200917 /* Figure out which quote to use; single is preferred */
918 quote = '\'';
919 start = PyByteArray_AS_STRING(self);
920 for (test = start; test < start+length; ++test) {
921 if (*test == '"') {
922 quote = '\''; /* back to single */
923 break;
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000924 }
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200925 else if (*test == '\'')
926 quote = '"';
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000927 }
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200928
929 p = buffer;
930 while (*quote_prefix)
931 *p++ = *quote_prefix++;
932 *p++ = quote;
933
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200934 bytes = PyByteArray_AS_STRING(self);
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200935 for (i = 0; i < length; i++) {
936 /* There's at least enough room for a hex escape
937 and a closing quote. */
938 assert(newsize - (p - buffer) >= 5);
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200939 c = bytes[i];
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200940 if (c == '\'' || c == '\\')
941 *p++ = '\\', *p++ = c;
942 else if (c == '\t')
943 *p++ = '\\', *p++ = 't';
944 else if (c == '\n')
945 *p++ = '\\', *p++ = 'n';
946 else if (c == '\r')
947 *p++ = '\\', *p++ = 'r';
948 else if (c == 0)
949 *p++ = '\\', *p++ = 'x', *p++ = '0', *p++ = '0';
950 else if (c < ' ' || c >= 0x7f) {
951 *p++ = '\\';
952 *p++ = 'x';
Victor Stinnerf5cff562011-10-14 02:13:11 +0200953 *p++ = Py_hexdigits[(c & 0xf0) >> 4];
954 *p++ = Py_hexdigits[c & 0xf];
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200955 }
956 else
957 *p++ = c;
958 }
959 assert(newsize - (p - buffer) >= 1);
960 *p++ = quote;
961 while (*quote_postfix) {
962 *p++ = *quote_postfix++;
963 }
964
965 v = PyUnicode_DecodeASCII(buffer, p - buffer, NULL);
Antoine Pitrou39aba4f2011-11-12 21:15:28 +0100966 PyObject_Free(buffer);
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200967 return v;
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000968}
969
970static PyObject *
Benjamin Peterson153c70f2009-04-18 15:42:12 +0000971bytearray_str(PyObject *op)
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000972{
Alexander Belopolskyf0f45142010-08-11 17:31:17 +0000973 if (Py_BytesWarningFlag) {
974 if (PyErr_WarnEx(PyExc_BytesWarning,
975 "str() on a bytearray instance", 1))
976 return NULL;
977 }
978 return bytearray_repr((PyByteArrayObject*)op);
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000979}
980
981static PyObject *
Benjamin Peterson153c70f2009-04-18 15:42:12 +0000982bytearray_richcompare(PyObject *self, PyObject *other, int op)
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000983{
984 Py_ssize_t self_size, other_size;
985 Py_buffer self_bytes, other_bytes;
986 PyObject *res;
987 Py_ssize_t minsize;
Serhiy Storchakafa494fd2015-05-30 17:45:22 +0300988 int cmp, rc;
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000989
990 /* Bytes can be compared to anything that supports the (binary)
991 buffer API. Except that a comparison with Unicode is always an
992 error, even if the comparison is for equality. */
Serhiy Storchakafa494fd2015-05-30 17:45:22 +0300993 rc = PyObject_IsInstance(self, (PyObject*)&PyUnicode_Type);
994 if (!rc)
995 rc = PyObject_IsInstance(other, (PyObject*)&PyUnicode_Type);
996 if (rc < 0)
997 return NULL;
998 if (rc) {
Barry Warsaw9e9dcd62008-10-17 01:50:37 +0000999 if (Py_BytesWarningFlag && (op == Py_EQ || op == Py_NE)) {
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001000 if (PyErr_WarnEx(PyExc_BytesWarning,
Georg Brandle5d68ac2008-06-04 11:30:26 +00001001 "Comparison between bytearray and string", 1))
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001002 return NULL;
1003 }
1004
Brian Curtindfc80e32011-08-10 20:28:54 -05001005 Py_RETURN_NOTIMPLEMENTED;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001006 }
1007
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +02001008 if (PyObject_GetBuffer(self, &self_bytes, PyBUF_SIMPLE) != 0) {
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001009 PyErr_Clear();
Brian Curtindfc80e32011-08-10 20:28:54 -05001010 Py_RETURN_NOTIMPLEMENTED;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001011 }
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +02001012 self_size = self_bytes.len;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001013
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +02001014 if (PyObject_GetBuffer(other, &other_bytes, PyBUF_SIMPLE) != 0) {
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001015 PyErr_Clear();
Martin v. Löwis423be952008-08-13 15:53:07 +00001016 PyBuffer_Release(&self_bytes);
Brian Curtindfc80e32011-08-10 20:28:54 -05001017 Py_RETURN_NOTIMPLEMENTED;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001018 }
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +02001019 other_size = other_bytes.len;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001020
1021 if (self_size != other_size && (op == Py_EQ || op == Py_NE)) {
1022 /* Shortcut: if the lengths differ, the objects differ */
1023 cmp = (op == Py_NE);
1024 }
1025 else {
1026 minsize = self_size;
1027 if (other_size < minsize)
1028 minsize = other_size;
1029
1030 cmp = memcmp(self_bytes.buf, other_bytes.buf, minsize);
1031 /* In ISO C, memcmp() guarantees to use unsigned bytes! */
1032
1033 if (cmp == 0) {
1034 if (self_size < other_size)
1035 cmp = -1;
1036 else if (self_size > other_size)
1037 cmp = 1;
1038 }
1039
1040 switch (op) {
1041 case Py_LT: cmp = cmp < 0; break;
1042 case Py_LE: cmp = cmp <= 0; break;
1043 case Py_EQ: cmp = cmp == 0; break;
1044 case Py_NE: cmp = cmp != 0; break;
1045 case Py_GT: cmp = cmp > 0; break;
1046 case Py_GE: cmp = cmp >= 0; break;
1047 }
1048 }
1049
1050 res = cmp ? Py_True : Py_False;
Martin v. Löwis423be952008-08-13 15:53:07 +00001051 PyBuffer_Release(&self_bytes);
1052 PyBuffer_Release(&other_bytes);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001053 Py_INCREF(res);
1054 return res;
1055}
1056
1057static void
Benjamin Peterson153c70f2009-04-18 15:42:12 +00001058bytearray_dealloc(PyByteArrayObject *self)
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001059{
Benjamin Petersone0124bd2009-03-09 21:04:33 +00001060 if (self->ob_exports > 0) {
1061 PyErr_SetString(PyExc_SystemError,
Benjamin Petersonef3e4c22009-04-11 19:48:14 +00001062 "deallocated bytearray object has exported buffers");
Benjamin Petersone0124bd2009-03-09 21:04:33 +00001063 PyErr_Print();
1064 }
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001065 if (self->ob_bytes != 0) {
Antoine Pitrou39aba4f2011-11-12 21:15:28 +01001066 PyObject_Free(self->ob_bytes);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001067 }
1068 Py_TYPE(self)->tp_free((PyObject *)self);
1069}
1070
1071
1072/* -------------------------------------------------------------------- */
1073/* Methods */
1074
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02001075#define FASTSEARCH fastsearch
1076#define STRINGLIB(F) stringlib_##F
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001077#define STRINGLIB_CHAR char
Antoine Pitroucfc22b42012-10-16 21:07:23 +02001078#define STRINGLIB_SIZEOF_CHAR 1
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001079#define STRINGLIB_LEN PyByteArray_GET_SIZE
1080#define STRINGLIB_STR PyByteArray_AS_STRING
1081#define STRINGLIB_NEW PyByteArray_FromStringAndSize
Antoine Pitrouf2c54842010-01-13 08:07:53 +00001082#define STRINGLIB_ISSPACE Py_ISSPACE
1083#define STRINGLIB_ISLINEBREAK(x) ((x == '\n') || (x == '\r'))
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001084#define STRINGLIB_CHECK_EXACT PyByteArray_CheckExact
1085#define STRINGLIB_MUTABLE 1
1086
1087#include "stringlib/fastsearch.h"
1088#include "stringlib/count.h"
1089#include "stringlib/find.h"
Antoine Pitroucfc22b42012-10-16 21:07:23 +02001090#include "stringlib/join.h"
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001091#include "stringlib/partition.h"
Antoine Pitrouf2c54842010-01-13 08:07:53 +00001092#include "stringlib/split.h"
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001093#include "stringlib/ctype.h"
1094#include "stringlib/transmogrify.h"
1095
1096
Serhiy Storchakae09132f2016-07-03 13:57:48 +03001097static PyObject *
1098bytearray_find(PyByteArrayObject *self, PyObject *args)
1099{
1100 return _Py_bytes_find(PyByteArray_AS_STRING(self), PyByteArray_GET_SIZE(self), args);
1101}
1102
1103static PyObject *
1104bytearray_count(PyByteArrayObject *self, PyObject *args)
1105{
1106 return _Py_bytes_count(PyByteArray_AS_STRING(self), PyByteArray_GET_SIZE(self), args);
1107}
1108
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001109/*[clinic input]
1110bytearray.clear
1111
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001112Remove all items from the bytearray.
1113[clinic start generated code]*/
1114
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001115static PyObject *
1116bytearray_clear_impl(PyByteArrayObject *self)
Serhiy Storchaka7a9579c2016-05-02 13:45:20 +03001117/*[clinic end generated code: output=85c2fe6aede0956c input=ed6edae9de447ac4]*/
Eli Bendersky4db28d32011-03-03 18:21:02 +00001118{
1119 if (PyByteArray_Resize((PyObject *)self, 0) < 0)
1120 return NULL;
1121 Py_RETURN_NONE;
1122}
1123
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001124/*[clinic input]
1125bytearray.copy
1126
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001127Return a copy of B.
1128[clinic start generated code]*/
1129
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001130static PyObject *
1131bytearray_copy_impl(PyByteArrayObject *self)
Serhiy Storchaka7a9579c2016-05-02 13:45:20 +03001132/*[clinic end generated code: output=68cfbcfed484c132 input=6597b0c01bccaa9e]*/
Eli Bendersky4db28d32011-03-03 18:21:02 +00001133{
1134 return PyByteArray_FromStringAndSize(PyByteArray_AS_STRING((PyObject *)self),
1135 PyByteArray_GET_SIZE(self));
1136}
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001137
Serhiy Storchakae09132f2016-07-03 13:57:48 +03001138static PyObject *
1139bytearray_index(PyByteArrayObject *self, PyObject *args)
1140{
1141 return _Py_bytes_index(PyByteArray_AS_STRING(self), PyByteArray_GET_SIZE(self), args);
1142}
1143
1144static PyObject *
1145bytearray_rfind(PyByteArrayObject *self, PyObject *args)
1146{
1147 return _Py_bytes_rfind(PyByteArray_AS_STRING(self), PyByteArray_GET_SIZE(self), args);
1148}
1149
1150static PyObject *
1151bytearray_rindex(PyByteArrayObject *self, PyObject *args)
1152{
1153 return _Py_bytes_rindex(PyByteArray_AS_STRING(self), PyByteArray_GET_SIZE(self), args);
1154}
1155
1156static int
1157bytearray_contains(PyObject *self, PyObject *arg)
1158{
1159 return _Py_bytes_contains(PyByteArray_AS_STRING(self), PyByteArray_GET_SIZE(self), arg);
1160}
1161
1162static PyObject *
1163bytearray_startswith(PyByteArrayObject *self, PyObject *args)
1164{
1165 return _Py_bytes_startswith(PyByteArray_AS_STRING(self), PyByteArray_GET_SIZE(self), args);
1166}
1167
1168static PyObject *
1169bytearray_endswith(PyByteArrayObject *self, PyObject *args)
1170{
1171 return _Py_bytes_endswith(PyByteArray_AS_STRING(self), PyByteArray_GET_SIZE(self), args);
1172}
1173
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001174
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001175/*[clinic input]
1176bytearray.translate
1177
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001178 table: object
1179 Translation table, which must be a bytes object of length 256.
1180 [
1181 deletechars: object
1182 ]
1183 /
1184
1185Return a copy with each character mapped by the given translation table.
1186
1187All characters occurring in the optional argument deletechars are removed.
1188The remaining characters are mapped through the given translation table.
1189[clinic start generated code]*/
1190
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001191static PyObject *
Larry Hastings89964c42015-04-14 18:07:59 -04001192bytearray_translate_impl(PyByteArrayObject *self, PyObject *table,
1193 int group_right_1, PyObject *deletechars)
Serhiy Storchaka7a9579c2016-05-02 13:45:20 +03001194/*[clinic end generated code: output=2bebc86a9a1ff083 input=846a01671bccc1c5]*/
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001195{
Antoine Pitrou9ed5f272013-08-13 20:18:52 +02001196 char *input, *output;
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001197 const char *table_chars;
Antoine Pitrou9ed5f272013-08-13 20:18:52 +02001198 Py_ssize_t i, c;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001199 PyObject *input_obj = (PyObject*)self;
1200 const char *output_start;
1201 Py_ssize_t inlen;
Georg Brandlccc47b62008-12-28 11:44:14 +00001202 PyObject *result = NULL;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001203 int trans_table[256];
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001204 Py_buffer vtable, vdel;
1205
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001206 if (table == Py_None) {
1207 table_chars = NULL;
Georg Brandlccc47b62008-12-28 11:44:14 +00001208 table = NULL;
Serhiy Storchaka3dd3e262015-02-03 01:25:42 +02001209 } else if (PyObject_GetBuffer(table, &vtable, PyBUF_SIMPLE) != 0) {
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001210 return NULL;
Georg Brandlccc47b62008-12-28 11:44:14 +00001211 } else {
1212 if (vtable.len != 256) {
1213 PyErr_SetString(PyExc_ValueError,
1214 "translation table must be 256 characters long");
Georg Brandl953152f2009-07-22 12:03:59 +00001215 PyBuffer_Release(&vtable);
1216 return NULL;
Georg Brandlccc47b62008-12-28 11:44:14 +00001217 }
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001218 table_chars = (const char*)vtable.buf;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001219 }
1220
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001221 if (deletechars != NULL) {
Serhiy Storchaka3dd3e262015-02-03 01:25:42 +02001222 if (PyObject_GetBuffer(deletechars, &vdel, PyBUF_SIMPLE) != 0) {
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001223 if (table != NULL)
Georg Brandl953152f2009-07-22 12:03:59 +00001224 PyBuffer_Release(&vtable);
1225 return NULL;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001226 }
1227 }
1228 else {
1229 vdel.buf = NULL;
1230 vdel.len = 0;
1231 }
1232
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001233 inlen = PyByteArray_GET_SIZE(input_obj);
1234 result = PyByteArray_FromStringAndSize((char *)NULL, inlen);
1235 if (result == NULL)
1236 goto done;
Serhiy Storchakadd40fc32016-05-04 22:23:26 +03001237 output_start = output = PyByteArray_AS_STRING(result);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001238 input = PyByteArray_AS_STRING(input_obj);
1239
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001240 if (vdel.len == 0 && table_chars != NULL) {
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001241 /* If no deletions are required, use faster code */
1242 for (i = inlen; --i >= 0; ) {
1243 c = Py_CHARMASK(*input++);
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001244 *output++ = table_chars[c];
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001245 }
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001246 goto done;
1247 }
Georg Brandlccc47b62008-12-28 11:44:14 +00001248
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001249 if (table_chars == NULL) {
Georg Brandlccc47b62008-12-28 11:44:14 +00001250 for (i = 0; i < 256; i++)
1251 trans_table[i] = Py_CHARMASK(i);
1252 } else {
1253 for (i = 0; i < 256; i++)
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001254 trans_table[i] = Py_CHARMASK(table_chars[i]);
Georg Brandlccc47b62008-12-28 11:44:14 +00001255 }
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001256
1257 for (i = 0; i < vdel.len; i++)
1258 trans_table[(int) Py_CHARMASK( ((unsigned char*)vdel.buf)[i] )] = -1;
1259
1260 for (i = inlen; --i >= 0; ) {
1261 c = Py_CHARMASK(*input++);
1262 if (trans_table[c] != -1)
1263 if (Py_CHARMASK(*output++ = (char)trans_table[c]) == c)
1264 continue;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001265 }
1266 /* Fix the size of the resulting string */
1267 if (inlen > 0)
Christian Heimesc731bbe2013-07-21 02:04:35 +02001268 if (PyByteArray_Resize(result, output - output_start) < 0) {
1269 Py_CLEAR(result);
1270 goto done;
1271 }
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001272
1273done:
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001274 if (table != NULL)
Georg Brandlccc47b62008-12-28 11:44:14 +00001275 PyBuffer_Release(&vtable);
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001276 if (deletechars != NULL)
Martin v. Löwis423be952008-08-13 15:53:07 +00001277 PyBuffer_Release(&vdel);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001278 return result;
1279}
1280
1281
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001282/*[clinic input]
1283
1284@staticmethod
1285bytearray.maketrans
1286
Serhiy Storchaka3dd3e262015-02-03 01:25:42 +02001287 frm: Py_buffer
1288 to: Py_buffer
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001289 /
1290
1291Return a translation table useable for the bytes or bytearray translate method.
1292
1293The returned table will be one where each byte in frm is mapped to the byte at
1294the same position in to.
1295
1296The bytes objects frm and to must be of the same length.
1297[clinic start generated code]*/
1298
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001299static PyObject *
Serhiy Storchaka3dd3e262015-02-03 01:25:42 +02001300bytearray_maketrans_impl(Py_buffer *frm, Py_buffer *to)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03001301/*[clinic end generated code: output=1df267d99f56b15e input=5925a81d2fbbf151]*/
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001302{
1303 return _Py_bytes_maketrans(frm, to);
Georg Brandlabc38772009-04-12 15:51:51 +00001304}
1305
1306
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001307/*[clinic input]
1308bytearray.replace
1309
Serhiy Storchaka3dd3e262015-02-03 01:25:42 +02001310 old: Py_buffer
1311 new: Py_buffer
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001312 count: Py_ssize_t = -1
1313 Maximum number of occurrences to replace.
1314 -1 (the default value) means replace all occurrences.
1315 /
1316
1317Return a copy with all occurrences of substring old replaced by new.
1318
1319If the optional argument count is given, only the first count occurrences are
1320replaced.
1321[clinic start generated code]*/
1322
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001323static PyObject *
Larry Hastings89964c42015-04-14 18:07:59 -04001324bytearray_replace_impl(PyByteArrayObject *self, Py_buffer *old,
1325 Py_buffer *new, Py_ssize_t count)
1326/*[clinic end generated code: output=d39884c4dc59412a input=aa379d988637c7fb]*/
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001327{
Serhiy Storchakafb81d3c2016-05-05 09:26:07 +03001328 return stringlib_replace((PyObject *)self,
Serhiy Storchakae09132f2016-07-03 13:57:48 +03001329 (const char *)old->buf, old->len,
1330 (const char *)new->buf, new->len, count);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001331}
1332
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001333/*[clinic input]
1334bytearray.split
1335
1336 sep: object = None
1337 The delimiter according which to split the bytearray.
1338 None (the default value) means split on ASCII whitespace characters
1339 (space, tab, return, newline, formfeed, vertical tab).
1340 maxsplit: Py_ssize_t = -1
1341 Maximum number of splits to do.
1342 -1 (the default value) means no limit.
1343
1344Return a list of the sections in the bytearray, using sep as the delimiter.
1345[clinic start generated code]*/
1346
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001347static PyObject *
Larry Hastings89964c42015-04-14 18:07:59 -04001348bytearray_split_impl(PyByteArrayObject *self, PyObject *sep,
1349 Py_ssize_t maxsplit)
1350/*[clinic end generated code: output=833e2cf385d9a04d input=24f82669f41bf523]*/
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001351{
1352 Py_ssize_t len = PyByteArray_GET_SIZE(self), n;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001353 const char *s = PyByteArray_AS_STRING(self), *sub;
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001354 PyObject *list;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001355 Py_buffer vsub;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001356
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001357 if (maxsplit < 0)
1358 maxsplit = PY_SSIZE_T_MAX;
1359
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001360 if (sep == Py_None)
Antoine Pitrouf2c54842010-01-13 08:07:53 +00001361 return stringlib_split_whitespace((PyObject*) self, s, len, maxsplit);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001362
Serhiy Storchaka3dd3e262015-02-03 01:25:42 +02001363 if (PyObject_GetBuffer(sep, &vsub, PyBUF_SIMPLE) != 0)
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001364 return NULL;
1365 sub = vsub.buf;
1366 n = vsub.len;
1367
Antoine Pitrouf2c54842010-01-13 08:07:53 +00001368 list = stringlib_split(
1369 (PyObject*) self, s, len, sub, n, maxsplit
1370 );
Martin v. Löwis423be952008-08-13 15:53:07 +00001371 PyBuffer_Release(&vsub);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001372 return list;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001373}
1374
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001375/*[clinic input]
1376bytearray.partition
1377
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001378 sep: object
1379 /
1380
1381Partition the bytearray into three parts using the given separator.
1382
1383This will search for the separator sep in the bytearray. If the separator is
1384found, returns a 3-tuple containing the part before the separator, the
1385separator itself, and the part after it.
1386
1387If the separator is not found, returns a 3-tuple containing the original
1388bytearray object and two empty bytearray objects.
1389[clinic start generated code]*/
1390
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001391static PyObject *
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001392bytearray_partition(PyByteArrayObject *self, PyObject *sep)
Serhiy Storchaka7a9579c2016-05-02 13:45:20 +03001393/*[clinic end generated code: output=45d2525ddd35f957 input=86f89223892b70b5]*/
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001394{
1395 PyObject *bytesep, *result;
1396
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001397 bytesep = PyByteArray_FromObject(sep);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001398 if (! bytesep)
1399 return NULL;
1400
1401 result = stringlib_partition(
1402 (PyObject*) self,
1403 PyByteArray_AS_STRING(self), PyByteArray_GET_SIZE(self),
1404 bytesep,
1405 PyByteArray_AS_STRING(bytesep), PyByteArray_GET_SIZE(bytesep)
1406 );
1407
1408 Py_DECREF(bytesep);
Antoine Pitrouf2c54842010-01-13 08:07:53 +00001409 return result;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001410}
1411
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001412/*[clinic input]
1413bytearray.rpartition
1414
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001415 sep: object
1416 /
1417
1418Partition the bytes into three parts using the given separator.
1419
1420This will search for the separator sep in the bytearray, starting and the end.
1421If the separator is found, returns a 3-tuple containing the part before the
1422separator, the separator itself, and the part after it.
1423
1424If the separator is not found, returns a 3-tuple containing two empty bytearray
1425objects and the original bytearray object.
1426[clinic start generated code]*/
1427
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001428static PyObject *
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001429bytearray_rpartition(PyByteArrayObject *self, PyObject *sep)
Serhiy Storchaka7a9579c2016-05-02 13:45:20 +03001430/*[clinic end generated code: output=440de3c9426115e8 input=5f4094f2de87c8f3]*/
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001431{
1432 PyObject *bytesep, *result;
1433
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001434 bytesep = PyByteArray_FromObject(sep);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001435 if (! bytesep)
1436 return NULL;
1437
1438 result = stringlib_rpartition(
1439 (PyObject*) self,
1440 PyByteArray_AS_STRING(self), PyByteArray_GET_SIZE(self),
1441 bytesep,
1442 PyByteArray_AS_STRING(bytesep), PyByteArray_GET_SIZE(bytesep)
1443 );
1444
1445 Py_DECREF(bytesep);
Antoine Pitrouf2c54842010-01-13 08:07:53 +00001446 return result;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001447}
1448
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001449/*[clinic input]
1450bytearray.rsplit = bytearray.split
1451
1452Return a list of the sections in the bytearray, using sep as the delimiter.
1453
1454Splitting is done starting at the end of the bytearray and working to the front.
1455[clinic start generated code]*/
1456
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001457static PyObject *
Larry Hastings89964c42015-04-14 18:07:59 -04001458bytearray_rsplit_impl(PyByteArrayObject *self, PyObject *sep,
1459 Py_ssize_t maxsplit)
1460/*[clinic end generated code: output=a55e0b5a03cb6190 input=a68286e4dd692ffe]*/
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001461{
1462 Py_ssize_t len = PyByteArray_GET_SIZE(self), n;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001463 const char *s = PyByteArray_AS_STRING(self), *sub;
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001464 PyObject *list;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001465 Py_buffer vsub;
1466
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001467 if (maxsplit < 0)
1468 maxsplit = PY_SSIZE_T_MAX;
1469
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001470 if (sep == Py_None)
Antoine Pitrouf2c54842010-01-13 08:07:53 +00001471 return stringlib_rsplit_whitespace((PyObject*) self, s, len, maxsplit);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001472
Serhiy Storchaka3dd3e262015-02-03 01:25:42 +02001473 if (PyObject_GetBuffer(sep, &vsub, PyBUF_SIMPLE) != 0)
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001474 return NULL;
1475 sub = vsub.buf;
1476 n = vsub.len;
1477
Antoine Pitrouf2c54842010-01-13 08:07:53 +00001478 list = stringlib_rsplit(
1479 (PyObject*) self, s, len, sub, n, maxsplit
1480 );
Martin v. Löwis423be952008-08-13 15:53:07 +00001481 PyBuffer_Release(&vsub);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001482 return list;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001483}
1484
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001485/*[clinic input]
1486bytearray.reverse
1487
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001488Reverse the order of the values in B in place.
1489[clinic start generated code]*/
1490
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001491static PyObject *
1492bytearray_reverse_impl(PyByteArrayObject *self)
Serhiy Storchaka7a9579c2016-05-02 13:45:20 +03001493/*[clinic end generated code: output=9f7616f29ab309d3 input=543356319fc78557]*/
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001494{
1495 char swap, *head, *tail;
1496 Py_ssize_t i, j, n = Py_SIZE(self);
1497
1498 j = n / 2;
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +02001499 head = PyByteArray_AS_STRING(self);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001500 tail = head + n - 1;
1501 for (i = 0; i < j; i++) {
1502 swap = *head;
1503 *head++ = *tail;
1504 *tail-- = swap;
1505 }
1506
1507 Py_RETURN_NONE;
1508}
1509
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001510
1511/*[python input]
1512class bytesvalue_converter(CConverter):
1513 type = 'int'
1514 converter = '_getbytevalue'
1515[python start generated code]*/
1516/*[python end generated code: output=da39a3ee5e6b4b0d input=29c2e7c26c212812]*/
1517
1518
1519/*[clinic input]
1520bytearray.insert
1521
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001522 index: Py_ssize_t
1523 The index where the value is to be inserted.
1524 item: bytesvalue
1525 The item to be inserted.
1526 /
1527
1528Insert a single item into the bytearray before the given index.
1529[clinic start generated code]*/
1530
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001531static PyObject *
1532bytearray_insert_impl(PyByteArrayObject *self, Py_ssize_t index, int item)
Serhiy Storchaka7a9579c2016-05-02 13:45:20 +03001533/*[clinic end generated code: output=76c775a70e7b07b7 input=b2b5d07e9de6c070]*/
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001534{
1535 Py_ssize_t n = Py_SIZE(self);
1536 char *buf;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001537
1538 if (n == PY_SSIZE_T_MAX) {
1539 PyErr_SetString(PyExc_OverflowError,
Mark Dickinson2b6705f2009-09-06 10:34:47 +00001540 "cannot add more objects to bytearray");
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001541 return NULL;
1542 }
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001543 if (PyByteArray_Resize((PyObject *)self, n + 1) < 0)
1544 return NULL;
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +02001545 buf = PyByteArray_AS_STRING(self);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001546
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001547 if (index < 0) {
1548 index += n;
1549 if (index < 0)
1550 index = 0;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001551 }
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001552 if (index > n)
1553 index = n;
1554 memmove(buf + index + 1, buf + index, n - index);
1555 buf[index] = item;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001556
1557 Py_RETURN_NONE;
1558}
1559
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001560/*[clinic input]
1561bytearray.append
1562
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001563 item: bytesvalue
1564 The item to be appended.
1565 /
1566
1567Append a single item to the end of the bytearray.
1568[clinic start generated code]*/
1569
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001570static PyObject *
1571bytearray_append_impl(PyByteArrayObject *self, int item)
Serhiy Storchaka7a9579c2016-05-02 13:45:20 +03001572/*[clinic end generated code: output=a154e19ed1886cb6 input=20d6bec3d1340593]*/
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001573{
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001574 Py_ssize_t n = Py_SIZE(self);
1575
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001576 if (n == PY_SSIZE_T_MAX) {
1577 PyErr_SetString(PyExc_OverflowError,
Mark Dickinson2b6705f2009-09-06 10:34:47 +00001578 "cannot add more objects to bytearray");
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001579 return NULL;
1580 }
1581 if (PyByteArray_Resize((PyObject *)self, n + 1) < 0)
1582 return NULL;
1583
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001584 PyByteArray_AS_STRING(self)[n] = item;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001585
1586 Py_RETURN_NONE;
1587}
1588
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001589/*[clinic input]
1590bytearray.extend
1591
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001592 iterable_of_ints: object
1593 The iterable of items to append.
1594 /
1595
1596Append all the items from the iterator or sequence to the end of the bytearray.
1597[clinic start generated code]*/
1598
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001599static PyObject *
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001600bytearray_extend(PyByteArrayObject *self, PyObject *iterable_of_ints)
Serhiy Storchaka7a9579c2016-05-02 13:45:20 +03001601/*[clinic end generated code: output=98155dbe249170b1 input=c617b3a93249ba28]*/
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001602{
Benjamin Peterson153c70f2009-04-18 15:42:12 +00001603 PyObject *it, *item, *bytearray_obj;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001604 Py_ssize_t buf_size = 0, len = 0;
1605 int value;
1606 char *buf;
1607
Benjamin Peterson153c70f2009-04-18 15:42:12 +00001608 /* bytearray_setslice code only accepts something supporting PEP 3118. */
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001609 if (PyObject_CheckBuffer(iterable_of_ints)) {
1610 if (bytearray_setslice(self, Py_SIZE(self), Py_SIZE(self), iterable_of_ints) == -1)
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001611 return NULL;
1612
1613 Py_RETURN_NONE;
1614 }
1615
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001616 it = PyObject_GetIter(iterable_of_ints);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001617 if (it == NULL)
1618 return NULL;
1619
Ezio Melotti42da6632011-03-15 05:18:48 +02001620 /* Try to determine the length of the argument. 32 is arbitrary. */
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001621 buf_size = PyObject_LengthHint(iterable_of_ints, 32);
Benjamin Petersonef3e4c22009-04-11 19:48:14 +00001622 if (buf_size == -1) {
1623 Py_DECREF(it);
1624 return NULL;
1625 }
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001626
Benjamin Peterson153c70f2009-04-18 15:42:12 +00001627 bytearray_obj = PyByteArray_FromStringAndSize(NULL, buf_size);
Antoine Pitrou58bb82e2012-04-01 16:05:46 +02001628 if (bytearray_obj == NULL) {
1629 Py_DECREF(it);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001630 return NULL;
Antoine Pitrou58bb82e2012-04-01 16:05:46 +02001631 }
Benjamin Peterson153c70f2009-04-18 15:42:12 +00001632 buf = PyByteArray_AS_STRING(bytearray_obj);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001633
1634 while ((item = PyIter_Next(it)) != NULL) {
1635 if (! _getbytevalue(item, &value)) {
1636 Py_DECREF(item);
1637 Py_DECREF(it);
Benjamin Peterson153c70f2009-04-18 15:42:12 +00001638 Py_DECREF(bytearray_obj);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001639 return NULL;
1640 }
1641 buf[len++] = value;
1642 Py_DECREF(item);
1643
1644 if (len >= buf_size) {
Martin Panter371731e2016-07-18 07:53:13 +00001645 Py_ssize_t addition;
1646 if (len == PY_SSIZE_T_MAX) {
1647 Py_DECREF(it);
1648 Py_DECREF(bytearray_obj);
1649 return PyErr_NoMemory();
1650 }
1651 addition = len >> 1;
1652 if (addition > PY_SSIZE_T_MAX - len - 1)
1653 buf_size = PY_SSIZE_T_MAX;
1654 else
1655 buf_size = len + addition + 1;
Benjamin Peterson153c70f2009-04-18 15:42:12 +00001656 if (PyByteArray_Resize((PyObject *)bytearray_obj, buf_size) < 0) {
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001657 Py_DECREF(it);
Benjamin Peterson153c70f2009-04-18 15:42:12 +00001658 Py_DECREF(bytearray_obj);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001659 return NULL;
1660 }
1661 /* Recompute the `buf' pointer, since the resizing operation may
1662 have invalidated it. */
Benjamin Peterson153c70f2009-04-18 15:42:12 +00001663 buf = PyByteArray_AS_STRING(bytearray_obj);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001664 }
1665 }
1666 Py_DECREF(it);
1667
1668 /* Resize down to exact size. */
Benjamin Peterson153c70f2009-04-18 15:42:12 +00001669 if (PyByteArray_Resize((PyObject *)bytearray_obj, len) < 0) {
1670 Py_DECREF(bytearray_obj);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001671 return NULL;
1672 }
1673
Antoine Pitrou58bb82e2012-04-01 16:05:46 +02001674 if (bytearray_setslice(self, Py_SIZE(self), Py_SIZE(self), bytearray_obj) == -1) {
1675 Py_DECREF(bytearray_obj);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001676 return NULL;
Antoine Pitrou58bb82e2012-04-01 16:05:46 +02001677 }
Benjamin Peterson153c70f2009-04-18 15:42:12 +00001678 Py_DECREF(bytearray_obj);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001679
1680 Py_RETURN_NONE;
1681}
1682
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001683/*[clinic input]
1684bytearray.pop
1685
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001686 index: Py_ssize_t = -1
1687 The index from where to remove the item.
1688 -1 (the default value) means remove the last item.
1689 /
1690
1691Remove and return a single item from B.
1692
1693If no index argument is given, will pop the last item.
1694[clinic start generated code]*/
1695
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001696static PyObject *
1697bytearray_pop_impl(PyByteArrayObject *self, Py_ssize_t index)
Serhiy Storchaka7a9579c2016-05-02 13:45:20 +03001698/*[clinic end generated code: output=e0ccd401f8021da8 input=3591df2d06c0d237]*/
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001699{
1700 int value;
1701 Py_ssize_t n = Py_SIZE(self);
1702 char *buf;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001703
1704 if (n == 0) {
Eli Bendersky1bc4f192011-03-04 04:55:25 +00001705 PyErr_SetString(PyExc_IndexError,
1706 "pop from empty bytearray");
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001707 return NULL;
1708 }
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001709 if (index < 0)
1710 index += Py_SIZE(self);
1711 if (index < 0 || index >= Py_SIZE(self)) {
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001712 PyErr_SetString(PyExc_IndexError, "pop index out of range");
1713 return NULL;
1714 }
Antoine Pitrou5504e892008-12-06 21:27:53 +00001715 if (!_canresize(self))
1716 return NULL;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001717
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +02001718 buf = PyByteArray_AS_STRING(self);
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001719 value = buf[index];
1720 memmove(buf + index, buf + index + 1, n - index);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001721 if (PyByteArray_Resize((PyObject *)self, n - 1) < 0)
1722 return NULL;
1723
Mark Dickinson54a3db92009-09-06 10:19:23 +00001724 return PyLong_FromLong((unsigned char)value);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001725}
1726
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001727/*[clinic input]
1728bytearray.remove
1729
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001730 value: bytesvalue
1731 The value to remove.
1732 /
1733
1734Remove the first occurrence of a value in the bytearray.
1735[clinic start generated code]*/
1736
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001737static PyObject *
1738bytearray_remove_impl(PyByteArrayObject *self, int value)
Serhiy Storchaka7a9579c2016-05-02 13:45:20 +03001739/*[clinic end generated code: output=d659e37866709c13 input=121831240cd51ddf]*/
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001740{
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001741 Py_ssize_t where, n = Py_SIZE(self);
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +02001742 char *buf = PyByteArray_AS_STRING(self);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001743
Serhiy Storchaka4b234942016-05-16 22:24:03 +03001744 where = stringlib_find_char(buf, n, value);
1745 if (where < 0) {
Mark Dickinson2b6705f2009-09-06 10:34:47 +00001746 PyErr_SetString(PyExc_ValueError, "value not found in bytearray");
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001747 return NULL;
1748 }
Antoine Pitrou5504e892008-12-06 21:27:53 +00001749 if (!_canresize(self))
1750 return NULL;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001751
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +02001752 memmove(buf + where, buf + where + 1, n - where);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001753 if (PyByteArray_Resize((PyObject *)self, n - 1) < 0)
1754 return NULL;
1755
1756 Py_RETURN_NONE;
1757}
1758
1759/* XXX These two helpers could be optimized if argsize == 1 */
1760
1761static Py_ssize_t
Serhiy Storchakaef1585e2015-12-25 20:01:53 +02001762lstrip_helper(const char *myptr, Py_ssize_t mysize,
1763 const void *argptr, Py_ssize_t argsize)
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001764{
1765 Py_ssize_t i = 0;
Antoine Pitrou5b720752013-10-05 21:24:10 +02001766 while (i < mysize && memchr(argptr, (unsigned char) myptr[i], argsize))
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001767 i++;
1768 return i;
1769}
1770
1771static Py_ssize_t
Serhiy Storchakaef1585e2015-12-25 20:01:53 +02001772rstrip_helper(const char *myptr, Py_ssize_t mysize,
1773 const void *argptr, Py_ssize_t argsize)
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001774{
1775 Py_ssize_t i = mysize - 1;
Antoine Pitrou5b720752013-10-05 21:24:10 +02001776 while (i >= 0 && memchr(argptr, (unsigned char) myptr[i], argsize))
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001777 i--;
1778 return i + 1;
1779}
1780
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001781/*[clinic input]
1782bytearray.strip
1783
1784 bytes: object = None
1785 /
1786
1787Strip leading and trailing bytes contained in the argument.
1788
1789If the argument is omitted or None, strip leading and trailing ASCII whitespace.
1790[clinic start generated code]*/
1791
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001792static PyObject *
1793bytearray_strip_impl(PyByteArrayObject *self, PyObject *bytes)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03001794/*[clinic end generated code: output=760412661a34ad5a input=ef7bb59b09c21d62]*/
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001795{
1796 Py_ssize_t left, right, mysize, byteslen;
1797 char *myptr, *bytesptr;
1798 Py_buffer vbytes;
1799
1800 if (bytes == Py_None) {
1801 bytesptr = "\t\n\r\f\v ";
1802 byteslen = 6;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001803 }
1804 else {
Serhiy Storchaka3dd3e262015-02-03 01:25:42 +02001805 if (PyObject_GetBuffer(bytes, &vbytes, PyBUF_SIMPLE) != 0)
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001806 return NULL;
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001807 bytesptr = (char *) vbytes.buf;
1808 byteslen = vbytes.len;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001809 }
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +02001810 myptr = PyByteArray_AS_STRING(self);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001811 mysize = Py_SIZE(self);
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001812 left = lstrip_helper(myptr, mysize, bytesptr, byteslen);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001813 if (left == mysize)
1814 right = left;
1815 else
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001816 right = rstrip_helper(myptr, mysize, bytesptr, byteslen);
1817 if (bytes != Py_None)
1818 PyBuffer_Release(&vbytes);
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +02001819 return PyByteArray_FromStringAndSize(myptr + left, right - left);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001820}
1821
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001822/*[clinic input]
1823bytearray.lstrip
1824
1825 bytes: object = None
1826 /
1827
1828Strip leading bytes contained in the argument.
1829
1830If the argument is omitted or None, strip leading ASCII whitespace.
1831[clinic start generated code]*/
1832
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001833static PyObject *
1834bytearray_lstrip_impl(PyByteArrayObject *self, PyObject *bytes)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03001835/*[clinic end generated code: output=d005c9d0ab909e66 input=80843f975dd7c480]*/
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001836{
1837 Py_ssize_t left, right, mysize, byteslen;
1838 char *myptr, *bytesptr;
1839 Py_buffer vbytes;
1840
1841 if (bytes == Py_None) {
1842 bytesptr = "\t\n\r\f\v ";
1843 byteslen = 6;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001844 }
1845 else {
Serhiy Storchaka3dd3e262015-02-03 01:25:42 +02001846 if (PyObject_GetBuffer(bytes, &vbytes, PyBUF_SIMPLE) != 0)
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001847 return NULL;
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001848 bytesptr = (char *) vbytes.buf;
1849 byteslen = vbytes.len;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001850 }
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +02001851 myptr = PyByteArray_AS_STRING(self);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001852 mysize = Py_SIZE(self);
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001853 left = lstrip_helper(myptr, mysize, bytesptr, byteslen);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001854 right = mysize;
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001855 if (bytes != Py_None)
1856 PyBuffer_Release(&vbytes);
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +02001857 return PyByteArray_FromStringAndSize(myptr + left, right - left);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001858}
1859
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001860/*[clinic input]
1861bytearray.rstrip
1862
1863 bytes: object = None
1864 /
1865
1866Strip trailing bytes contained in the argument.
1867
1868If the argument is omitted or None, strip trailing ASCII whitespace.
1869[clinic start generated code]*/
1870
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001871static PyObject *
1872bytearray_rstrip_impl(PyByteArrayObject *self, PyObject *bytes)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03001873/*[clinic end generated code: output=030e2fbd2f7276bd input=e728b994954cfd91]*/
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001874{
1875 Py_ssize_t right, mysize, byteslen;
1876 char *myptr, *bytesptr;
1877 Py_buffer vbytes;
1878
1879 if (bytes == Py_None) {
1880 bytesptr = "\t\n\r\f\v ";
1881 byteslen = 6;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001882 }
1883 else {
Serhiy Storchaka3dd3e262015-02-03 01:25:42 +02001884 if (PyObject_GetBuffer(bytes, &vbytes, PyBUF_SIMPLE) != 0)
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001885 return NULL;
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001886 bytesptr = (char *) vbytes.buf;
1887 byteslen = vbytes.len;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001888 }
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +02001889 myptr = PyByteArray_AS_STRING(self);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001890 mysize = Py_SIZE(self);
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001891 right = rstrip_helper(myptr, mysize, bytesptr, byteslen);
1892 if (bytes != Py_None)
1893 PyBuffer_Release(&vbytes);
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +02001894 return PyByteArray_FromStringAndSize(myptr, right);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001895}
1896
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001897/*[clinic input]
1898bytearray.decode
1899
1900 encoding: str(c_default="NULL") = 'utf-8'
1901 The encoding with which to decode the bytearray.
1902 errors: str(c_default="NULL") = 'strict'
1903 The error handling scheme to use for the handling of decoding errors.
1904 The default is 'strict' meaning that decoding errors raise a
1905 UnicodeDecodeError. Other possible values are 'ignore' and 'replace'
1906 as well as any other name registered with codecs.register_error that
1907 can handle UnicodeDecodeErrors.
1908
1909Decode the bytearray using the codec registered for encoding.
1910[clinic start generated code]*/
1911
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001912static PyObject *
Larry Hastings89964c42015-04-14 18:07:59 -04001913bytearray_decode_impl(PyByteArrayObject *self, const char *encoding,
1914 const char *errors)
1915/*[clinic end generated code: output=f57d43f4a00b42c5 input=f28d8f903020257b]*/
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001916{
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001917 if (encoding == NULL)
1918 encoding = PyUnicode_GetDefaultEncoding();
Martin v. Löwis0efea322014-07-27 17:29:17 +02001919 return PyUnicode_FromEncodedObject((PyObject*)self, encoding, errors);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001920}
1921
1922PyDoc_STRVAR(alloc_doc,
1923"B.__alloc__() -> int\n\
1924\n\
Georg Brandl17cb8a82008-05-30 08:20:09 +00001925Return the number of bytes actually allocated.");
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001926
1927static PyObject *
Benjamin Peterson153c70f2009-04-18 15:42:12 +00001928bytearray_alloc(PyByteArrayObject *self)
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001929{
1930 return PyLong_FromSsize_t(self->ob_alloc);
1931}
1932
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001933/*[clinic input]
1934bytearray.join
1935
1936 iterable_of_bytes: object
1937 /
1938
1939Concatenate any number of bytes/bytearray objects.
1940
1941The bytearray whose method is called is inserted in between each pair.
1942
1943The result is returned as a new bytearray object.
1944[clinic start generated code]*/
1945
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001946static PyObject *
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001947bytearray_join(PyByteArrayObject *self, PyObject *iterable_of_bytes)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03001948/*[clinic end generated code: output=a8516370bf68ae08 input=aba6b1f9b30fcb8e]*/
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001949{
Martin v. Löwis0efea322014-07-27 17:29:17 +02001950 return stringlib_bytes_join((PyObject*)self, iterable_of_bytes);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001951}
1952
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001953/*[clinic input]
1954bytearray.splitlines
Antoine Pitrouf2c54842010-01-13 08:07:53 +00001955
Serhiy Storchaka8b2e8b62015-05-30 11:30:39 +03001956 keepends: int(c_default="0") = False
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001957
1958Return a list of the lines in the bytearray, breaking at line boundaries.
1959
1960Line breaks are not included in the resulting list unless keepends is given and
1961true.
1962[clinic start generated code]*/
1963
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001964static PyObject *
1965bytearray_splitlines_impl(PyByteArrayObject *self, int keepends)
Serhiy Storchaka8b2e8b62015-05-30 11:30:39 +03001966/*[clinic end generated code: output=4223c94b895f6ad9 input=8ccade941e5ea0bd]*/
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001967{
Antoine Pitrouf2c54842010-01-13 08:07:53 +00001968 return stringlib_splitlines(
1969 (PyObject*) self, PyByteArray_AS_STRING(self),
1970 PyByteArray_GET_SIZE(self), keepends
1971 );
1972}
1973
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001974/*[clinic input]
1975@classmethod
1976bytearray.fromhex
1977
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001978 string: unicode
1979 /
1980
1981Create a bytearray object from a string of hexadecimal numbers.
1982
1983Spaces between two numbers are accepted.
1984Example: bytearray.fromhex('B9 01EF') -> bytearray(b'\\xb9\\x01\\xef')
1985[clinic start generated code]*/
1986
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001987static PyObject *
Serhiy Storchaka0855e702016-07-01 17:22:31 +03001988bytearray_fromhex_impl(PyTypeObject *type, PyObject *string)
1989/*[clinic end generated code: output=8f0f0b6d30fb3ba0 input=f033a16d1fb21f48]*/
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001990{
Serhiy Storchaka0855e702016-07-01 17:22:31 +03001991 PyObject *result = _PyBytes_FromHex(string, type == &PyByteArray_Type);
1992 if (type != &PyByteArray_Type && result != NULL) {
1993 Py_SETREF(result, PyObject_CallFunctionObjArgs((PyObject *)type,
1994 result, NULL));
1995 }
1996 return result;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001997}
1998
Gregory P. Smith8cb65692015-04-25 23:22:26 +00001999PyDoc_STRVAR(hex__doc__,
2000"B.hex() -> string\n\
2001\n\
2002Create a string of hexadecimal numbers from a bytearray object.\n\
2003Example: bytearray([0xb9, 0x01, 0xef]).hex() -> 'b901ef'.");
2004
2005static PyObject *
Serhiy Storchakae09132f2016-07-03 13:57:48 +03002006bytearray_hex(PyBytesObject *self)
2007{
2008 char* argbuf = PyByteArray_AS_STRING(self);
2009 Py_ssize_t arglen = PyByteArray_GET_SIZE(self);
2010 return _Py_strhex(argbuf, arglen);
2011}
2012
2013static PyObject *
Antoine Pitroub0e1f8b2011-12-05 20:40:08 +01002014_common_reduce(PyByteArrayObject *self, int proto)
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002015{
Antoine Pitroub0e1f8b2011-12-05 20:40:08 +01002016 PyObject *dict;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02002017 _Py_IDENTIFIER(__dict__);
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +02002018 char *buf;
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02002019
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02002020 dict = _PyObject_GetAttrId((PyObject *)self, &PyId___dict__);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002021 if (dict == NULL) {
2022 PyErr_Clear();
2023 dict = Py_None;
2024 Py_INCREF(dict);
2025 }
2026
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +02002027 buf = PyByteArray_AS_STRING(self);
Antoine Pitroub0e1f8b2011-12-05 20:40:08 +01002028 if (proto < 3) {
2029 /* use str based reduction for backwards compatibility with Python 2.x */
2030 PyObject *latin1;
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +02002031 if (Py_SIZE(self))
2032 latin1 = PyUnicode_DecodeLatin1(buf, Py_SIZE(self), NULL);
Antoine Pitroub0e1f8b2011-12-05 20:40:08 +01002033 else
2034 latin1 = PyUnicode_FromString("");
2035 return Py_BuildValue("(O(Ns)N)", Py_TYPE(self), latin1, "latin-1", dict);
2036 }
2037 else {
2038 /* use more efficient byte based reduction */
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +02002039 if (Py_SIZE(self)) {
2040 return Py_BuildValue("(O(y#)N)", Py_TYPE(self), buf, Py_SIZE(self), dict);
Antoine Pitroub0e1f8b2011-12-05 20:40:08 +01002041 }
2042 else {
2043 return Py_BuildValue("(O()N)", Py_TYPE(self), dict);
2044 }
2045 }
2046}
2047
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002048/*[clinic input]
2049bytearray.__reduce__ as bytearray_reduce
2050
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002051Return state information for pickling.
2052[clinic start generated code]*/
2053
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002054static PyObject *
2055bytearray_reduce_impl(PyByteArrayObject *self)
Serhiy Storchaka7a9579c2016-05-02 13:45:20 +03002056/*[clinic end generated code: output=52bf304086464cab input=44b5737ada62dd3f]*/
Antoine Pitroub0e1f8b2011-12-05 20:40:08 +01002057{
2058 return _common_reduce(self, 2);
2059}
2060
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002061/*[clinic input]
2062bytearray.__reduce_ex__ as bytearray_reduce_ex
2063
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002064 proto: int = 0
2065 /
2066
2067Return state information for pickling.
2068[clinic start generated code]*/
2069
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002070static PyObject *
2071bytearray_reduce_ex_impl(PyByteArrayObject *self, int proto)
Serhiy Storchaka7a9579c2016-05-02 13:45:20 +03002072/*[clinic end generated code: output=52eac33377197520 input=f129bc1a1aa151ee]*/
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002073{
Antoine Pitroub0e1f8b2011-12-05 20:40:08 +01002074 return _common_reduce(self, proto);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002075}
2076
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002077/*[clinic input]
2078bytearray.__sizeof__ as bytearray_sizeof
2079
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002080Returns the size of the bytearray object in memory, in bytes.
2081[clinic start generated code]*/
2082
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002083static PyObject *
2084bytearray_sizeof_impl(PyByteArrayObject *self)
Serhiy Storchaka7a9579c2016-05-02 13:45:20 +03002085/*[clinic end generated code: output=738abdd17951c427 input=e27320fd98a4bc5a]*/
Robert Schuppeniesfbe94c52008-07-14 10:13:31 +00002086{
Benjamin Petersonef3e4c22009-04-11 19:48:14 +00002087 Py_ssize_t res;
Robert Schuppeniesfbe94c52008-07-14 10:13:31 +00002088
Serhiy Storchaka5c4064e2015-12-19 20:05:25 +02002089 res = _PyObject_SIZE(Py_TYPE(self)) + self->ob_alloc * sizeof(char);
Benjamin Petersonef3e4c22009-04-11 19:48:14 +00002090 return PyLong_FromSsize_t(res);
Robert Schuppeniesfbe94c52008-07-14 10:13:31 +00002091}
2092
Benjamin Peterson153c70f2009-04-18 15:42:12 +00002093static PySequenceMethods bytearray_as_sequence = {
2094 (lenfunc)bytearray_length, /* sq_length */
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002095 (binaryfunc)PyByteArray_Concat, /* sq_concat */
Benjamin Peterson153c70f2009-04-18 15:42:12 +00002096 (ssizeargfunc)bytearray_repeat, /* sq_repeat */
2097 (ssizeargfunc)bytearray_getitem, /* sq_item */
2098 0, /* sq_slice */
2099 (ssizeobjargproc)bytearray_setitem, /* sq_ass_item */
2100 0, /* sq_ass_slice */
Serhiy Storchakae09132f2016-07-03 13:57:48 +03002101 (objobjproc)bytearray_contains, /* sq_contains */
Benjamin Peterson153c70f2009-04-18 15:42:12 +00002102 (binaryfunc)bytearray_iconcat, /* sq_inplace_concat */
2103 (ssizeargfunc)bytearray_irepeat, /* sq_inplace_repeat */
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002104};
2105
Benjamin Peterson153c70f2009-04-18 15:42:12 +00002106static PyMappingMethods bytearray_as_mapping = {
2107 (lenfunc)bytearray_length,
2108 (binaryfunc)bytearray_subscript,
2109 (objobjargproc)bytearray_ass_subscript,
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002110};
2111
Benjamin Peterson153c70f2009-04-18 15:42:12 +00002112static PyBufferProcs bytearray_as_buffer = {
2113 (getbufferproc)bytearray_getbuffer,
2114 (releasebufferproc)bytearray_releasebuffer,
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002115};
2116
2117static PyMethodDef
Benjamin Peterson153c70f2009-04-18 15:42:12 +00002118bytearray_methods[] = {
2119 {"__alloc__", (PyCFunction)bytearray_alloc, METH_NOARGS, alloc_doc},
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002120 BYTEARRAY_REDUCE_METHODDEF
2121 BYTEARRAY_REDUCE_EX_METHODDEF
2122 BYTEARRAY_SIZEOF_METHODDEF
2123 BYTEARRAY_APPEND_METHODDEF
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002124 {"capitalize", (PyCFunction)stringlib_capitalize, METH_NOARGS,
2125 _Py_capitalize__doc__},
Serhiy Storchakadd40fc32016-05-04 22:23:26 +03002126 {"center", (PyCFunction)stringlib_center, METH_VARARGS, _Py_center__doc__},
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002127 BYTEARRAY_CLEAR_METHODDEF
2128 BYTEARRAY_COPY_METHODDEF
Serhiy Storchakae09132f2016-07-03 13:57:48 +03002129 {"count", (PyCFunction)bytearray_count, METH_VARARGS,
Serhiy Storchakadd40fc32016-05-04 22:23:26 +03002130 _Py_count__doc__},
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002131 BYTEARRAY_DECODE_METHODDEF
Serhiy Storchakae09132f2016-07-03 13:57:48 +03002132 {"endswith", (PyCFunction)bytearray_endswith, METH_VARARGS,
Serhiy Storchakadd40fc32016-05-04 22:23:26 +03002133 _Py_endswith__doc__},
Ezio Melotti745d54d2013-11-16 19:10:57 +02002134 {"expandtabs", (PyCFunction)stringlib_expandtabs, METH_VARARGS | METH_KEYWORDS,
Serhiy Storchakadd40fc32016-05-04 22:23:26 +03002135 _Py_expandtabs__doc__},
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002136 BYTEARRAY_EXTEND_METHODDEF
Serhiy Storchakae09132f2016-07-03 13:57:48 +03002137 {"find", (PyCFunction)bytearray_find, METH_VARARGS,
Serhiy Storchakadd40fc32016-05-04 22:23:26 +03002138 _Py_find__doc__},
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002139 BYTEARRAY_FROMHEX_METHODDEF
Serhiy Storchakae09132f2016-07-03 13:57:48 +03002140 {"hex", (PyCFunction)bytearray_hex, METH_NOARGS, hex__doc__},
2141 {"index", (PyCFunction)bytearray_index, METH_VARARGS, _Py_index__doc__},
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002142 BYTEARRAY_INSERT_METHODDEF
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002143 {"isalnum", (PyCFunction)stringlib_isalnum, METH_NOARGS,
2144 _Py_isalnum__doc__},
2145 {"isalpha", (PyCFunction)stringlib_isalpha, METH_NOARGS,
2146 _Py_isalpha__doc__},
2147 {"isdigit", (PyCFunction)stringlib_isdigit, METH_NOARGS,
2148 _Py_isdigit__doc__},
2149 {"islower", (PyCFunction)stringlib_islower, METH_NOARGS,
2150 _Py_islower__doc__},
2151 {"isspace", (PyCFunction)stringlib_isspace, METH_NOARGS,
2152 _Py_isspace__doc__},
2153 {"istitle", (PyCFunction)stringlib_istitle, METH_NOARGS,
2154 _Py_istitle__doc__},
2155 {"isupper", (PyCFunction)stringlib_isupper, METH_NOARGS,
2156 _Py_isupper__doc__},
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002157 BYTEARRAY_JOIN_METHODDEF
Serhiy Storchakadd40fc32016-05-04 22:23:26 +03002158 {"ljust", (PyCFunction)stringlib_ljust, METH_VARARGS, _Py_ljust__doc__},
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002159 {"lower", (PyCFunction)stringlib_lower, METH_NOARGS, _Py_lower__doc__},
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002160 BYTEARRAY_LSTRIP_METHODDEF
2161 BYTEARRAY_MAKETRANS_METHODDEF
2162 BYTEARRAY_PARTITION_METHODDEF
2163 BYTEARRAY_POP_METHODDEF
2164 BYTEARRAY_REMOVE_METHODDEF
2165 BYTEARRAY_REPLACE_METHODDEF
2166 BYTEARRAY_REVERSE_METHODDEF
Serhiy Storchakae09132f2016-07-03 13:57:48 +03002167 {"rfind", (PyCFunction)bytearray_rfind, METH_VARARGS, _Py_rfind__doc__},
2168 {"rindex", (PyCFunction)bytearray_rindex, METH_VARARGS, _Py_rindex__doc__},
Serhiy Storchakadd40fc32016-05-04 22:23:26 +03002169 {"rjust", (PyCFunction)stringlib_rjust, METH_VARARGS, _Py_rjust__doc__},
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002170 BYTEARRAY_RPARTITION_METHODDEF
2171 BYTEARRAY_RSPLIT_METHODDEF
2172 BYTEARRAY_RSTRIP_METHODDEF
2173 BYTEARRAY_SPLIT_METHODDEF
2174 BYTEARRAY_SPLITLINES_METHODDEF
Serhiy Storchakae09132f2016-07-03 13:57:48 +03002175 {"startswith", (PyCFunction)bytearray_startswith, METH_VARARGS ,
Serhiy Storchakadd40fc32016-05-04 22:23:26 +03002176 _Py_startswith__doc__},
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002177 BYTEARRAY_STRIP_METHODDEF
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002178 {"swapcase", (PyCFunction)stringlib_swapcase, METH_NOARGS,
2179 _Py_swapcase__doc__},
2180 {"title", (PyCFunction)stringlib_title, METH_NOARGS, _Py_title__doc__},
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002181 BYTEARRAY_TRANSLATE_METHODDEF
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002182 {"upper", (PyCFunction)stringlib_upper, METH_NOARGS, _Py_upper__doc__},
Serhiy Storchakadd40fc32016-05-04 22:23:26 +03002183 {"zfill", (PyCFunction)stringlib_zfill, METH_VARARGS, _Py_zfill__doc__},
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002184 {NULL}
2185};
2186
Ethan Furmanb95b5612015-01-23 20:05:18 -08002187static PyObject *
2188bytearray_mod(PyObject *v, PyObject *w)
2189{
2190 if (!PyByteArray_Check(v))
2191 Py_RETURN_NOTIMPLEMENTED;
Berker Peksag43de36d2016-04-16 01:20:47 +03002192 return _PyBytes_FormatEx(PyByteArray_AS_STRING(v), PyByteArray_GET_SIZE(v), w, 1);
Ethan Furmanb95b5612015-01-23 20:05:18 -08002193}
2194
2195static PyNumberMethods bytearray_as_number = {
2196 0, /*nb_add*/
2197 0, /*nb_subtract*/
2198 0, /*nb_multiply*/
2199 bytearray_mod, /*nb_remainder*/
2200};
2201
Benjamin Peterson153c70f2009-04-18 15:42:12 +00002202PyDoc_STRVAR(bytearray_doc,
Georg Brandl17cb8a82008-05-30 08:20:09 +00002203"bytearray(iterable_of_ints) -> bytearray\n\
2204bytearray(string, encoding[, errors]) -> bytearray\n\
Victor Stinnerbb2e9c42011-12-17 23:18:07 +01002205bytearray(bytes_or_buffer) -> mutable copy of bytes_or_buffer\n\
2206bytearray(int) -> bytes array of size given by the parameter initialized with null bytes\n\
2207bytearray() -> empty bytes array\n\
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002208\n\
Serhiy Storchaka6a7b3a72016-04-17 08:32:47 +03002209Construct a mutable bytearray object from:\n\
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002210 - an iterable yielding integers in range(256)\n\
2211 - a text string encoded using the specified encoding\n\
Victor Stinnerbb2e9c42011-12-17 23:18:07 +01002212 - a bytes or a buffer object\n\
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002213 - any object implementing the buffer API.\n\
Victor Stinnerbb2e9c42011-12-17 23:18:07 +01002214 - an integer");
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002215
2216
Benjamin Peterson153c70f2009-04-18 15:42:12 +00002217static PyObject *bytearray_iter(PyObject *seq);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002218
2219PyTypeObject PyByteArray_Type = {
2220 PyVarObject_HEAD_INIT(&PyType_Type, 0)
2221 "bytearray",
2222 sizeof(PyByteArrayObject),
2223 0,
Benjamin Peterson153c70f2009-04-18 15:42:12 +00002224 (destructor)bytearray_dealloc, /* tp_dealloc */
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002225 0, /* tp_print */
2226 0, /* tp_getattr */
2227 0, /* tp_setattr */
Mark Dickinsone94c6792009-02-02 20:36:42 +00002228 0, /* tp_reserved */
Benjamin Peterson153c70f2009-04-18 15:42:12 +00002229 (reprfunc)bytearray_repr, /* tp_repr */
Ethan Furmanb95b5612015-01-23 20:05:18 -08002230 &bytearray_as_number, /* tp_as_number */
Benjamin Peterson153c70f2009-04-18 15:42:12 +00002231 &bytearray_as_sequence, /* tp_as_sequence */
2232 &bytearray_as_mapping, /* tp_as_mapping */
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002233 0, /* tp_hash */
2234 0, /* tp_call */
Benjamin Peterson153c70f2009-04-18 15:42:12 +00002235 bytearray_str, /* tp_str */
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002236 PyObject_GenericGetAttr, /* tp_getattro */
2237 0, /* tp_setattro */
Benjamin Peterson153c70f2009-04-18 15:42:12 +00002238 &bytearray_as_buffer, /* tp_as_buffer */
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002239 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
Benjamin Peterson153c70f2009-04-18 15:42:12 +00002240 bytearray_doc, /* tp_doc */
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002241 0, /* tp_traverse */
2242 0, /* tp_clear */
Benjamin Peterson153c70f2009-04-18 15:42:12 +00002243 (richcmpfunc)bytearray_richcompare, /* tp_richcompare */
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002244 0, /* tp_weaklistoffset */
Benjamin Peterson153c70f2009-04-18 15:42:12 +00002245 bytearray_iter, /* tp_iter */
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002246 0, /* tp_iternext */
Benjamin Peterson153c70f2009-04-18 15:42:12 +00002247 bytearray_methods, /* tp_methods */
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002248 0, /* tp_members */
2249 0, /* tp_getset */
2250 0, /* tp_base */
2251 0, /* tp_dict */
2252 0, /* tp_descr_get */
2253 0, /* tp_descr_set */
2254 0, /* tp_dictoffset */
Benjamin Peterson153c70f2009-04-18 15:42:12 +00002255 (initproc)bytearray_init, /* tp_init */
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002256 PyType_GenericAlloc, /* tp_alloc */
2257 PyType_GenericNew, /* tp_new */
2258 PyObject_Del, /* tp_free */
2259};
2260
2261/*********************** Bytes Iterator ****************************/
2262
2263typedef struct {
2264 PyObject_HEAD
2265 Py_ssize_t it_index;
2266 PyByteArrayObject *it_seq; /* Set to NULL when iterator is exhausted */
2267} bytesiterobject;
2268
2269static void
Benjamin Peterson153c70f2009-04-18 15:42:12 +00002270bytearrayiter_dealloc(bytesiterobject *it)
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002271{
2272 _PyObject_GC_UNTRACK(it);
2273 Py_XDECREF(it->it_seq);
2274 PyObject_GC_Del(it);
2275}
2276
2277static int
Benjamin Peterson153c70f2009-04-18 15:42:12 +00002278bytearrayiter_traverse(bytesiterobject *it, visitproc visit, void *arg)
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002279{
2280 Py_VISIT(it->it_seq);
2281 return 0;
2282}
2283
2284static PyObject *
Benjamin Peterson153c70f2009-04-18 15:42:12 +00002285bytearrayiter_next(bytesiterobject *it)
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002286{
2287 PyByteArrayObject *seq;
2288 PyObject *item;
2289
2290 assert(it != NULL);
2291 seq = it->it_seq;
2292 if (seq == NULL)
2293 return NULL;
2294 assert(PyByteArray_Check(seq));
2295
2296 if (it->it_index < PyByteArray_GET_SIZE(seq)) {
2297 item = PyLong_FromLong(
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +02002298 (unsigned char)PyByteArray_AS_STRING(seq)[it->it_index]);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002299 if (item != NULL)
2300 ++it->it_index;
2301 return item;
2302 }
2303
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002304 it->it_seq = NULL;
Serhiy Storchakafbb1c5e2016-03-30 20:40:02 +03002305 Py_DECREF(seq);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002306 return NULL;
2307}
2308
2309static PyObject *
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00002310bytearrayiter_length_hint(bytesiterobject *it)
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002311{
2312 Py_ssize_t len = 0;
Serhiy Storchakaaf658722016-07-03 14:41:36 +03002313 if (it->it_seq) {
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002314 len = PyByteArray_GET_SIZE(it->it_seq) - it->it_index;
Serhiy Storchakaaf658722016-07-03 14:41:36 +03002315 if (len < 0) {
2316 len = 0;
2317 }
2318 }
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002319 return PyLong_FromSsize_t(len);
2320}
2321
2322PyDoc_STRVAR(length_hint_doc,
2323 "Private method returning an estimate of len(list(it)).");
2324
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00002325static PyObject *
2326bytearrayiter_reduce(bytesiterobject *it)
2327{
2328 if (it->it_seq != NULL) {
Antoine Pitroua7013882012-04-05 00:04:20 +02002329 return Py_BuildValue("N(O)n", _PyObject_GetBuiltin("iter"),
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00002330 it->it_seq, it->it_index);
2331 } else {
2332 PyObject *u = PyUnicode_FromUnicode(NULL, 0);
2333 if (u == NULL)
2334 return NULL;
Antoine Pitroua7013882012-04-05 00:04:20 +02002335 return Py_BuildValue("N(N)", _PyObject_GetBuiltin("iter"), u);
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00002336 }
2337}
2338
2339static PyObject *
2340bytearrayiter_setstate(bytesiterobject *it, PyObject *state)
2341{
2342 Py_ssize_t index = PyLong_AsSsize_t(state);
2343 if (index == -1 && PyErr_Occurred())
2344 return NULL;
Kristján Valur Jónsson25dded02014-03-05 13:47:57 +00002345 if (it->it_seq != NULL) {
2346 if (index < 0)
2347 index = 0;
2348 else if (index > PyByteArray_GET_SIZE(it->it_seq))
2349 index = PyByteArray_GET_SIZE(it->it_seq); /* iterator exhausted */
2350 it->it_index = index;
2351 }
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00002352 Py_RETURN_NONE;
2353}
2354
2355PyDoc_STRVAR(setstate_doc, "Set state information for unpickling.");
2356
Benjamin Peterson153c70f2009-04-18 15:42:12 +00002357static PyMethodDef bytearrayiter_methods[] = {
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00002358 {"__length_hint__", (PyCFunction)bytearrayiter_length_hint, METH_NOARGS,
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002359 length_hint_doc},
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00002360 {"__reduce__", (PyCFunction)bytearrayiter_reduce, METH_NOARGS,
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002361 bytearray_reduce__doc__},
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00002362 {"__setstate__", (PyCFunction)bytearrayiter_setstate, METH_O,
2363 setstate_doc},
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002364 {NULL, NULL} /* sentinel */
2365};
2366
2367PyTypeObject PyByteArrayIter_Type = {
2368 PyVarObject_HEAD_INIT(&PyType_Type, 0)
2369 "bytearray_iterator", /* tp_name */
2370 sizeof(bytesiterobject), /* tp_basicsize */
2371 0, /* tp_itemsize */
2372 /* methods */
Benjamin Peterson153c70f2009-04-18 15:42:12 +00002373 (destructor)bytearrayiter_dealloc, /* tp_dealloc */
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002374 0, /* tp_print */
2375 0, /* tp_getattr */
2376 0, /* tp_setattr */
Mark Dickinsone94c6792009-02-02 20:36:42 +00002377 0, /* tp_reserved */
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002378 0, /* tp_repr */
2379 0, /* tp_as_number */
2380 0, /* tp_as_sequence */
2381 0, /* tp_as_mapping */
2382 0, /* tp_hash */
2383 0, /* tp_call */
2384 0, /* tp_str */
2385 PyObject_GenericGetAttr, /* tp_getattro */
2386 0, /* tp_setattro */
2387 0, /* tp_as_buffer */
2388 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC, /* tp_flags */
2389 0, /* tp_doc */
Benjamin Peterson153c70f2009-04-18 15:42:12 +00002390 (traverseproc)bytearrayiter_traverse, /* tp_traverse */
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002391 0, /* tp_clear */
2392 0, /* tp_richcompare */
2393 0, /* tp_weaklistoffset */
2394 PyObject_SelfIter, /* tp_iter */
Benjamin Peterson153c70f2009-04-18 15:42:12 +00002395 (iternextfunc)bytearrayiter_next, /* tp_iternext */
2396 bytearrayiter_methods, /* tp_methods */
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002397 0,
2398};
2399
2400static PyObject *
Benjamin Peterson153c70f2009-04-18 15:42:12 +00002401bytearray_iter(PyObject *seq)
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002402{
2403 bytesiterobject *it;
2404
2405 if (!PyByteArray_Check(seq)) {
2406 PyErr_BadInternalCall();
2407 return NULL;
2408 }
2409 it = PyObject_GC_New(bytesiterobject, &PyByteArrayIter_Type);
2410 if (it == NULL)
2411 return NULL;
2412 it->it_index = 0;
2413 Py_INCREF(seq);
2414 it->it_seq = (PyByteArrayObject *)seq;
2415 _PyObject_GC_TRACK(it);
2416 return (PyObject *)it;
2417}