blob: 093cdbf45dcbc514866efbf41f59082552ac8bda [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{
249 Py_ssize_t size;
250 Py_buffer va, vb;
251 PyByteArrayObject *result = NULL;
252
253 va.len = -1;
254 vb.len = -1;
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +0200255 if (PyObject_GetBuffer(a, &va, PyBUF_SIMPLE) != 0 ||
256 PyObject_GetBuffer(b, &vb, PyBUF_SIMPLE) != 0) {
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000257 PyErr_Format(PyExc_TypeError, "can't concat %.100s to %.100s",
258 Py_TYPE(a)->tp_name, Py_TYPE(b)->tp_name);
259 goto done;
260 }
261
262 size = va.len + vb.len;
263 if (size < 0) {
Benjamin Petersone0124bd2009-03-09 21:04:33 +0000264 PyErr_NoMemory();
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000265 goto done;
266 }
267
268 result = (PyByteArrayObject *) PyByteArray_FromStringAndSize(NULL, size);
269 if (result != NULL) {
270 memcpy(result->ob_bytes, va.buf, va.len);
271 memcpy(result->ob_bytes + va.len, vb.buf, vb.len);
272 }
273
274 done:
275 if (va.len != -1)
Martin v. Löwis423be952008-08-13 15:53:07 +0000276 PyBuffer_Release(&va);
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000277 if (vb.len != -1)
Martin v. Löwis423be952008-08-13 15:53:07 +0000278 PyBuffer_Release(&vb);
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000279 return (PyObject *)result;
280}
281
282/* Functions stuffed into the type object */
283
284static Py_ssize_t
Benjamin Peterson153c70f2009-04-18 15:42:12 +0000285bytearray_length(PyByteArrayObject *self)
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000286{
287 return Py_SIZE(self);
288}
289
290static PyObject *
Benjamin Peterson153c70f2009-04-18 15:42:12 +0000291bytearray_iconcat(PyByteArrayObject *self, PyObject *other)
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000292{
293 Py_ssize_t mysize;
294 Py_ssize_t size;
295 Py_buffer vo;
296
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +0200297 if (PyObject_GetBuffer(other, &vo, PyBUF_SIMPLE) != 0) {
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000298 PyErr_Format(PyExc_TypeError, "can't concat %.100s to %.100s",
299 Py_TYPE(other)->tp_name, Py_TYPE(self)->tp_name);
300 return NULL;
301 }
302
303 mysize = Py_SIZE(self);
304 size = mysize + vo.len;
305 if (size < 0) {
Martin v. Löwis423be952008-08-13 15:53:07 +0000306 PyBuffer_Release(&vo);
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000307 return PyErr_NoMemory();
308 }
Antoine Pitrou25454112015-05-19 20:52:27 +0200309 if (PyByteArray_Resize((PyObject *)self, size) < 0) {
Martin v. Löwis423be952008-08-13 15:53:07 +0000310 PyBuffer_Release(&vo);
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000311 return NULL;
312 }
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200313 memcpy(PyByteArray_AS_STRING(self) + mysize, vo.buf, vo.len);
Martin v. Löwis423be952008-08-13 15:53:07 +0000314 PyBuffer_Release(&vo);
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000315 Py_INCREF(self);
316 return (PyObject *)self;
317}
318
319static PyObject *
Benjamin Peterson153c70f2009-04-18 15:42:12 +0000320bytearray_repeat(PyByteArrayObject *self, Py_ssize_t count)
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000321{
322 PyByteArrayObject *result;
323 Py_ssize_t mysize;
324 Py_ssize_t size;
325
326 if (count < 0)
327 count = 0;
328 mysize = Py_SIZE(self);
Mark Dickinsoncf940c72010-08-10 18:35:01 +0000329 if (count > 0 && mysize > PY_SSIZE_T_MAX / count)
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000330 return PyErr_NoMemory();
Mark Dickinsoncf940c72010-08-10 18:35:01 +0000331 size = mysize * count;
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000332 result = (PyByteArrayObject *)PyByteArray_FromStringAndSize(NULL, size);
333 if (result != NULL && size != 0) {
334 if (mysize == 1)
335 memset(result->ob_bytes, self->ob_bytes[0], size);
336 else {
337 Py_ssize_t i;
338 for (i = 0; i < count; i++)
339 memcpy(result->ob_bytes + i*mysize, self->ob_bytes, mysize);
340 }
341 }
342 return (PyObject *)result;
343}
344
345static PyObject *
Benjamin Peterson153c70f2009-04-18 15:42:12 +0000346bytearray_irepeat(PyByteArrayObject *self, Py_ssize_t count)
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000347{
348 Py_ssize_t mysize;
349 Py_ssize_t size;
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200350 char *buf;
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000351
352 if (count < 0)
353 count = 0;
354 mysize = Py_SIZE(self);
Mark Dickinsoncf940c72010-08-10 18:35:01 +0000355 if (count > 0 && mysize > PY_SSIZE_T_MAX / count)
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000356 return PyErr_NoMemory();
Mark Dickinsoncf940c72010-08-10 18:35:01 +0000357 size = mysize * count;
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200358 if (PyByteArray_Resize((PyObject *)self, size) < 0)
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000359 return NULL;
360
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200361 buf = PyByteArray_AS_STRING(self);
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000362 if (mysize == 1)
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200363 memset(buf, buf[0], size);
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000364 else {
365 Py_ssize_t i;
366 for (i = 1; i < count; i++)
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200367 memcpy(buf + i*mysize, buf, mysize);
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000368 }
369
370 Py_INCREF(self);
371 return (PyObject *)self;
372}
373
374static PyObject *
Benjamin Peterson153c70f2009-04-18 15:42:12 +0000375bytearray_getitem(PyByteArrayObject *self, Py_ssize_t i)
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000376{
377 if (i < 0)
378 i += Py_SIZE(self);
379 if (i < 0 || i >= Py_SIZE(self)) {
380 PyErr_SetString(PyExc_IndexError, "bytearray index out of range");
381 return NULL;
382 }
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200383 return PyLong_FromLong((unsigned char)(PyByteArray_AS_STRING(self)[i]));
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000384}
385
386static PyObject *
Benjamin Peterson153c70f2009-04-18 15:42:12 +0000387bytearray_subscript(PyByteArrayObject *self, PyObject *index)
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000388{
Georg Brandl9a54d7c2008-07-16 23:15:30 +0000389 if (PyIndex_Check(index)) {
390 Py_ssize_t i = PyNumber_AsSsize_t(index, PyExc_IndexError);
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000391
392 if (i == -1 && PyErr_Occurred())
393 return NULL;
394
395 if (i < 0)
396 i += PyByteArray_GET_SIZE(self);
397
398 if (i < 0 || i >= Py_SIZE(self)) {
399 PyErr_SetString(PyExc_IndexError, "bytearray index out of range");
400 return NULL;
401 }
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200402 return PyLong_FromLong((unsigned char)(PyByteArray_AS_STRING(self)[i]));
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000403 }
Georg Brandl9a54d7c2008-07-16 23:15:30 +0000404 else if (PySlice_Check(index)) {
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000405 Py_ssize_t start, stop, step, slicelength, cur, i;
Martin v. Löwis4d0d4712010-12-03 20:14:31 +0000406 if (PySlice_GetIndicesEx(index,
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000407 PyByteArray_GET_SIZE(self),
408 &start, &stop, &step, &slicelength) < 0) {
409 return NULL;
410 }
411
412 if (slicelength <= 0)
413 return PyByteArray_FromStringAndSize("", 0);
414 else if (step == 1) {
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200415 return PyByteArray_FromStringAndSize(
416 PyByteArray_AS_STRING(self) + start, slicelength);
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000417 }
418 else {
419 char *source_buf = PyByteArray_AS_STRING(self);
Alexandre Vassalottie2641f42009-04-03 06:38:02 +0000420 char *result_buf;
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000421 PyObject *result;
422
Alexandre Vassalottie2641f42009-04-03 06:38:02 +0000423 result = PyByteArray_FromStringAndSize(NULL, slicelength);
424 if (result == NULL)
425 return NULL;
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000426
Alexandre Vassalottie2641f42009-04-03 06:38:02 +0000427 result_buf = PyByteArray_AS_STRING(result);
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000428 for (cur = start, i = 0; i < slicelength;
429 cur += step, i++) {
430 result_buf[i] = source_buf[cur];
431 }
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000432 return result;
433 }
434 }
435 else {
Terry Jan Reedyffff1442014-08-02 01:30:37 -0400436 PyErr_Format(PyExc_TypeError,
437 "bytearray indices must be integers or slices, not %.200s",
438 Py_TYPE(index)->tp_name);
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000439 return NULL;
440 }
441}
442
443static int
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200444bytearray_setslice_linear(PyByteArrayObject *self,
445 Py_ssize_t lo, Py_ssize_t hi,
446 char *bytes, Py_ssize_t bytes_len)
447{
448 Py_ssize_t avail = hi - lo;
449 char *buf = PyByteArray_AS_STRING(self);
450 Py_ssize_t growth = bytes_len - avail;
Victor Stinner84557232013-11-21 12:29:51 +0100451 int res = 0;
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200452 assert(avail >= 0);
453
Victor Stinner84557232013-11-21 12:29:51 +0100454 if (growth < 0) {
455 if (!_canresize(self))
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200456 return -1;
Victor Stinner84557232013-11-21 12:29:51 +0100457
458 if (lo == 0) {
459 /* Shrink the buffer by advancing its logical start */
460 self->ob_start -= growth;
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200461 /*
Victor Stinner84557232013-11-21 12:29:51 +0100462 0 lo hi old_size
463 | |<----avail----->|<-----tail------>|
464 | |<-bytes_len->|<-----tail------>|
465 0 new_lo new_hi new_size
466 */
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200467 }
Victor Stinner84557232013-11-21 12:29:51 +0100468 else {
469 /*
470 0 lo hi old_size
471 | |<----avail----->|<-----tomove------>|
472 | |<-bytes_len->|<-----tomove------>|
473 0 lo new_hi new_size
474 */
475 memmove(buf + lo + bytes_len, buf + hi,
476 Py_SIZE(self) - hi);
477 }
478 if (PyByteArray_Resize((PyObject *)self,
479 Py_SIZE(self) + growth) < 0) {
480 /* Issue #19578: Handling the memory allocation failure here is
481 tricky here because the bytearray object has already been
482 modified. Depending on growth and lo, the behaviour is
483 different.
484
485 If growth < 0 and lo != 0, the operation is completed, but a
486 MemoryError is still raised and the memory block is not
487 shrinked. Otherwise, the bytearray is restored in its previous
488 state and a MemoryError is raised. */
489 if (lo == 0) {
490 self->ob_start += growth;
491 return -1;
492 }
493 /* memmove() removed bytes, the bytearray object cannot be
494 restored in its previous state. */
495 Py_SIZE(self) += growth;
496 res = -1;
497 }
498 buf = PyByteArray_AS_STRING(self);
499 }
500 else if (growth > 0) {
501 if (Py_SIZE(self) > (Py_ssize_t)PY_SSIZE_T_MAX - growth) {
502 PyErr_NoMemory();
503 return -1;
504 }
505
506 if (PyByteArray_Resize((PyObject *)self,
507 Py_SIZE(self) + growth) < 0) {
508 return -1;
509 }
510 buf = PyByteArray_AS_STRING(self);
511 /* Make the place for the additional bytes */
512 /*
513 0 lo hi old_size
514 | |<-avail->|<-----tomove------>|
515 | |<---bytes_len-->|<-----tomove------>|
516 0 lo new_hi new_size
517 */
518 memmove(buf + lo + bytes_len, buf + hi,
519 Py_SIZE(self) - lo - bytes_len);
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200520 }
521
522 if (bytes_len > 0)
523 memcpy(buf + lo, bytes, bytes_len);
Victor Stinner84557232013-11-21 12:29:51 +0100524 return res;
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200525}
526
527static int
Benjamin Peterson153c70f2009-04-18 15:42:12 +0000528bytearray_setslice(PyByteArrayObject *self, Py_ssize_t lo, Py_ssize_t hi,
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000529 PyObject *values)
530{
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200531 Py_ssize_t needed;
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000532 void *bytes;
533 Py_buffer vbytes;
534 int res = 0;
535
536 vbytes.len = -1;
537 if (values == (PyObject *)self) {
538 /* Make a copy and call this function recursively */
539 int err;
540 values = PyByteArray_FromObject(values);
541 if (values == NULL)
542 return -1;
Benjamin Peterson153c70f2009-04-18 15:42:12 +0000543 err = bytearray_setslice(self, lo, hi, values);
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000544 Py_DECREF(values);
545 return err;
546 }
547 if (values == NULL) {
548 /* del b[lo:hi] */
549 bytes = NULL;
550 needed = 0;
551 }
552 else {
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +0200553 if (PyObject_GetBuffer(values, &vbytes, PyBUF_SIMPLE) != 0) {
554 PyErr_Format(PyExc_TypeError,
555 "can't set bytearray slice from %.100s",
556 Py_TYPE(values)->tp_name);
557 return -1;
558 }
559 needed = vbytes.len;
560 bytes = vbytes.buf;
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000561 }
562
563 if (lo < 0)
564 lo = 0;
565 if (hi < lo)
566 hi = lo;
567 if (hi > Py_SIZE(self))
568 hi = Py_SIZE(self);
569
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200570 res = bytearray_setslice_linear(self, lo, hi, bytes, needed);
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000571 if (vbytes.len != -1)
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200572 PyBuffer_Release(&vbytes);
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000573 return res;
574}
575
576static int
Benjamin Peterson153c70f2009-04-18 15:42:12 +0000577bytearray_setitem(PyByteArrayObject *self, Py_ssize_t i, PyObject *value)
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000578{
Georg Brandl9a54d7c2008-07-16 23:15:30 +0000579 int ival;
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000580
581 if (i < 0)
582 i += Py_SIZE(self);
583
584 if (i < 0 || i >= Py_SIZE(self)) {
585 PyErr_SetString(PyExc_IndexError, "bytearray index out of range");
586 return -1;
587 }
588
589 if (value == NULL)
Benjamin Peterson153c70f2009-04-18 15:42:12 +0000590 return bytearray_setslice(self, i, i+1, NULL);
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000591
Georg Brandl9a54d7c2008-07-16 23:15:30 +0000592 if (!_getbytevalue(value, &ival))
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000593 return -1;
594
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200595 PyByteArray_AS_STRING(self)[i] = ival;
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000596 return 0;
597}
598
599static int
Benjamin Peterson153c70f2009-04-18 15:42:12 +0000600bytearray_ass_subscript(PyByteArrayObject *self, PyObject *index, PyObject *values)
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000601{
602 Py_ssize_t start, stop, step, slicelen, needed;
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200603 char *buf, *bytes;
604 buf = PyByteArray_AS_STRING(self);
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000605
Georg Brandl9a54d7c2008-07-16 23:15:30 +0000606 if (PyIndex_Check(index)) {
607 Py_ssize_t i = PyNumber_AsSsize_t(index, PyExc_IndexError);
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000608
609 if (i == -1 && PyErr_Occurred())
610 return -1;
611
612 if (i < 0)
613 i += PyByteArray_GET_SIZE(self);
614
615 if (i < 0 || i >= Py_SIZE(self)) {
616 PyErr_SetString(PyExc_IndexError, "bytearray index out of range");
617 return -1;
618 }
619
620 if (values == NULL) {
621 /* Fall through to slice assignment */
622 start = i;
623 stop = i + 1;
624 step = 1;
625 slicelen = 1;
626 }
627 else {
Georg Brandl9a54d7c2008-07-16 23:15:30 +0000628 int ival;
629 if (!_getbytevalue(values, &ival))
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000630 return -1;
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200631 buf[i] = (char)ival;
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000632 return 0;
633 }
634 }
Georg Brandl9a54d7c2008-07-16 23:15:30 +0000635 else if (PySlice_Check(index)) {
Martin v. Löwis4d0d4712010-12-03 20:14:31 +0000636 if (PySlice_GetIndicesEx(index,
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000637 PyByteArray_GET_SIZE(self),
638 &start, &stop, &step, &slicelen) < 0) {
639 return -1;
640 }
641 }
642 else {
Terry Jan Reedyffff1442014-08-02 01:30:37 -0400643 PyErr_Format(PyExc_TypeError,
644 "bytearray indices must be integers or slices, not %.200s",
645 Py_TYPE(index)->tp_name);
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000646 return -1;
647 }
648
649 if (values == NULL) {
650 bytes = NULL;
651 needed = 0;
652 }
653 else if (values == (PyObject *)self || !PyByteArray_Check(values)) {
Christian Heimes6d26ade2012-11-03 23:07:59 +0100654 int err;
Ezio Melottic64bcbe2012-11-03 21:19:06 +0200655 if (PyNumber_Check(values) || PyUnicode_Check(values)) {
656 PyErr_SetString(PyExc_TypeError,
657 "can assign only bytes, buffers, or iterables "
658 "of ints in range(0, 256)");
659 return -1;
660 }
Georg Brandlf3fa5682010-12-04 17:09:30 +0000661 /* Make a copy and call this function recursively */
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000662 values = PyByteArray_FromObject(values);
663 if (values == NULL)
664 return -1;
Benjamin Peterson153c70f2009-04-18 15:42:12 +0000665 err = bytearray_ass_subscript(self, index, values);
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000666 Py_DECREF(values);
667 return err;
668 }
669 else {
670 assert(PyByteArray_Check(values));
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200671 bytes = PyByteArray_AS_STRING(values);
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000672 needed = Py_SIZE(values);
673 }
674 /* Make sure b[5:2] = ... inserts before 5, not before 2. */
675 if ((step < 0 && start < stop) ||
676 (step > 0 && start > stop))
677 stop = start;
678 if (step == 1) {
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200679 return bytearray_setslice_linear(self, start, stop, bytes, needed);
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000680 }
681 else {
682 if (needed == 0) {
683 /* Delete slice */
Mark Dickinsonbc099642010-01-29 17:27:24 +0000684 size_t cur;
685 Py_ssize_t i;
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000686
Antoine Pitrou5504e892008-12-06 21:27:53 +0000687 if (!_canresize(self))
688 return -1;
Mark Dickinson7e3b9482010-08-06 21:33:18 +0000689
690 if (slicelen == 0)
691 /* Nothing to do here. */
692 return 0;
693
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000694 if (step < 0) {
695 stop = start + 1;
696 start = stop + step * (slicelen - 1) - 1;
697 step = -step;
698 }
699 for (cur = start, i = 0;
700 i < slicelen; cur += step, i++) {
701 Py_ssize_t lim = step - 1;
702
Mark Dickinson66f575b2010-02-14 12:53:32 +0000703 if (cur + step >= (size_t)PyByteArray_GET_SIZE(self))
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000704 lim = PyByteArray_GET_SIZE(self) - cur - 1;
705
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200706 memmove(buf + cur - i,
707 buf + cur + 1, lim);
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000708 }
709 /* Move the tail of the bytes, in one chunk */
Mark Dickinson7e3b9482010-08-06 21:33:18 +0000710 cur = start + (size_t)slicelen*step;
Mark Dickinson66f575b2010-02-14 12:53:32 +0000711 if (cur < (size_t)PyByteArray_GET_SIZE(self)) {
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200712 memmove(buf + cur - slicelen,
713 buf + cur,
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000714 PyByteArray_GET_SIZE(self) - cur);
715 }
716 if (PyByteArray_Resize((PyObject *)self,
717 PyByteArray_GET_SIZE(self) - slicelen) < 0)
718 return -1;
719
720 return 0;
721 }
722 else {
723 /* Assign slice */
Mark Dickinson7e3b9482010-08-06 21:33:18 +0000724 Py_ssize_t i;
725 size_t cur;
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000726
727 if (needed != slicelen) {
728 PyErr_Format(PyExc_ValueError,
729 "attempt to assign bytes of size %zd "
730 "to extended slice of size %zd",
731 needed, slicelen);
732 return -1;
733 }
734 for (cur = start, i = 0; i < slicelen; cur += step, i++)
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200735 buf[cur] = bytes[i];
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000736 return 0;
737 }
738 }
739}
740
741static int
Benjamin Peterson153c70f2009-04-18 15:42:12 +0000742bytearray_init(PyByteArrayObject *self, PyObject *args, PyObject *kwds)
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000743{
744 static char *kwlist[] = {"source", "encoding", "errors", 0};
745 PyObject *arg = NULL;
746 const char *encoding = NULL;
747 const char *errors = NULL;
748 Py_ssize_t count;
749 PyObject *it;
750 PyObject *(*iternext)(PyObject *);
751
752 if (Py_SIZE(self) != 0) {
753 /* Empty previous contents (yes, do this first of all!) */
754 if (PyByteArray_Resize((PyObject *)self, 0) < 0)
755 return -1;
756 }
757
758 /* Parse arguments */
Georg Brandl3dbca812008-07-23 16:10:53 +0000759 if (!PyArg_ParseTupleAndKeywords(args, kwds, "|Oss:bytearray", kwlist,
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000760 &arg, &encoding, &errors))
761 return -1;
762
763 /* Make a quick exit if no first argument */
764 if (arg == NULL) {
765 if (encoding != NULL || errors != NULL) {
766 PyErr_SetString(PyExc_TypeError,
767 "encoding or errors without sequence argument");
768 return -1;
769 }
770 return 0;
771 }
772
773 if (PyUnicode_Check(arg)) {
774 /* Encode via the codec registry */
775 PyObject *encoded, *new;
776 if (encoding == NULL) {
777 PyErr_SetString(PyExc_TypeError,
778 "string argument without an encoding");
779 return -1;
780 }
Marc-André Lemburgb2750b52008-06-06 12:18:17 +0000781 encoded = PyUnicode_AsEncodedString(arg, encoding, errors);
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000782 if (encoded == NULL)
783 return -1;
784 assert(PyBytes_Check(encoded));
Benjamin Peterson153c70f2009-04-18 15:42:12 +0000785 new = bytearray_iconcat(self, encoded);
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000786 Py_DECREF(encoded);
787 if (new == NULL)
788 return -1;
789 Py_DECREF(new);
790 return 0;
791 }
792
793 /* If it's not unicode, there can't be encoding or errors */
794 if (encoding != NULL || errors != NULL) {
795 PyErr_SetString(PyExc_TypeError,
796 "encoding or errors without a string argument");
797 return -1;
798 }
799
800 /* Is it an int? */
Benjamin Peterson8380dd52010-04-16 22:51:37 +0000801 count = PyNumber_AsSsize_t(arg, PyExc_OverflowError);
802 if (count == -1 && PyErr_Occurred()) {
803 if (PyErr_ExceptionMatches(PyExc_OverflowError))
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000804 return -1;
Benjamin Peterson9c0e94f2010-04-16 23:00:53 +0000805 PyErr_Clear();
Benjamin Peterson8380dd52010-04-16 22:51:37 +0000806 }
807 else if (count < 0) {
808 PyErr_SetString(PyExc_ValueError, "negative count");
809 return -1;
810 }
811 else {
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000812 if (count > 0) {
Victor Stinner2bc4d952014-06-02 22:22:42 +0200813 if (PyByteArray_Resize((PyObject *)self, count))
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000814 return -1;
Victor Stinner2bc4d952014-06-02 22:22:42 +0200815 memset(PyByteArray_AS_STRING(self), 0, count);
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000816 }
817 return 0;
818 }
819
820 /* Use the buffer API */
821 if (PyObject_CheckBuffer(arg)) {
822 Py_ssize_t size;
823 Py_buffer view;
824 if (PyObject_GetBuffer(arg, &view, PyBUF_FULL_RO) < 0)
825 return -1;
826 size = view.len;
827 if (PyByteArray_Resize((PyObject *)self, size) < 0) goto fail;
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200828 if (PyBuffer_ToContiguous(PyByteArray_AS_STRING(self),
829 &view, size, 'C') < 0)
Stefan Krah7d12d9d2012-07-28 12:25:55 +0200830 goto fail;
Martin v. Löwis423be952008-08-13 15:53:07 +0000831 PyBuffer_Release(&view);
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000832 return 0;
833 fail:
Martin v. Löwis423be952008-08-13 15:53:07 +0000834 PyBuffer_Release(&view);
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000835 return -1;
836 }
837
838 /* XXX Optimize this if the arguments is a list, tuple */
839
840 /* Get the iterator */
841 it = PyObject_GetIter(arg);
842 if (it == NULL)
843 return -1;
844 iternext = *Py_TYPE(it)->tp_iternext;
845
846 /* Run the iterator to exhaustion */
847 for (;;) {
848 PyObject *item;
Georg Brandl9a54d7c2008-07-16 23:15:30 +0000849 int rc, value;
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000850
851 /* Get the next item */
852 item = iternext(it);
853 if (item == NULL) {
854 if (PyErr_Occurred()) {
855 if (!PyErr_ExceptionMatches(PyExc_StopIteration))
856 goto error;
857 PyErr_Clear();
858 }
859 break;
860 }
861
862 /* Interpret it as an int (__index__) */
Georg Brandl9a54d7c2008-07-16 23:15:30 +0000863 rc = _getbytevalue(item, &value);
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000864 Py_DECREF(item);
Georg Brandl9a54d7c2008-07-16 23:15:30 +0000865 if (!rc)
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000866 goto error;
867
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000868 /* Append the byte */
Serhiy Storchaka7b6e3b92015-06-29 21:14:06 +0300869 if (Py_SIZE(self) + 1 < self->ob_alloc) {
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000870 Py_SIZE(self)++;
Serhiy Storchaka7b6e3b92015-06-29 21:14:06 +0300871 PyByteArray_AS_STRING(self)[Py_SIZE(self)] = '\0';
872 }
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000873 else if (PyByteArray_Resize((PyObject *)self, Py_SIZE(self)+1) < 0)
874 goto error;
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200875 PyByteArray_AS_STRING(self)[Py_SIZE(self)-1] = value;
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000876 }
877
878 /* Clean up and return success */
879 Py_DECREF(it);
880 return 0;
881
882 error:
883 /* Error handling when it != NULL */
884 Py_DECREF(it);
885 return -1;
886}
887
888/* Mostly copied from string_repr, but without the
889 "smart quote" functionality. */
890static PyObject *
Benjamin Peterson153c70f2009-04-18 15:42:12 +0000891bytearray_repr(PyByteArrayObject *self)
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000892{
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000893 const char *quote_prefix = "bytearray(b";
894 const char *quote_postfix = ")";
895 Py_ssize_t length = Py_SIZE(self);
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200896 /* 15 == strlen(quote_prefix) + 2 + strlen(quote_postfix) + 1 */
Mark Dickinson66f575b2010-02-14 12:53:32 +0000897 size_t newsize;
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000898 PyObject *v;
Antoine Pitrou9ed5f272013-08-13 20:18:52 +0200899 Py_ssize_t i;
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200900 char *bytes;
Antoine Pitrou9ed5f272013-08-13 20:18:52 +0200901 char c;
902 char *p;
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200903 int quote;
904 char *test, *start;
905 char *buffer;
906
907 if (length > (PY_SSIZE_T_MAX - 15) / 4) {
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000908 PyErr_SetString(PyExc_OverflowError,
909 "bytearray object is too large to make repr");
910 return NULL;
911 }
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200912
913 newsize = 15 + length * 4;
Antoine Pitrou39aba4f2011-11-12 21:15:28 +0100914 buffer = PyObject_Malloc(newsize);
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200915 if (buffer == NULL) {
916 PyErr_NoMemory();
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000917 return NULL;
918 }
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000919
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200920 /* Figure out which quote to use; single is preferred */
921 quote = '\'';
922 start = PyByteArray_AS_STRING(self);
923 for (test = start; test < start+length; ++test) {
924 if (*test == '"') {
925 quote = '\''; /* back to single */
926 break;
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000927 }
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200928 else if (*test == '\'')
929 quote = '"';
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000930 }
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200931
932 p = buffer;
933 while (*quote_prefix)
934 *p++ = *quote_prefix++;
935 *p++ = quote;
936
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200937 bytes = PyByteArray_AS_STRING(self);
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200938 for (i = 0; i < length; i++) {
939 /* There's at least enough room for a hex escape
940 and a closing quote. */
941 assert(newsize - (p - buffer) >= 5);
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200942 c = bytes[i];
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200943 if (c == '\'' || c == '\\')
944 *p++ = '\\', *p++ = c;
945 else if (c == '\t')
946 *p++ = '\\', *p++ = 't';
947 else if (c == '\n')
948 *p++ = '\\', *p++ = 'n';
949 else if (c == '\r')
950 *p++ = '\\', *p++ = 'r';
951 else if (c == 0)
952 *p++ = '\\', *p++ = 'x', *p++ = '0', *p++ = '0';
953 else if (c < ' ' || c >= 0x7f) {
954 *p++ = '\\';
955 *p++ = 'x';
Victor Stinnerf5cff562011-10-14 02:13:11 +0200956 *p++ = Py_hexdigits[(c & 0xf0) >> 4];
957 *p++ = Py_hexdigits[c & 0xf];
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200958 }
959 else
960 *p++ = c;
961 }
962 assert(newsize - (p - buffer) >= 1);
963 *p++ = quote;
964 while (*quote_postfix) {
965 *p++ = *quote_postfix++;
966 }
967
968 v = PyUnicode_DecodeASCII(buffer, p - buffer, NULL);
Antoine Pitrou39aba4f2011-11-12 21:15:28 +0100969 PyObject_Free(buffer);
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200970 return v;
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000971}
972
973static PyObject *
Benjamin Peterson153c70f2009-04-18 15:42:12 +0000974bytearray_str(PyObject *op)
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000975{
Alexander Belopolskyf0f45142010-08-11 17:31:17 +0000976 if (Py_BytesWarningFlag) {
977 if (PyErr_WarnEx(PyExc_BytesWarning,
978 "str() on a bytearray instance", 1))
979 return NULL;
980 }
981 return bytearray_repr((PyByteArrayObject*)op);
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000982}
983
984static PyObject *
Benjamin Peterson153c70f2009-04-18 15:42:12 +0000985bytearray_richcompare(PyObject *self, PyObject *other, int op)
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000986{
987 Py_ssize_t self_size, other_size;
988 Py_buffer self_bytes, other_bytes;
989 PyObject *res;
990 Py_ssize_t minsize;
Serhiy Storchakafa494fd2015-05-30 17:45:22 +0300991 int cmp, rc;
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000992
993 /* Bytes can be compared to anything that supports the (binary)
994 buffer API. Except that a comparison with Unicode is always an
995 error, even if the comparison is for equality. */
Serhiy Storchakafa494fd2015-05-30 17:45:22 +0300996 rc = PyObject_IsInstance(self, (PyObject*)&PyUnicode_Type);
997 if (!rc)
998 rc = PyObject_IsInstance(other, (PyObject*)&PyUnicode_Type);
999 if (rc < 0)
1000 return NULL;
1001 if (rc) {
Barry Warsaw9e9dcd62008-10-17 01:50:37 +00001002 if (Py_BytesWarningFlag && (op == Py_EQ || op == Py_NE)) {
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001003 if (PyErr_WarnEx(PyExc_BytesWarning,
Georg Brandle5d68ac2008-06-04 11:30:26 +00001004 "Comparison between bytearray and string", 1))
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001005 return NULL;
1006 }
1007
Brian Curtindfc80e32011-08-10 20:28:54 -05001008 Py_RETURN_NOTIMPLEMENTED;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001009 }
1010
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +02001011 if (PyObject_GetBuffer(self, &self_bytes, PyBUF_SIMPLE) != 0) {
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001012 PyErr_Clear();
Brian Curtindfc80e32011-08-10 20:28:54 -05001013 Py_RETURN_NOTIMPLEMENTED;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001014 }
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +02001015 self_size = self_bytes.len;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001016
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +02001017 if (PyObject_GetBuffer(other, &other_bytes, PyBUF_SIMPLE) != 0) {
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001018 PyErr_Clear();
Martin v. Löwis423be952008-08-13 15:53:07 +00001019 PyBuffer_Release(&self_bytes);
Brian Curtindfc80e32011-08-10 20:28:54 -05001020 Py_RETURN_NOTIMPLEMENTED;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001021 }
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +02001022 other_size = other_bytes.len;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001023
1024 if (self_size != other_size && (op == Py_EQ || op == Py_NE)) {
1025 /* Shortcut: if the lengths differ, the objects differ */
1026 cmp = (op == Py_NE);
1027 }
1028 else {
1029 minsize = self_size;
1030 if (other_size < minsize)
1031 minsize = other_size;
1032
1033 cmp = memcmp(self_bytes.buf, other_bytes.buf, minsize);
1034 /* In ISO C, memcmp() guarantees to use unsigned bytes! */
1035
1036 if (cmp == 0) {
1037 if (self_size < other_size)
1038 cmp = -1;
1039 else if (self_size > other_size)
1040 cmp = 1;
1041 }
1042
1043 switch (op) {
1044 case Py_LT: cmp = cmp < 0; break;
1045 case Py_LE: cmp = cmp <= 0; break;
1046 case Py_EQ: cmp = cmp == 0; break;
1047 case Py_NE: cmp = cmp != 0; break;
1048 case Py_GT: cmp = cmp > 0; break;
1049 case Py_GE: cmp = cmp >= 0; break;
1050 }
1051 }
1052
1053 res = cmp ? Py_True : Py_False;
Martin v. Löwis423be952008-08-13 15:53:07 +00001054 PyBuffer_Release(&self_bytes);
1055 PyBuffer_Release(&other_bytes);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001056 Py_INCREF(res);
1057 return res;
1058}
1059
1060static void
Benjamin Peterson153c70f2009-04-18 15:42:12 +00001061bytearray_dealloc(PyByteArrayObject *self)
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001062{
Benjamin Petersone0124bd2009-03-09 21:04:33 +00001063 if (self->ob_exports > 0) {
1064 PyErr_SetString(PyExc_SystemError,
Benjamin Petersonef3e4c22009-04-11 19:48:14 +00001065 "deallocated bytearray object has exported buffers");
Benjamin Petersone0124bd2009-03-09 21:04:33 +00001066 PyErr_Print();
1067 }
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001068 if (self->ob_bytes != 0) {
Antoine Pitrou39aba4f2011-11-12 21:15:28 +01001069 PyObject_Free(self->ob_bytes);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001070 }
1071 Py_TYPE(self)->tp_free((PyObject *)self);
1072}
1073
1074
1075/* -------------------------------------------------------------------- */
1076/* Methods */
1077
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02001078#define FASTSEARCH fastsearch
1079#define STRINGLIB(F) stringlib_##F
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001080#define STRINGLIB_CHAR char
Antoine Pitroucfc22b42012-10-16 21:07:23 +02001081#define STRINGLIB_SIZEOF_CHAR 1
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001082#define STRINGLIB_LEN PyByteArray_GET_SIZE
1083#define STRINGLIB_STR PyByteArray_AS_STRING
1084#define STRINGLIB_NEW PyByteArray_FromStringAndSize
Antoine Pitrouf2c54842010-01-13 08:07:53 +00001085#define STRINGLIB_ISSPACE Py_ISSPACE
1086#define STRINGLIB_ISLINEBREAK(x) ((x == '\n') || (x == '\r'))
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001087#define STRINGLIB_CHECK_EXACT PyByteArray_CheckExact
1088#define STRINGLIB_MUTABLE 1
1089
1090#include "stringlib/fastsearch.h"
1091#include "stringlib/count.h"
1092#include "stringlib/find.h"
Antoine Pitroucfc22b42012-10-16 21:07:23 +02001093#include "stringlib/join.h"
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001094#include "stringlib/partition.h"
Antoine Pitrouf2c54842010-01-13 08:07:53 +00001095#include "stringlib/split.h"
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001096#include "stringlib/ctype.h"
1097#include "stringlib/transmogrify.h"
1098
1099
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001100static PyObject *
Benjamin Peterson153c70f2009-04-18 15:42:12 +00001101bytearray_find(PyByteArrayObject *self, PyObject *args)
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001102{
Serhiy Storchakadd40fc32016-05-04 22:23:26 +03001103 return _Py_bytes_find(PyByteArray_AS_STRING(self), PyByteArray_GET_SIZE(self), args);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001104}
1105
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001106static PyObject *
Benjamin Peterson153c70f2009-04-18 15:42:12 +00001107bytearray_count(PyByteArrayObject *self, PyObject *args)
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001108{
Serhiy Storchakadd40fc32016-05-04 22:23:26 +03001109 return _Py_bytes_count(PyByteArray_AS_STRING(self), PyByteArray_GET_SIZE(self), args);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001110}
1111
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001112/*[clinic input]
1113bytearray.clear
1114
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001115Remove all items from the bytearray.
1116[clinic start generated code]*/
1117
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001118static PyObject *
1119bytearray_clear_impl(PyByteArrayObject *self)
Serhiy Storchaka7a9579c2016-05-02 13:45:20 +03001120/*[clinic end generated code: output=85c2fe6aede0956c input=ed6edae9de447ac4]*/
Eli Bendersky4db28d32011-03-03 18:21:02 +00001121{
1122 if (PyByteArray_Resize((PyObject *)self, 0) < 0)
1123 return NULL;
1124 Py_RETURN_NONE;
1125}
1126
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001127/*[clinic input]
1128bytearray.copy
1129
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001130Return a copy of B.
1131[clinic start generated code]*/
1132
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001133static PyObject *
1134bytearray_copy_impl(PyByteArrayObject *self)
Serhiy Storchaka7a9579c2016-05-02 13:45:20 +03001135/*[clinic end generated code: output=68cfbcfed484c132 input=6597b0c01bccaa9e]*/
Eli Bendersky4db28d32011-03-03 18:21:02 +00001136{
1137 return PyByteArray_FromStringAndSize(PyByteArray_AS_STRING((PyObject *)self),
1138 PyByteArray_GET_SIZE(self));
1139}
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001140
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001141static PyObject *
Benjamin Peterson153c70f2009-04-18 15:42:12 +00001142bytearray_index(PyByteArrayObject *self, PyObject *args)
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001143{
Serhiy Storchakadd40fc32016-05-04 22:23:26 +03001144 return _Py_bytes_index(PyByteArray_AS_STRING(self), PyByteArray_GET_SIZE(self), args);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001145}
1146
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001147static PyObject *
Benjamin Peterson153c70f2009-04-18 15:42:12 +00001148bytearray_rfind(PyByteArrayObject *self, PyObject *args)
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001149{
Serhiy Storchakadd40fc32016-05-04 22:23:26 +03001150 return _Py_bytes_rfind(PyByteArray_AS_STRING(self), PyByteArray_GET_SIZE(self), args);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001151}
1152
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001153static PyObject *
Benjamin Peterson153c70f2009-04-18 15:42:12 +00001154bytearray_rindex(PyByteArrayObject *self, PyObject *args)
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001155{
Serhiy Storchakadd40fc32016-05-04 22:23:26 +03001156 return _Py_bytes_rindex(PyByteArray_AS_STRING(self), PyByteArray_GET_SIZE(self), args);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001157}
1158
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001159static int
Benjamin Peterson153c70f2009-04-18 15:42:12 +00001160bytearray_contains(PyObject *self, PyObject *arg)
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001161{
Serhiy Storchakadd40fc32016-05-04 22:23:26 +03001162 return _Py_bytes_contains(PyByteArray_AS_STRING(self), PyByteArray_GET_SIZE(self), arg);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001163}
1164
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001165static PyObject *
Benjamin Peterson153c70f2009-04-18 15:42:12 +00001166bytearray_startswith(PyByteArrayObject *self, PyObject *args)
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001167{
Serhiy Storchakadd40fc32016-05-04 22:23:26 +03001168 return _Py_bytes_startswith(PyByteArray_AS_STRING(self), PyByteArray_GET_SIZE(self), args);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001169}
1170
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001171static PyObject *
Benjamin Peterson153c70f2009-04-18 15:42:12 +00001172bytearray_endswith(PyByteArrayObject *self, PyObject *args)
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001173{
Serhiy Storchakadd40fc32016-05-04 22:23:26 +03001174 return _Py_bytes_endswith(PyByteArray_AS_STRING(self), PyByteArray_GET_SIZE(self), args);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001175}
1176
1177
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001178/*[clinic input]
1179bytearray.translate
1180
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001181 table: object
1182 Translation table, which must be a bytes object of length 256.
1183 [
1184 deletechars: object
1185 ]
1186 /
1187
1188Return a copy with each character mapped by the given translation table.
1189
1190All characters occurring in the optional argument deletechars are removed.
1191The remaining characters are mapped through the given translation table.
1192[clinic start generated code]*/
1193
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001194static PyObject *
Larry Hastings89964c42015-04-14 18:07:59 -04001195bytearray_translate_impl(PyByteArrayObject *self, PyObject *table,
1196 int group_right_1, PyObject *deletechars)
Serhiy Storchaka7a9579c2016-05-02 13:45:20 +03001197/*[clinic end generated code: output=2bebc86a9a1ff083 input=846a01671bccc1c5]*/
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001198{
Antoine Pitrou9ed5f272013-08-13 20:18:52 +02001199 char *input, *output;
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001200 const char *table_chars;
Antoine Pitrou9ed5f272013-08-13 20:18:52 +02001201 Py_ssize_t i, c;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001202 PyObject *input_obj = (PyObject*)self;
1203 const char *output_start;
1204 Py_ssize_t inlen;
Georg Brandlccc47b62008-12-28 11:44:14 +00001205 PyObject *result = NULL;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001206 int trans_table[256];
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001207 Py_buffer vtable, vdel;
1208
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001209 if (table == Py_None) {
1210 table_chars = NULL;
Georg Brandlccc47b62008-12-28 11:44:14 +00001211 table = NULL;
Serhiy Storchaka3dd3e262015-02-03 01:25:42 +02001212 } else if (PyObject_GetBuffer(table, &vtable, PyBUF_SIMPLE) != 0) {
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001213 return NULL;
Georg Brandlccc47b62008-12-28 11:44:14 +00001214 } else {
1215 if (vtable.len != 256) {
1216 PyErr_SetString(PyExc_ValueError,
1217 "translation table must be 256 characters long");
Georg Brandl953152f2009-07-22 12:03:59 +00001218 PyBuffer_Release(&vtable);
1219 return NULL;
Georg Brandlccc47b62008-12-28 11:44:14 +00001220 }
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001221 table_chars = (const char*)vtable.buf;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001222 }
1223
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001224 if (deletechars != NULL) {
Serhiy Storchaka3dd3e262015-02-03 01:25:42 +02001225 if (PyObject_GetBuffer(deletechars, &vdel, PyBUF_SIMPLE) != 0) {
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001226 if (table != NULL)
Georg Brandl953152f2009-07-22 12:03:59 +00001227 PyBuffer_Release(&vtable);
1228 return NULL;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001229 }
1230 }
1231 else {
1232 vdel.buf = NULL;
1233 vdel.len = 0;
1234 }
1235
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001236 inlen = PyByteArray_GET_SIZE(input_obj);
1237 result = PyByteArray_FromStringAndSize((char *)NULL, inlen);
1238 if (result == NULL)
1239 goto done;
Serhiy Storchakadd40fc32016-05-04 22:23:26 +03001240 output_start = output = PyByteArray_AS_STRING(result);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001241 input = PyByteArray_AS_STRING(input_obj);
1242
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001243 if (vdel.len == 0 && table_chars != NULL) {
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001244 /* If no deletions are required, use faster code */
1245 for (i = inlen; --i >= 0; ) {
1246 c = Py_CHARMASK(*input++);
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001247 *output++ = table_chars[c];
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001248 }
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001249 goto done;
1250 }
Georg Brandlccc47b62008-12-28 11:44:14 +00001251
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001252 if (table_chars == NULL) {
Georg Brandlccc47b62008-12-28 11:44:14 +00001253 for (i = 0; i < 256; i++)
1254 trans_table[i] = Py_CHARMASK(i);
1255 } else {
1256 for (i = 0; i < 256; i++)
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001257 trans_table[i] = Py_CHARMASK(table_chars[i]);
Georg Brandlccc47b62008-12-28 11:44:14 +00001258 }
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001259
1260 for (i = 0; i < vdel.len; i++)
1261 trans_table[(int) Py_CHARMASK( ((unsigned char*)vdel.buf)[i] )] = -1;
1262
1263 for (i = inlen; --i >= 0; ) {
1264 c = Py_CHARMASK(*input++);
1265 if (trans_table[c] != -1)
1266 if (Py_CHARMASK(*output++ = (char)trans_table[c]) == c)
1267 continue;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001268 }
1269 /* Fix the size of the resulting string */
1270 if (inlen > 0)
Christian Heimesc731bbe2013-07-21 02:04:35 +02001271 if (PyByteArray_Resize(result, output - output_start) < 0) {
1272 Py_CLEAR(result);
1273 goto done;
1274 }
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001275
1276done:
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001277 if (table != NULL)
Georg Brandlccc47b62008-12-28 11:44:14 +00001278 PyBuffer_Release(&vtable);
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001279 if (deletechars != NULL)
Martin v. Löwis423be952008-08-13 15:53:07 +00001280 PyBuffer_Release(&vdel);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001281 return result;
1282}
1283
1284
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001285/*[clinic input]
1286
1287@staticmethod
1288bytearray.maketrans
1289
Serhiy Storchaka3dd3e262015-02-03 01:25:42 +02001290 frm: Py_buffer
1291 to: Py_buffer
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001292 /
1293
1294Return a translation table useable for the bytes or bytearray translate method.
1295
1296The returned table will be one where each byte in frm is mapped to the byte at
1297the same position in to.
1298
1299The bytes objects frm and to must be of the same length.
1300[clinic start generated code]*/
1301
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001302static PyObject *
Serhiy Storchaka3dd3e262015-02-03 01:25:42 +02001303bytearray_maketrans_impl(Py_buffer *frm, Py_buffer *to)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03001304/*[clinic end generated code: output=1df267d99f56b15e input=5925a81d2fbbf151]*/
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001305{
1306 return _Py_bytes_maketrans(frm, to);
Georg Brandlabc38772009-04-12 15:51:51 +00001307}
1308
1309
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001310/* find and count characters and substrings */
1311
1312#define findchar(target, target_len, c) \
1313 ((char *)memchr((const void *)(target), c, target_len))
1314
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001315
Benjamin Peterson0f3641c2008-11-19 22:05:52 +00001316/* Bytes ops must return a string, create a copy */
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001317Py_LOCAL(PyByteArrayObject *)
1318return_self(PyByteArrayObject *self)
1319{
Georg Brandl1e7217d2008-05-30 12:02:38 +00001320 /* always return a new bytearray */
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001321 return (PyByteArrayObject *)PyByteArray_FromStringAndSize(
1322 PyByteArray_AS_STRING(self),
1323 PyByteArray_GET_SIZE(self));
1324}
1325
1326Py_LOCAL_INLINE(Py_ssize_t)
1327countchar(const char *target, Py_ssize_t target_len, char c, Py_ssize_t maxcount)
1328{
1329 Py_ssize_t count=0;
1330 const char *start=target;
1331 const char *end=target+target_len;
1332
1333 while ( (start=findchar(start, end-start, c)) != NULL ) {
1334 count++;
1335 if (count >= maxcount)
1336 break;
1337 start += 1;
1338 }
1339 return count;
1340}
1341
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001342
1343/* Algorithms for different cases of string replacement */
1344
1345/* len(self)>=1, from="", len(to)>=1, maxcount>=1 */
1346Py_LOCAL(PyByteArrayObject *)
1347replace_interleave(PyByteArrayObject *self,
1348 const char *to_s, Py_ssize_t to_len,
1349 Py_ssize_t maxcount)
1350{
1351 char *self_s, *result_s;
1352 Py_ssize_t self_len, result_len;
Mark Dickinsoncf940c72010-08-10 18:35:01 +00001353 Py_ssize_t count, i;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001354 PyByteArrayObject *result;
1355
1356 self_len = PyByteArray_GET_SIZE(self);
1357
Mark Dickinsoncf940c72010-08-10 18:35:01 +00001358 /* 1 at the end plus 1 after every character;
1359 count = min(maxcount, self_len + 1) */
1360 if (maxcount <= self_len)
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001361 count = maxcount;
Mark Dickinsoncf940c72010-08-10 18:35:01 +00001362 else
1363 /* Can't overflow: self_len + 1 <= maxcount <= PY_SSIZE_T_MAX. */
1364 count = self_len + 1;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001365
1366 /* Check for overflow */
1367 /* result_len = count * to_len + self_len; */
Mark Dickinsoncf940c72010-08-10 18:35:01 +00001368 assert(count > 0);
1369 if (to_len > (PY_SSIZE_T_MAX - self_len) / count) {
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001370 PyErr_SetString(PyExc_OverflowError,
1371 "replace string is too long");
1372 return NULL;
1373 }
Mark Dickinsoncf940c72010-08-10 18:35:01 +00001374 result_len = count * to_len + self_len;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001375
1376 if (! (result = (PyByteArrayObject *)
1377 PyByteArray_FromStringAndSize(NULL, result_len)) )
1378 return NULL;
1379
1380 self_s = PyByteArray_AS_STRING(self);
1381 result_s = PyByteArray_AS_STRING(result);
1382
Victor Stinnerfac39562016-03-21 10:38:58 +01001383 if (to_len > 1) {
1384 /* Lay the first one down (guaranteed this will occur) */
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001385 Py_MEMCPY(result_s, to_s, to_len);
1386 result_s += to_len;
Victor Stinnerfac39562016-03-21 10:38:58 +01001387 count -= 1;
1388
1389 for (i = 0; i < count; i++) {
1390 *result_s++ = *self_s++;
1391 Py_MEMCPY(result_s, to_s, to_len);
1392 result_s += to_len;
1393 }
1394 }
1395 else {
1396 result_s[0] = to_s[0];
1397 result_s += to_len;
1398 count -= 1;
1399 for (i = 0; i < count; i++) {
1400 *result_s++ = *self_s++;
1401 result_s[0] = to_s[0];
1402 result_s += to_len;
1403 }
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001404 }
1405
1406 /* Copy the rest of the original string */
1407 Py_MEMCPY(result_s, self_s, self_len-i);
1408
1409 return result;
1410}
1411
1412/* Special case for deleting a single character */
1413/* len(self)>=1, len(from)==1, to="", maxcount>=1 */
1414Py_LOCAL(PyByteArrayObject *)
1415replace_delete_single_character(PyByteArrayObject *self,
1416 char from_c, Py_ssize_t maxcount)
1417{
1418 char *self_s, *result_s;
1419 char *start, *next, *end;
1420 Py_ssize_t self_len, result_len;
1421 Py_ssize_t count;
1422 PyByteArrayObject *result;
1423
1424 self_len = PyByteArray_GET_SIZE(self);
1425 self_s = PyByteArray_AS_STRING(self);
1426
1427 count = countchar(self_s, self_len, from_c, maxcount);
1428 if (count == 0) {
1429 return return_self(self);
1430 }
1431
1432 result_len = self_len - count; /* from_len == 1 */
1433 assert(result_len>=0);
1434
1435 if ( (result = (PyByteArrayObject *)
1436 PyByteArray_FromStringAndSize(NULL, result_len)) == NULL)
1437 return NULL;
1438 result_s = PyByteArray_AS_STRING(result);
1439
1440 start = self_s;
1441 end = self_s + self_len;
1442 while (count-- > 0) {
1443 next = findchar(start, end-start, from_c);
1444 if (next == NULL)
1445 break;
1446 Py_MEMCPY(result_s, start, next-start);
1447 result_s += (next-start);
1448 start = next+1;
1449 }
1450 Py_MEMCPY(result_s, start, end-start);
1451
1452 return result;
1453}
1454
1455/* len(self)>=1, len(from)>=2, to="", maxcount>=1 */
1456
1457Py_LOCAL(PyByteArrayObject *)
1458replace_delete_substring(PyByteArrayObject *self,
1459 const char *from_s, Py_ssize_t from_len,
1460 Py_ssize_t maxcount)
1461{
1462 char *self_s, *result_s;
1463 char *start, *next, *end;
1464 Py_ssize_t self_len, result_len;
1465 Py_ssize_t count, offset;
1466 PyByteArrayObject *result;
1467
1468 self_len = PyByteArray_GET_SIZE(self);
1469 self_s = PyByteArray_AS_STRING(self);
1470
Antoine Pitrouf2c54842010-01-13 08:07:53 +00001471 count = stringlib_count(self_s, self_len,
1472 from_s, from_len,
1473 maxcount);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001474
1475 if (count == 0) {
1476 /* no matches */
1477 return return_self(self);
1478 }
1479
1480 result_len = self_len - (count * from_len);
1481 assert (result_len>=0);
1482
1483 if ( (result = (PyByteArrayObject *)
1484 PyByteArray_FromStringAndSize(NULL, result_len)) == NULL )
1485 return NULL;
1486
1487 result_s = PyByteArray_AS_STRING(result);
1488
1489 start = self_s;
1490 end = self_s + self_len;
1491 while (count-- > 0) {
Antoine Pitrouf2c54842010-01-13 08:07:53 +00001492 offset = stringlib_find(start, end-start,
1493 from_s, from_len,
1494 0);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001495 if (offset == -1)
1496 break;
1497 next = start + offset;
1498
1499 Py_MEMCPY(result_s, start, next-start);
1500
1501 result_s += (next-start);
1502 start = next+from_len;
1503 }
1504 Py_MEMCPY(result_s, start, end-start);
1505 return result;
1506}
1507
1508/* len(self)>=1, len(from)==len(to)==1, maxcount>=1 */
1509Py_LOCAL(PyByteArrayObject *)
1510replace_single_character_in_place(PyByteArrayObject *self,
1511 char from_c, char to_c,
1512 Py_ssize_t maxcount)
1513{
Antoine Pitroud1188562010-06-09 16:38:55 +00001514 char *self_s, *result_s, *start, *end, *next;
1515 Py_ssize_t self_len;
1516 PyByteArrayObject *result;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001517
Antoine Pitroud1188562010-06-09 16:38:55 +00001518 /* The result string will be the same size */
1519 self_s = PyByteArray_AS_STRING(self);
1520 self_len = PyByteArray_GET_SIZE(self);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001521
Antoine Pitroud1188562010-06-09 16:38:55 +00001522 next = findchar(self_s, self_len, from_c);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001523
Antoine Pitroud1188562010-06-09 16:38:55 +00001524 if (next == NULL) {
1525 /* No matches; return the original bytes */
1526 return return_self(self);
1527 }
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001528
Antoine Pitroud1188562010-06-09 16:38:55 +00001529 /* Need to make a new bytes */
1530 result = (PyByteArrayObject *) PyByteArray_FromStringAndSize(NULL, self_len);
1531 if (result == NULL)
1532 return NULL;
1533 result_s = PyByteArray_AS_STRING(result);
1534 Py_MEMCPY(result_s, self_s, self_len);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001535
Antoine Pitroud1188562010-06-09 16:38:55 +00001536 /* change everything in-place, starting with this one */
1537 start = result_s + (next-self_s);
1538 *start = to_c;
1539 start++;
1540 end = result_s + self_len;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001541
Antoine Pitroud1188562010-06-09 16:38:55 +00001542 while (--maxcount > 0) {
1543 next = findchar(start, end-start, from_c);
1544 if (next == NULL)
1545 break;
1546 *next = to_c;
1547 start = next+1;
1548 }
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001549
Antoine Pitroud1188562010-06-09 16:38:55 +00001550 return result;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001551}
1552
1553/* len(self)>=1, len(from)==len(to)>=2, maxcount>=1 */
1554Py_LOCAL(PyByteArrayObject *)
1555replace_substring_in_place(PyByteArrayObject *self,
1556 const char *from_s, Py_ssize_t from_len,
1557 const char *to_s, Py_ssize_t to_len,
1558 Py_ssize_t maxcount)
1559{
1560 char *result_s, *start, *end;
1561 char *self_s;
1562 Py_ssize_t self_len, offset;
1563 PyByteArrayObject *result;
1564
1565 /* The result bytes will be the same size */
1566
1567 self_s = PyByteArray_AS_STRING(self);
1568 self_len = PyByteArray_GET_SIZE(self);
1569
Antoine Pitrouf2c54842010-01-13 08:07:53 +00001570 offset = stringlib_find(self_s, self_len,
1571 from_s, from_len,
1572 0);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001573 if (offset == -1) {
1574 /* No matches; return the original bytes */
1575 return return_self(self);
1576 }
1577
1578 /* Need to make a new bytes */
1579 result = (PyByteArrayObject *) PyByteArray_FromStringAndSize(NULL, self_len);
1580 if (result == NULL)
1581 return NULL;
1582 result_s = PyByteArray_AS_STRING(result);
1583 Py_MEMCPY(result_s, self_s, self_len);
1584
1585 /* change everything in-place, starting with this one */
1586 start = result_s + offset;
1587 Py_MEMCPY(start, to_s, from_len);
1588 start += from_len;
1589 end = result_s + self_len;
1590
1591 while ( --maxcount > 0) {
Antoine Pitrouf2c54842010-01-13 08:07:53 +00001592 offset = stringlib_find(start, end-start,
1593 from_s, from_len,
1594 0);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001595 if (offset==-1)
1596 break;
1597 Py_MEMCPY(start+offset, to_s, from_len);
1598 start += offset+from_len;
1599 }
1600
1601 return result;
1602}
1603
1604/* len(self)>=1, len(from)==1, len(to)>=2, maxcount>=1 */
1605Py_LOCAL(PyByteArrayObject *)
1606replace_single_character(PyByteArrayObject *self,
1607 char from_c,
1608 const char *to_s, Py_ssize_t to_len,
1609 Py_ssize_t maxcount)
1610{
1611 char *self_s, *result_s;
1612 char *start, *next, *end;
1613 Py_ssize_t self_len, result_len;
Mark Dickinsoncf940c72010-08-10 18:35:01 +00001614 Py_ssize_t count;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001615 PyByteArrayObject *result;
1616
1617 self_s = PyByteArray_AS_STRING(self);
1618 self_len = PyByteArray_GET_SIZE(self);
1619
1620 count = countchar(self_s, self_len, from_c, maxcount);
1621 if (count == 0) {
1622 /* no matches, return unchanged */
1623 return return_self(self);
1624 }
1625
1626 /* use the difference between current and new, hence the "-1" */
1627 /* result_len = self_len + count * (to_len-1) */
Mark Dickinsoncf940c72010-08-10 18:35:01 +00001628 assert(count > 0);
1629 if (to_len - 1 > (PY_SSIZE_T_MAX - self_len) / count) {
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001630 PyErr_SetString(PyExc_OverflowError, "replace bytes is too long");
1631 return NULL;
1632 }
Mark Dickinsoncf940c72010-08-10 18:35:01 +00001633 result_len = self_len + count * (to_len - 1);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001634
1635 if ( (result = (PyByteArrayObject *)
1636 PyByteArray_FromStringAndSize(NULL, result_len)) == NULL)
1637 return NULL;
1638 result_s = PyByteArray_AS_STRING(result);
1639
1640 start = self_s;
1641 end = self_s + self_len;
1642 while (count-- > 0) {
1643 next = findchar(start, end-start, from_c);
1644 if (next == NULL)
1645 break;
1646
1647 if (next == start) {
1648 /* replace with the 'to' */
1649 Py_MEMCPY(result_s, to_s, to_len);
1650 result_s += to_len;
1651 start += 1;
1652 } else {
1653 /* copy the unchanged old then the 'to' */
1654 Py_MEMCPY(result_s, start, next-start);
1655 result_s += (next-start);
1656 Py_MEMCPY(result_s, to_s, to_len);
1657 result_s += to_len;
1658 start = next+1;
1659 }
1660 }
1661 /* Copy the remainder of the remaining bytes */
1662 Py_MEMCPY(result_s, start, end-start);
1663
1664 return result;
1665}
1666
1667/* len(self)>=1, len(from)>=2, len(to)>=2, maxcount>=1 */
1668Py_LOCAL(PyByteArrayObject *)
1669replace_substring(PyByteArrayObject *self,
1670 const char *from_s, Py_ssize_t from_len,
1671 const char *to_s, Py_ssize_t to_len,
1672 Py_ssize_t maxcount)
1673{
1674 char *self_s, *result_s;
1675 char *start, *next, *end;
1676 Py_ssize_t self_len, result_len;
Mark Dickinsoncf940c72010-08-10 18:35:01 +00001677 Py_ssize_t count, offset;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001678 PyByteArrayObject *result;
1679
1680 self_s = PyByteArray_AS_STRING(self);
1681 self_len = PyByteArray_GET_SIZE(self);
1682
Antoine Pitrouf2c54842010-01-13 08:07:53 +00001683 count = stringlib_count(self_s, self_len,
1684 from_s, from_len,
1685 maxcount);
1686
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001687 if (count == 0) {
1688 /* no matches, return unchanged */
1689 return return_self(self);
1690 }
1691
1692 /* Check for overflow */
1693 /* result_len = self_len + count * (to_len-from_len) */
Mark Dickinsoncf940c72010-08-10 18:35:01 +00001694 assert(count > 0);
1695 if (to_len - from_len > (PY_SSIZE_T_MAX - self_len) / count) {
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001696 PyErr_SetString(PyExc_OverflowError, "replace bytes is too long");
1697 return NULL;
1698 }
Mark Dickinsoncf940c72010-08-10 18:35:01 +00001699 result_len = self_len + count * (to_len - from_len);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001700
1701 if ( (result = (PyByteArrayObject *)
1702 PyByteArray_FromStringAndSize(NULL, result_len)) == NULL)
1703 return NULL;
1704 result_s = PyByteArray_AS_STRING(result);
1705
1706 start = self_s;
1707 end = self_s + self_len;
1708 while (count-- > 0) {
Antoine Pitrouf2c54842010-01-13 08:07:53 +00001709 offset = stringlib_find(start, end-start,
1710 from_s, from_len,
1711 0);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001712 if (offset == -1)
1713 break;
1714 next = start+offset;
1715 if (next == start) {
1716 /* replace with the 'to' */
1717 Py_MEMCPY(result_s, to_s, to_len);
1718 result_s += to_len;
1719 start += from_len;
1720 } else {
1721 /* copy the unchanged old then the 'to' */
1722 Py_MEMCPY(result_s, start, next-start);
1723 result_s += (next-start);
1724 Py_MEMCPY(result_s, to_s, to_len);
1725 result_s += to_len;
1726 start = next+from_len;
1727 }
1728 }
1729 /* Copy the remainder of the remaining bytes */
1730 Py_MEMCPY(result_s, start, end-start);
1731
1732 return result;
1733}
1734
1735
1736Py_LOCAL(PyByteArrayObject *)
1737replace(PyByteArrayObject *self,
1738 const char *from_s, Py_ssize_t from_len,
1739 const char *to_s, Py_ssize_t to_len,
1740 Py_ssize_t maxcount)
1741{
1742 if (maxcount < 0) {
1743 maxcount = PY_SSIZE_T_MAX;
1744 } else if (maxcount == 0 || PyByteArray_GET_SIZE(self) == 0) {
1745 /* nothing to do; return the original bytes */
1746 return return_self(self);
1747 }
1748
1749 if (maxcount == 0 ||
1750 (from_len == 0 && to_len == 0)) {
1751 /* nothing to do; return the original bytes */
1752 return return_self(self);
1753 }
1754
1755 /* Handle zero-length special cases */
1756
1757 if (from_len == 0) {
1758 /* insert the 'to' bytes everywhere. */
1759 /* >>> "Python".replace("", ".") */
1760 /* '.P.y.t.h.o.n.' */
1761 return replace_interleave(self, to_s, to_len, maxcount);
1762 }
1763
1764 /* Except for "".replace("", "A") == "A" there is no way beyond this */
1765 /* point for an empty self bytes to generate a non-empty bytes */
1766 /* Special case so the remaining code always gets a non-empty bytes */
1767 if (PyByteArray_GET_SIZE(self) == 0) {
1768 return return_self(self);
1769 }
1770
1771 if (to_len == 0) {
Georg Brandl17cb8a82008-05-30 08:20:09 +00001772 /* delete all occurrences of 'from' bytes */
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001773 if (from_len == 1) {
1774 return replace_delete_single_character(
1775 self, from_s[0], maxcount);
1776 } else {
1777 return replace_delete_substring(self, from_s, from_len, maxcount);
1778 }
1779 }
1780
1781 /* Handle special case where both bytes have the same length */
1782
1783 if (from_len == to_len) {
1784 if (from_len == 1) {
1785 return replace_single_character_in_place(
1786 self,
1787 from_s[0],
1788 to_s[0],
1789 maxcount);
1790 } else {
1791 return replace_substring_in_place(
1792 self, from_s, from_len, to_s, to_len, maxcount);
1793 }
1794 }
1795
1796 /* Otherwise use the more generic algorithms */
1797 if (from_len == 1) {
1798 return replace_single_character(self, from_s[0],
1799 to_s, to_len, maxcount);
1800 } else {
1801 /* len('from')>=2, len('to')>=1 */
1802 return replace_substring(self, from_s, from_len, to_s, to_len, maxcount);
1803 }
1804}
1805
1806
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001807/*[clinic input]
1808bytearray.replace
1809
Serhiy Storchaka3dd3e262015-02-03 01:25:42 +02001810 old: Py_buffer
1811 new: Py_buffer
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001812 count: Py_ssize_t = -1
1813 Maximum number of occurrences to replace.
1814 -1 (the default value) means replace all occurrences.
1815 /
1816
1817Return a copy with all occurrences of substring old replaced by new.
1818
1819If the optional argument count is given, only the first count occurrences are
1820replaced.
1821[clinic start generated code]*/
1822
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001823static PyObject *
Larry Hastings89964c42015-04-14 18:07:59 -04001824bytearray_replace_impl(PyByteArrayObject *self, Py_buffer *old,
1825 Py_buffer *new, Py_ssize_t count)
1826/*[clinic end generated code: output=d39884c4dc59412a input=aa379d988637c7fb]*/
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001827{
Serhiy Storchaka3dd3e262015-02-03 01:25:42 +02001828 return (PyObject *)replace((PyByteArrayObject *) self,
1829 old->buf, old->len,
1830 new->buf, new->len, count);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001831}
1832
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001833/*[clinic input]
1834bytearray.split
1835
1836 sep: object = None
1837 The delimiter according which to split the bytearray.
1838 None (the default value) means split on ASCII whitespace characters
1839 (space, tab, return, newline, formfeed, vertical tab).
1840 maxsplit: Py_ssize_t = -1
1841 Maximum number of splits to do.
1842 -1 (the default value) means no limit.
1843
1844Return a list of the sections in the bytearray, using sep as the delimiter.
1845[clinic start generated code]*/
1846
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001847static PyObject *
Larry Hastings89964c42015-04-14 18:07:59 -04001848bytearray_split_impl(PyByteArrayObject *self, PyObject *sep,
1849 Py_ssize_t maxsplit)
1850/*[clinic end generated code: output=833e2cf385d9a04d input=24f82669f41bf523]*/
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001851{
1852 Py_ssize_t len = PyByteArray_GET_SIZE(self), n;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001853 const char *s = PyByteArray_AS_STRING(self), *sub;
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001854 PyObject *list;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001855 Py_buffer vsub;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001856
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001857 if (maxsplit < 0)
1858 maxsplit = PY_SSIZE_T_MAX;
1859
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001860 if (sep == Py_None)
Antoine Pitrouf2c54842010-01-13 08:07:53 +00001861 return stringlib_split_whitespace((PyObject*) self, s, len, maxsplit);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001862
Serhiy Storchaka3dd3e262015-02-03 01:25:42 +02001863 if (PyObject_GetBuffer(sep, &vsub, PyBUF_SIMPLE) != 0)
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001864 return NULL;
1865 sub = vsub.buf;
1866 n = vsub.len;
1867
Antoine Pitrouf2c54842010-01-13 08:07:53 +00001868 list = stringlib_split(
1869 (PyObject*) self, s, len, sub, n, maxsplit
1870 );
Martin v. Löwis423be952008-08-13 15:53:07 +00001871 PyBuffer_Release(&vsub);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001872 return list;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001873}
1874
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001875/*[clinic input]
1876bytearray.partition
1877
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001878 sep: object
1879 /
1880
1881Partition the bytearray into three parts using the given separator.
1882
1883This will search for the separator sep in the bytearray. If the separator is
1884found, returns a 3-tuple containing the part before the separator, the
1885separator itself, and the part after it.
1886
1887If the separator is not found, returns a 3-tuple containing the original
1888bytearray object and two empty bytearray objects.
1889[clinic start generated code]*/
1890
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001891static PyObject *
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001892bytearray_partition(PyByteArrayObject *self, PyObject *sep)
Serhiy Storchaka7a9579c2016-05-02 13:45:20 +03001893/*[clinic end generated code: output=45d2525ddd35f957 input=86f89223892b70b5]*/
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001894{
1895 PyObject *bytesep, *result;
1896
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001897 bytesep = PyByteArray_FromObject(sep);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001898 if (! bytesep)
1899 return NULL;
1900
1901 result = stringlib_partition(
1902 (PyObject*) self,
1903 PyByteArray_AS_STRING(self), PyByteArray_GET_SIZE(self),
1904 bytesep,
1905 PyByteArray_AS_STRING(bytesep), PyByteArray_GET_SIZE(bytesep)
1906 );
1907
1908 Py_DECREF(bytesep);
Antoine Pitrouf2c54842010-01-13 08:07:53 +00001909 return result;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001910}
1911
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001912/*[clinic input]
1913bytearray.rpartition
1914
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001915 sep: object
1916 /
1917
1918Partition the bytes into three parts using the given separator.
1919
1920This will search for the separator sep in the bytearray, starting and the end.
1921If the separator is found, returns a 3-tuple containing the part before the
1922separator, the separator itself, and the part after it.
1923
1924If the separator is not found, returns a 3-tuple containing two empty bytearray
1925objects and the original bytearray object.
1926[clinic start generated code]*/
1927
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001928static PyObject *
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001929bytearray_rpartition(PyByteArrayObject *self, PyObject *sep)
Serhiy Storchaka7a9579c2016-05-02 13:45:20 +03001930/*[clinic end generated code: output=440de3c9426115e8 input=5f4094f2de87c8f3]*/
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001931{
1932 PyObject *bytesep, *result;
1933
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001934 bytesep = PyByteArray_FromObject(sep);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001935 if (! bytesep)
1936 return NULL;
1937
1938 result = stringlib_rpartition(
1939 (PyObject*) self,
1940 PyByteArray_AS_STRING(self), PyByteArray_GET_SIZE(self),
1941 bytesep,
1942 PyByteArray_AS_STRING(bytesep), PyByteArray_GET_SIZE(bytesep)
1943 );
1944
1945 Py_DECREF(bytesep);
Antoine Pitrouf2c54842010-01-13 08:07:53 +00001946 return result;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001947}
1948
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001949/*[clinic input]
1950bytearray.rsplit = bytearray.split
1951
1952Return a list of the sections in the bytearray, using sep as the delimiter.
1953
1954Splitting is done starting at the end of the bytearray and working to the front.
1955[clinic start generated code]*/
1956
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001957static PyObject *
Larry Hastings89964c42015-04-14 18:07:59 -04001958bytearray_rsplit_impl(PyByteArrayObject *self, PyObject *sep,
1959 Py_ssize_t maxsplit)
1960/*[clinic end generated code: output=a55e0b5a03cb6190 input=a68286e4dd692ffe]*/
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001961{
1962 Py_ssize_t len = PyByteArray_GET_SIZE(self), n;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001963 const char *s = PyByteArray_AS_STRING(self), *sub;
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001964 PyObject *list;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001965 Py_buffer vsub;
1966
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001967 if (maxsplit < 0)
1968 maxsplit = PY_SSIZE_T_MAX;
1969
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001970 if (sep == Py_None)
Antoine Pitrouf2c54842010-01-13 08:07:53 +00001971 return stringlib_rsplit_whitespace((PyObject*) self, s, len, maxsplit);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001972
Serhiy Storchaka3dd3e262015-02-03 01:25:42 +02001973 if (PyObject_GetBuffer(sep, &vsub, PyBUF_SIMPLE) != 0)
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001974 return NULL;
1975 sub = vsub.buf;
1976 n = vsub.len;
1977
Antoine Pitrouf2c54842010-01-13 08:07:53 +00001978 list = stringlib_rsplit(
1979 (PyObject*) self, s, len, sub, n, maxsplit
1980 );
Martin v. Löwis423be952008-08-13 15:53:07 +00001981 PyBuffer_Release(&vsub);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001982 return list;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001983}
1984
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001985/*[clinic input]
1986bytearray.reverse
1987
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001988Reverse the order of the values in B in place.
1989[clinic start generated code]*/
1990
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001991static PyObject *
1992bytearray_reverse_impl(PyByteArrayObject *self)
Serhiy Storchaka7a9579c2016-05-02 13:45:20 +03001993/*[clinic end generated code: output=9f7616f29ab309d3 input=543356319fc78557]*/
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001994{
1995 char swap, *head, *tail;
1996 Py_ssize_t i, j, n = Py_SIZE(self);
1997
1998 j = n / 2;
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +02001999 head = PyByteArray_AS_STRING(self);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002000 tail = head + n - 1;
2001 for (i = 0; i < j; i++) {
2002 swap = *head;
2003 *head++ = *tail;
2004 *tail-- = swap;
2005 }
2006
2007 Py_RETURN_NONE;
2008}
2009
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002010
2011/*[python input]
2012class bytesvalue_converter(CConverter):
2013 type = 'int'
2014 converter = '_getbytevalue'
2015[python start generated code]*/
2016/*[python end generated code: output=da39a3ee5e6b4b0d input=29c2e7c26c212812]*/
2017
2018
2019/*[clinic input]
2020bytearray.insert
2021
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002022 index: Py_ssize_t
2023 The index where the value is to be inserted.
2024 item: bytesvalue
2025 The item to be inserted.
2026 /
2027
2028Insert a single item into the bytearray before the given index.
2029[clinic start generated code]*/
2030
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002031static PyObject *
2032bytearray_insert_impl(PyByteArrayObject *self, Py_ssize_t index, int item)
Serhiy Storchaka7a9579c2016-05-02 13:45:20 +03002033/*[clinic end generated code: output=76c775a70e7b07b7 input=b2b5d07e9de6c070]*/
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002034{
2035 Py_ssize_t n = Py_SIZE(self);
2036 char *buf;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002037
2038 if (n == PY_SSIZE_T_MAX) {
2039 PyErr_SetString(PyExc_OverflowError,
Mark Dickinson2b6705f2009-09-06 10:34:47 +00002040 "cannot add more objects to bytearray");
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002041 return NULL;
2042 }
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002043 if (PyByteArray_Resize((PyObject *)self, n + 1) < 0)
2044 return NULL;
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +02002045 buf = PyByteArray_AS_STRING(self);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002046
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002047 if (index < 0) {
2048 index += n;
2049 if (index < 0)
2050 index = 0;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002051 }
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002052 if (index > n)
2053 index = n;
2054 memmove(buf + index + 1, buf + index, n - index);
2055 buf[index] = item;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002056
2057 Py_RETURN_NONE;
2058}
2059
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002060/*[clinic input]
2061bytearray.append
2062
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002063 item: bytesvalue
2064 The item to be appended.
2065 /
2066
2067Append a single item to the end of the bytearray.
2068[clinic start generated code]*/
2069
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002070static PyObject *
2071bytearray_append_impl(PyByteArrayObject *self, int item)
Serhiy Storchaka7a9579c2016-05-02 13:45:20 +03002072/*[clinic end generated code: output=a154e19ed1886cb6 input=20d6bec3d1340593]*/
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002073{
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002074 Py_ssize_t n = Py_SIZE(self);
2075
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002076 if (n == PY_SSIZE_T_MAX) {
2077 PyErr_SetString(PyExc_OverflowError,
Mark Dickinson2b6705f2009-09-06 10:34:47 +00002078 "cannot add more objects to bytearray");
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002079 return NULL;
2080 }
2081 if (PyByteArray_Resize((PyObject *)self, n + 1) < 0)
2082 return NULL;
2083
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002084 PyByteArray_AS_STRING(self)[n] = item;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002085
2086 Py_RETURN_NONE;
2087}
2088
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002089/*[clinic input]
2090bytearray.extend
2091
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002092 iterable_of_ints: object
2093 The iterable of items to append.
2094 /
2095
2096Append all the items from the iterator or sequence to the end of the bytearray.
2097[clinic start generated code]*/
2098
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002099static PyObject *
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002100bytearray_extend(PyByteArrayObject *self, PyObject *iterable_of_ints)
Serhiy Storchaka7a9579c2016-05-02 13:45:20 +03002101/*[clinic end generated code: output=98155dbe249170b1 input=c617b3a93249ba28]*/
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002102{
Benjamin Peterson153c70f2009-04-18 15:42:12 +00002103 PyObject *it, *item, *bytearray_obj;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002104 Py_ssize_t buf_size = 0, len = 0;
2105 int value;
2106 char *buf;
2107
Benjamin Peterson153c70f2009-04-18 15:42:12 +00002108 /* bytearray_setslice code only accepts something supporting PEP 3118. */
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002109 if (PyObject_CheckBuffer(iterable_of_ints)) {
2110 if (bytearray_setslice(self, Py_SIZE(self), Py_SIZE(self), iterable_of_ints) == -1)
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002111 return NULL;
2112
2113 Py_RETURN_NONE;
2114 }
2115
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002116 it = PyObject_GetIter(iterable_of_ints);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002117 if (it == NULL)
2118 return NULL;
2119
Ezio Melotti42da6632011-03-15 05:18:48 +02002120 /* Try to determine the length of the argument. 32 is arbitrary. */
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002121 buf_size = PyObject_LengthHint(iterable_of_ints, 32);
Benjamin Petersonef3e4c22009-04-11 19:48:14 +00002122 if (buf_size == -1) {
2123 Py_DECREF(it);
2124 return NULL;
2125 }
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002126
Benjamin Peterson153c70f2009-04-18 15:42:12 +00002127 bytearray_obj = PyByteArray_FromStringAndSize(NULL, buf_size);
Antoine Pitrou58bb82e2012-04-01 16:05:46 +02002128 if (bytearray_obj == NULL) {
2129 Py_DECREF(it);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002130 return NULL;
Antoine Pitrou58bb82e2012-04-01 16:05:46 +02002131 }
Benjamin Peterson153c70f2009-04-18 15:42:12 +00002132 buf = PyByteArray_AS_STRING(bytearray_obj);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002133
2134 while ((item = PyIter_Next(it)) != NULL) {
2135 if (! _getbytevalue(item, &value)) {
2136 Py_DECREF(item);
2137 Py_DECREF(it);
Benjamin Peterson153c70f2009-04-18 15:42:12 +00002138 Py_DECREF(bytearray_obj);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002139 return NULL;
2140 }
2141 buf[len++] = value;
2142 Py_DECREF(item);
2143
2144 if (len >= buf_size) {
2145 buf_size = len + (len >> 1) + 1;
Benjamin Peterson153c70f2009-04-18 15:42:12 +00002146 if (PyByteArray_Resize((PyObject *)bytearray_obj, buf_size) < 0) {
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002147 Py_DECREF(it);
Benjamin Peterson153c70f2009-04-18 15:42:12 +00002148 Py_DECREF(bytearray_obj);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002149 return NULL;
2150 }
2151 /* Recompute the `buf' pointer, since the resizing operation may
2152 have invalidated it. */
Benjamin Peterson153c70f2009-04-18 15:42:12 +00002153 buf = PyByteArray_AS_STRING(bytearray_obj);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002154 }
2155 }
2156 Py_DECREF(it);
2157
2158 /* Resize down to exact size. */
Benjamin Peterson153c70f2009-04-18 15:42:12 +00002159 if (PyByteArray_Resize((PyObject *)bytearray_obj, len) < 0) {
2160 Py_DECREF(bytearray_obj);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002161 return NULL;
2162 }
2163
Antoine Pitrou58bb82e2012-04-01 16:05:46 +02002164 if (bytearray_setslice(self, Py_SIZE(self), Py_SIZE(self), bytearray_obj) == -1) {
2165 Py_DECREF(bytearray_obj);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002166 return NULL;
Antoine Pitrou58bb82e2012-04-01 16:05:46 +02002167 }
Benjamin Peterson153c70f2009-04-18 15:42:12 +00002168 Py_DECREF(bytearray_obj);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002169
2170 Py_RETURN_NONE;
2171}
2172
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002173/*[clinic input]
2174bytearray.pop
2175
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002176 index: Py_ssize_t = -1
2177 The index from where to remove the item.
2178 -1 (the default value) means remove the last item.
2179 /
2180
2181Remove and return a single item from B.
2182
2183If no index argument is given, will pop the last item.
2184[clinic start generated code]*/
2185
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002186static PyObject *
2187bytearray_pop_impl(PyByteArrayObject *self, Py_ssize_t index)
Serhiy Storchaka7a9579c2016-05-02 13:45:20 +03002188/*[clinic end generated code: output=e0ccd401f8021da8 input=3591df2d06c0d237]*/
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002189{
2190 int value;
2191 Py_ssize_t n = Py_SIZE(self);
2192 char *buf;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002193
2194 if (n == 0) {
Eli Bendersky1bc4f192011-03-04 04:55:25 +00002195 PyErr_SetString(PyExc_IndexError,
2196 "pop from empty bytearray");
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002197 return NULL;
2198 }
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002199 if (index < 0)
2200 index += Py_SIZE(self);
2201 if (index < 0 || index >= Py_SIZE(self)) {
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002202 PyErr_SetString(PyExc_IndexError, "pop index out of range");
2203 return NULL;
2204 }
Antoine Pitrou5504e892008-12-06 21:27:53 +00002205 if (!_canresize(self))
2206 return NULL;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002207
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +02002208 buf = PyByteArray_AS_STRING(self);
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002209 value = buf[index];
2210 memmove(buf + index, buf + index + 1, n - index);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002211 if (PyByteArray_Resize((PyObject *)self, n - 1) < 0)
2212 return NULL;
2213
Mark Dickinson54a3db92009-09-06 10:19:23 +00002214 return PyLong_FromLong((unsigned char)value);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002215}
2216
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002217/*[clinic input]
2218bytearray.remove
2219
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002220 value: bytesvalue
2221 The value to remove.
2222 /
2223
2224Remove the first occurrence of a value in the bytearray.
2225[clinic start generated code]*/
2226
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002227static PyObject *
2228bytearray_remove_impl(PyByteArrayObject *self, int value)
Serhiy Storchaka7a9579c2016-05-02 13:45:20 +03002229/*[clinic end generated code: output=d659e37866709c13 input=121831240cd51ddf]*/
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002230{
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002231 Py_ssize_t where, n = Py_SIZE(self);
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +02002232 char *buf = PyByteArray_AS_STRING(self);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002233
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002234 for (where = 0; where < n; where++) {
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +02002235 if (buf[where] == value)
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002236 break;
2237 }
2238 if (where == n) {
Mark Dickinson2b6705f2009-09-06 10:34:47 +00002239 PyErr_SetString(PyExc_ValueError, "value not found in bytearray");
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002240 return NULL;
2241 }
Antoine Pitrou5504e892008-12-06 21:27:53 +00002242 if (!_canresize(self))
2243 return NULL;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002244
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +02002245 memmove(buf + where, buf + where + 1, n - where);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002246 if (PyByteArray_Resize((PyObject *)self, n - 1) < 0)
2247 return NULL;
2248
2249 Py_RETURN_NONE;
2250}
2251
2252/* XXX These two helpers could be optimized if argsize == 1 */
2253
2254static Py_ssize_t
Serhiy Storchakaef1585e2015-12-25 20:01:53 +02002255lstrip_helper(const char *myptr, Py_ssize_t mysize,
2256 const void *argptr, Py_ssize_t argsize)
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002257{
2258 Py_ssize_t i = 0;
Antoine Pitrou5b720752013-10-05 21:24:10 +02002259 while (i < mysize && memchr(argptr, (unsigned char) myptr[i], argsize))
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002260 i++;
2261 return i;
2262}
2263
2264static Py_ssize_t
Serhiy Storchakaef1585e2015-12-25 20:01:53 +02002265rstrip_helper(const char *myptr, Py_ssize_t mysize,
2266 const void *argptr, Py_ssize_t argsize)
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002267{
2268 Py_ssize_t i = mysize - 1;
Antoine Pitrou5b720752013-10-05 21:24:10 +02002269 while (i >= 0 && memchr(argptr, (unsigned char) myptr[i], argsize))
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002270 i--;
2271 return i + 1;
2272}
2273
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002274/*[clinic input]
2275bytearray.strip
2276
2277 bytes: object = None
2278 /
2279
2280Strip leading and trailing bytes contained in the argument.
2281
2282If the argument is omitted or None, strip leading and trailing ASCII whitespace.
2283[clinic start generated code]*/
2284
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002285static PyObject *
2286bytearray_strip_impl(PyByteArrayObject *self, PyObject *bytes)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03002287/*[clinic end generated code: output=760412661a34ad5a input=ef7bb59b09c21d62]*/
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002288{
2289 Py_ssize_t left, right, mysize, byteslen;
2290 char *myptr, *bytesptr;
2291 Py_buffer vbytes;
2292
2293 if (bytes == Py_None) {
2294 bytesptr = "\t\n\r\f\v ";
2295 byteslen = 6;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002296 }
2297 else {
Serhiy Storchaka3dd3e262015-02-03 01:25:42 +02002298 if (PyObject_GetBuffer(bytes, &vbytes, PyBUF_SIMPLE) != 0)
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002299 return NULL;
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002300 bytesptr = (char *) vbytes.buf;
2301 byteslen = vbytes.len;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002302 }
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +02002303 myptr = PyByteArray_AS_STRING(self);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002304 mysize = Py_SIZE(self);
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002305 left = lstrip_helper(myptr, mysize, bytesptr, byteslen);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002306 if (left == mysize)
2307 right = left;
2308 else
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002309 right = rstrip_helper(myptr, mysize, bytesptr, byteslen);
2310 if (bytes != Py_None)
2311 PyBuffer_Release(&vbytes);
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +02002312 return PyByteArray_FromStringAndSize(myptr + left, right - left);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002313}
2314
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002315/*[clinic input]
2316bytearray.lstrip
2317
2318 bytes: object = None
2319 /
2320
2321Strip leading bytes contained in the argument.
2322
2323If the argument is omitted or None, strip leading ASCII whitespace.
2324[clinic start generated code]*/
2325
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002326static PyObject *
2327bytearray_lstrip_impl(PyByteArrayObject *self, PyObject *bytes)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03002328/*[clinic end generated code: output=d005c9d0ab909e66 input=80843f975dd7c480]*/
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002329{
2330 Py_ssize_t left, right, mysize, byteslen;
2331 char *myptr, *bytesptr;
2332 Py_buffer vbytes;
2333
2334 if (bytes == Py_None) {
2335 bytesptr = "\t\n\r\f\v ";
2336 byteslen = 6;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002337 }
2338 else {
Serhiy Storchaka3dd3e262015-02-03 01:25:42 +02002339 if (PyObject_GetBuffer(bytes, &vbytes, PyBUF_SIMPLE) != 0)
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002340 return NULL;
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002341 bytesptr = (char *) vbytes.buf;
2342 byteslen = vbytes.len;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002343 }
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +02002344 myptr = PyByteArray_AS_STRING(self);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002345 mysize = Py_SIZE(self);
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002346 left = lstrip_helper(myptr, mysize, bytesptr, byteslen);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002347 right = mysize;
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002348 if (bytes != Py_None)
2349 PyBuffer_Release(&vbytes);
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +02002350 return PyByteArray_FromStringAndSize(myptr + left, right - left);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002351}
2352
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002353/*[clinic input]
2354bytearray.rstrip
2355
2356 bytes: object = None
2357 /
2358
2359Strip trailing bytes contained in the argument.
2360
2361If the argument is omitted or None, strip trailing ASCII whitespace.
2362[clinic start generated code]*/
2363
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002364static PyObject *
2365bytearray_rstrip_impl(PyByteArrayObject *self, PyObject *bytes)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03002366/*[clinic end generated code: output=030e2fbd2f7276bd input=e728b994954cfd91]*/
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002367{
2368 Py_ssize_t right, mysize, byteslen;
2369 char *myptr, *bytesptr;
2370 Py_buffer vbytes;
2371
2372 if (bytes == Py_None) {
2373 bytesptr = "\t\n\r\f\v ";
2374 byteslen = 6;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002375 }
2376 else {
Serhiy Storchaka3dd3e262015-02-03 01:25:42 +02002377 if (PyObject_GetBuffer(bytes, &vbytes, PyBUF_SIMPLE) != 0)
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002378 return NULL;
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002379 bytesptr = (char *) vbytes.buf;
2380 byteslen = vbytes.len;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002381 }
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +02002382 myptr = PyByteArray_AS_STRING(self);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002383 mysize = Py_SIZE(self);
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002384 right = rstrip_helper(myptr, mysize, bytesptr, byteslen);
2385 if (bytes != Py_None)
2386 PyBuffer_Release(&vbytes);
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +02002387 return PyByteArray_FromStringAndSize(myptr, right);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002388}
2389
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002390/*[clinic input]
2391bytearray.decode
2392
2393 encoding: str(c_default="NULL") = 'utf-8'
2394 The encoding with which to decode the bytearray.
2395 errors: str(c_default="NULL") = 'strict'
2396 The error handling scheme to use for the handling of decoding errors.
2397 The default is 'strict' meaning that decoding errors raise a
2398 UnicodeDecodeError. Other possible values are 'ignore' and 'replace'
2399 as well as any other name registered with codecs.register_error that
2400 can handle UnicodeDecodeErrors.
2401
2402Decode the bytearray using the codec registered for encoding.
2403[clinic start generated code]*/
2404
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002405static PyObject *
Larry Hastings89964c42015-04-14 18:07:59 -04002406bytearray_decode_impl(PyByteArrayObject *self, const char *encoding,
2407 const char *errors)
2408/*[clinic end generated code: output=f57d43f4a00b42c5 input=f28d8f903020257b]*/
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002409{
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002410 if (encoding == NULL)
2411 encoding = PyUnicode_GetDefaultEncoding();
Martin v. Löwis0efea322014-07-27 17:29:17 +02002412 return PyUnicode_FromEncodedObject((PyObject*)self, encoding, errors);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002413}
2414
2415PyDoc_STRVAR(alloc_doc,
2416"B.__alloc__() -> int\n\
2417\n\
Georg Brandl17cb8a82008-05-30 08:20:09 +00002418Return the number of bytes actually allocated.");
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002419
2420static PyObject *
Benjamin Peterson153c70f2009-04-18 15:42:12 +00002421bytearray_alloc(PyByteArrayObject *self)
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002422{
2423 return PyLong_FromSsize_t(self->ob_alloc);
2424}
2425
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002426/*[clinic input]
2427bytearray.join
2428
2429 iterable_of_bytes: object
2430 /
2431
2432Concatenate any number of bytes/bytearray objects.
2433
2434The bytearray whose method is called is inserted in between each pair.
2435
2436The result is returned as a new bytearray object.
2437[clinic start generated code]*/
2438
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002439static PyObject *
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002440bytearray_join(PyByteArrayObject *self, PyObject *iterable_of_bytes)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03002441/*[clinic end generated code: output=a8516370bf68ae08 input=aba6b1f9b30fcb8e]*/
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002442{
Martin v. Löwis0efea322014-07-27 17:29:17 +02002443 return stringlib_bytes_join((PyObject*)self, iterable_of_bytes);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002444}
2445
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002446/*[clinic input]
2447bytearray.splitlines
Antoine Pitrouf2c54842010-01-13 08:07:53 +00002448
Serhiy Storchaka8b2e8b62015-05-30 11:30:39 +03002449 keepends: int(c_default="0") = False
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002450
2451Return a list of the lines in the bytearray, breaking at line boundaries.
2452
2453Line breaks are not included in the resulting list unless keepends is given and
2454true.
2455[clinic start generated code]*/
2456
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002457static PyObject *
2458bytearray_splitlines_impl(PyByteArrayObject *self, int keepends)
Serhiy Storchaka8b2e8b62015-05-30 11:30:39 +03002459/*[clinic end generated code: output=4223c94b895f6ad9 input=8ccade941e5ea0bd]*/
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002460{
Antoine Pitrouf2c54842010-01-13 08:07:53 +00002461 return stringlib_splitlines(
2462 (PyObject*) self, PyByteArray_AS_STRING(self),
2463 PyByteArray_GET_SIZE(self), keepends
2464 );
2465}
2466
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002467/*[clinic input]
2468@classmethod
2469bytearray.fromhex
2470
2471 cls: self(type="PyObject*")
2472 string: unicode
2473 /
2474
2475Create a bytearray object from a string of hexadecimal numbers.
2476
2477Spaces between two numbers are accepted.
2478Example: bytearray.fromhex('B9 01EF') -> bytearray(b'\\xb9\\x01\\xef')
2479[clinic start generated code]*/
2480
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002481static PyObject *
2482bytearray_fromhex_impl(PyObject*cls, PyObject *string)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03002483/*[clinic end generated code: output=df3da60129b3700c input=907bbd2d34d9367a]*/
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002484{
Victor Stinner2bf89932015-10-14 11:25:33 +02002485 return _PyBytes_FromHex(string, 1);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002486}
2487
Gregory P. Smith8cb65692015-04-25 23:22:26 +00002488PyDoc_STRVAR(hex__doc__,
2489"B.hex() -> string\n\
2490\n\
2491Create a string of hexadecimal numbers from a bytearray object.\n\
2492Example: bytearray([0xb9, 0x01, 0xef]).hex() -> 'b901ef'.");
2493
2494static PyObject *
2495bytearray_hex(PyBytesObject *self)
2496{
2497 char* argbuf = PyByteArray_AS_STRING(self);
2498 Py_ssize_t arglen = PyByteArray_GET_SIZE(self);
2499 return _Py_strhex(argbuf, arglen);
2500}
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002501
2502static PyObject *
Antoine Pitroub0e1f8b2011-12-05 20:40:08 +01002503_common_reduce(PyByteArrayObject *self, int proto)
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002504{
Antoine Pitroub0e1f8b2011-12-05 20:40:08 +01002505 PyObject *dict;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02002506 _Py_IDENTIFIER(__dict__);
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +02002507 char *buf;
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02002508
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02002509 dict = _PyObject_GetAttrId((PyObject *)self, &PyId___dict__);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002510 if (dict == NULL) {
2511 PyErr_Clear();
2512 dict = Py_None;
2513 Py_INCREF(dict);
2514 }
2515
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +02002516 buf = PyByteArray_AS_STRING(self);
Antoine Pitroub0e1f8b2011-12-05 20:40:08 +01002517 if (proto < 3) {
2518 /* use str based reduction for backwards compatibility with Python 2.x */
2519 PyObject *latin1;
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +02002520 if (Py_SIZE(self))
2521 latin1 = PyUnicode_DecodeLatin1(buf, Py_SIZE(self), NULL);
Antoine Pitroub0e1f8b2011-12-05 20:40:08 +01002522 else
2523 latin1 = PyUnicode_FromString("");
2524 return Py_BuildValue("(O(Ns)N)", Py_TYPE(self), latin1, "latin-1", dict);
2525 }
2526 else {
2527 /* use more efficient byte based reduction */
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +02002528 if (Py_SIZE(self)) {
2529 return Py_BuildValue("(O(y#)N)", Py_TYPE(self), buf, Py_SIZE(self), dict);
Antoine Pitroub0e1f8b2011-12-05 20:40:08 +01002530 }
2531 else {
2532 return Py_BuildValue("(O()N)", Py_TYPE(self), dict);
2533 }
2534 }
2535}
2536
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002537/*[clinic input]
2538bytearray.__reduce__ as bytearray_reduce
2539
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002540Return state information for pickling.
2541[clinic start generated code]*/
2542
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002543static PyObject *
2544bytearray_reduce_impl(PyByteArrayObject *self)
Serhiy Storchaka7a9579c2016-05-02 13:45:20 +03002545/*[clinic end generated code: output=52bf304086464cab input=44b5737ada62dd3f]*/
Antoine Pitroub0e1f8b2011-12-05 20:40:08 +01002546{
2547 return _common_reduce(self, 2);
2548}
2549
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002550/*[clinic input]
2551bytearray.__reduce_ex__ as bytearray_reduce_ex
2552
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002553 proto: int = 0
2554 /
2555
2556Return state information for pickling.
2557[clinic start generated code]*/
2558
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002559static PyObject *
2560bytearray_reduce_ex_impl(PyByteArrayObject *self, int proto)
Serhiy Storchaka7a9579c2016-05-02 13:45:20 +03002561/*[clinic end generated code: output=52eac33377197520 input=f129bc1a1aa151ee]*/
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002562{
Antoine Pitroub0e1f8b2011-12-05 20:40:08 +01002563 return _common_reduce(self, proto);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002564}
2565
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002566/*[clinic input]
2567bytearray.__sizeof__ as bytearray_sizeof
2568
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002569Returns the size of the bytearray object in memory, in bytes.
2570[clinic start generated code]*/
2571
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002572static PyObject *
2573bytearray_sizeof_impl(PyByteArrayObject *self)
Serhiy Storchaka7a9579c2016-05-02 13:45:20 +03002574/*[clinic end generated code: output=738abdd17951c427 input=e27320fd98a4bc5a]*/
Robert Schuppeniesfbe94c52008-07-14 10:13:31 +00002575{
Benjamin Petersonef3e4c22009-04-11 19:48:14 +00002576 Py_ssize_t res;
Robert Schuppeniesfbe94c52008-07-14 10:13:31 +00002577
Serhiy Storchaka5c4064e2015-12-19 20:05:25 +02002578 res = _PyObject_SIZE(Py_TYPE(self)) + self->ob_alloc * sizeof(char);
Benjamin Petersonef3e4c22009-04-11 19:48:14 +00002579 return PyLong_FromSsize_t(res);
Robert Schuppeniesfbe94c52008-07-14 10:13:31 +00002580}
2581
Benjamin Peterson153c70f2009-04-18 15:42:12 +00002582static PySequenceMethods bytearray_as_sequence = {
2583 (lenfunc)bytearray_length, /* sq_length */
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002584 (binaryfunc)PyByteArray_Concat, /* sq_concat */
Benjamin Peterson153c70f2009-04-18 15:42:12 +00002585 (ssizeargfunc)bytearray_repeat, /* sq_repeat */
2586 (ssizeargfunc)bytearray_getitem, /* sq_item */
2587 0, /* sq_slice */
2588 (ssizeobjargproc)bytearray_setitem, /* sq_ass_item */
2589 0, /* sq_ass_slice */
2590 (objobjproc)bytearray_contains, /* sq_contains */
2591 (binaryfunc)bytearray_iconcat, /* sq_inplace_concat */
2592 (ssizeargfunc)bytearray_irepeat, /* sq_inplace_repeat */
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002593};
2594
Benjamin Peterson153c70f2009-04-18 15:42:12 +00002595static PyMappingMethods bytearray_as_mapping = {
2596 (lenfunc)bytearray_length,
2597 (binaryfunc)bytearray_subscript,
2598 (objobjargproc)bytearray_ass_subscript,
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002599};
2600
Benjamin Peterson153c70f2009-04-18 15:42:12 +00002601static PyBufferProcs bytearray_as_buffer = {
2602 (getbufferproc)bytearray_getbuffer,
2603 (releasebufferproc)bytearray_releasebuffer,
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002604};
2605
2606static PyMethodDef
Benjamin Peterson153c70f2009-04-18 15:42:12 +00002607bytearray_methods[] = {
2608 {"__alloc__", (PyCFunction)bytearray_alloc, METH_NOARGS, alloc_doc},
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002609 BYTEARRAY_REDUCE_METHODDEF
2610 BYTEARRAY_REDUCE_EX_METHODDEF
2611 BYTEARRAY_SIZEOF_METHODDEF
2612 BYTEARRAY_APPEND_METHODDEF
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002613 {"capitalize", (PyCFunction)stringlib_capitalize, METH_NOARGS,
2614 _Py_capitalize__doc__},
Serhiy Storchakadd40fc32016-05-04 22:23:26 +03002615 {"center", (PyCFunction)stringlib_center, METH_VARARGS, _Py_center__doc__},
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002616 BYTEARRAY_CLEAR_METHODDEF
2617 BYTEARRAY_COPY_METHODDEF
Serhiy Storchakadd40fc32016-05-04 22:23:26 +03002618 {"count", (PyCFunction)bytearray_count, METH_VARARGS,
2619 _Py_count__doc__},
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002620 BYTEARRAY_DECODE_METHODDEF
Serhiy Storchakadd40fc32016-05-04 22:23:26 +03002621 {"endswith", (PyCFunction)bytearray_endswith, METH_VARARGS,
2622 _Py_endswith__doc__},
Ezio Melotti745d54d2013-11-16 19:10:57 +02002623 {"expandtabs", (PyCFunction)stringlib_expandtabs, METH_VARARGS | METH_KEYWORDS,
Serhiy Storchakadd40fc32016-05-04 22:23:26 +03002624 _Py_expandtabs__doc__},
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002625 BYTEARRAY_EXTEND_METHODDEF
Serhiy Storchakadd40fc32016-05-04 22:23:26 +03002626 {"find", (PyCFunction)bytearray_find, METH_VARARGS,
2627 _Py_find__doc__},
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002628 BYTEARRAY_FROMHEX_METHODDEF
Gregory P. Smith8cb65692015-04-25 23:22:26 +00002629 {"hex", (PyCFunction)bytearray_hex, METH_NOARGS, hex__doc__},
Serhiy Storchakadd40fc32016-05-04 22:23:26 +03002630 {"index", (PyCFunction)bytearray_index, METH_VARARGS, _Py_index__doc__},
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002631 BYTEARRAY_INSERT_METHODDEF
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002632 {"isalnum", (PyCFunction)stringlib_isalnum, METH_NOARGS,
2633 _Py_isalnum__doc__},
2634 {"isalpha", (PyCFunction)stringlib_isalpha, METH_NOARGS,
2635 _Py_isalpha__doc__},
2636 {"isdigit", (PyCFunction)stringlib_isdigit, METH_NOARGS,
2637 _Py_isdigit__doc__},
2638 {"islower", (PyCFunction)stringlib_islower, METH_NOARGS,
2639 _Py_islower__doc__},
2640 {"isspace", (PyCFunction)stringlib_isspace, METH_NOARGS,
2641 _Py_isspace__doc__},
2642 {"istitle", (PyCFunction)stringlib_istitle, METH_NOARGS,
2643 _Py_istitle__doc__},
2644 {"isupper", (PyCFunction)stringlib_isupper, METH_NOARGS,
2645 _Py_isupper__doc__},
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002646 BYTEARRAY_JOIN_METHODDEF
Serhiy Storchakadd40fc32016-05-04 22:23:26 +03002647 {"ljust", (PyCFunction)stringlib_ljust, METH_VARARGS, _Py_ljust__doc__},
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002648 {"lower", (PyCFunction)stringlib_lower, METH_NOARGS, _Py_lower__doc__},
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002649 BYTEARRAY_LSTRIP_METHODDEF
2650 BYTEARRAY_MAKETRANS_METHODDEF
2651 BYTEARRAY_PARTITION_METHODDEF
2652 BYTEARRAY_POP_METHODDEF
2653 BYTEARRAY_REMOVE_METHODDEF
2654 BYTEARRAY_REPLACE_METHODDEF
2655 BYTEARRAY_REVERSE_METHODDEF
Serhiy Storchakadd40fc32016-05-04 22:23:26 +03002656 {"rfind", (PyCFunction)bytearray_rfind, METH_VARARGS, _Py_rfind__doc__},
2657 {"rindex", (PyCFunction)bytearray_rindex, METH_VARARGS, _Py_rindex__doc__},
2658 {"rjust", (PyCFunction)stringlib_rjust, METH_VARARGS, _Py_rjust__doc__},
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002659 BYTEARRAY_RPARTITION_METHODDEF
2660 BYTEARRAY_RSPLIT_METHODDEF
2661 BYTEARRAY_RSTRIP_METHODDEF
2662 BYTEARRAY_SPLIT_METHODDEF
2663 BYTEARRAY_SPLITLINES_METHODDEF
Benjamin Peterson153c70f2009-04-18 15:42:12 +00002664 {"startswith", (PyCFunction)bytearray_startswith, METH_VARARGS ,
Serhiy Storchakadd40fc32016-05-04 22:23:26 +03002665 _Py_startswith__doc__},
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002666 BYTEARRAY_STRIP_METHODDEF
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002667 {"swapcase", (PyCFunction)stringlib_swapcase, METH_NOARGS,
2668 _Py_swapcase__doc__},
2669 {"title", (PyCFunction)stringlib_title, METH_NOARGS, _Py_title__doc__},
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002670 BYTEARRAY_TRANSLATE_METHODDEF
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002671 {"upper", (PyCFunction)stringlib_upper, METH_NOARGS, _Py_upper__doc__},
Serhiy Storchakadd40fc32016-05-04 22:23:26 +03002672 {"zfill", (PyCFunction)stringlib_zfill, METH_VARARGS, _Py_zfill__doc__},
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002673 {NULL}
2674};
2675
Ethan Furmanb95b5612015-01-23 20:05:18 -08002676static PyObject *
2677bytearray_mod(PyObject *v, PyObject *w)
2678{
2679 if (!PyByteArray_Check(v))
2680 Py_RETURN_NOTIMPLEMENTED;
Berker Peksag43de36d2016-04-16 01:20:47 +03002681 return _PyBytes_FormatEx(PyByteArray_AS_STRING(v), PyByteArray_GET_SIZE(v), w, 1);
Ethan Furmanb95b5612015-01-23 20:05:18 -08002682}
2683
2684static PyNumberMethods bytearray_as_number = {
2685 0, /*nb_add*/
2686 0, /*nb_subtract*/
2687 0, /*nb_multiply*/
2688 bytearray_mod, /*nb_remainder*/
2689};
2690
Benjamin Peterson153c70f2009-04-18 15:42:12 +00002691PyDoc_STRVAR(bytearray_doc,
Georg Brandl17cb8a82008-05-30 08:20:09 +00002692"bytearray(iterable_of_ints) -> bytearray\n\
2693bytearray(string, encoding[, errors]) -> bytearray\n\
Victor Stinnerbb2e9c42011-12-17 23:18:07 +01002694bytearray(bytes_or_buffer) -> mutable copy of bytes_or_buffer\n\
2695bytearray(int) -> bytes array of size given by the parameter initialized with null bytes\n\
2696bytearray() -> empty bytes array\n\
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002697\n\
Serhiy Storchaka6a7b3a72016-04-17 08:32:47 +03002698Construct a mutable bytearray object from:\n\
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002699 - an iterable yielding integers in range(256)\n\
2700 - a text string encoded using the specified encoding\n\
Victor Stinnerbb2e9c42011-12-17 23:18:07 +01002701 - a bytes or a buffer object\n\
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002702 - any object implementing the buffer API.\n\
Victor Stinnerbb2e9c42011-12-17 23:18:07 +01002703 - an integer");
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002704
2705
Benjamin Peterson153c70f2009-04-18 15:42:12 +00002706static PyObject *bytearray_iter(PyObject *seq);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002707
2708PyTypeObject PyByteArray_Type = {
2709 PyVarObject_HEAD_INIT(&PyType_Type, 0)
2710 "bytearray",
2711 sizeof(PyByteArrayObject),
2712 0,
Benjamin Peterson153c70f2009-04-18 15:42:12 +00002713 (destructor)bytearray_dealloc, /* tp_dealloc */
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002714 0, /* tp_print */
2715 0, /* tp_getattr */
2716 0, /* tp_setattr */
Mark Dickinsone94c6792009-02-02 20:36:42 +00002717 0, /* tp_reserved */
Benjamin Peterson153c70f2009-04-18 15:42:12 +00002718 (reprfunc)bytearray_repr, /* tp_repr */
Ethan Furmanb95b5612015-01-23 20:05:18 -08002719 &bytearray_as_number, /* tp_as_number */
Benjamin Peterson153c70f2009-04-18 15:42:12 +00002720 &bytearray_as_sequence, /* tp_as_sequence */
2721 &bytearray_as_mapping, /* tp_as_mapping */
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002722 0, /* tp_hash */
2723 0, /* tp_call */
Benjamin Peterson153c70f2009-04-18 15:42:12 +00002724 bytearray_str, /* tp_str */
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002725 PyObject_GenericGetAttr, /* tp_getattro */
2726 0, /* tp_setattro */
Benjamin Peterson153c70f2009-04-18 15:42:12 +00002727 &bytearray_as_buffer, /* tp_as_buffer */
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002728 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
Benjamin Peterson153c70f2009-04-18 15:42:12 +00002729 bytearray_doc, /* tp_doc */
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002730 0, /* tp_traverse */
2731 0, /* tp_clear */
Benjamin Peterson153c70f2009-04-18 15:42:12 +00002732 (richcmpfunc)bytearray_richcompare, /* tp_richcompare */
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002733 0, /* tp_weaklistoffset */
Benjamin Peterson153c70f2009-04-18 15:42:12 +00002734 bytearray_iter, /* tp_iter */
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002735 0, /* tp_iternext */
Benjamin Peterson153c70f2009-04-18 15:42:12 +00002736 bytearray_methods, /* tp_methods */
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002737 0, /* tp_members */
2738 0, /* tp_getset */
2739 0, /* tp_base */
2740 0, /* tp_dict */
2741 0, /* tp_descr_get */
2742 0, /* tp_descr_set */
2743 0, /* tp_dictoffset */
Benjamin Peterson153c70f2009-04-18 15:42:12 +00002744 (initproc)bytearray_init, /* tp_init */
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002745 PyType_GenericAlloc, /* tp_alloc */
2746 PyType_GenericNew, /* tp_new */
2747 PyObject_Del, /* tp_free */
2748};
2749
2750/*********************** Bytes Iterator ****************************/
2751
2752typedef struct {
2753 PyObject_HEAD
2754 Py_ssize_t it_index;
2755 PyByteArrayObject *it_seq; /* Set to NULL when iterator is exhausted */
2756} bytesiterobject;
2757
2758static void
Benjamin Peterson153c70f2009-04-18 15:42:12 +00002759bytearrayiter_dealloc(bytesiterobject *it)
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002760{
2761 _PyObject_GC_UNTRACK(it);
2762 Py_XDECREF(it->it_seq);
2763 PyObject_GC_Del(it);
2764}
2765
2766static int
Benjamin Peterson153c70f2009-04-18 15:42:12 +00002767bytearrayiter_traverse(bytesiterobject *it, visitproc visit, void *arg)
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002768{
2769 Py_VISIT(it->it_seq);
2770 return 0;
2771}
2772
2773static PyObject *
Benjamin Peterson153c70f2009-04-18 15:42:12 +00002774bytearrayiter_next(bytesiterobject *it)
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002775{
2776 PyByteArrayObject *seq;
2777 PyObject *item;
2778
2779 assert(it != NULL);
2780 seq = it->it_seq;
2781 if (seq == NULL)
2782 return NULL;
2783 assert(PyByteArray_Check(seq));
2784
2785 if (it->it_index < PyByteArray_GET_SIZE(seq)) {
2786 item = PyLong_FromLong(
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +02002787 (unsigned char)PyByteArray_AS_STRING(seq)[it->it_index]);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002788 if (item != NULL)
2789 ++it->it_index;
2790 return item;
2791 }
2792
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002793 it->it_seq = NULL;
Serhiy Storchakafbb1c5e2016-03-30 20:40:02 +03002794 Py_DECREF(seq);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002795 return NULL;
2796}
2797
2798static PyObject *
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00002799bytearrayiter_length_hint(bytesiterobject *it)
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002800{
2801 Py_ssize_t len = 0;
2802 if (it->it_seq)
2803 len = PyByteArray_GET_SIZE(it->it_seq) - it->it_index;
2804 return PyLong_FromSsize_t(len);
2805}
2806
2807PyDoc_STRVAR(length_hint_doc,
2808 "Private method returning an estimate of len(list(it)).");
2809
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00002810static PyObject *
2811bytearrayiter_reduce(bytesiterobject *it)
2812{
2813 if (it->it_seq != NULL) {
Antoine Pitroua7013882012-04-05 00:04:20 +02002814 return Py_BuildValue("N(O)n", _PyObject_GetBuiltin("iter"),
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00002815 it->it_seq, it->it_index);
2816 } else {
2817 PyObject *u = PyUnicode_FromUnicode(NULL, 0);
2818 if (u == NULL)
2819 return NULL;
Antoine Pitroua7013882012-04-05 00:04:20 +02002820 return Py_BuildValue("N(N)", _PyObject_GetBuiltin("iter"), u);
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00002821 }
2822}
2823
2824static PyObject *
2825bytearrayiter_setstate(bytesiterobject *it, PyObject *state)
2826{
2827 Py_ssize_t index = PyLong_AsSsize_t(state);
2828 if (index == -1 && PyErr_Occurred())
2829 return NULL;
Kristján Valur Jónsson25dded02014-03-05 13:47:57 +00002830 if (it->it_seq != NULL) {
2831 if (index < 0)
2832 index = 0;
2833 else if (index > PyByteArray_GET_SIZE(it->it_seq))
2834 index = PyByteArray_GET_SIZE(it->it_seq); /* iterator exhausted */
2835 it->it_index = index;
2836 }
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00002837 Py_RETURN_NONE;
2838}
2839
2840PyDoc_STRVAR(setstate_doc, "Set state information for unpickling.");
2841
Benjamin Peterson153c70f2009-04-18 15:42:12 +00002842static PyMethodDef bytearrayiter_methods[] = {
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00002843 {"__length_hint__", (PyCFunction)bytearrayiter_length_hint, METH_NOARGS,
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002844 length_hint_doc},
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00002845 {"__reduce__", (PyCFunction)bytearrayiter_reduce, METH_NOARGS,
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002846 bytearray_reduce__doc__},
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00002847 {"__setstate__", (PyCFunction)bytearrayiter_setstate, METH_O,
2848 setstate_doc},
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002849 {NULL, NULL} /* sentinel */
2850};
2851
2852PyTypeObject PyByteArrayIter_Type = {
2853 PyVarObject_HEAD_INIT(&PyType_Type, 0)
2854 "bytearray_iterator", /* tp_name */
2855 sizeof(bytesiterobject), /* tp_basicsize */
2856 0, /* tp_itemsize */
2857 /* methods */
Benjamin Peterson153c70f2009-04-18 15:42:12 +00002858 (destructor)bytearrayiter_dealloc, /* tp_dealloc */
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002859 0, /* tp_print */
2860 0, /* tp_getattr */
2861 0, /* tp_setattr */
Mark Dickinsone94c6792009-02-02 20:36:42 +00002862 0, /* tp_reserved */
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002863 0, /* tp_repr */
2864 0, /* tp_as_number */
2865 0, /* tp_as_sequence */
2866 0, /* tp_as_mapping */
2867 0, /* tp_hash */
2868 0, /* tp_call */
2869 0, /* tp_str */
2870 PyObject_GenericGetAttr, /* tp_getattro */
2871 0, /* tp_setattro */
2872 0, /* tp_as_buffer */
2873 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC, /* tp_flags */
2874 0, /* tp_doc */
Benjamin Peterson153c70f2009-04-18 15:42:12 +00002875 (traverseproc)bytearrayiter_traverse, /* tp_traverse */
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002876 0, /* tp_clear */
2877 0, /* tp_richcompare */
2878 0, /* tp_weaklistoffset */
2879 PyObject_SelfIter, /* tp_iter */
Benjamin Peterson153c70f2009-04-18 15:42:12 +00002880 (iternextfunc)bytearrayiter_next, /* tp_iternext */
2881 bytearrayiter_methods, /* tp_methods */
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002882 0,
2883};
2884
2885static PyObject *
Benjamin Peterson153c70f2009-04-18 15:42:12 +00002886bytearray_iter(PyObject *seq)
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002887{
2888 bytesiterobject *it;
2889
2890 if (!PyByteArray_Check(seq)) {
2891 PyErr_BadInternalCall();
2892 return NULL;
2893 }
2894 it = PyObject_GC_New(bytesiterobject, &PyByteArrayIter_Type);
2895 if (it == NULL)
2896 return NULL;
2897 it->it_index = 0;
2898 Py_INCREF(seq);
2899 it->it_seq = (PyByteArrayObject *)seq;
2900 _PyObject_GC_TRACK(it);
2901 return (PyObject *)it;
2902}