blob: a8d698025087361f68d0b76b4820c0f279814cf8 [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
Raymond Hettinger15f44ab2016-08-30 10:47:49 -0700484 shrunk. Otherwise, the bytearray is restored in its previous
Victor Stinner84557232013-11-21 12:29:51 +0100485 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? */
Serhiy Storchakaeb249882016-08-15 09:46:07 +0300798 if (PyIndex_Check(arg)) {
799 count = PyNumber_AsSsize_t(arg, PyExc_OverflowError);
800 if (count == -1 && PyErr_Occurred()) {
INADA Naokia634e232017-01-06 17:32:01 +0900801 if (PyErr_ExceptionMatches(PyExc_OverflowError))
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000802 return -1;
INADA Naokia634e232017-01-06 17:32:01 +0900803 PyErr_Clear(); /* fall through */
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000804 }
INADA Naokia634e232017-01-06 17:32:01 +0900805 else {
806 if (count < 0) {
807 PyErr_SetString(PyExc_ValueError, "negative count");
808 return -1;
809 }
810 if (count > 0) {
811 if (PyByteArray_Resize((PyObject *)self, count))
812 return -1;
813 memset(PyByteArray_AS_STRING(self), 0, count);
814 }
815 return 0;
816 }
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000817 }
818
819 /* Use the buffer API */
820 if (PyObject_CheckBuffer(arg)) {
821 Py_ssize_t size;
822 Py_buffer view;
823 if (PyObject_GetBuffer(arg, &view, PyBUF_FULL_RO) < 0)
824 return -1;
825 size = view.len;
826 if (PyByteArray_Resize((PyObject *)self, size) < 0) goto fail;
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200827 if (PyBuffer_ToContiguous(PyByteArray_AS_STRING(self),
828 &view, size, 'C') < 0)
Stefan Krah7d12d9d2012-07-28 12:25:55 +0200829 goto fail;
Martin v. Löwis423be952008-08-13 15:53:07 +0000830 PyBuffer_Release(&view);
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000831 return 0;
832 fail:
Martin v. Löwis423be952008-08-13 15:53:07 +0000833 PyBuffer_Release(&view);
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000834 return -1;
835 }
836
837 /* XXX Optimize this if the arguments is a list, tuple */
838
839 /* Get the iterator */
840 it = PyObject_GetIter(arg);
841 if (it == NULL)
842 return -1;
843 iternext = *Py_TYPE(it)->tp_iternext;
844
845 /* Run the iterator to exhaustion */
846 for (;;) {
847 PyObject *item;
Georg Brandl9a54d7c2008-07-16 23:15:30 +0000848 int rc, value;
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000849
850 /* Get the next item */
851 item = iternext(it);
852 if (item == NULL) {
853 if (PyErr_Occurred()) {
854 if (!PyErr_ExceptionMatches(PyExc_StopIteration))
855 goto error;
856 PyErr_Clear();
857 }
858 break;
859 }
860
861 /* Interpret it as an int (__index__) */
Georg Brandl9a54d7c2008-07-16 23:15:30 +0000862 rc = _getbytevalue(item, &value);
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000863 Py_DECREF(item);
Georg Brandl9a54d7c2008-07-16 23:15:30 +0000864 if (!rc)
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000865 goto error;
866
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000867 /* Append the byte */
Serhiy Storchaka7b6e3b92015-06-29 21:14:06 +0300868 if (Py_SIZE(self) + 1 < self->ob_alloc) {
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000869 Py_SIZE(self)++;
Serhiy Storchaka7b6e3b92015-06-29 21:14:06 +0300870 PyByteArray_AS_STRING(self)[Py_SIZE(self)] = '\0';
871 }
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000872 else if (PyByteArray_Resize((PyObject *)self, Py_SIZE(self)+1) < 0)
873 goto error;
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200874 PyByteArray_AS_STRING(self)[Py_SIZE(self)-1] = value;
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000875 }
876
877 /* Clean up and return success */
878 Py_DECREF(it);
879 return 0;
880
881 error:
882 /* Error handling when it != NULL */
883 Py_DECREF(it);
884 return -1;
885}
886
887/* Mostly copied from string_repr, but without the
888 "smart quote" functionality. */
889static PyObject *
Benjamin Peterson153c70f2009-04-18 15:42:12 +0000890bytearray_repr(PyByteArrayObject *self)
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000891{
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000892 const char *quote_prefix = "bytearray(b";
893 const char *quote_postfix = ")";
894 Py_ssize_t length = Py_SIZE(self);
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200895 /* 15 == strlen(quote_prefix) + 2 + strlen(quote_postfix) + 1 */
Mark Dickinson66f575b2010-02-14 12:53:32 +0000896 size_t newsize;
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000897 PyObject *v;
Antoine Pitrou9ed5f272013-08-13 20:18:52 +0200898 Py_ssize_t i;
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200899 char *bytes;
Antoine Pitrou9ed5f272013-08-13 20:18:52 +0200900 char c;
901 char *p;
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200902 int quote;
903 char *test, *start;
904 char *buffer;
905
906 if (length > (PY_SSIZE_T_MAX - 15) / 4) {
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000907 PyErr_SetString(PyExc_OverflowError,
908 "bytearray object is too large to make repr");
909 return NULL;
910 }
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200911
912 newsize = 15 + length * 4;
Antoine Pitrou39aba4f2011-11-12 21:15:28 +0100913 buffer = PyObject_Malloc(newsize);
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200914 if (buffer == NULL) {
915 PyErr_NoMemory();
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000916 return NULL;
917 }
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000918
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200919 /* Figure out which quote to use; single is preferred */
920 quote = '\'';
921 start = PyByteArray_AS_STRING(self);
922 for (test = start; test < start+length; ++test) {
923 if (*test == '"') {
924 quote = '\''; /* back to single */
925 break;
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000926 }
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200927 else if (*test == '\'')
928 quote = '"';
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000929 }
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200930
931 p = buffer;
932 while (*quote_prefix)
933 *p++ = *quote_prefix++;
934 *p++ = quote;
935
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200936 bytes = PyByteArray_AS_STRING(self);
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200937 for (i = 0; i < length; i++) {
938 /* There's at least enough room for a hex escape
939 and a closing quote. */
940 assert(newsize - (p - buffer) >= 5);
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200941 c = bytes[i];
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200942 if (c == '\'' || c == '\\')
943 *p++ = '\\', *p++ = c;
944 else if (c == '\t')
945 *p++ = '\\', *p++ = 't';
946 else if (c == '\n')
947 *p++ = '\\', *p++ = 'n';
948 else if (c == '\r')
949 *p++ = '\\', *p++ = 'r';
950 else if (c == 0)
951 *p++ = '\\', *p++ = 'x', *p++ = '0', *p++ = '0';
952 else if (c < ' ' || c >= 0x7f) {
953 *p++ = '\\';
954 *p++ = 'x';
Victor Stinnerf5cff562011-10-14 02:13:11 +0200955 *p++ = Py_hexdigits[(c & 0xf0) >> 4];
956 *p++ = Py_hexdigits[c & 0xf];
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200957 }
958 else
959 *p++ = c;
960 }
961 assert(newsize - (p - buffer) >= 1);
962 *p++ = quote;
963 while (*quote_postfix) {
964 *p++ = *quote_postfix++;
965 }
966
967 v = PyUnicode_DecodeASCII(buffer, p - buffer, NULL);
Antoine Pitrou39aba4f2011-11-12 21:15:28 +0100968 PyObject_Free(buffer);
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200969 return v;
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000970}
971
972static PyObject *
Benjamin Peterson153c70f2009-04-18 15:42:12 +0000973bytearray_str(PyObject *op)
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000974{
Alexander Belopolskyf0f45142010-08-11 17:31:17 +0000975 if (Py_BytesWarningFlag) {
976 if (PyErr_WarnEx(PyExc_BytesWarning,
977 "str() on a bytearray instance", 1))
978 return NULL;
979 }
980 return bytearray_repr((PyByteArrayObject*)op);
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000981}
982
983static PyObject *
Benjamin Peterson153c70f2009-04-18 15:42:12 +0000984bytearray_richcompare(PyObject *self, PyObject *other, int op)
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000985{
986 Py_ssize_t self_size, other_size;
987 Py_buffer self_bytes, other_bytes;
988 PyObject *res;
989 Py_ssize_t minsize;
Serhiy Storchakafa494fd2015-05-30 17:45:22 +0300990 int cmp, rc;
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000991
992 /* Bytes can be compared to anything that supports the (binary)
993 buffer API. Except that a comparison with Unicode is always an
994 error, even if the comparison is for equality. */
Serhiy Storchakafa494fd2015-05-30 17:45:22 +0300995 rc = PyObject_IsInstance(self, (PyObject*)&PyUnicode_Type);
996 if (!rc)
997 rc = PyObject_IsInstance(other, (PyObject*)&PyUnicode_Type);
998 if (rc < 0)
999 return NULL;
1000 if (rc) {
Barry Warsaw9e9dcd62008-10-17 01:50:37 +00001001 if (Py_BytesWarningFlag && (op == Py_EQ || op == Py_NE)) {
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001002 if (PyErr_WarnEx(PyExc_BytesWarning,
Georg Brandle5d68ac2008-06-04 11:30:26 +00001003 "Comparison between bytearray and string", 1))
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001004 return NULL;
1005 }
1006
Brian Curtindfc80e32011-08-10 20:28:54 -05001007 Py_RETURN_NOTIMPLEMENTED;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001008 }
1009
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +02001010 if (PyObject_GetBuffer(self, &self_bytes, PyBUF_SIMPLE) != 0) {
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001011 PyErr_Clear();
Brian Curtindfc80e32011-08-10 20:28:54 -05001012 Py_RETURN_NOTIMPLEMENTED;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001013 }
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +02001014 self_size = self_bytes.len;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001015
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +02001016 if (PyObject_GetBuffer(other, &other_bytes, PyBUF_SIMPLE) != 0) {
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001017 PyErr_Clear();
Martin v. Löwis423be952008-08-13 15:53:07 +00001018 PyBuffer_Release(&self_bytes);
Brian Curtindfc80e32011-08-10 20:28:54 -05001019 Py_RETURN_NOTIMPLEMENTED;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001020 }
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +02001021 other_size = other_bytes.len;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001022
1023 if (self_size != other_size && (op == Py_EQ || op == Py_NE)) {
1024 /* Shortcut: if the lengths differ, the objects differ */
1025 cmp = (op == Py_NE);
1026 }
1027 else {
1028 minsize = self_size;
1029 if (other_size < minsize)
1030 minsize = other_size;
1031
1032 cmp = memcmp(self_bytes.buf, other_bytes.buf, minsize);
1033 /* In ISO C, memcmp() guarantees to use unsigned bytes! */
1034
1035 if (cmp == 0) {
1036 if (self_size < other_size)
1037 cmp = -1;
1038 else if (self_size > other_size)
1039 cmp = 1;
1040 }
1041
1042 switch (op) {
1043 case Py_LT: cmp = cmp < 0; break;
1044 case Py_LE: cmp = cmp <= 0; break;
1045 case Py_EQ: cmp = cmp == 0; break;
1046 case Py_NE: cmp = cmp != 0; break;
1047 case Py_GT: cmp = cmp > 0; break;
1048 case Py_GE: cmp = cmp >= 0; break;
1049 }
1050 }
1051
1052 res = cmp ? Py_True : Py_False;
Martin v. Löwis423be952008-08-13 15:53:07 +00001053 PyBuffer_Release(&self_bytes);
1054 PyBuffer_Release(&other_bytes);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001055 Py_INCREF(res);
1056 return res;
1057}
1058
1059static void
Benjamin Peterson153c70f2009-04-18 15:42:12 +00001060bytearray_dealloc(PyByteArrayObject *self)
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001061{
Benjamin Petersone0124bd2009-03-09 21:04:33 +00001062 if (self->ob_exports > 0) {
1063 PyErr_SetString(PyExc_SystemError,
Benjamin Petersonef3e4c22009-04-11 19:48:14 +00001064 "deallocated bytearray object has exported buffers");
Benjamin Petersone0124bd2009-03-09 21:04:33 +00001065 PyErr_Print();
1066 }
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001067 if (self->ob_bytes != 0) {
Antoine Pitrou39aba4f2011-11-12 21:15:28 +01001068 PyObject_Free(self->ob_bytes);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001069 }
1070 Py_TYPE(self)->tp_free((PyObject *)self);
1071}
1072
1073
1074/* -------------------------------------------------------------------- */
1075/* Methods */
1076
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02001077#define FASTSEARCH fastsearch
1078#define STRINGLIB(F) stringlib_##F
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001079#define STRINGLIB_CHAR char
Antoine Pitroucfc22b42012-10-16 21:07:23 +02001080#define STRINGLIB_SIZEOF_CHAR 1
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001081#define STRINGLIB_LEN PyByteArray_GET_SIZE
1082#define STRINGLIB_STR PyByteArray_AS_STRING
1083#define STRINGLIB_NEW PyByteArray_FromStringAndSize
Antoine Pitrouf2c54842010-01-13 08:07:53 +00001084#define STRINGLIB_ISSPACE Py_ISSPACE
1085#define STRINGLIB_ISLINEBREAK(x) ((x == '\n') || (x == '\r'))
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001086#define STRINGLIB_CHECK_EXACT PyByteArray_CheckExact
1087#define STRINGLIB_MUTABLE 1
1088
1089#include "stringlib/fastsearch.h"
1090#include "stringlib/count.h"
1091#include "stringlib/find.h"
Antoine Pitroucfc22b42012-10-16 21:07:23 +02001092#include "stringlib/join.h"
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001093#include "stringlib/partition.h"
Antoine Pitrouf2c54842010-01-13 08:07:53 +00001094#include "stringlib/split.h"
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001095#include "stringlib/ctype.h"
1096#include "stringlib/transmogrify.h"
1097
1098
Serhiy Storchakae09132f2016-07-03 13:57:48 +03001099static PyObject *
1100bytearray_find(PyByteArrayObject *self, PyObject *args)
1101{
1102 return _Py_bytes_find(PyByteArray_AS_STRING(self), PyByteArray_GET_SIZE(self), args);
1103}
1104
1105static PyObject *
1106bytearray_count(PyByteArrayObject *self, PyObject *args)
1107{
1108 return _Py_bytes_count(PyByteArray_AS_STRING(self), PyByteArray_GET_SIZE(self), args);
1109}
1110
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001111/*[clinic input]
1112bytearray.clear
1113
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001114Remove all items from the bytearray.
1115[clinic start generated code]*/
1116
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001117static PyObject *
1118bytearray_clear_impl(PyByteArrayObject *self)
Serhiy Storchaka7a9579c2016-05-02 13:45:20 +03001119/*[clinic end generated code: output=85c2fe6aede0956c input=ed6edae9de447ac4]*/
Eli Bendersky4db28d32011-03-03 18:21:02 +00001120{
1121 if (PyByteArray_Resize((PyObject *)self, 0) < 0)
1122 return NULL;
1123 Py_RETURN_NONE;
1124}
1125
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001126/*[clinic input]
1127bytearray.copy
1128
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001129Return a copy of B.
1130[clinic start generated code]*/
1131
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001132static PyObject *
1133bytearray_copy_impl(PyByteArrayObject *self)
Serhiy Storchaka7a9579c2016-05-02 13:45:20 +03001134/*[clinic end generated code: output=68cfbcfed484c132 input=6597b0c01bccaa9e]*/
Eli Bendersky4db28d32011-03-03 18:21:02 +00001135{
1136 return PyByteArray_FromStringAndSize(PyByteArray_AS_STRING((PyObject *)self),
1137 PyByteArray_GET_SIZE(self));
1138}
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001139
Serhiy Storchakae09132f2016-07-03 13:57:48 +03001140static PyObject *
1141bytearray_index(PyByteArrayObject *self, PyObject *args)
1142{
1143 return _Py_bytes_index(PyByteArray_AS_STRING(self), PyByteArray_GET_SIZE(self), args);
1144}
1145
1146static PyObject *
1147bytearray_rfind(PyByteArrayObject *self, PyObject *args)
1148{
1149 return _Py_bytes_rfind(PyByteArray_AS_STRING(self), PyByteArray_GET_SIZE(self), args);
1150}
1151
1152static PyObject *
1153bytearray_rindex(PyByteArrayObject *self, PyObject *args)
1154{
1155 return _Py_bytes_rindex(PyByteArray_AS_STRING(self), PyByteArray_GET_SIZE(self), args);
1156}
1157
1158static int
1159bytearray_contains(PyObject *self, PyObject *arg)
1160{
1161 return _Py_bytes_contains(PyByteArray_AS_STRING(self), PyByteArray_GET_SIZE(self), arg);
1162}
1163
1164static PyObject *
1165bytearray_startswith(PyByteArrayObject *self, PyObject *args)
1166{
1167 return _Py_bytes_startswith(PyByteArray_AS_STRING(self), PyByteArray_GET_SIZE(self), args);
1168}
1169
1170static PyObject *
1171bytearray_endswith(PyByteArrayObject *self, PyObject *args)
1172{
1173 return _Py_bytes_endswith(PyByteArray_AS_STRING(self), PyByteArray_GET_SIZE(self), args);
1174}
1175
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001176
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001177/*[clinic input]
1178bytearray.translate
1179
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001180 table: object
1181 Translation table, which must be a bytes object of length 256.
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001182 /
Martin Panter1b6c6da2016-08-27 08:35:02 +00001183 delete as deletechars: object(c_default="NULL") = b''
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001184
1185Return a copy with each character mapped by the given translation table.
1186
Martin Panter1b6c6da2016-08-27 08:35:02 +00001187All characters occurring in the optional argument delete are removed.
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001188The 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,
Martin Panter1b6c6da2016-08-27 08:35:02 +00001193 PyObject *deletechars)
1194/*[clinic end generated code: output=b6a8f01c2a74e446 input=cfff956d4d127a9b]*/
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)
Martin Panter1b6c6da2016-08-27 08:35:02 +00001263 *output++ = (char)trans_table[c];
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001264 }
1265 /* Fix the size of the resulting string */
1266 if (inlen > 0)
Christian Heimesc731bbe2013-07-21 02:04:35 +02001267 if (PyByteArray_Resize(result, output - output_start) < 0) {
1268 Py_CLEAR(result);
1269 goto done;
1270 }
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001271
1272done:
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001273 if (table != NULL)
Georg Brandlccc47b62008-12-28 11:44:14 +00001274 PyBuffer_Release(&vtable);
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001275 if (deletechars != NULL)
Martin v. Löwis423be952008-08-13 15:53:07 +00001276 PyBuffer_Release(&vdel);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001277 return result;
1278}
1279
1280
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001281/*[clinic input]
1282
1283@staticmethod
1284bytearray.maketrans
1285
Serhiy Storchaka3dd3e262015-02-03 01:25:42 +02001286 frm: Py_buffer
1287 to: Py_buffer
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001288 /
1289
1290Return a translation table useable for the bytes or bytearray translate method.
1291
1292The returned table will be one where each byte in frm is mapped to the byte at
1293the same position in to.
1294
1295The bytes objects frm and to must be of the same length.
1296[clinic start generated code]*/
1297
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001298static PyObject *
Serhiy Storchaka3dd3e262015-02-03 01:25:42 +02001299bytearray_maketrans_impl(Py_buffer *frm, Py_buffer *to)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03001300/*[clinic end generated code: output=1df267d99f56b15e input=5925a81d2fbbf151]*/
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001301{
1302 return _Py_bytes_maketrans(frm, to);
Georg Brandlabc38772009-04-12 15:51:51 +00001303}
1304
1305
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001306/*[clinic input]
1307bytearray.replace
1308
Serhiy Storchaka3dd3e262015-02-03 01:25:42 +02001309 old: Py_buffer
1310 new: Py_buffer
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001311 count: Py_ssize_t = -1
1312 Maximum number of occurrences to replace.
1313 -1 (the default value) means replace all occurrences.
1314 /
1315
1316Return a copy with all occurrences of substring old replaced by new.
1317
1318If the optional argument count is given, only the first count occurrences are
1319replaced.
1320[clinic start generated code]*/
1321
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001322static PyObject *
Larry Hastings89964c42015-04-14 18:07:59 -04001323bytearray_replace_impl(PyByteArrayObject *self, Py_buffer *old,
1324 Py_buffer *new, Py_ssize_t count)
1325/*[clinic end generated code: output=d39884c4dc59412a input=aa379d988637c7fb]*/
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001326{
Serhiy Storchakafb81d3c2016-05-05 09:26:07 +03001327 return stringlib_replace((PyObject *)self,
Serhiy Storchakae09132f2016-07-03 13:57:48 +03001328 (const char *)old->buf, old->len,
1329 (const char *)new->buf, new->len, count);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001330}
1331
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001332/*[clinic input]
1333bytearray.split
1334
1335 sep: object = None
1336 The delimiter according which to split the bytearray.
1337 None (the default value) means split on ASCII whitespace characters
1338 (space, tab, return, newline, formfeed, vertical tab).
1339 maxsplit: Py_ssize_t = -1
1340 Maximum number of splits to do.
1341 -1 (the default value) means no limit.
1342
1343Return a list of the sections in the bytearray, using sep as the delimiter.
1344[clinic start generated code]*/
1345
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001346static PyObject *
Larry Hastings89964c42015-04-14 18:07:59 -04001347bytearray_split_impl(PyByteArrayObject *self, PyObject *sep,
1348 Py_ssize_t maxsplit)
1349/*[clinic end generated code: output=833e2cf385d9a04d input=24f82669f41bf523]*/
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001350{
1351 Py_ssize_t len = PyByteArray_GET_SIZE(self), n;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001352 const char *s = PyByteArray_AS_STRING(self), *sub;
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001353 PyObject *list;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001354 Py_buffer vsub;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001355
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001356 if (maxsplit < 0)
1357 maxsplit = PY_SSIZE_T_MAX;
1358
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001359 if (sep == Py_None)
Antoine Pitrouf2c54842010-01-13 08:07:53 +00001360 return stringlib_split_whitespace((PyObject*) self, s, len, maxsplit);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001361
Serhiy Storchaka3dd3e262015-02-03 01:25:42 +02001362 if (PyObject_GetBuffer(sep, &vsub, PyBUF_SIMPLE) != 0)
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001363 return NULL;
1364 sub = vsub.buf;
1365 n = vsub.len;
1366
Antoine Pitrouf2c54842010-01-13 08:07:53 +00001367 list = stringlib_split(
1368 (PyObject*) self, s, len, sub, n, maxsplit
1369 );
Martin v. Löwis423be952008-08-13 15:53:07 +00001370 PyBuffer_Release(&vsub);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001371 return list;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001372}
1373
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001374/*[clinic input]
1375bytearray.partition
1376
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001377 sep: object
1378 /
1379
1380Partition the bytearray into three parts using the given separator.
1381
1382This will search for the separator sep in the bytearray. If the separator is
1383found, returns a 3-tuple containing the part before the separator, the
1384separator itself, and the part after it.
1385
1386If the separator is not found, returns a 3-tuple containing the original
1387bytearray object and two empty bytearray objects.
1388[clinic start generated code]*/
1389
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001390static PyObject *
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001391bytearray_partition(PyByteArrayObject *self, PyObject *sep)
Serhiy Storchaka7a9579c2016-05-02 13:45:20 +03001392/*[clinic end generated code: output=45d2525ddd35f957 input=86f89223892b70b5]*/
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001393{
1394 PyObject *bytesep, *result;
1395
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001396 bytesep = PyByteArray_FromObject(sep);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001397 if (! bytesep)
1398 return NULL;
1399
1400 result = stringlib_partition(
1401 (PyObject*) self,
1402 PyByteArray_AS_STRING(self), PyByteArray_GET_SIZE(self),
1403 bytesep,
1404 PyByteArray_AS_STRING(bytesep), PyByteArray_GET_SIZE(bytesep)
1405 );
1406
1407 Py_DECREF(bytesep);
Antoine Pitrouf2c54842010-01-13 08:07:53 +00001408 return result;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001409}
1410
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001411/*[clinic input]
1412bytearray.rpartition
1413
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001414 sep: object
1415 /
1416
1417Partition the bytes into three parts using the given separator.
1418
1419This will search for the separator sep in the bytearray, starting and the end.
1420If the separator is found, returns a 3-tuple containing the part before the
1421separator, the separator itself, and the part after it.
1422
1423If the separator is not found, returns a 3-tuple containing two empty bytearray
1424objects and the original bytearray object.
1425[clinic start generated code]*/
1426
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001427static PyObject *
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001428bytearray_rpartition(PyByteArrayObject *self, PyObject *sep)
Serhiy Storchaka7a9579c2016-05-02 13:45:20 +03001429/*[clinic end generated code: output=440de3c9426115e8 input=5f4094f2de87c8f3]*/
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001430{
1431 PyObject *bytesep, *result;
1432
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001433 bytesep = PyByteArray_FromObject(sep);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001434 if (! bytesep)
1435 return NULL;
1436
1437 result = stringlib_rpartition(
1438 (PyObject*) self,
1439 PyByteArray_AS_STRING(self), PyByteArray_GET_SIZE(self),
1440 bytesep,
1441 PyByteArray_AS_STRING(bytesep), PyByteArray_GET_SIZE(bytesep)
1442 );
1443
1444 Py_DECREF(bytesep);
Antoine Pitrouf2c54842010-01-13 08:07:53 +00001445 return result;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001446}
1447
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001448/*[clinic input]
1449bytearray.rsplit = bytearray.split
1450
1451Return a list of the sections in the bytearray, using sep as the delimiter.
1452
1453Splitting is done starting at the end of the bytearray and working to the front.
1454[clinic start generated code]*/
1455
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001456static PyObject *
Larry Hastings89964c42015-04-14 18:07:59 -04001457bytearray_rsplit_impl(PyByteArrayObject *self, PyObject *sep,
1458 Py_ssize_t maxsplit)
1459/*[clinic end generated code: output=a55e0b5a03cb6190 input=a68286e4dd692ffe]*/
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001460{
1461 Py_ssize_t len = PyByteArray_GET_SIZE(self), n;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001462 const char *s = PyByteArray_AS_STRING(self), *sub;
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001463 PyObject *list;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001464 Py_buffer vsub;
1465
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001466 if (maxsplit < 0)
1467 maxsplit = PY_SSIZE_T_MAX;
1468
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001469 if (sep == Py_None)
Antoine Pitrouf2c54842010-01-13 08:07:53 +00001470 return stringlib_rsplit_whitespace((PyObject*) self, s, len, maxsplit);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001471
Serhiy Storchaka3dd3e262015-02-03 01:25:42 +02001472 if (PyObject_GetBuffer(sep, &vsub, PyBUF_SIMPLE) != 0)
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001473 return NULL;
1474 sub = vsub.buf;
1475 n = vsub.len;
1476
Antoine Pitrouf2c54842010-01-13 08:07:53 +00001477 list = stringlib_rsplit(
1478 (PyObject*) self, s, len, sub, n, maxsplit
1479 );
Martin v. Löwis423be952008-08-13 15:53:07 +00001480 PyBuffer_Release(&vsub);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001481 return list;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001482}
1483
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001484/*[clinic input]
1485bytearray.reverse
1486
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001487Reverse the order of the values in B in place.
1488[clinic start generated code]*/
1489
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001490static PyObject *
1491bytearray_reverse_impl(PyByteArrayObject *self)
Serhiy Storchaka7a9579c2016-05-02 13:45:20 +03001492/*[clinic end generated code: output=9f7616f29ab309d3 input=543356319fc78557]*/
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001493{
1494 char swap, *head, *tail;
1495 Py_ssize_t i, j, n = Py_SIZE(self);
1496
1497 j = n / 2;
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +02001498 head = PyByteArray_AS_STRING(self);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001499 tail = head + n - 1;
1500 for (i = 0; i < j; i++) {
1501 swap = *head;
1502 *head++ = *tail;
1503 *tail-- = swap;
1504 }
1505
1506 Py_RETURN_NONE;
1507}
1508
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001509
1510/*[python input]
1511class bytesvalue_converter(CConverter):
1512 type = 'int'
1513 converter = '_getbytevalue'
1514[python start generated code]*/
1515/*[python end generated code: output=da39a3ee5e6b4b0d input=29c2e7c26c212812]*/
1516
1517
1518/*[clinic input]
1519bytearray.insert
1520
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001521 index: Py_ssize_t
1522 The index where the value is to be inserted.
1523 item: bytesvalue
1524 The item to be inserted.
1525 /
1526
1527Insert a single item into the bytearray before the given index.
1528[clinic start generated code]*/
1529
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001530static PyObject *
1531bytearray_insert_impl(PyByteArrayObject *self, Py_ssize_t index, int item)
Serhiy Storchaka7a9579c2016-05-02 13:45:20 +03001532/*[clinic end generated code: output=76c775a70e7b07b7 input=b2b5d07e9de6c070]*/
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001533{
1534 Py_ssize_t n = Py_SIZE(self);
1535 char *buf;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001536
1537 if (n == PY_SSIZE_T_MAX) {
1538 PyErr_SetString(PyExc_OverflowError,
Mark Dickinson2b6705f2009-09-06 10:34:47 +00001539 "cannot add more objects to bytearray");
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001540 return NULL;
1541 }
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001542 if (PyByteArray_Resize((PyObject *)self, n + 1) < 0)
1543 return NULL;
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +02001544 buf = PyByteArray_AS_STRING(self);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001545
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001546 if (index < 0) {
1547 index += n;
1548 if (index < 0)
1549 index = 0;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001550 }
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001551 if (index > n)
1552 index = n;
1553 memmove(buf + index + 1, buf + index, n - index);
1554 buf[index] = item;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001555
1556 Py_RETURN_NONE;
1557}
1558
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001559/*[clinic input]
1560bytearray.append
1561
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001562 item: bytesvalue
1563 The item to be appended.
1564 /
1565
1566Append a single item to the end of the bytearray.
1567[clinic start generated code]*/
1568
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001569static PyObject *
1570bytearray_append_impl(PyByteArrayObject *self, int item)
Serhiy Storchaka7a9579c2016-05-02 13:45:20 +03001571/*[clinic end generated code: output=a154e19ed1886cb6 input=20d6bec3d1340593]*/
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001572{
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001573 Py_ssize_t n = Py_SIZE(self);
1574
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001575 if (n == PY_SSIZE_T_MAX) {
1576 PyErr_SetString(PyExc_OverflowError,
Mark Dickinson2b6705f2009-09-06 10:34:47 +00001577 "cannot add more objects to bytearray");
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001578 return NULL;
1579 }
1580 if (PyByteArray_Resize((PyObject *)self, n + 1) < 0)
1581 return NULL;
1582
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001583 PyByteArray_AS_STRING(self)[n] = item;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001584
1585 Py_RETURN_NONE;
1586}
1587
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001588/*[clinic input]
1589bytearray.extend
1590
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001591 iterable_of_ints: object
1592 The iterable of items to append.
1593 /
1594
1595Append all the items from the iterator or sequence to the end of the bytearray.
1596[clinic start generated code]*/
1597
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001598static PyObject *
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001599bytearray_extend(PyByteArrayObject *self, PyObject *iterable_of_ints)
Serhiy Storchaka7a9579c2016-05-02 13:45:20 +03001600/*[clinic end generated code: output=98155dbe249170b1 input=c617b3a93249ba28]*/
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001601{
Benjamin Peterson153c70f2009-04-18 15:42:12 +00001602 PyObject *it, *item, *bytearray_obj;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001603 Py_ssize_t buf_size = 0, len = 0;
1604 int value;
1605 char *buf;
1606
Benjamin Peterson153c70f2009-04-18 15:42:12 +00001607 /* bytearray_setslice code only accepts something supporting PEP 3118. */
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001608 if (PyObject_CheckBuffer(iterable_of_ints)) {
1609 if (bytearray_setslice(self, Py_SIZE(self), Py_SIZE(self), iterable_of_ints) == -1)
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001610 return NULL;
1611
1612 Py_RETURN_NONE;
1613 }
1614
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001615 it = PyObject_GetIter(iterable_of_ints);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001616 if (it == NULL)
1617 return NULL;
1618
Ezio Melotti42da6632011-03-15 05:18:48 +02001619 /* Try to determine the length of the argument. 32 is arbitrary. */
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001620 buf_size = PyObject_LengthHint(iterable_of_ints, 32);
Benjamin Petersonef3e4c22009-04-11 19:48:14 +00001621 if (buf_size == -1) {
1622 Py_DECREF(it);
1623 return NULL;
1624 }
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001625
Benjamin Peterson153c70f2009-04-18 15:42:12 +00001626 bytearray_obj = PyByteArray_FromStringAndSize(NULL, buf_size);
Antoine Pitrou58bb82e2012-04-01 16:05:46 +02001627 if (bytearray_obj == NULL) {
1628 Py_DECREF(it);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001629 return NULL;
Antoine Pitrou58bb82e2012-04-01 16:05:46 +02001630 }
Benjamin Peterson153c70f2009-04-18 15:42:12 +00001631 buf = PyByteArray_AS_STRING(bytearray_obj);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001632
1633 while ((item = PyIter_Next(it)) != NULL) {
1634 if (! _getbytevalue(item, &value)) {
1635 Py_DECREF(item);
1636 Py_DECREF(it);
Benjamin Peterson153c70f2009-04-18 15:42:12 +00001637 Py_DECREF(bytearray_obj);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001638 return NULL;
1639 }
1640 buf[len++] = value;
1641 Py_DECREF(item);
1642
1643 if (len >= buf_size) {
Martin Panter371731e2016-07-18 07:53:13 +00001644 Py_ssize_t addition;
1645 if (len == PY_SSIZE_T_MAX) {
1646 Py_DECREF(it);
1647 Py_DECREF(bytearray_obj);
1648 return PyErr_NoMemory();
1649 }
1650 addition = len >> 1;
1651 if (addition > PY_SSIZE_T_MAX - len - 1)
1652 buf_size = PY_SSIZE_T_MAX;
1653 else
1654 buf_size = len + addition + 1;
Benjamin Peterson153c70f2009-04-18 15:42:12 +00001655 if (PyByteArray_Resize((PyObject *)bytearray_obj, buf_size) < 0) {
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001656 Py_DECREF(it);
Benjamin Peterson153c70f2009-04-18 15:42:12 +00001657 Py_DECREF(bytearray_obj);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001658 return NULL;
1659 }
1660 /* Recompute the `buf' pointer, since the resizing operation may
1661 have invalidated it. */
Benjamin Peterson153c70f2009-04-18 15:42:12 +00001662 buf = PyByteArray_AS_STRING(bytearray_obj);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001663 }
1664 }
1665 Py_DECREF(it);
1666
1667 /* Resize down to exact size. */
Benjamin Peterson153c70f2009-04-18 15:42:12 +00001668 if (PyByteArray_Resize((PyObject *)bytearray_obj, len) < 0) {
1669 Py_DECREF(bytearray_obj);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001670 return NULL;
1671 }
1672
Antoine Pitrou58bb82e2012-04-01 16:05:46 +02001673 if (bytearray_setslice(self, Py_SIZE(self), Py_SIZE(self), bytearray_obj) == -1) {
1674 Py_DECREF(bytearray_obj);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001675 return NULL;
Antoine Pitrou58bb82e2012-04-01 16:05:46 +02001676 }
Benjamin Peterson153c70f2009-04-18 15:42:12 +00001677 Py_DECREF(bytearray_obj);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001678
1679 Py_RETURN_NONE;
1680}
1681
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001682/*[clinic input]
1683bytearray.pop
1684
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001685 index: Py_ssize_t = -1
1686 The index from where to remove the item.
1687 -1 (the default value) means remove the last item.
1688 /
1689
1690Remove and return a single item from B.
1691
1692If no index argument is given, will pop the last item.
1693[clinic start generated code]*/
1694
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001695static PyObject *
1696bytearray_pop_impl(PyByteArrayObject *self, Py_ssize_t index)
Serhiy Storchaka7a9579c2016-05-02 13:45:20 +03001697/*[clinic end generated code: output=e0ccd401f8021da8 input=3591df2d06c0d237]*/
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001698{
1699 int value;
1700 Py_ssize_t n = Py_SIZE(self);
1701 char *buf;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001702
1703 if (n == 0) {
Eli Bendersky1bc4f192011-03-04 04:55:25 +00001704 PyErr_SetString(PyExc_IndexError,
1705 "pop from empty bytearray");
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001706 return NULL;
1707 }
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001708 if (index < 0)
1709 index += Py_SIZE(self);
1710 if (index < 0 || index >= Py_SIZE(self)) {
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001711 PyErr_SetString(PyExc_IndexError, "pop index out of range");
1712 return NULL;
1713 }
Antoine Pitrou5504e892008-12-06 21:27:53 +00001714 if (!_canresize(self))
1715 return NULL;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001716
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +02001717 buf = PyByteArray_AS_STRING(self);
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001718 value = buf[index];
1719 memmove(buf + index, buf + index + 1, n - index);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001720 if (PyByteArray_Resize((PyObject *)self, n - 1) < 0)
1721 return NULL;
1722
Mark Dickinson54a3db92009-09-06 10:19:23 +00001723 return PyLong_FromLong((unsigned char)value);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001724}
1725
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001726/*[clinic input]
1727bytearray.remove
1728
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001729 value: bytesvalue
1730 The value to remove.
1731 /
1732
1733Remove the first occurrence of a value in the bytearray.
1734[clinic start generated code]*/
1735
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001736static PyObject *
1737bytearray_remove_impl(PyByteArrayObject *self, int value)
Serhiy Storchaka7a9579c2016-05-02 13:45:20 +03001738/*[clinic end generated code: output=d659e37866709c13 input=121831240cd51ddf]*/
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001739{
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001740 Py_ssize_t where, n = Py_SIZE(self);
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +02001741 char *buf = PyByteArray_AS_STRING(self);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001742
Serhiy Storchaka4b234942016-05-16 22:24:03 +03001743 where = stringlib_find_char(buf, n, value);
1744 if (where < 0) {
Mark Dickinson2b6705f2009-09-06 10:34:47 +00001745 PyErr_SetString(PyExc_ValueError, "value not found in bytearray");
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001746 return NULL;
1747 }
Antoine Pitrou5504e892008-12-06 21:27:53 +00001748 if (!_canresize(self))
1749 return NULL;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001750
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +02001751 memmove(buf + where, buf + where + 1, n - where);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001752 if (PyByteArray_Resize((PyObject *)self, n - 1) < 0)
1753 return NULL;
1754
1755 Py_RETURN_NONE;
1756}
1757
1758/* XXX These two helpers could be optimized if argsize == 1 */
1759
1760static Py_ssize_t
Serhiy Storchakaef1585e2015-12-25 20:01:53 +02001761lstrip_helper(const char *myptr, Py_ssize_t mysize,
1762 const void *argptr, Py_ssize_t argsize)
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001763{
1764 Py_ssize_t i = 0;
Antoine Pitrou5b720752013-10-05 21:24:10 +02001765 while (i < mysize && memchr(argptr, (unsigned char) myptr[i], argsize))
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001766 i++;
1767 return i;
1768}
1769
1770static Py_ssize_t
Serhiy Storchakaef1585e2015-12-25 20:01:53 +02001771rstrip_helper(const char *myptr, Py_ssize_t mysize,
1772 const void *argptr, Py_ssize_t argsize)
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001773{
1774 Py_ssize_t i = mysize - 1;
Antoine Pitrou5b720752013-10-05 21:24:10 +02001775 while (i >= 0 && memchr(argptr, (unsigned char) myptr[i], argsize))
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001776 i--;
1777 return i + 1;
1778}
1779
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001780/*[clinic input]
1781bytearray.strip
1782
1783 bytes: object = None
1784 /
1785
1786Strip leading and trailing bytes contained in the argument.
1787
1788If the argument is omitted or None, strip leading and trailing ASCII whitespace.
1789[clinic start generated code]*/
1790
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001791static PyObject *
1792bytearray_strip_impl(PyByteArrayObject *self, PyObject *bytes)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03001793/*[clinic end generated code: output=760412661a34ad5a input=ef7bb59b09c21d62]*/
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001794{
1795 Py_ssize_t left, right, mysize, byteslen;
1796 char *myptr, *bytesptr;
1797 Py_buffer vbytes;
1798
1799 if (bytes == Py_None) {
1800 bytesptr = "\t\n\r\f\v ";
1801 byteslen = 6;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001802 }
1803 else {
Serhiy Storchaka3dd3e262015-02-03 01:25:42 +02001804 if (PyObject_GetBuffer(bytes, &vbytes, PyBUF_SIMPLE) != 0)
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001805 return NULL;
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001806 bytesptr = (char *) vbytes.buf;
1807 byteslen = vbytes.len;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001808 }
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +02001809 myptr = PyByteArray_AS_STRING(self);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001810 mysize = Py_SIZE(self);
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001811 left = lstrip_helper(myptr, mysize, bytesptr, byteslen);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001812 if (left == mysize)
1813 right = left;
1814 else
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001815 right = rstrip_helper(myptr, mysize, bytesptr, byteslen);
1816 if (bytes != Py_None)
1817 PyBuffer_Release(&vbytes);
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +02001818 return PyByteArray_FromStringAndSize(myptr + left, right - left);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001819}
1820
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001821/*[clinic input]
1822bytearray.lstrip
1823
1824 bytes: object = None
1825 /
1826
1827Strip leading bytes contained in the argument.
1828
1829If the argument is omitted or None, strip leading ASCII whitespace.
1830[clinic start generated code]*/
1831
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001832static PyObject *
1833bytearray_lstrip_impl(PyByteArrayObject *self, PyObject *bytes)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03001834/*[clinic end generated code: output=d005c9d0ab909e66 input=80843f975dd7c480]*/
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001835{
1836 Py_ssize_t left, right, mysize, byteslen;
1837 char *myptr, *bytesptr;
1838 Py_buffer vbytes;
1839
1840 if (bytes == Py_None) {
1841 bytesptr = "\t\n\r\f\v ";
1842 byteslen = 6;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001843 }
1844 else {
Serhiy Storchaka3dd3e262015-02-03 01:25:42 +02001845 if (PyObject_GetBuffer(bytes, &vbytes, PyBUF_SIMPLE) != 0)
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001846 return NULL;
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001847 bytesptr = (char *) vbytes.buf;
1848 byteslen = vbytes.len;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001849 }
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +02001850 myptr = PyByteArray_AS_STRING(self);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001851 mysize = Py_SIZE(self);
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001852 left = lstrip_helper(myptr, mysize, bytesptr, byteslen);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001853 right = mysize;
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001854 if (bytes != Py_None)
1855 PyBuffer_Release(&vbytes);
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +02001856 return PyByteArray_FromStringAndSize(myptr + left, right - left);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001857}
1858
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001859/*[clinic input]
1860bytearray.rstrip
1861
1862 bytes: object = None
1863 /
1864
1865Strip trailing bytes contained in the argument.
1866
1867If the argument is omitted or None, strip trailing ASCII whitespace.
1868[clinic start generated code]*/
1869
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001870static PyObject *
1871bytearray_rstrip_impl(PyByteArrayObject *self, PyObject *bytes)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03001872/*[clinic end generated code: output=030e2fbd2f7276bd input=e728b994954cfd91]*/
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001873{
1874 Py_ssize_t right, mysize, byteslen;
1875 char *myptr, *bytesptr;
1876 Py_buffer vbytes;
1877
1878 if (bytes == Py_None) {
1879 bytesptr = "\t\n\r\f\v ";
1880 byteslen = 6;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001881 }
1882 else {
Serhiy Storchaka3dd3e262015-02-03 01:25:42 +02001883 if (PyObject_GetBuffer(bytes, &vbytes, PyBUF_SIMPLE) != 0)
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001884 return NULL;
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001885 bytesptr = (char *) vbytes.buf;
1886 byteslen = vbytes.len;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001887 }
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +02001888 myptr = PyByteArray_AS_STRING(self);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001889 mysize = Py_SIZE(self);
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001890 right = rstrip_helper(myptr, mysize, bytesptr, byteslen);
1891 if (bytes != Py_None)
1892 PyBuffer_Release(&vbytes);
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +02001893 return PyByteArray_FromStringAndSize(myptr, right);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001894}
1895
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001896/*[clinic input]
1897bytearray.decode
1898
1899 encoding: str(c_default="NULL") = 'utf-8'
1900 The encoding with which to decode the bytearray.
1901 errors: str(c_default="NULL") = 'strict'
1902 The error handling scheme to use for the handling of decoding errors.
1903 The default is 'strict' meaning that decoding errors raise a
1904 UnicodeDecodeError. Other possible values are 'ignore' and 'replace'
1905 as well as any other name registered with codecs.register_error that
1906 can handle UnicodeDecodeErrors.
1907
1908Decode the bytearray using the codec registered for encoding.
1909[clinic start generated code]*/
1910
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001911static PyObject *
Larry Hastings89964c42015-04-14 18:07:59 -04001912bytearray_decode_impl(PyByteArrayObject *self, const char *encoding,
1913 const char *errors)
1914/*[clinic end generated code: output=f57d43f4a00b42c5 input=f28d8f903020257b]*/
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001915{
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001916 if (encoding == NULL)
1917 encoding = PyUnicode_GetDefaultEncoding();
Martin v. Löwis0efea322014-07-27 17:29:17 +02001918 return PyUnicode_FromEncodedObject((PyObject*)self, encoding, errors);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001919}
1920
1921PyDoc_STRVAR(alloc_doc,
1922"B.__alloc__() -> int\n\
1923\n\
Georg Brandl17cb8a82008-05-30 08:20:09 +00001924Return the number of bytes actually allocated.");
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001925
1926static PyObject *
Benjamin Peterson153c70f2009-04-18 15:42:12 +00001927bytearray_alloc(PyByteArrayObject *self)
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001928{
1929 return PyLong_FromSsize_t(self->ob_alloc);
1930}
1931
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001932/*[clinic input]
1933bytearray.join
1934
1935 iterable_of_bytes: object
1936 /
1937
1938Concatenate any number of bytes/bytearray objects.
1939
1940The bytearray whose method is called is inserted in between each pair.
1941
1942The result is returned as a new bytearray object.
1943[clinic start generated code]*/
1944
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001945static PyObject *
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001946bytearray_join(PyByteArrayObject *self, PyObject *iterable_of_bytes)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03001947/*[clinic end generated code: output=a8516370bf68ae08 input=aba6b1f9b30fcb8e]*/
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001948{
Martin v. Löwis0efea322014-07-27 17:29:17 +02001949 return stringlib_bytes_join((PyObject*)self, iterable_of_bytes);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001950}
1951
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001952/*[clinic input]
1953bytearray.splitlines
Antoine Pitrouf2c54842010-01-13 08:07:53 +00001954
Serhiy Storchaka8b2e8b62015-05-30 11:30:39 +03001955 keepends: int(c_default="0") = False
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001956
1957Return a list of the lines in the bytearray, breaking at line boundaries.
1958
1959Line breaks are not included in the resulting list unless keepends is given and
1960true.
1961[clinic start generated code]*/
1962
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001963static PyObject *
1964bytearray_splitlines_impl(PyByteArrayObject *self, int keepends)
Serhiy Storchaka8b2e8b62015-05-30 11:30:39 +03001965/*[clinic end generated code: output=4223c94b895f6ad9 input=8ccade941e5ea0bd]*/
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001966{
Antoine Pitrouf2c54842010-01-13 08:07:53 +00001967 return stringlib_splitlines(
1968 (PyObject*) self, PyByteArray_AS_STRING(self),
1969 PyByteArray_GET_SIZE(self), keepends
1970 );
1971}
1972
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001973/*[clinic input]
1974@classmethod
1975bytearray.fromhex
1976
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001977 string: unicode
1978 /
1979
1980Create a bytearray object from a string of hexadecimal numbers.
1981
1982Spaces between two numbers are accepted.
1983Example: bytearray.fromhex('B9 01EF') -> bytearray(b'\\xb9\\x01\\xef')
1984[clinic start generated code]*/
1985
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001986static PyObject *
Serhiy Storchaka0855e702016-07-01 17:22:31 +03001987bytearray_fromhex_impl(PyTypeObject *type, PyObject *string)
1988/*[clinic end generated code: output=8f0f0b6d30fb3ba0 input=f033a16d1fb21f48]*/
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001989{
Serhiy Storchaka0855e702016-07-01 17:22:31 +03001990 PyObject *result = _PyBytes_FromHex(string, type == &PyByteArray_Type);
1991 if (type != &PyByteArray_Type && result != NULL) {
1992 Py_SETREF(result, PyObject_CallFunctionObjArgs((PyObject *)type,
1993 result, NULL));
1994 }
1995 return result;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001996}
1997
Gregory P. Smith8cb65692015-04-25 23:22:26 +00001998PyDoc_STRVAR(hex__doc__,
1999"B.hex() -> string\n\
2000\n\
2001Create a string of hexadecimal numbers from a bytearray object.\n\
2002Example: bytearray([0xb9, 0x01, 0xef]).hex() -> 'b901ef'.");
2003
2004static PyObject *
Serhiy Storchakae09132f2016-07-03 13:57:48 +03002005bytearray_hex(PyBytesObject *self)
2006{
2007 char* argbuf = PyByteArray_AS_STRING(self);
2008 Py_ssize_t arglen = PyByteArray_GET_SIZE(self);
2009 return _Py_strhex(argbuf, arglen);
2010}
2011
2012static PyObject *
Antoine Pitroub0e1f8b2011-12-05 20:40:08 +01002013_common_reduce(PyByteArrayObject *self, int proto)
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002014{
Antoine Pitroub0e1f8b2011-12-05 20:40:08 +01002015 PyObject *dict;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02002016 _Py_IDENTIFIER(__dict__);
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +02002017 char *buf;
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02002018
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02002019 dict = _PyObject_GetAttrId((PyObject *)self, &PyId___dict__);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002020 if (dict == NULL) {
2021 PyErr_Clear();
2022 dict = Py_None;
2023 Py_INCREF(dict);
2024 }
2025
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +02002026 buf = PyByteArray_AS_STRING(self);
Antoine Pitroub0e1f8b2011-12-05 20:40:08 +01002027 if (proto < 3) {
2028 /* use str based reduction for backwards compatibility with Python 2.x */
2029 PyObject *latin1;
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +02002030 if (Py_SIZE(self))
2031 latin1 = PyUnicode_DecodeLatin1(buf, Py_SIZE(self), NULL);
Antoine Pitroub0e1f8b2011-12-05 20:40:08 +01002032 else
2033 latin1 = PyUnicode_FromString("");
2034 return Py_BuildValue("(O(Ns)N)", Py_TYPE(self), latin1, "latin-1", dict);
2035 }
2036 else {
2037 /* use more efficient byte based reduction */
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +02002038 if (Py_SIZE(self)) {
2039 return Py_BuildValue("(O(y#)N)", Py_TYPE(self), buf, Py_SIZE(self), dict);
Antoine Pitroub0e1f8b2011-12-05 20:40:08 +01002040 }
2041 else {
2042 return Py_BuildValue("(O()N)", Py_TYPE(self), dict);
2043 }
2044 }
2045}
2046
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002047/*[clinic input]
2048bytearray.__reduce__ as bytearray_reduce
2049
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002050Return state information for pickling.
2051[clinic start generated code]*/
2052
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002053static PyObject *
2054bytearray_reduce_impl(PyByteArrayObject *self)
Serhiy Storchaka7a9579c2016-05-02 13:45:20 +03002055/*[clinic end generated code: output=52bf304086464cab input=44b5737ada62dd3f]*/
Antoine Pitroub0e1f8b2011-12-05 20:40:08 +01002056{
2057 return _common_reduce(self, 2);
2058}
2059
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002060/*[clinic input]
2061bytearray.__reduce_ex__ as bytearray_reduce_ex
2062
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002063 proto: int = 0
2064 /
2065
2066Return state information for pickling.
2067[clinic start generated code]*/
2068
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002069static PyObject *
2070bytearray_reduce_ex_impl(PyByteArrayObject *self, int proto)
Serhiy Storchaka7a9579c2016-05-02 13:45:20 +03002071/*[clinic end generated code: output=52eac33377197520 input=f129bc1a1aa151ee]*/
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002072{
Antoine Pitroub0e1f8b2011-12-05 20:40:08 +01002073 return _common_reduce(self, proto);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002074}
2075
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002076/*[clinic input]
2077bytearray.__sizeof__ as bytearray_sizeof
2078
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002079Returns the size of the bytearray object in memory, in bytes.
2080[clinic start generated code]*/
2081
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002082static PyObject *
2083bytearray_sizeof_impl(PyByteArrayObject *self)
Serhiy Storchaka7a9579c2016-05-02 13:45:20 +03002084/*[clinic end generated code: output=738abdd17951c427 input=e27320fd98a4bc5a]*/
Robert Schuppeniesfbe94c52008-07-14 10:13:31 +00002085{
Benjamin Petersonef3e4c22009-04-11 19:48:14 +00002086 Py_ssize_t res;
Robert Schuppeniesfbe94c52008-07-14 10:13:31 +00002087
Serhiy Storchaka5c4064e2015-12-19 20:05:25 +02002088 res = _PyObject_SIZE(Py_TYPE(self)) + self->ob_alloc * sizeof(char);
Benjamin Petersonef3e4c22009-04-11 19:48:14 +00002089 return PyLong_FromSsize_t(res);
Robert Schuppeniesfbe94c52008-07-14 10:13:31 +00002090}
2091
Benjamin Peterson153c70f2009-04-18 15:42:12 +00002092static PySequenceMethods bytearray_as_sequence = {
2093 (lenfunc)bytearray_length, /* sq_length */
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002094 (binaryfunc)PyByteArray_Concat, /* sq_concat */
Benjamin Peterson153c70f2009-04-18 15:42:12 +00002095 (ssizeargfunc)bytearray_repeat, /* sq_repeat */
2096 (ssizeargfunc)bytearray_getitem, /* sq_item */
2097 0, /* sq_slice */
2098 (ssizeobjargproc)bytearray_setitem, /* sq_ass_item */
2099 0, /* sq_ass_slice */
Serhiy Storchakae09132f2016-07-03 13:57:48 +03002100 (objobjproc)bytearray_contains, /* sq_contains */
Benjamin Peterson153c70f2009-04-18 15:42:12 +00002101 (binaryfunc)bytearray_iconcat, /* sq_inplace_concat */
2102 (ssizeargfunc)bytearray_irepeat, /* sq_inplace_repeat */
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002103};
2104
Benjamin Peterson153c70f2009-04-18 15:42:12 +00002105static PyMappingMethods bytearray_as_mapping = {
2106 (lenfunc)bytearray_length,
2107 (binaryfunc)bytearray_subscript,
2108 (objobjargproc)bytearray_ass_subscript,
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002109};
2110
Benjamin Peterson153c70f2009-04-18 15:42:12 +00002111static PyBufferProcs bytearray_as_buffer = {
2112 (getbufferproc)bytearray_getbuffer,
2113 (releasebufferproc)bytearray_releasebuffer,
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002114};
2115
2116static PyMethodDef
Benjamin Peterson153c70f2009-04-18 15:42:12 +00002117bytearray_methods[] = {
2118 {"__alloc__", (PyCFunction)bytearray_alloc, METH_NOARGS, alloc_doc},
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002119 BYTEARRAY_REDUCE_METHODDEF
2120 BYTEARRAY_REDUCE_EX_METHODDEF
2121 BYTEARRAY_SIZEOF_METHODDEF
2122 BYTEARRAY_APPEND_METHODDEF
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002123 {"capitalize", (PyCFunction)stringlib_capitalize, METH_NOARGS,
2124 _Py_capitalize__doc__},
Serhiy Storchakadd40fc32016-05-04 22:23:26 +03002125 {"center", (PyCFunction)stringlib_center, METH_VARARGS, _Py_center__doc__},
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002126 BYTEARRAY_CLEAR_METHODDEF
2127 BYTEARRAY_COPY_METHODDEF
Serhiy Storchakae09132f2016-07-03 13:57:48 +03002128 {"count", (PyCFunction)bytearray_count, METH_VARARGS,
Serhiy Storchakadd40fc32016-05-04 22:23:26 +03002129 _Py_count__doc__},
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002130 BYTEARRAY_DECODE_METHODDEF
Serhiy Storchakae09132f2016-07-03 13:57:48 +03002131 {"endswith", (PyCFunction)bytearray_endswith, METH_VARARGS,
Serhiy Storchakadd40fc32016-05-04 22:23:26 +03002132 _Py_endswith__doc__},
Ezio Melotti745d54d2013-11-16 19:10:57 +02002133 {"expandtabs", (PyCFunction)stringlib_expandtabs, METH_VARARGS | METH_KEYWORDS,
Serhiy Storchakadd40fc32016-05-04 22:23:26 +03002134 _Py_expandtabs__doc__},
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002135 BYTEARRAY_EXTEND_METHODDEF
Serhiy Storchakae09132f2016-07-03 13:57:48 +03002136 {"find", (PyCFunction)bytearray_find, METH_VARARGS,
Serhiy Storchakadd40fc32016-05-04 22:23:26 +03002137 _Py_find__doc__},
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002138 BYTEARRAY_FROMHEX_METHODDEF
Serhiy Storchakae09132f2016-07-03 13:57:48 +03002139 {"hex", (PyCFunction)bytearray_hex, METH_NOARGS, hex__doc__},
2140 {"index", (PyCFunction)bytearray_index, METH_VARARGS, _Py_index__doc__},
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002141 BYTEARRAY_INSERT_METHODDEF
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002142 {"isalnum", (PyCFunction)stringlib_isalnum, METH_NOARGS,
2143 _Py_isalnum__doc__},
2144 {"isalpha", (PyCFunction)stringlib_isalpha, METH_NOARGS,
2145 _Py_isalpha__doc__},
2146 {"isdigit", (PyCFunction)stringlib_isdigit, METH_NOARGS,
2147 _Py_isdigit__doc__},
2148 {"islower", (PyCFunction)stringlib_islower, METH_NOARGS,
2149 _Py_islower__doc__},
2150 {"isspace", (PyCFunction)stringlib_isspace, METH_NOARGS,
2151 _Py_isspace__doc__},
2152 {"istitle", (PyCFunction)stringlib_istitle, METH_NOARGS,
2153 _Py_istitle__doc__},
2154 {"isupper", (PyCFunction)stringlib_isupper, METH_NOARGS,
2155 _Py_isupper__doc__},
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002156 BYTEARRAY_JOIN_METHODDEF
Serhiy Storchakadd40fc32016-05-04 22:23:26 +03002157 {"ljust", (PyCFunction)stringlib_ljust, METH_VARARGS, _Py_ljust__doc__},
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002158 {"lower", (PyCFunction)stringlib_lower, METH_NOARGS, _Py_lower__doc__},
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002159 BYTEARRAY_LSTRIP_METHODDEF
2160 BYTEARRAY_MAKETRANS_METHODDEF
2161 BYTEARRAY_PARTITION_METHODDEF
2162 BYTEARRAY_POP_METHODDEF
2163 BYTEARRAY_REMOVE_METHODDEF
2164 BYTEARRAY_REPLACE_METHODDEF
2165 BYTEARRAY_REVERSE_METHODDEF
Serhiy Storchakae09132f2016-07-03 13:57:48 +03002166 {"rfind", (PyCFunction)bytearray_rfind, METH_VARARGS, _Py_rfind__doc__},
2167 {"rindex", (PyCFunction)bytearray_rindex, METH_VARARGS, _Py_rindex__doc__},
Serhiy Storchakadd40fc32016-05-04 22:23:26 +03002168 {"rjust", (PyCFunction)stringlib_rjust, METH_VARARGS, _Py_rjust__doc__},
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002169 BYTEARRAY_RPARTITION_METHODDEF
2170 BYTEARRAY_RSPLIT_METHODDEF
2171 BYTEARRAY_RSTRIP_METHODDEF
2172 BYTEARRAY_SPLIT_METHODDEF
2173 BYTEARRAY_SPLITLINES_METHODDEF
Serhiy Storchakae09132f2016-07-03 13:57:48 +03002174 {"startswith", (PyCFunction)bytearray_startswith, METH_VARARGS ,
Serhiy Storchakadd40fc32016-05-04 22:23:26 +03002175 _Py_startswith__doc__},
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002176 BYTEARRAY_STRIP_METHODDEF
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002177 {"swapcase", (PyCFunction)stringlib_swapcase, METH_NOARGS,
2178 _Py_swapcase__doc__},
2179 {"title", (PyCFunction)stringlib_title, METH_NOARGS, _Py_title__doc__},
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002180 BYTEARRAY_TRANSLATE_METHODDEF
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002181 {"upper", (PyCFunction)stringlib_upper, METH_NOARGS, _Py_upper__doc__},
Serhiy Storchakadd40fc32016-05-04 22:23:26 +03002182 {"zfill", (PyCFunction)stringlib_zfill, METH_VARARGS, _Py_zfill__doc__},
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002183 {NULL}
2184};
2185
Ethan Furmanb95b5612015-01-23 20:05:18 -08002186static PyObject *
2187bytearray_mod(PyObject *v, PyObject *w)
2188{
2189 if (!PyByteArray_Check(v))
2190 Py_RETURN_NOTIMPLEMENTED;
Berker Peksag43de36d2016-04-16 01:20:47 +03002191 return _PyBytes_FormatEx(PyByteArray_AS_STRING(v), PyByteArray_GET_SIZE(v), w, 1);
Ethan Furmanb95b5612015-01-23 20:05:18 -08002192}
2193
2194static PyNumberMethods bytearray_as_number = {
2195 0, /*nb_add*/
2196 0, /*nb_subtract*/
2197 0, /*nb_multiply*/
2198 bytearray_mod, /*nb_remainder*/
2199};
2200
Benjamin Peterson153c70f2009-04-18 15:42:12 +00002201PyDoc_STRVAR(bytearray_doc,
Georg Brandl17cb8a82008-05-30 08:20:09 +00002202"bytearray(iterable_of_ints) -> bytearray\n\
2203bytearray(string, encoding[, errors]) -> bytearray\n\
Victor Stinnerbb2e9c42011-12-17 23:18:07 +01002204bytearray(bytes_or_buffer) -> mutable copy of bytes_or_buffer\n\
2205bytearray(int) -> bytes array of size given by the parameter initialized with null bytes\n\
2206bytearray() -> empty bytes array\n\
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002207\n\
Serhiy Storchaka6a7b3a72016-04-17 08:32:47 +03002208Construct a mutable bytearray object from:\n\
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002209 - an iterable yielding integers in range(256)\n\
2210 - a text string encoded using the specified encoding\n\
Victor Stinnerbb2e9c42011-12-17 23:18:07 +01002211 - a bytes or a buffer object\n\
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002212 - any object implementing the buffer API.\n\
Victor Stinnerbb2e9c42011-12-17 23:18:07 +01002213 - an integer");
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002214
2215
Benjamin Peterson153c70f2009-04-18 15:42:12 +00002216static PyObject *bytearray_iter(PyObject *seq);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002217
2218PyTypeObject PyByteArray_Type = {
2219 PyVarObject_HEAD_INIT(&PyType_Type, 0)
2220 "bytearray",
2221 sizeof(PyByteArrayObject),
2222 0,
Benjamin Peterson153c70f2009-04-18 15:42:12 +00002223 (destructor)bytearray_dealloc, /* tp_dealloc */
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002224 0, /* tp_print */
2225 0, /* tp_getattr */
2226 0, /* tp_setattr */
Mark Dickinsone94c6792009-02-02 20:36:42 +00002227 0, /* tp_reserved */
Benjamin Peterson153c70f2009-04-18 15:42:12 +00002228 (reprfunc)bytearray_repr, /* tp_repr */
Ethan Furmanb95b5612015-01-23 20:05:18 -08002229 &bytearray_as_number, /* tp_as_number */
Benjamin Peterson153c70f2009-04-18 15:42:12 +00002230 &bytearray_as_sequence, /* tp_as_sequence */
2231 &bytearray_as_mapping, /* tp_as_mapping */
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002232 0, /* tp_hash */
2233 0, /* tp_call */
Benjamin Peterson153c70f2009-04-18 15:42:12 +00002234 bytearray_str, /* tp_str */
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002235 PyObject_GenericGetAttr, /* tp_getattro */
2236 0, /* tp_setattro */
Benjamin Peterson153c70f2009-04-18 15:42:12 +00002237 &bytearray_as_buffer, /* tp_as_buffer */
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002238 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
Benjamin Peterson153c70f2009-04-18 15:42:12 +00002239 bytearray_doc, /* tp_doc */
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002240 0, /* tp_traverse */
2241 0, /* tp_clear */
Benjamin Peterson153c70f2009-04-18 15:42:12 +00002242 (richcmpfunc)bytearray_richcompare, /* tp_richcompare */
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002243 0, /* tp_weaklistoffset */
Benjamin Peterson153c70f2009-04-18 15:42:12 +00002244 bytearray_iter, /* tp_iter */
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002245 0, /* tp_iternext */
Benjamin Peterson153c70f2009-04-18 15:42:12 +00002246 bytearray_methods, /* tp_methods */
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002247 0, /* tp_members */
2248 0, /* tp_getset */
2249 0, /* tp_base */
2250 0, /* tp_dict */
2251 0, /* tp_descr_get */
2252 0, /* tp_descr_set */
2253 0, /* tp_dictoffset */
Benjamin Peterson153c70f2009-04-18 15:42:12 +00002254 (initproc)bytearray_init, /* tp_init */
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002255 PyType_GenericAlloc, /* tp_alloc */
2256 PyType_GenericNew, /* tp_new */
2257 PyObject_Del, /* tp_free */
2258};
2259
2260/*********************** Bytes Iterator ****************************/
2261
2262typedef struct {
2263 PyObject_HEAD
2264 Py_ssize_t it_index;
2265 PyByteArrayObject *it_seq; /* Set to NULL when iterator is exhausted */
2266} bytesiterobject;
2267
2268static void
Benjamin Peterson153c70f2009-04-18 15:42:12 +00002269bytearrayiter_dealloc(bytesiterobject *it)
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002270{
2271 _PyObject_GC_UNTRACK(it);
2272 Py_XDECREF(it->it_seq);
2273 PyObject_GC_Del(it);
2274}
2275
2276static int
Benjamin Peterson153c70f2009-04-18 15:42:12 +00002277bytearrayiter_traverse(bytesiterobject *it, visitproc visit, void *arg)
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002278{
2279 Py_VISIT(it->it_seq);
2280 return 0;
2281}
2282
2283static PyObject *
Benjamin Peterson153c70f2009-04-18 15:42:12 +00002284bytearrayiter_next(bytesiterobject *it)
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002285{
2286 PyByteArrayObject *seq;
2287 PyObject *item;
2288
2289 assert(it != NULL);
2290 seq = it->it_seq;
2291 if (seq == NULL)
2292 return NULL;
2293 assert(PyByteArray_Check(seq));
2294
2295 if (it->it_index < PyByteArray_GET_SIZE(seq)) {
2296 item = PyLong_FromLong(
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +02002297 (unsigned char)PyByteArray_AS_STRING(seq)[it->it_index]);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002298 if (item != NULL)
2299 ++it->it_index;
2300 return item;
2301 }
2302
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002303 it->it_seq = NULL;
Serhiy Storchakafbb1c5e2016-03-30 20:40:02 +03002304 Py_DECREF(seq);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002305 return NULL;
2306}
2307
2308static PyObject *
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00002309bytearrayiter_length_hint(bytesiterobject *it)
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002310{
2311 Py_ssize_t len = 0;
Serhiy Storchakaaf658722016-07-03 14:41:36 +03002312 if (it->it_seq) {
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002313 len = PyByteArray_GET_SIZE(it->it_seq) - it->it_index;
Serhiy Storchakaaf658722016-07-03 14:41:36 +03002314 if (len < 0) {
2315 len = 0;
2316 }
2317 }
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002318 return PyLong_FromSsize_t(len);
2319}
2320
2321PyDoc_STRVAR(length_hint_doc,
2322 "Private method returning an estimate of len(list(it)).");
2323
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00002324static PyObject *
2325bytearrayiter_reduce(bytesiterobject *it)
2326{
2327 if (it->it_seq != NULL) {
Antoine Pitroua7013882012-04-05 00:04:20 +02002328 return Py_BuildValue("N(O)n", _PyObject_GetBuiltin("iter"),
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00002329 it->it_seq, it->it_index);
2330 } else {
2331 PyObject *u = PyUnicode_FromUnicode(NULL, 0);
2332 if (u == NULL)
2333 return NULL;
Antoine Pitroua7013882012-04-05 00:04:20 +02002334 return Py_BuildValue("N(N)", _PyObject_GetBuiltin("iter"), u);
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00002335 }
2336}
2337
2338static PyObject *
2339bytearrayiter_setstate(bytesiterobject *it, PyObject *state)
2340{
2341 Py_ssize_t index = PyLong_AsSsize_t(state);
2342 if (index == -1 && PyErr_Occurred())
2343 return NULL;
Kristján Valur Jónsson25dded02014-03-05 13:47:57 +00002344 if (it->it_seq != NULL) {
2345 if (index < 0)
2346 index = 0;
2347 else if (index > PyByteArray_GET_SIZE(it->it_seq))
2348 index = PyByteArray_GET_SIZE(it->it_seq); /* iterator exhausted */
2349 it->it_index = index;
2350 }
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00002351 Py_RETURN_NONE;
2352}
2353
2354PyDoc_STRVAR(setstate_doc, "Set state information for unpickling.");
2355
Benjamin Peterson153c70f2009-04-18 15:42:12 +00002356static PyMethodDef bytearrayiter_methods[] = {
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00002357 {"__length_hint__", (PyCFunction)bytearrayiter_length_hint, METH_NOARGS,
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002358 length_hint_doc},
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00002359 {"__reduce__", (PyCFunction)bytearrayiter_reduce, METH_NOARGS,
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002360 bytearray_reduce__doc__},
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00002361 {"__setstate__", (PyCFunction)bytearrayiter_setstate, METH_O,
2362 setstate_doc},
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002363 {NULL, NULL} /* sentinel */
2364};
2365
2366PyTypeObject PyByteArrayIter_Type = {
2367 PyVarObject_HEAD_INIT(&PyType_Type, 0)
2368 "bytearray_iterator", /* tp_name */
2369 sizeof(bytesiterobject), /* tp_basicsize */
2370 0, /* tp_itemsize */
2371 /* methods */
Benjamin Peterson153c70f2009-04-18 15:42:12 +00002372 (destructor)bytearrayiter_dealloc, /* tp_dealloc */
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002373 0, /* tp_print */
2374 0, /* tp_getattr */
2375 0, /* tp_setattr */
Mark Dickinsone94c6792009-02-02 20:36:42 +00002376 0, /* tp_reserved */
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002377 0, /* tp_repr */
2378 0, /* tp_as_number */
2379 0, /* tp_as_sequence */
2380 0, /* tp_as_mapping */
2381 0, /* tp_hash */
2382 0, /* tp_call */
2383 0, /* tp_str */
2384 PyObject_GenericGetAttr, /* tp_getattro */
2385 0, /* tp_setattro */
2386 0, /* tp_as_buffer */
2387 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC, /* tp_flags */
2388 0, /* tp_doc */
Benjamin Peterson153c70f2009-04-18 15:42:12 +00002389 (traverseproc)bytearrayiter_traverse, /* tp_traverse */
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002390 0, /* tp_clear */
2391 0, /* tp_richcompare */
2392 0, /* tp_weaklistoffset */
2393 PyObject_SelfIter, /* tp_iter */
Benjamin Peterson153c70f2009-04-18 15:42:12 +00002394 (iternextfunc)bytearrayiter_next, /* tp_iternext */
2395 bytearrayiter_methods, /* tp_methods */
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002396 0,
2397};
2398
2399static PyObject *
Benjamin Peterson153c70f2009-04-18 15:42:12 +00002400bytearray_iter(PyObject *seq)
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002401{
2402 bytesiterobject *it;
2403
2404 if (!PyByteArray_Check(seq)) {
2405 PyErr_BadInternalCall();
2406 return NULL;
2407 }
2408 it = PyObject_GC_New(bytesiterobject, &PyByteArrayIter_Type);
2409 if (it == NULL)
2410 return NULL;
2411 it->it_index = 0;
2412 Py_INCREF(seq);
2413 it->it_seq = (PyByteArrayObject *)seq;
2414 _PyObject_GC_TRACK(it);
2415 return (PyObject *)it;
2416}