blob: d0260c903efc9f0eb92f6ceb70b85e68456dabfa [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
1100/* The following Py_LOCAL_INLINE and Py_LOCAL functions
1101were copied from the old char* style string object. */
1102
Antoine Pitrouf2c54842010-01-13 08:07:53 +00001103/* helper macro to fixup start/end slice values */
1104#define ADJUST_INDICES(start, end, len) \
1105 if (end > len) \
1106 end = len; \
1107 else if (end < 0) { \
1108 end += len; \
1109 if (end < 0) \
1110 end = 0; \
1111 } \
1112 if (start < 0) { \
1113 start += len; \
1114 if (start < 0) \
1115 start = 0; \
1116 }
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001117
1118Py_LOCAL_INLINE(Py_ssize_t)
Benjamin Peterson153c70f2009-04-18 15:42:12 +00001119bytearray_find_internal(PyByteArrayObject *self, PyObject *args, int dir)
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001120{
1121 PyObject *subobj;
Antoine Pitrouac65d962011-10-20 23:54:17 +02001122 char byte;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001123 Py_buffer subbuf;
Antoine Pitrouac65d962011-10-20 23:54:17 +02001124 const char *sub;
Serhiy Storchakad9d769f2015-03-24 21:55:47 +02001125 Py_ssize_t len, sub_len;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001126 Py_ssize_t start=0, end=PY_SSIZE_T_MAX;
1127 Py_ssize_t res;
1128
Antoine Pitrouac65d962011-10-20 23:54:17 +02001129 if (!stringlib_parse_args_finds_byte("find/rfind/index/rindex",
1130 args, &subobj, &byte, &start, &end))
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001131 return -2;
Antoine Pitrouac65d962011-10-20 23:54:17 +02001132
1133 if (subobj) {
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +02001134 if (PyObject_GetBuffer(subobj, &subbuf, PyBUF_SIMPLE) != 0)
Antoine Pitrouac65d962011-10-20 23:54:17 +02001135 return -2;
1136
1137 sub = subbuf.buf;
1138 sub_len = subbuf.len;
1139 }
1140 else {
1141 sub = &byte;
1142 sub_len = 1;
1143 }
Serhiy Storchakad9d769f2015-03-24 21:55:47 +02001144 len = PyByteArray_GET_SIZE(self);
Antoine Pitrouac65d962011-10-20 23:54:17 +02001145
Serhiy Storchakad9d769f2015-03-24 21:55:47 +02001146 ADJUST_INDICES(start, end, len);
1147 if (end - start < sub_len)
1148 res = -1;
Serhiy Storchaka413fdce2015-11-14 15:42:17 +02001149 else if (sub_len == 1) {
1150 if (dir > 0)
1151 res = stringlib_find_char(
1152 PyByteArray_AS_STRING(self) + start, end - start,
1153 *sub);
1154 else
1155 res = stringlib_rfind_char(
1156 PyByteArray_AS_STRING(self) + start, end - start,
1157 *sub);
Serhiy Storchakad9d769f2015-03-24 21:55:47 +02001158 if (res >= 0)
1159 res += start;
1160 }
1161 else {
1162 if (dir > 0)
1163 res = stringlib_find_slice(
1164 PyByteArray_AS_STRING(self), len,
1165 sub, sub_len, start, end);
1166 else
1167 res = stringlib_rfind_slice(
1168 PyByteArray_AS_STRING(self), len,
1169 sub, sub_len, start, end);
1170 }
Antoine Pitrouac65d962011-10-20 23:54:17 +02001171
1172 if (subobj)
1173 PyBuffer_Release(&subbuf);
1174
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001175 return res;
1176}
1177
1178PyDoc_STRVAR(find__doc__,
Georg Brandl17cb8a82008-05-30 08:20:09 +00001179"B.find(sub[, start[, end]]) -> int\n\
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001180\n\
1181Return the lowest index in B where subsection sub is found,\n\
Senthil Kumaran53516a82011-07-27 23:33:54 +08001182such that sub is contained within B[start,end]. Optional\n\
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001183arguments start and end are interpreted as in slice notation.\n\
1184\n\
1185Return -1 on failure.");
1186
1187static PyObject *
Benjamin Peterson153c70f2009-04-18 15:42:12 +00001188bytearray_find(PyByteArrayObject *self, PyObject *args)
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001189{
Benjamin Peterson153c70f2009-04-18 15:42:12 +00001190 Py_ssize_t result = bytearray_find_internal(self, args, +1);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001191 if (result == -2)
1192 return NULL;
1193 return PyLong_FromSsize_t(result);
1194}
1195
1196PyDoc_STRVAR(count__doc__,
Georg Brandl17cb8a82008-05-30 08:20:09 +00001197"B.count(sub[, start[, end]]) -> int\n\
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001198\n\
1199Return the number of non-overlapping occurrences of subsection sub in\n\
1200bytes B[start:end]. Optional arguments start and end are interpreted\n\
1201as in slice notation.");
1202
1203static PyObject *
Benjamin Peterson153c70f2009-04-18 15:42:12 +00001204bytearray_count(PyByteArrayObject *self, PyObject *args)
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001205{
1206 PyObject *sub_obj;
Antoine Pitrouac65d962011-10-20 23:54:17 +02001207 const char *str = PyByteArray_AS_STRING(self), *sub;
1208 Py_ssize_t sub_len;
1209 char byte;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001210 Py_ssize_t start = 0, end = PY_SSIZE_T_MAX;
Antoine Pitrouac65d962011-10-20 23:54:17 +02001211
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001212 Py_buffer vsub;
1213 PyObject *count_obj;
1214
Antoine Pitrouac65d962011-10-20 23:54:17 +02001215 if (!stringlib_parse_args_finds_byte("count", args, &sub_obj, &byte,
1216 &start, &end))
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001217 return NULL;
1218
Antoine Pitrouac65d962011-10-20 23:54:17 +02001219 if (sub_obj) {
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +02001220 if (PyObject_GetBuffer(sub_obj, &vsub, PyBUF_SIMPLE) != 0)
Antoine Pitrouac65d962011-10-20 23:54:17 +02001221 return NULL;
1222
1223 sub = vsub.buf;
1224 sub_len = vsub.len;
1225 }
1226 else {
1227 sub = &byte;
1228 sub_len = 1;
1229 }
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001230
Antoine Pitrouf2c54842010-01-13 08:07:53 +00001231 ADJUST_INDICES(start, end, PyByteArray_GET_SIZE(self));
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001232
1233 count_obj = PyLong_FromSsize_t(
Antoine Pitrouac65d962011-10-20 23:54:17 +02001234 stringlib_count(str + start, end - start, sub, sub_len, PY_SSIZE_T_MAX)
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001235 );
Antoine Pitrouac65d962011-10-20 23:54:17 +02001236
1237 if (sub_obj)
1238 PyBuffer_Release(&vsub);
1239
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001240 return count_obj;
1241}
1242
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001243/*[clinic input]
1244bytearray.clear
1245
1246 self: self(type="PyByteArrayObject *")
1247
1248Remove all items from the bytearray.
1249[clinic start generated code]*/
1250
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001251static PyObject *
1252bytearray_clear_impl(PyByteArrayObject *self)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03001253/*[clinic end generated code: output=85c2fe6aede0956c input=e524fd330abcdc18]*/
Eli Bendersky4db28d32011-03-03 18:21:02 +00001254{
1255 if (PyByteArray_Resize((PyObject *)self, 0) < 0)
1256 return NULL;
1257 Py_RETURN_NONE;
1258}
1259
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001260/*[clinic input]
1261bytearray.copy
1262
1263 self: self(type="PyByteArrayObject *")
1264
1265Return a copy of B.
1266[clinic start generated code]*/
1267
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001268static PyObject *
1269bytearray_copy_impl(PyByteArrayObject *self)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03001270/*[clinic end generated code: output=68cfbcfed484c132 input=6d5d2975aa0f33f3]*/
Eli Bendersky4db28d32011-03-03 18:21:02 +00001271{
1272 return PyByteArray_FromStringAndSize(PyByteArray_AS_STRING((PyObject *)self),
1273 PyByteArray_GET_SIZE(self));
1274}
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001275
1276PyDoc_STRVAR(index__doc__,
Georg Brandl17cb8a82008-05-30 08:20:09 +00001277"B.index(sub[, start[, end]]) -> int\n\
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001278\n\
1279Like B.find() but raise ValueError when the subsection is not found.");
1280
1281static PyObject *
Benjamin Peterson153c70f2009-04-18 15:42:12 +00001282bytearray_index(PyByteArrayObject *self, PyObject *args)
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001283{
Benjamin Peterson153c70f2009-04-18 15:42:12 +00001284 Py_ssize_t result = bytearray_find_internal(self, args, +1);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001285 if (result == -2)
1286 return NULL;
1287 if (result == -1) {
1288 PyErr_SetString(PyExc_ValueError,
1289 "subsection not found");
1290 return NULL;
1291 }
1292 return PyLong_FromSsize_t(result);
1293}
1294
1295
1296PyDoc_STRVAR(rfind__doc__,
Georg Brandl17cb8a82008-05-30 08:20:09 +00001297"B.rfind(sub[, start[, end]]) -> int\n\
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001298\n\
1299Return the highest index in B where subsection sub is found,\n\
Senthil Kumaran53516a82011-07-27 23:33:54 +08001300such that sub is contained within B[start,end]. Optional\n\
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001301arguments start and end are interpreted as in slice notation.\n\
1302\n\
1303Return -1 on failure.");
1304
1305static PyObject *
Benjamin Peterson153c70f2009-04-18 15:42:12 +00001306bytearray_rfind(PyByteArrayObject *self, PyObject *args)
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001307{
Benjamin Peterson153c70f2009-04-18 15:42:12 +00001308 Py_ssize_t result = bytearray_find_internal(self, args, -1);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001309 if (result == -2)
1310 return NULL;
1311 return PyLong_FromSsize_t(result);
1312}
1313
1314
1315PyDoc_STRVAR(rindex__doc__,
Georg Brandl17cb8a82008-05-30 08:20:09 +00001316"B.rindex(sub[, start[, end]]) -> int\n\
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001317\n\
1318Like B.rfind() but raise ValueError when the subsection is not found.");
1319
1320static PyObject *
Benjamin Peterson153c70f2009-04-18 15:42:12 +00001321bytearray_rindex(PyByteArrayObject *self, PyObject *args)
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001322{
Benjamin Peterson153c70f2009-04-18 15:42:12 +00001323 Py_ssize_t result = bytearray_find_internal(self, args, -1);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001324 if (result == -2)
1325 return NULL;
1326 if (result == -1) {
1327 PyErr_SetString(PyExc_ValueError,
1328 "subsection not found");
1329 return NULL;
1330 }
1331 return PyLong_FromSsize_t(result);
1332}
1333
1334
1335static int
Benjamin Peterson153c70f2009-04-18 15:42:12 +00001336bytearray_contains(PyObject *self, PyObject *arg)
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001337{
1338 Py_ssize_t ival = PyNumber_AsSsize_t(arg, PyExc_ValueError);
1339 if (ival == -1 && PyErr_Occurred()) {
1340 Py_buffer varg;
Antoine Pitrou0010d372010-08-15 17:12:55 +00001341 Py_ssize_t pos;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001342 PyErr_Clear();
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +02001343 if (PyObject_GetBuffer(arg, &varg, PyBUF_SIMPLE) != 0)
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001344 return -1;
1345 pos = stringlib_find(PyByteArray_AS_STRING(self), Py_SIZE(self),
1346 varg.buf, varg.len, 0);
Martin v. Löwis423be952008-08-13 15:53:07 +00001347 PyBuffer_Release(&varg);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001348 return pos >= 0;
1349 }
1350 if (ival < 0 || ival >= 256) {
1351 PyErr_SetString(PyExc_ValueError, "byte must be in range(0, 256)");
1352 return -1;
1353 }
1354
Antoine Pitrou0010d372010-08-15 17:12:55 +00001355 return memchr(PyByteArray_AS_STRING(self), (int) ival, Py_SIZE(self)) != NULL;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001356}
1357
1358
1359/* Matches the end (direction >= 0) or start (direction < 0) of self
1360 * against substr, using the start and end arguments. Returns
1361 * -1 on error, 0 if not found and 1 if found.
1362 */
1363Py_LOCAL(int)
Benjamin Peterson153c70f2009-04-18 15:42:12 +00001364_bytearray_tailmatch(PyByteArrayObject *self, PyObject *substr, Py_ssize_t start,
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001365 Py_ssize_t end, int direction)
1366{
1367 Py_ssize_t len = PyByteArray_GET_SIZE(self);
1368 const char* str;
1369 Py_buffer vsubstr;
1370 int rv = 0;
1371
1372 str = PyByteArray_AS_STRING(self);
1373
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +02001374 if (PyObject_GetBuffer(substr, &vsubstr, PyBUF_SIMPLE) != 0)
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001375 return -1;
1376
Antoine Pitrouf2c54842010-01-13 08:07:53 +00001377 ADJUST_INDICES(start, end, len);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001378
1379 if (direction < 0) {
1380 /* startswith */
1381 if (start+vsubstr.len > len) {
1382 goto done;
1383 }
1384 } else {
1385 /* endswith */
1386 if (end-start < vsubstr.len || start > len) {
1387 goto done;
1388 }
1389
1390 if (end-vsubstr.len > start)
1391 start = end - vsubstr.len;
1392 }
1393 if (end-start >= vsubstr.len)
1394 rv = ! memcmp(str+start, vsubstr.buf, vsubstr.len);
1395
1396done:
Martin v. Löwis423be952008-08-13 15:53:07 +00001397 PyBuffer_Release(&vsubstr);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001398 return rv;
1399}
1400
1401
1402PyDoc_STRVAR(startswith__doc__,
Georg Brandl17cb8a82008-05-30 08:20:09 +00001403"B.startswith(prefix[, start[, end]]) -> bool\n\
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001404\n\
1405Return True if B starts with the specified prefix, False otherwise.\n\
1406With optional start, test B beginning at that position.\n\
1407With optional end, stop comparing B at that position.\n\
Ezio Melottiba42fd52011-04-26 06:09:45 +03001408prefix can also be a tuple of bytes to try.");
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001409
1410static PyObject *
Benjamin Peterson153c70f2009-04-18 15:42:12 +00001411bytearray_startswith(PyByteArrayObject *self, PyObject *args)
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001412{
1413 Py_ssize_t start = 0;
1414 Py_ssize_t end = PY_SSIZE_T_MAX;
1415 PyObject *subobj;
1416 int result;
1417
Jesus Ceaac451502011-04-20 17:09:23 +02001418 if (!stringlib_parse_args_finds("startswith", args, &subobj, &start, &end))
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001419 return NULL;
1420 if (PyTuple_Check(subobj)) {
1421 Py_ssize_t i;
1422 for (i = 0; i < PyTuple_GET_SIZE(subobj); i++) {
Benjamin Peterson153c70f2009-04-18 15:42:12 +00001423 result = _bytearray_tailmatch(self,
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001424 PyTuple_GET_ITEM(subobj, i),
1425 start, end, -1);
1426 if (result == -1)
1427 return NULL;
1428 else if (result) {
1429 Py_RETURN_TRUE;
1430 }
1431 }
1432 Py_RETURN_FALSE;
1433 }
Benjamin Peterson153c70f2009-04-18 15:42:12 +00001434 result = _bytearray_tailmatch(self, subobj, start, end, -1);
Ezio Melottiba42fd52011-04-26 06:09:45 +03001435 if (result == -1) {
1436 if (PyErr_ExceptionMatches(PyExc_TypeError))
1437 PyErr_Format(PyExc_TypeError, "startswith first arg must be bytes "
1438 "or a tuple of bytes, not %s", Py_TYPE(subobj)->tp_name);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001439 return NULL;
Ezio Melottiba42fd52011-04-26 06:09:45 +03001440 }
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001441 else
1442 return PyBool_FromLong(result);
1443}
1444
1445PyDoc_STRVAR(endswith__doc__,
Georg Brandl17cb8a82008-05-30 08:20:09 +00001446"B.endswith(suffix[, start[, end]]) -> bool\n\
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001447\n\
1448Return True if B ends with the specified suffix, False otherwise.\n\
1449With optional start, test B beginning at that position.\n\
1450With optional end, stop comparing B at that position.\n\
Ezio Melottiba42fd52011-04-26 06:09:45 +03001451suffix can also be a tuple of bytes to try.");
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001452
1453static PyObject *
Benjamin Peterson153c70f2009-04-18 15:42:12 +00001454bytearray_endswith(PyByteArrayObject *self, PyObject *args)
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001455{
1456 Py_ssize_t start = 0;
1457 Py_ssize_t end = PY_SSIZE_T_MAX;
1458 PyObject *subobj;
1459 int result;
1460
Jesus Ceaac451502011-04-20 17:09:23 +02001461 if (!stringlib_parse_args_finds("endswith", args, &subobj, &start, &end))
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001462 return NULL;
1463 if (PyTuple_Check(subobj)) {
1464 Py_ssize_t i;
1465 for (i = 0; i < PyTuple_GET_SIZE(subobj); i++) {
Benjamin Peterson153c70f2009-04-18 15:42:12 +00001466 result = _bytearray_tailmatch(self,
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001467 PyTuple_GET_ITEM(subobj, i),
1468 start, end, +1);
1469 if (result == -1)
1470 return NULL;
1471 else if (result) {
1472 Py_RETURN_TRUE;
1473 }
1474 }
1475 Py_RETURN_FALSE;
1476 }
Benjamin Peterson153c70f2009-04-18 15:42:12 +00001477 result = _bytearray_tailmatch(self, subobj, start, end, +1);
Ezio Melottiba42fd52011-04-26 06:09:45 +03001478 if (result == -1) {
1479 if (PyErr_ExceptionMatches(PyExc_TypeError))
1480 PyErr_Format(PyExc_TypeError, "endswith first arg must be bytes or "
1481 "a tuple of bytes, not %s", Py_TYPE(subobj)->tp_name);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001482 return NULL;
Ezio Melottiba42fd52011-04-26 06:09:45 +03001483 }
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001484 else
1485 return PyBool_FromLong(result);
1486}
1487
1488
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001489/*[clinic input]
1490bytearray.translate
1491
1492 self: self(type="PyByteArrayObject *")
1493 table: object
1494 Translation table, which must be a bytes object of length 256.
1495 [
1496 deletechars: object
1497 ]
1498 /
1499
1500Return a copy with each character mapped by the given translation table.
1501
1502All characters occurring in the optional argument deletechars are removed.
1503The remaining characters are mapped through the given translation table.
1504[clinic start generated code]*/
1505
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001506static PyObject *
Larry Hastings89964c42015-04-14 18:07:59 -04001507bytearray_translate_impl(PyByteArrayObject *self, PyObject *table,
1508 int group_right_1, PyObject *deletechars)
1509/*[clinic end generated code: output=2bebc86a9a1ff083 input=b749ad85f4860824]*/
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001510{
Antoine Pitrou9ed5f272013-08-13 20:18:52 +02001511 char *input, *output;
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001512 const char *table_chars;
Antoine Pitrou9ed5f272013-08-13 20:18:52 +02001513 Py_ssize_t i, c;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001514 PyObject *input_obj = (PyObject*)self;
1515 const char *output_start;
1516 Py_ssize_t inlen;
Georg Brandlccc47b62008-12-28 11:44:14 +00001517 PyObject *result = NULL;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001518 int trans_table[256];
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001519 Py_buffer vtable, vdel;
1520
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001521 if (table == Py_None) {
1522 table_chars = NULL;
Georg Brandlccc47b62008-12-28 11:44:14 +00001523 table = NULL;
Serhiy Storchaka3dd3e262015-02-03 01:25:42 +02001524 } else if (PyObject_GetBuffer(table, &vtable, PyBUF_SIMPLE) != 0) {
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001525 return NULL;
Georg Brandlccc47b62008-12-28 11:44:14 +00001526 } else {
1527 if (vtable.len != 256) {
1528 PyErr_SetString(PyExc_ValueError,
1529 "translation table must be 256 characters long");
Georg Brandl953152f2009-07-22 12:03:59 +00001530 PyBuffer_Release(&vtable);
1531 return NULL;
Georg Brandlccc47b62008-12-28 11:44:14 +00001532 }
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001533 table_chars = (const char*)vtable.buf;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001534 }
1535
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001536 if (deletechars != NULL) {
Serhiy Storchaka3dd3e262015-02-03 01:25:42 +02001537 if (PyObject_GetBuffer(deletechars, &vdel, PyBUF_SIMPLE) != 0) {
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001538 if (table != NULL)
Georg Brandl953152f2009-07-22 12:03:59 +00001539 PyBuffer_Release(&vtable);
1540 return NULL;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001541 }
1542 }
1543 else {
1544 vdel.buf = NULL;
1545 vdel.len = 0;
1546 }
1547
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001548 inlen = PyByteArray_GET_SIZE(input_obj);
1549 result = PyByteArray_FromStringAndSize((char *)NULL, inlen);
1550 if (result == NULL)
1551 goto done;
1552 output_start = output = PyByteArray_AsString(result);
1553 input = PyByteArray_AS_STRING(input_obj);
1554
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001555 if (vdel.len == 0 && table_chars != NULL) {
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001556 /* If no deletions are required, use faster code */
1557 for (i = inlen; --i >= 0; ) {
1558 c = Py_CHARMASK(*input++);
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001559 *output++ = table_chars[c];
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001560 }
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001561 goto done;
1562 }
Georg Brandlccc47b62008-12-28 11:44:14 +00001563
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001564 if (table_chars == NULL) {
Georg Brandlccc47b62008-12-28 11:44:14 +00001565 for (i = 0; i < 256; i++)
1566 trans_table[i] = Py_CHARMASK(i);
1567 } else {
1568 for (i = 0; i < 256; i++)
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001569 trans_table[i] = Py_CHARMASK(table_chars[i]);
Georg Brandlccc47b62008-12-28 11:44:14 +00001570 }
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001571
1572 for (i = 0; i < vdel.len; i++)
1573 trans_table[(int) Py_CHARMASK( ((unsigned char*)vdel.buf)[i] )] = -1;
1574
1575 for (i = inlen; --i >= 0; ) {
1576 c = Py_CHARMASK(*input++);
1577 if (trans_table[c] != -1)
1578 if (Py_CHARMASK(*output++ = (char)trans_table[c]) == c)
1579 continue;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001580 }
1581 /* Fix the size of the resulting string */
1582 if (inlen > 0)
Christian Heimesc731bbe2013-07-21 02:04:35 +02001583 if (PyByteArray_Resize(result, output - output_start) < 0) {
1584 Py_CLEAR(result);
1585 goto done;
1586 }
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001587
1588done:
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001589 if (table != NULL)
Georg Brandlccc47b62008-12-28 11:44:14 +00001590 PyBuffer_Release(&vtable);
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001591 if (deletechars != NULL)
Martin v. Löwis423be952008-08-13 15:53:07 +00001592 PyBuffer_Release(&vdel);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001593 return result;
1594}
1595
1596
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001597/*[clinic input]
1598
1599@staticmethod
1600bytearray.maketrans
1601
Serhiy Storchaka3dd3e262015-02-03 01:25:42 +02001602 frm: Py_buffer
1603 to: Py_buffer
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001604 /
1605
1606Return a translation table useable for the bytes or bytearray translate method.
1607
1608The returned table will be one where each byte in frm is mapped to the byte at
1609the same position in to.
1610
1611The bytes objects frm and to must be of the same length.
1612[clinic start generated code]*/
1613
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001614static PyObject *
Serhiy Storchaka3dd3e262015-02-03 01:25:42 +02001615bytearray_maketrans_impl(Py_buffer *frm, Py_buffer *to)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03001616/*[clinic end generated code: output=1df267d99f56b15e input=5925a81d2fbbf151]*/
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001617{
1618 return _Py_bytes_maketrans(frm, to);
Georg Brandlabc38772009-04-12 15:51:51 +00001619}
1620
1621
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001622/* find and count characters and substrings */
1623
1624#define findchar(target, target_len, c) \
1625 ((char *)memchr((const void *)(target), c, target_len))
1626
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001627
Benjamin Peterson0f3641c2008-11-19 22:05:52 +00001628/* Bytes ops must return a string, create a copy */
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001629Py_LOCAL(PyByteArrayObject *)
1630return_self(PyByteArrayObject *self)
1631{
Georg Brandl1e7217d2008-05-30 12:02:38 +00001632 /* always return a new bytearray */
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001633 return (PyByteArrayObject *)PyByteArray_FromStringAndSize(
1634 PyByteArray_AS_STRING(self),
1635 PyByteArray_GET_SIZE(self));
1636}
1637
1638Py_LOCAL_INLINE(Py_ssize_t)
1639countchar(const char *target, Py_ssize_t target_len, char c, Py_ssize_t maxcount)
1640{
1641 Py_ssize_t count=0;
1642 const char *start=target;
1643 const char *end=target+target_len;
1644
1645 while ( (start=findchar(start, end-start, c)) != NULL ) {
1646 count++;
1647 if (count >= maxcount)
1648 break;
1649 start += 1;
1650 }
1651 return count;
1652}
1653
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001654
1655/* Algorithms for different cases of string replacement */
1656
1657/* len(self)>=1, from="", len(to)>=1, maxcount>=1 */
1658Py_LOCAL(PyByteArrayObject *)
1659replace_interleave(PyByteArrayObject *self,
1660 const char *to_s, Py_ssize_t to_len,
1661 Py_ssize_t maxcount)
1662{
1663 char *self_s, *result_s;
1664 Py_ssize_t self_len, result_len;
Mark Dickinsoncf940c72010-08-10 18:35:01 +00001665 Py_ssize_t count, i;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001666 PyByteArrayObject *result;
1667
1668 self_len = PyByteArray_GET_SIZE(self);
1669
Mark Dickinsoncf940c72010-08-10 18:35:01 +00001670 /* 1 at the end plus 1 after every character;
1671 count = min(maxcount, self_len + 1) */
1672 if (maxcount <= self_len)
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001673 count = maxcount;
Mark Dickinsoncf940c72010-08-10 18:35:01 +00001674 else
1675 /* Can't overflow: self_len + 1 <= maxcount <= PY_SSIZE_T_MAX. */
1676 count = self_len + 1;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001677
1678 /* Check for overflow */
1679 /* result_len = count * to_len + self_len; */
Mark Dickinsoncf940c72010-08-10 18:35:01 +00001680 assert(count > 0);
1681 if (to_len > (PY_SSIZE_T_MAX - self_len) / count) {
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001682 PyErr_SetString(PyExc_OverflowError,
1683 "replace string is too long");
1684 return NULL;
1685 }
Mark Dickinsoncf940c72010-08-10 18:35:01 +00001686 result_len = count * to_len + self_len;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001687
1688 if (! (result = (PyByteArrayObject *)
1689 PyByteArray_FromStringAndSize(NULL, result_len)) )
1690 return NULL;
1691
1692 self_s = PyByteArray_AS_STRING(self);
1693 result_s = PyByteArray_AS_STRING(result);
1694
Victor Stinnerfac39562016-03-21 10:38:58 +01001695 if (to_len > 1) {
1696 /* Lay the first one down (guaranteed this will occur) */
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001697 Py_MEMCPY(result_s, to_s, to_len);
1698 result_s += to_len;
Victor Stinnerfac39562016-03-21 10:38:58 +01001699 count -= 1;
1700
1701 for (i = 0; i < count; i++) {
1702 *result_s++ = *self_s++;
1703 Py_MEMCPY(result_s, to_s, to_len);
1704 result_s += to_len;
1705 }
1706 }
1707 else {
1708 result_s[0] = to_s[0];
1709 result_s += to_len;
1710 count -= 1;
1711 for (i = 0; i < count; i++) {
1712 *result_s++ = *self_s++;
1713 result_s[0] = to_s[0];
1714 result_s += to_len;
1715 }
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001716 }
1717
1718 /* Copy the rest of the original string */
1719 Py_MEMCPY(result_s, self_s, self_len-i);
1720
1721 return result;
1722}
1723
1724/* Special case for deleting a single character */
1725/* len(self)>=1, len(from)==1, to="", maxcount>=1 */
1726Py_LOCAL(PyByteArrayObject *)
1727replace_delete_single_character(PyByteArrayObject *self,
1728 char from_c, Py_ssize_t maxcount)
1729{
1730 char *self_s, *result_s;
1731 char *start, *next, *end;
1732 Py_ssize_t self_len, result_len;
1733 Py_ssize_t count;
1734 PyByteArrayObject *result;
1735
1736 self_len = PyByteArray_GET_SIZE(self);
1737 self_s = PyByteArray_AS_STRING(self);
1738
1739 count = countchar(self_s, self_len, from_c, maxcount);
1740 if (count == 0) {
1741 return return_self(self);
1742 }
1743
1744 result_len = self_len - count; /* from_len == 1 */
1745 assert(result_len>=0);
1746
1747 if ( (result = (PyByteArrayObject *)
1748 PyByteArray_FromStringAndSize(NULL, result_len)) == NULL)
1749 return NULL;
1750 result_s = PyByteArray_AS_STRING(result);
1751
1752 start = self_s;
1753 end = self_s + self_len;
1754 while (count-- > 0) {
1755 next = findchar(start, end-start, from_c);
1756 if (next == NULL)
1757 break;
1758 Py_MEMCPY(result_s, start, next-start);
1759 result_s += (next-start);
1760 start = next+1;
1761 }
1762 Py_MEMCPY(result_s, start, end-start);
1763
1764 return result;
1765}
1766
1767/* len(self)>=1, len(from)>=2, to="", maxcount>=1 */
1768
1769Py_LOCAL(PyByteArrayObject *)
1770replace_delete_substring(PyByteArrayObject *self,
1771 const char *from_s, Py_ssize_t from_len,
1772 Py_ssize_t maxcount)
1773{
1774 char *self_s, *result_s;
1775 char *start, *next, *end;
1776 Py_ssize_t self_len, result_len;
1777 Py_ssize_t count, offset;
1778 PyByteArrayObject *result;
1779
1780 self_len = PyByteArray_GET_SIZE(self);
1781 self_s = PyByteArray_AS_STRING(self);
1782
Antoine Pitrouf2c54842010-01-13 08:07:53 +00001783 count = stringlib_count(self_s, self_len,
1784 from_s, from_len,
1785 maxcount);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001786
1787 if (count == 0) {
1788 /* no matches */
1789 return return_self(self);
1790 }
1791
1792 result_len = self_len - (count * from_len);
1793 assert (result_len>=0);
1794
1795 if ( (result = (PyByteArrayObject *)
1796 PyByteArray_FromStringAndSize(NULL, result_len)) == NULL )
1797 return NULL;
1798
1799 result_s = PyByteArray_AS_STRING(result);
1800
1801 start = self_s;
1802 end = self_s + self_len;
1803 while (count-- > 0) {
Antoine Pitrouf2c54842010-01-13 08:07:53 +00001804 offset = stringlib_find(start, end-start,
1805 from_s, from_len,
1806 0);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001807 if (offset == -1)
1808 break;
1809 next = start + offset;
1810
1811 Py_MEMCPY(result_s, start, next-start);
1812
1813 result_s += (next-start);
1814 start = next+from_len;
1815 }
1816 Py_MEMCPY(result_s, start, end-start);
1817 return result;
1818}
1819
1820/* len(self)>=1, len(from)==len(to)==1, maxcount>=1 */
1821Py_LOCAL(PyByteArrayObject *)
1822replace_single_character_in_place(PyByteArrayObject *self,
1823 char from_c, char to_c,
1824 Py_ssize_t maxcount)
1825{
Antoine Pitroud1188562010-06-09 16:38:55 +00001826 char *self_s, *result_s, *start, *end, *next;
1827 Py_ssize_t self_len;
1828 PyByteArrayObject *result;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001829
Antoine Pitroud1188562010-06-09 16:38:55 +00001830 /* The result string will be the same size */
1831 self_s = PyByteArray_AS_STRING(self);
1832 self_len = PyByteArray_GET_SIZE(self);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001833
Antoine Pitroud1188562010-06-09 16:38:55 +00001834 next = findchar(self_s, self_len, from_c);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001835
Antoine Pitroud1188562010-06-09 16:38:55 +00001836 if (next == NULL) {
1837 /* No matches; return the original bytes */
1838 return return_self(self);
1839 }
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001840
Antoine Pitroud1188562010-06-09 16:38:55 +00001841 /* Need to make a new bytes */
1842 result = (PyByteArrayObject *) PyByteArray_FromStringAndSize(NULL, self_len);
1843 if (result == NULL)
1844 return NULL;
1845 result_s = PyByteArray_AS_STRING(result);
1846 Py_MEMCPY(result_s, self_s, self_len);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001847
Antoine Pitroud1188562010-06-09 16:38:55 +00001848 /* change everything in-place, starting with this one */
1849 start = result_s + (next-self_s);
1850 *start = to_c;
1851 start++;
1852 end = result_s + self_len;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001853
Antoine Pitroud1188562010-06-09 16:38:55 +00001854 while (--maxcount > 0) {
1855 next = findchar(start, end-start, from_c);
1856 if (next == NULL)
1857 break;
1858 *next = to_c;
1859 start = next+1;
1860 }
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001861
Antoine Pitroud1188562010-06-09 16:38:55 +00001862 return result;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001863}
1864
1865/* len(self)>=1, len(from)==len(to)>=2, maxcount>=1 */
1866Py_LOCAL(PyByteArrayObject *)
1867replace_substring_in_place(PyByteArrayObject *self,
1868 const char *from_s, Py_ssize_t from_len,
1869 const char *to_s, Py_ssize_t to_len,
1870 Py_ssize_t maxcount)
1871{
1872 char *result_s, *start, *end;
1873 char *self_s;
1874 Py_ssize_t self_len, offset;
1875 PyByteArrayObject *result;
1876
1877 /* The result bytes will be the same size */
1878
1879 self_s = PyByteArray_AS_STRING(self);
1880 self_len = PyByteArray_GET_SIZE(self);
1881
Antoine Pitrouf2c54842010-01-13 08:07:53 +00001882 offset = stringlib_find(self_s, self_len,
1883 from_s, from_len,
1884 0);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001885 if (offset == -1) {
1886 /* No matches; return the original bytes */
1887 return return_self(self);
1888 }
1889
1890 /* Need to make a new bytes */
1891 result = (PyByteArrayObject *) PyByteArray_FromStringAndSize(NULL, self_len);
1892 if (result == NULL)
1893 return NULL;
1894 result_s = PyByteArray_AS_STRING(result);
1895 Py_MEMCPY(result_s, self_s, self_len);
1896
1897 /* change everything in-place, starting with this one */
1898 start = result_s + offset;
1899 Py_MEMCPY(start, to_s, from_len);
1900 start += from_len;
1901 end = result_s + self_len;
1902
1903 while ( --maxcount > 0) {
Antoine Pitrouf2c54842010-01-13 08:07:53 +00001904 offset = stringlib_find(start, end-start,
1905 from_s, from_len,
1906 0);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001907 if (offset==-1)
1908 break;
1909 Py_MEMCPY(start+offset, to_s, from_len);
1910 start += offset+from_len;
1911 }
1912
1913 return result;
1914}
1915
1916/* len(self)>=1, len(from)==1, len(to)>=2, maxcount>=1 */
1917Py_LOCAL(PyByteArrayObject *)
1918replace_single_character(PyByteArrayObject *self,
1919 char from_c,
1920 const char *to_s, Py_ssize_t to_len,
1921 Py_ssize_t maxcount)
1922{
1923 char *self_s, *result_s;
1924 char *start, *next, *end;
1925 Py_ssize_t self_len, result_len;
Mark Dickinsoncf940c72010-08-10 18:35:01 +00001926 Py_ssize_t count;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001927 PyByteArrayObject *result;
1928
1929 self_s = PyByteArray_AS_STRING(self);
1930 self_len = PyByteArray_GET_SIZE(self);
1931
1932 count = countchar(self_s, self_len, from_c, maxcount);
1933 if (count == 0) {
1934 /* no matches, return unchanged */
1935 return return_self(self);
1936 }
1937
1938 /* use the difference between current and new, hence the "-1" */
1939 /* result_len = self_len + count * (to_len-1) */
Mark Dickinsoncf940c72010-08-10 18:35:01 +00001940 assert(count > 0);
1941 if (to_len - 1 > (PY_SSIZE_T_MAX - self_len) / count) {
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001942 PyErr_SetString(PyExc_OverflowError, "replace bytes is too long");
1943 return NULL;
1944 }
Mark Dickinsoncf940c72010-08-10 18:35:01 +00001945 result_len = self_len + count * (to_len - 1);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001946
1947 if ( (result = (PyByteArrayObject *)
1948 PyByteArray_FromStringAndSize(NULL, result_len)) == NULL)
1949 return NULL;
1950 result_s = PyByteArray_AS_STRING(result);
1951
1952 start = self_s;
1953 end = self_s + self_len;
1954 while (count-- > 0) {
1955 next = findchar(start, end-start, from_c);
1956 if (next == NULL)
1957 break;
1958
1959 if (next == start) {
1960 /* replace with the 'to' */
1961 Py_MEMCPY(result_s, to_s, to_len);
1962 result_s += to_len;
1963 start += 1;
1964 } else {
1965 /* copy the unchanged old then the 'to' */
1966 Py_MEMCPY(result_s, start, next-start);
1967 result_s += (next-start);
1968 Py_MEMCPY(result_s, to_s, to_len);
1969 result_s += to_len;
1970 start = next+1;
1971 }
1972 }
1973 /* Copy the remainder of the remaining bytes */
1974 Py_MEMCPY(result_s, start, end-start);
1975
1976 return result;
1977}
1978
1979/* len(self)>=1, len(from)>=2, len(to)>=2, maxcount>=1 */
1980Py_LOCAL(PyByteArrayObject *)
1981replace_substring(PyByteArrayObject *self,
1982 const char *from_s, Py_ssize_t from_len,
1983 const char *to_s, Py_ssize_t to_len,
1984 Py_ssize_t maxcount)
1985{
1986 char *self_s, *result_s;
1987 char *start, *next, *end;
1988 Py_ssize_t self_len, result_len;
Mark Dickinsoncf940c72010-08-10 18:35:01 +00001989 Py_ssize_t count, offset;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001990 PyByteArrayObject *result;
1991
1992 self_s = PyByteArray_AS_STRING(self);
1993 self_len = PyByteArray_GET_SIZE(self);
1994
Antoine Pitrouf2c54842010-01-13 08:07:53 +00001995 count = stringlib_count(self_s, self_len,
1996 from_s, from_len,
1997 maxcount);
1998
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001999 if (count == 0) {
2000 /* no matches, return unchanged */
2001 return return_self(self);
2002 }
2003
2004 /* Check for overflow */
2005 /* result_len = self_len + count * (to_len-from_len) */
Mark Dickinsoncf940c72010-08-10 18:35:01 +00002006 assert(count > 0);
2007 if (to_len - from_len > (PY_SSIZE_T_MAX - self_len) / count) {
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002008 PyErr_SetString(PyExc_OverflowError, "replace bytes is too long");
2009 return NULL;
2010 }
Mark Dickinsoncf940c72010-08-10 18:35:01 +00002011 result_len = self_len + count * (to_len - from_len);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002012
2013 if ( (result = (PyByteArrayObject *)
2014 PyByteArray_FromStringAndSize(NULL, result_len)) == NULL)
2015 return NULL;
2016 result_s = PyByteArray_AS_STRING(result);
2017
2018 start = self_s;
2019 end = self_s + self_len;
2020 while (count-- > 0) {
Antoine Pitrouf2c54842010-01-13 08:07:53 +00002021 offset = stringlib_find(start, end-start,
2022 from_s, from_len,
2023 0);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002024 if (offset == -1)
2025 break;
2026 next = start+offset;
2027 if (next == start) {
2028 /* replace with the 'to' */
2029 Py_MEMCPY(result_s, to_s, to_len);
2030 result_s += to_len;
2031 start += from_len;
2032 } else {
2033 /* copy the unchanged old then the 'to' */
2034 Py_MEMCPY(result_s, start, next-start);
2035 result_s += (next-start);
2036 Py_MEMCPY(result_s, to_s, to_len);
2037 result_s += to_len;
2038 start = next+from_len;
2039 }
2040 }
2041 /* Copy the remainder of the remaining bytes */
2042 Py_MEMCPY(result_s, start, end-start);
2043
2044 return result;
2045}
2046
2047
2048Py_LOCAL(PyByteArrayObject *)
2049replace(PyByteArrayObject *self,
2050 const char *from_s, Py_ssize_t from_len,
2051 const char *to_s, Py_ssize_t to_len,
2052 Py_ssize_t maxcount)
2053{
2054 if (maxcount < 0) {
2055 maxcount = PY_SSIZE_T_MAX;
2056 } else if (maxcount == 0 || PyByteArray_GET_SIZE(self) == 0) {
2057 /* nothing to do; return the original bytes */
2058 return return_self(self);
2059 }
2060
2061 if (maxcount == 0 ||
2062 (from_len == 0 && to_len == 0)) {
2063 /* nothing to do; return the original bytes */
2064 return return_self(self);
2065 }
2066
2067 /* Handle zero-length special cases */
2068
2069 if (from_len == 0) {
2070 /* insert the 'to' bytes everywhere. */
2071 /* >>> "Python".replace("", ".") */
2072 /* '.P.y.t.h.o.n.' */
2073 return replace_interleave(self, to_s, to_len, maxcount);
2074 }
2075
2076 /* Except for "".replace("", "A") == "A" there is no way beyond this */
2077 /* point for an empty self bytes to generate a non-empty bytes */
2078 /* Special case so the remaining code always gets a non-empty bytes */
2079 if (PyByteArray_GET_SIZE(self) == 0) {
2080 return return_self(self);
2081 }
2082
2083 if (to_len == 0) {
Georg Brandl17cb8a82008-05-30 08:20:09 +00002084 /* delete all occurrences of 'from' bytes */
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002085 if (from_len == 1) {
2086 return replace_delete_single_character(
2087 self, from_s[0], maxcount);
2088 } else {
2089 return replace_delete_substring(self, from_s, from_len, maxcount);
2090 }
2091 }
2092
2093 /* Handle special case where both bytes have the same length */
2094
2095 if (from_len == to_len) {
2096 if (from_len == 1) {
2097 return replace_single_character_in_place(
2098 self,
2099 from_s[0],
2100 to_s[0],
2101 maxcount);
2102 } else {
2103 return replace_substring_in_place(
2104 self, from_s, from_len, to_s, to_len, maxcount);
2105 }
2106 }
2107
2108 /* Otherwise use the more generic algorithms */
2109 if (from_len == 1) {
2110 return replace_single_character(self, from_s[0],
2111 to_s, to_len, maxcount);
2112 } else {
2113 /* len('from')>=2, len('to')>=1 */
2114 return replace_substring(self, from_s, from_len, to_s, to_len, maxcount);
2115 }
2116}
2117
2118
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002119/*[clinic input]
2120bytearray.replace
2121
Serhiy Storchaka3dd3e262015-02-03 01:25:42 +02002122 old: Py_buffer
2123 new: Py_buffer
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002124 count: Py_ssize_t = -1
2125 Maximum number of occurrences to replace.
2126 -1 (the default value) means replace all occurrences.
2127 /
2128
2129Return a copy with all occurrences of substring old replaced by new.
2130
2131If the optional argument count is given, only the first count occurrences are
2132replaced.
2133[clinic start generated code]*/
2134
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002135static PyObject *
Larry Hastings89964c42015-04-14 18:07:59 -04002136bytearray_replace_impl(PyByteArrayObject *self, Py_buffer *old,
2137 Py_buffer *new, Py_ssize_t count)
2138/*[clinic end generated code: output=d39884c4dc59412a input=aa379d988637c7fb]*/
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002139{
Serhiy Storchaka3dd3e262015-02-03 01:25:42 +02002140 return (PyObject *)replace((PyByteArrayObject *) self,
2141 old->buf, old->len,
2142 new->buf, new->len, count);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002143}
2144
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002145/*[clinic input]
2146bytearray.split
2147
2148 sep: object = None
2149 The delimiter according which to split the bytearray.
2150 None (the default value) means split on ASCII whitespace characters
2151 (space, tab, return, newline, formfeed, vertical tab).
2152 maxsplit: Py_ssize_t = -1
2153 Maximum number of splits to do.
2154 -1 (the default value) means no limit.
2155
2156Return a list of the sections in the bytearray, using sep as the delimiter.
2157[clinic start generated code]*/
2158
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002159static PyObject *
Larry Hastings89964c42015-04-14 18:07:59 -04002160bytearray_split_impl(PyByteArrayObject *self, PyObject *sep,
2161 Py_ssize_t maxsplit)
2162/*[clinic end generated code: output=833e2cf385d9a04d input=24f82669f41bf523]*/
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002163{
2164 Py_ssize_t len = PyByteArray_GET_SIZE(self), n;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002165 const char *s = PyByteArray_AS_STRING(self), *sub;
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002166 PyObject *list;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002167 Py_buffer vsub;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002168
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002169 if (maxsplit < 0)
2170 maxsplit = PY_SSIZE_T_MAX;
2171
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002172 if (sep == Py_None)
Antoine Pitrouf2c54842010-01-13 08:07:53 +00002173 return stringlib_split_whitespace((PyObject*) self, s, len, maxsplit);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002174
Serhiy Storchaka3dd3e262015-02-03 01:25:42 +02002175 if (PyObject_GetBuffer(sep, &vsub, PyBUF_SIMPLE) != 0)
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002176 return NULL;
2177 sub = vsub.buf;
2178 n = vsub.len;
2179
Antoine Pitrouf2c54842010-01-13 08:07:53 +00002180 list = stringlib_split(
2181 (PyObject*) self, s, len, sub, n, maxsplit
2182 );
Martin v. Löwis423be952008-08-13 15:53:07 +00002183 PyBuffer_Release(&vsub);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002184 return list;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002185}
2186
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002187/*[clinic input]
2188bytearray.partition
2189
2190 self: self(type="PyByteArrayObject *")
2191 sep: object
2192 /
2193
2194Partition the bytearray into three parts using the given separator.
2195
2196This will search for the separator sep in the bytearray. If the separator is
2197found, returns a 3-tuple containing the part before the separator, the
2198separator itself, and the part after it.
2199
2200If the separator is not found, returns a 3-tuple containing the original
2201bytearray object and two empty bytearray objects.
2202[clinic start generated code]*/
2203
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002204static PyObject *
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002205bytearray_partition(PyByteArrayObject *self, PyObject *sep)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03002206/*[clinic end generated code: output=45d2525ddd35f957 input=7d7fe37b1696d506]*/
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002207{
2208 PyObject *bytesep, *result;
2209
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002210 bytesep = PyByteArray_FromObject(sep);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002211 if (! bytesep)
2212 return NULL;
2213
2214 result = stringlib_partition(
2215 (PyObject*) self,
2216 PyByteArray_AS_STRING(self), PyByteArray_GET_SIZE(self),
2217 bytesep,
2218 PyByteArray_AS_STRING(bytesep), PyByteArray_GET_SIZE(bytesep)
2219 );
2220
2221 Py_DECREF(bytesep);
Antoine Pitrouf2c54842010-01-13 08:07:53 +00002222 return result;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002223}
2224
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002225/*[clinic input]
2226bytearray.rpartition
2227
2228 self: self(type="PyByteArrayObject *")
2229 sep: object
2230 /
2231
2232Partition the bytes into three parts using the given separator.
2233
2234This will search for the separator sep in the bytearray, starting and the end.
2235If the separator is found, returns a 3-tuple containing the part before the
2236separator, the separator itself, and the part after it.
2237
2238If the separator is not found, returns a 3-tuple containing two empty bytearray
2239objects and the original bytearray object.
2240[clinic start generated code]*/
2241
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002242static PyObject *
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002243bytearray_rpartition(PyByteArrayObject *self, PyObject *sep)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03002244/*[clinic end generated code: output=440de3c9426115e8 input=9b8cd540c1b75853]*/
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002245{
2246 PyObject *bytesep, *result;
2247
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002248 bytesep = PyByteArray_FromObject(sep);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002249 if (! bytesep)
2250 return NULL;
2251
2252 result = stringlib_rpartition(
2253 (PyObject*) self,
2254 PyByteArray_AS_STRING(self), PyByteArray_GET_SIZE(self),
2255 bytesep,
2256 PyByteArray_AS_STRING(bytesep), PyByteArray_GET_SIZE(bytesep)
2257 );
2258
2259 Py_DECREF(bytesep);
Antoine Pitrouf2c54842010-01-13 08:07:53 +00002260 return result;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002261}
2262
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002263/*[clinic input]
2264bytearray.rsplit = bytearray.split
2265
2266Return a list of the sections in the bytearray, using sep as the delimiter.
2267
2268Splitting is done starting at the end of the bytearray and working to the front.
2269[clinic start generated code]*/
2270
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002271static PyObject *
Larry Hastings89964c42015-04-14 18:07:59 -04002272bytearray_rsplit_impl(PyByteArrayObject *self, PyObject *sep,
2273 Py_ssize_t maxsplit)
2274/*[clinic end generated code: output=a55e0b5a03cb6190 input=a68286e4dd692ffe]*/
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002275{
2276 Py_ssize_t len = PyByteArray_GET_SIZE(self), n;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002277 const char *s = PyByteArray_AS_STRING(self), *sub;
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002278 PyObject *list;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002279 Py_buffer vsub;
2280
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002281 if (maxsplit < 0)
2282 maxsplit = PY_SSIZE_T_MAX;
2283
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002284 if (sep == Py_None)
Antoine Pitrouf2c54842010-01-13 08:07:53 +00002285 return stringlib_rsplit_whitespace((PyObject*) self, s, len, maxsplit);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002286
Serhiy Storchaka3dd3e262015-02-03 01:25:42 +02002287 if (PyObject_GetBuffer(sep, &vsub, PyBUF_SIMPLE) != 0)
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002288 return NULL;
2289 sub = vsub.buf;
2290 n = vsub.len;
2291
Antoine Pitrouf2c54842010-01-13 08:07:53 +00002292 list = stringlib_rsplit(
2293 (PyObject*) self, s, len, sub, n, maxsplit
2294 );
Martin v. Löwis423be952008-08-13 15:53:07 +00002295 PyBuffer_Release(&vsub);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002296 return list;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002297}
2298
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002299/*[clinic input]
2300bytearray.reverse
2301
2302 self: self(type="PyByteArrayObject *")
2303
2304Reverse the order of the values in B in place.
2305[clinic start generated code]*/
2306
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002307static PyObject *
2308bytearray_reverse_impl(PyByteArrayObject *self)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03002309/*[clinic end generated code: output=9f7616f29ab309d3 input=7933a499b8597bd1]*/
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002310{
2311 char swap, *head, *tail;
2312 Py_ssize_t i, j, n = Py_SIZE(self);
2313
2314 j = n / 2;
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +02002315 head = PyByteArray_AS_STRING(self);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002316 tail = head + n - 1;
2317 for (i = 0; i < j; i++) {
2318 swap = *head;
2319 *head++ = *tail;
2320 *tail-- = swap;
2321 }
2322
2323 Py_RETURN_NONE;
2324}
2325
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002326
2327/*[python input]
2328class bytesvalue_converter(CConverter):
2329 type = 'int'
2330 converter = '_getbytevalue'
2331[python start generated code]*/
2332/*[python end generated code: output=da39a3ee5e6b4b0d input=29c2e7c26c212812]*/
2333
2334
2335/*[clinic input]
2336bytearray.insert
2337
2338 self: self(type="PyByteArrayObject *")
2339 index: Py_ssize_t
2340 The index where the value is to be inserted.
2341 item: bytesvalue
2342 The item to be inserted.
2343 /
2344
2345Insert a single item into the bytearray before the given index.
2346[clinic start generated code]*/
2347
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002348static PyObject *
2349bytearray_insert_impl(PyByteArrayObject *self, Py_ssize_t index, int item)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03002350/*[clinic end generated code: output=76c775a70e7b07b7 input=833766836ba30e1e]*/
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002351{
2352 Py_ssize_t n = Py_SIZE(self);
2353 char *buf;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002354
2355 if (n == PY_SSIZE_T_MAX) {
2356 PyErr_SetString(PyExc_OverflowError,
Mark Dickinson2b6705f2009-09-06 10:34:47 +00002357 "cannot add more objects to bytearray");
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002358 return NULL;
2359 }
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002360 if (PyByteArray_Resize((PyObject *)self, n + 1) < 0)
2361 return NULL;
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +02002362 buf = PyByteArray_AS_STRING(self);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002363
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002364 if (index < 0) {
2365 index += n;
2366 if (index < 0)
2367 index = 0;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002368 }
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002369 if (index > n)
2370 index = n;
2371 memmove(buf + index + 1, buf + index, n - index);
2372 buf[index] = item;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002373
2374 Py_RETURN_NONE;
2375}
2376
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002377/*[clinic input]
2378bytearray.append
2379
2380 self: self(type="PyByteArrayObject *")
2381 item: bytesvalue
2382 The item to be appended.
2383 /
2384
2385Append a single item to the end of the bytearray.
2386[clinic start generated code]*/
2387
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002388static PyObject *
2389bytearray_append_impl(PyByteArrayObject *self, int item)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03002390/*[clinic end generated code: output=a154e19ed1886cb6 input=ae56ea87380407cc]*/
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002391{
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002392 Py_ssize_t n = Py_SIZE(self);
2393
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002394 if (n == PY_SSIZE_T_MAX) {
2395 PyErr_SetString(PyExc_OverflowError,
Mark Dickinson2b6705f2009-09-06 10:34:47 +00002396 "cannot add more objects to bytearray");
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002397 return NULL;
2398 }
2399 if (PyByteArray_Resize((PyObject *)self, n + 1) < 0)
2400 return NULL;
2401
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002402 PyByteArray_AS_STRING(self)[n] = item;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002403
2404 Py_RETURN_NONE;
2405}
2406
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002407/*[clinic input]
2408bytearray.extend
2409
2410 self: self(type="PyByteArrayObject *")
2411 iterable_of_ints: object
2412 The iterable of items to append.
2413 /
2414
2415Append all the items from the iterator or sequence to the end of the bytearray.
2416[clinic start generated code]*/
2417
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002418static PyObject *
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002419bytearray_extend(PyByteArrayObject *self, PyObject *iterable_of_ints)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03002420/*[clinic end generated code: output=98155dbe249170b1 input=ce83a5d75b70d850]*/
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002421{
Benjamin Peterson153c70f2009-04-18 15:42:12 +00002422 PyObject *it, *item, *bytearray_obj;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002423 Py_ssize_t buf_size = 0, len = 0;
2424 int value;
2425 char *buf;
2426
Benjamin Peterson153c70f2009-04-18 15:42:12 +00002427 /* bytearray_setslice code only accepts something supporting PEP 3118. */
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002428 if (PyObject_CheckBuffer(iterable_of_ints)) {
2429 if (bytearray_setslice(self, Py_SIZE(self), Py_SIZE(self), iterable_of_ints) == -1)
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002430 return NULL;
2431
2432 Py_RETURN_NONE;
2433 }
2434
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002435 it = PyObject_GetIter(iterable_of_ints);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002436 if (it == NULL)
2437 return NULL;
2438
Ezio Melotti42da6632011-03-15 05:18:48 +02002439 /* Try to determine the length of the argument. 32 is arbitrary. */
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002440 buf_size = PyObject_LengthHint(iterable_of_ints, 32);
Benjamin Petersonef3e4c22009-04-11 19:48:14 +00002441 if (buf_size == -1) {
2442 Py_DECREF(it);
2443 return NULL;
2444 }
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002445
Benjamin Peterson153c70f2009-04-18 15:42:12 +00002446 bytearray_obj = PyByteArray_FromStringAndSize(NULL, buf_size);
Antoine Pitrou58bb82e2012-04-01 16:05:46 +02002447 if (bytearray_obj == NULL) {
2448 Py_DECREF(it);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002449 return NULL;
Antoine Pitrou58bb82e2012-04-01 16:05:46 +02002450 }
Benjamin Peterson153c70f2009-04-18 15:42:12 +00002451 buf = PyByteArray_AS_STRING(bytearray_obj);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002452
2453 while ((item = PyIter_Next(it)) != NULL) {
2454 if (! _getbytevalue(item, &value)) {
2455 Py_DECREF(item);
2456 Py_DECREF(it);
Benjamin Peterson153c70f2009-04-18 15:42:12 +00002457 Py_DECREF(bytearray_obj);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002458 return NULL;
2459 }
2460 buf[len++] = value;
2461 Py_DECREF(item);
2462
2463 if (len >= buf_size) {
2464 buf_size = len + (len >> 1) + 1;
Benjamin Peterson153c70f2009-04-18 15:42:12 +00002465 if (PyByteArray_Resize((PyObject *)bytearray_obj, buf_size) < 0) {
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002466 Py_DECREF(it);
Benjamin Peterson153c70f2009-04-18 15:42:12 +00002467 Py_DECREF(bytearray_obj);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002468 return NULL;
2469 }
2470 /* Recompute the `buf' pointer, since the resizing operation may
2471 have invalidated it. */
Benjamin Peterson153c70f2009-04-18 15:42:12 +00002472 buf = PyByteArray_AS_STRING(bytearray_obj);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002473 }
2474 }
2475 Py_DECREF(it);
2476
2477 /* Resize down to exact size. */
Benjamin Peterson153c70f2009-04-18 15:42:12 +00002478 if (PyByteArray_Resize((PyObject *)bytearray_obj, len) < 0) {
2479 Py_DECREF(bytearray_obj);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002480 return NULL;
2481 }
2482
Antoine Pitrou58bb82e2012-04-01 16:05:46 +02002483 if (bytearray_setslice(self, Py_SIZE(self), Py_SIZE(self), bytearray_obj) == -1) {
2484 Py_DECREF(bytearray_obj);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002485 return NULL;
Antoine Pitrou58bb82e2012-04-01 16:05:46 +02002486 }
Benjamin Peterson153c70f2009-04-18 15:42:12 +00002487 Py_DECREF(bytearray_obj);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002488
2489 Py_RETURN_NONE;
2490}
2491
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002492/*[clinic input]
2493bytearray.pop
2494
2495 self: self(type="PyByteArrayObject *")
2496 index: Py_ssize_t = -1
2497 The index from where to remove the item.
2498 -1 (the default value) means remove the last item.
2499 /
2500
2501Remove and return a single item from B.
2502
2503If no index argument is given, will pop the last item.
2504[clinic start generated code]*/
2505
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002506static PyObject *
2507bytearray_pop_impl(PyByteArrayObject *self, Py_ssize_t index)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03002508/*[clinic end generated code: output=e0ccd401f8021da8 input=0797e6c0ca9d5a85]*/
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002509{
2510 int value;
2511 Py_ssize_t n = Py_SIZE(self);
2512 char *buf;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002513
2514 if (n == 0) {
Eli Bendersky1bc4f192011-03-04 04:55:25 +00002515 PyErr_SetString(PyExc_IndexError,
2516 "pop from empty bytearray");
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002517 return NULL;
2518 }
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002519 if (index < 0)
2520 index += Py_SIZE(self);
2521 if (index < 0 || index >= Py_SIZE(self)) {
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002522 PyErr_SetString(PyExc_IndexError, "pop index out of range");
2523 return NULL;
2524 }
Antoine Pitrou5504e892008-12-06 21:27:53 +00002525 if (!_canresize(self))
2526 return NULL;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002527
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +02002528 buf = PyByteArray_AS_STRING(self);
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002529 value = buf[index];
2530 memmove(buf + index, buf + index + 1, n - index);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002531 if (PyByteArray_Resize((PyObject *)self, n - 1) < 0)
2532 return NULL;
2533
Mark Dickinson54a3db92009-09-06 10:19:23 +00002534 return PyLong_FromLong((unsigned char)value);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002535}
2536
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002537/*[clinic input]
2538bytearray.remove
2539
2540 self: self(type="PyByteArrayObject *")
2541 value: bytesvalue
2542 The value to remove.
2543 /
2544
2545Remove the first occurrence of a value in the bytearray.
2546[clinic start generated code]*/
2547
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002548static PyObject *
2549bytearray_remove_impl(PyByteArrayObject *self, int value)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03002550/*[clinic end generated code: output=d659e37866709c13 input=47560b11fd856c24]*/
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002551{
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002552 Py_ssize_t where, n = Py_SIZE(self);
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +02002553 char *buf = PyByteArray_AS_STRING(self);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002554
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002555 for (where = 0; where < n; where++) {
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +02002556 if (buf[where] == value)
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002557 break;
2558 }
2559 if (where == n) {
Mark Dickinson2b6705f2009-09-06 10:34:47 +00002560 PyErr_SetString(PyExc_ValueError, "value not found in bytearray");
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002561 return NULL;
2562 }
Antoine Pitrou5504e892008-12-06 21:27:53 +00002563 if (!_canresize(self))
2564 return NULL;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002565
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +02002566 memmove(buf + where, buf + where + 1, n - where);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002567 if (PyByteArray_Resize((PyObject *)self, n - 1) < 0)
2568 return NULL;
2569
2570 Py_RETURN_NONE;
2571}
2572
2573/* XXX These two helpers could be optimized if argsize == 1 */
2574
2575static Py_ssize_t
Serhiy Storchakaef1585e2015-12-25 20:01:53 +02002576lstrip_helper(const char *myptr, Py_ssize_t mysize,
2577 const void *argptr, Py_ssize_t argsize)
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002578{
2579 Py_ssize_t i = 0;
Antoine Pitrou5b720752013-10-05 21:24:10 +02002580 while (i < mysize && memchr(argptr, (unsigned char) myptr[i], argsize))
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002581 i++;
2582 return i;
2583}
2584
2585static Py_ssize_t
Serhiy Storchakaef1585e2015-12-25 20:01:53 +02002586rstrip_helper(const char *myptr, Py_ssize_t mysize,
2587 const void *argptr, Py_ssize_t argsize)
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002588{
2589 Py_ssize_t i = mysize - 1;
Antoine Pitrou5b720752013-10-05 21:24:10 +02002590 while (i >= 0 && memchr(argptr, (unsigned char) myptr[i], argsize))
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002591 i--;
2592 return i + 1;
2593}
2594
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002595/*[clinic input]
2596bytearray.strip
2597
2598 bytes: object = None
2599 /
2600
2601Strip leading and trailing bytes contained in the argument.
2602
2603If the argument is omitted or None, strip leading and trailing ASCII whitespace.
2604[clinic start generated code]*/
2605
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002606static PyObject *
2607bytearray_strip_impl(PyByteArrayObject *self, PyObject *bytes)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03002608/*[clinic end generated code: output=760412661a34ad5a input=ef7bb59b09c21d62]*/
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002609{
2610 Py_ssize_t left, right, mysize, byteslen;
2611 char *myptr, *bytesptr;
2612 Py_buffer vbytes;
2613
2614 if (bytes == Py_None) {
2615 bytesptr = "\t\n\r\f\v ";
2616 byteslen = 6;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002617 }
2618 else {
Serhiy Storchaka3dd3e262015-02-03 01:25:42 +02002619 if (PyObject_GetBuffer(bytes, &vbytes, PyBUF_SIMPLE) != 0)
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002620 return NULL;
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002621 bytesptr = (char *) vbytes.buf;
2622 byteslen = vbytes.len;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002623 }
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +02002624 myptr = PyByteArray_AS_STRING(self);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002625 mysize = Py_SIZE(self);
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002626 left = lstrip_helper(myptr, mysize, bytesptr, byteslen);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002627 if (left == mysize)
2628 right = left;
2629 else
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002630 right = rstrip_helper(myptr, mysize, bytesptr, byteslen);
2631 if (bytes != Py_None)
2632 PyBuffer_Release(&vbytes);
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +02002633 return PyByteArray_FromStringAndSize(myptr + left, right - left);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002634}
2635
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002636/*[clinic input]
2637bytearray.lstrip
2638
2639 bytes: object = None
2640 /
2641
2642Strip leading bytes contained in the argument.
2643
2644If the argument is omitted or None, strip leading ASCII whitespace.
2645[clinic start generated code]*/
2646
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002647static PyObject *
2648bytearray_lstrip_impl(PyByteArrayObject *self, PyObject *bytes)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03002649/*[clinic end generated code: output=d005c9d0ab909e66 input=80843f975dd7c480]*/
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002650{
2651 Py_ssize_t left, right, mysize, byteslen;
2652 char *myptr, *bytesptr;
2653 Py_buffer vbytes;
2654
2655 if (bytes == Py_None) {
2656 bytesptr = "\t\n\r\f\v ";
2657 byteslen = 6;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002658 }
2659 else {
Serhiy Storchaka3dd3e262015-02-03 01:25:42 +02002660 if (PyObject_GetBuffer(bytes, &vbytes, PyBUF_SIMPLE) != 0)
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002661 return NULL;
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002662 bytesptr = (char *) vbytes.buf;
2663 byteslen = vbytes.len;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002664 }
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +02002665 myptr = PyByteArray_AS_STRING(self);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002666 mysize = Py_SIZE(self);
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002667 left = lstrip_helper(myptr, mysize, bytesptr, byteslen);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002668 right = mysize;
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002669 if (bytes != Py_None)
2670 PyBuffer_Release(&vbytes);
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +02002671 return PyByteArray_FromStringAndSize(myptr + left, right - left);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002672}
2673
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002674/*[clinic input]
2675bytearray.rstrip
2676
2677 bytes: object = None
2678 /
2679
2680Strip trailing bytes contained in the argument.
2681
2682If the argument is omitted or None, strip trailing ASCII whitespace.
2683[clinic start generated code]*/
2684
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002685static PyObject *
2686bytearray_rstrip_impl(PyByteArrayObject *self, PyObject *bytes)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03002687/*[clinic end generated code: output=030e2fbd2f7276bd input=e728b994954cfd91]*/
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002688{
2689 Py_ssize_t right, mysize, byteslen;
2690 char *myptr, *bytesptr;
2691 Py_buffer vbytes;
2692
2693 if (bytes == Py_None) {
2694 bytesptr = "\t\n\r\f\v ";
2695 byteslen = 6;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002696 }
2697 else {
Serhiy Storchaka3dd3e262015-02-03 01:25:42 +02002698 if (PyObject_GetBuffer(bytes, &vbytes, PyBUF_SIMPLE) != 0)
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002699 return NULL;
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002700 bytesptr = (char *) vbytes.buf;
2701 byteslen = vbytes.len;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002702 }
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +02002703 myptr = PyByteArray_AS_STRING(self);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002704 mysize = Py_SIZE(self);
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002705 right = rstrip_helper(myptr, mysize, bytesptr, byteslen);
2706 if (bytes != Py_None)
2707 PyBuffer_Release(&vbytes);
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +02002708 return PyByteArray_FromStringAndSize(myptr, right);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002709}
2710
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002711/*[clinic input]
2712bytearray.decode
2713
2714 encoding: str(c_default="NULL") = 'utf-8'
2715 The encoding with which to decode the bytearray.
2716 errors: str(c_default="NULL") = 'strict'
2717 The error handling scheme to use for the handling of decoding errors.
2718 The default is 'strict' meaning that decoding errors raise a
2719 UnicodeDecodeError. Other possible values are 'ignore' and 'replace'
2720 as well as any other name registered with codecs.register_error that
2721 can handle UnicodeDecodeErrors.
2722
2723Decode the bytearray using the codec registered for encoding.
2724[clinic start generated code]*/
2725
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002726static PyObject *
Larry Hastings89964c42015-04-14 18:07:59 -04002727bytearray_decode_impl(PyByteArrayObject *self, const char *encoding,
2728 const char *errors)
2729/*[clinic end generated code: output=f57d43f4a00b42c5 input=f28d8f903020257b]*/
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002730{
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002731 if (encoding == NULL)
2732 encoding = PyUnicode_GetDefaultEncoding();
Martin v. Löwis0efea322014-07-27 17:29:17 +02002733 return PyUnicode_FromEncodedObject((PyObject*)self, encoding, errors);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002734}
2735
2736PyDoc_STRVAR(alloc_doc,
2737"B.__alloc__() -> int\n\
2738\n\
Georg Brandl17cb8a82008-05-30 08:20:09 +00002739Return the number of bytes actually allocated.");
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002740
2741static PyObject *
Benjamin Peterson153c70f2009-04-18 15:42:12 +00002742bytearray_alloc(PyByteArrayObject *self)
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002743{
2744 return PyLong_FromSsize_t(self->ob_alloc);
2745}
2746
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002747/*[clinic input]
2748bytearray.join
2749
2750 iterable_of_bytes: object
2751 /
2752
2753Concatenate any number of bytes/bytearray objects.
2754
2755The bytearray whose method is called is inserted in between each pair.
2756
2757The result is returned as a new bytearray object.
2758[clinic start generated code]*/
2759
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002760static PyObject *
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002761bytearray_join(PyByteArrayObject *self, PyObject *iterable_of_bytes)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03002762/*[clinic end generated code: output=a8516370bf68ae08 input=aba6b1f9b30fcb8e]*/
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002763{
Martin v. Löwis0efea322014-07-27 17:29:17 +02002764 return stringlib_bytes_join((PyObject*)self, iterable_of_bytes);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002765}
2766
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002767/*[clinic input]
2768bytearray.splitlines
Antoine Pitrouf2c54842010-01-13 08:07:53 +00002769
Serhiy Storchaka8b2e8b62015-05-30 11:30:39 +03002770 keepends: int(c_default="0") = False
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002771
2772Return a list of the lines in the bytearray, breaking at line boundaries.
2773
2774Line breaks are not included in the resulting list unless keepends is given and
2775true.
2776[clinic start generated code]*/
2777
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002778static PyObject *
2779bytearray_splitlines_impl(PyByteArrayObject *self, int keepends)
Serhiy Storchaka8b2e8b62015-05-30 11:30:39 +03002780/*[clinic end generated code: output=4223c94b895f6ad9 input=8ccade941e5ea0bd]*/
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002781{
Antoine Pitrouf2c54842010-01-13 08:07:53 +00002782 return stringlib_splitlines(
2783 (PyObject*) self, PyByteArray_AS_STRING(self),
2784 PyByteArray_GET_SIZE(self), keepends
2785 );
2786}
2787
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002788/*[clinic input]
2789@classmethod
2790bytearray.fromhex
2791
2792 cls: self(type="PyObject*")
2793 string: unicode
2794 /
2795
2796Create a bytearray object from a string of hexadecimal numbers.
2797
2798Spaces between two numbers are accepted.
2799Example: bytearray.fromhex('B9 01EF') -> bytearray(b'\\xb9\\x01\\xef')
2800[clinic start generated code]*/
2801
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002802static PyObject *
2803bytearray_fromhex_impl(PyObject*cls, PyObject *string)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03002804/*[clinic end generated code: output=df3da60129b3700c input=907bbd2d34d9367a]*/
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002805{
Victor Stinner2bf89932015-10-14 11:25:33 +02002806 return _PyBytes_FromHex(string, 1);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002807}
2808
Gregory P. Smith8cb65692015-04-25 23:22:26 +00002809PyDoc_STRVAR(hex__doc__,
2810"B.hex() -> string\n\
2811\n\
2812Create a string of hexadecimal numbers from a bytearray object.\n\
2813Example: bytearray([0xb9, 0x01, 0xef]).hex() -> 'b901ef'.");
2814
2815static PyObject *
2816bytearray_hex(PyBytesObject *self)
2817{
2818 char* argbuf = PyByteArray_AS_STRING(self);
2819 Py_ssize_t arglen = PyByteArray_GET_SIZE(self);
2820 return _Py_strhex(argbuf, arglen);
2821}
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002822
2823static PyObject *
Antoine Pitroub0e1f8b2011-12-05 20:40:08 +01002824_common_reduce(PyByteArrayObject *self, int proto)
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002825{
Antoine Pitroub0e1f8b2011-12-05 20:40:08 +01002826 PyObject *dict;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02002827 _Py_IDENTIFIER(__dict__);
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +02002828 char *buf;
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02002829
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02002830 dict = _PyObject_GetAttrId((PyObject *)self, &PyId___dict__);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002831 if (dict == NULL) {
2832 PyErr_Clear();
2833 dict = Py_None;
2834 Py_INCREF(dict);
2835 }
2836
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +02002837 buf = PyByteArray_AS_STRING(self);
Antoine Pitroub0e1f8b2011-12-05 20:40:08 +01002838 if (proto < 3) {
2839 /* use str based reduction for backwards compatibility with Python 2.x */
2840 PyObject *latin1;
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +02002841 if (Py_SIZE(self))
2842 latin1 = PyUnicode_DecodeLatin1(buf, Py_SIZE(self), NULL);
Antoine Pitroub0e1f8b2011-12-05 20:40:08 +01002843 else
2844 latin1 = PyUnicode_FromString("");
2845 return Py_BuildValue("(O(Ns)N)", Py_TYPE(self), latin1, "latin-1", dict);
2846 }
2847 else {
2848 /* use more efficient byte based reduction */
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +02002849 if (Py_SIZE(self)) {
2850 return Py_BuildValue("(O(y#)N)", Py_TYPE(self), buf, Py_SIZE(self), dict);
Antoine Pitroub0e1f8b2011-12-05 20:40:08 +01002851 }
2852 else {
2853 return Py_BuildValue("(O()N)", Py_TYPE(self), dict);
2854 }
2855 }
2856}
2857
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002858/*[clinic input]
2859bytearray.__reduce__ as bytearray_reduce
2860
2861 self: self(type="PyByteArrayObject *")
2862
2863Return state information for pickling.
2864[clinic start generated code]*/
2865
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002866static PyObject *
2867bytearray_reduce_impl(PyByteArrayObject *self)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03002868/*[clinic end generated code: output=52bf304086464cab input=fbb07de4d102a03a]*/
Antoine Pitroub0e1f8b2011-12-05 20:40:08 +01002869{
2870 return _common_reduce(self, 2);
2871}
2872
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002873/*[clinic input]
2874bytearray.__reduce_ex__ as bytearray_reduce_ex
2875
2876 self: self(type="PyByteArrayObject *")
2877 proto: int = 0
2878 /
2879
2880Return state information for pickling.
2881[clinic start generated code]*/
2882
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002883static PyObject *
2884bytearray_reduce_ex_impl(PyByteArrayObject *self, int proto)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03002885/*[clinic end generated code: output=52eac33377197520 input=0e091a42ca6dbd91]*/
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002886{
Antoine Pitroub0e1f8b2011-12-05 20:40:08 +01002887 return _common_reduce(self, proto);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002888}
2889
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002890/*[clinic input]
2891bytearray.__sizeof__ as bytearray_sizeof
2892
2893 self: self(type="PyByteArrayObject *")
2894
2895Returns the size of the bytearray object in memory, in bytes.
2896[clinic start generated code]*/
2897
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002898static PyObject *
2899bytearray_sizeof_impl(PyByteArrayObject *self)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03002900/*[clinic end generated code: output=738abdd17951c427 input=6b23d305362b462b]*/
Robert Schuppeniesfbe94c52008-07-14 10:13:31 +00002901{
Benjamin Petersonef3e4c22009-04-11 19:48:14 +00002902 Py_ssize_t res;
Robert Schuppeniesfbe94c52008-07-14 10:13:31 +00002903
Serhiy Storchaka5c4064e2015-12-19 20:05:25 +02002904 res = _PyObject_SIZE(Py_TYPE(self)) + self->ob_alloc * sizeof(char);
Benjamin Petersonef3e4c22009-04-11 19:48:14 +00002905 return PyLong_FromSsize_t(res);
Robert Schuppeniesfbe94c52008-07-14 10:13:31 +00002906}
2907
Benjamin Peterson153c70f2009-04-18 15:42:12 +00002908static PySequenceMethods bytearray_as_sequence = {
2909 (lenfunc)bytearray_length, /* sq_length */
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002910 (binaryfunc)PyByteArray_Concat, /* sq_concat */
Benjamin Peterson153c70f2009-04-18 15:42:12 +00002911 (ssizeargfunc)bytearray_repeat, /* sq_repeat */
2912 (ssizeargfunc)bytearray_getitem, /* sq_item */
2913 0, /* sq_slice */
2914 (ssizeobjargproc)bytearray_setitem, /* sq_ass_item */
2915 0, /* sq_ass_slice */
2916 (objobjproc)bytearray_contains, /* sq_contains */
2917 (binaryfunc)bytearray_iconcat, /* sq_inplace_concat */
2918 (ssizeargfunc)bytearray_irepeat, /* sq_inplace_repeat */
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002919};
2920
Benjamin Peterson153c70f2009-04-18 15:42:12 +00002921static PyMappingMethods bytearray_as_mapping = {
2922 (lenfunc)bytearray_length,
2923 (binaryfunc)bytearray_subscript,
2924 (objobjargproc)bytearray_ass_subscript,
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002925};
2926
Benjamin Peterson153c70f2009-04-18 15:42:12 +00002927static PyBufferProcs bytearray_as_buffer = {
2928 (getbufferproc)bytearray_getbuffer,
2929 (releasebufferproc)bytearray_releasebuffer,
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002930};
2931
2932static PyMethodDef
Benjamin Peterson153c70f2009-04-18 15:42:12 +00002933bytearray_methods[] = {
2934 {"__alloc__", (PyCFunction)bytearray_alloc, METH_NOARGS, alloc_doc},
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002935 BYTEARRAY_REDUCE_METHODDEF
2936 BYTEARRAY_REDUCE_EX_METHODDEF
2937 BYTEARRAY_SIZEOF_METHODDEF
2938 BYTEARRAY_APPEND_METHODDEF
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002939 {"capitalize", (PyCFunction)stringlib_capitalize, METH_NOARGS,
2940 _Py_capitalize__doc__},
2941 {"center", (PyCFunction)stringlib_center, METH_VARARGS, center__doc__},
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002942 BYTEARRAY_CLEAR_METHODDEF
2943 BYTEARRAY_COPY_METHODDEF
Benjamin Peterson153c70f2009-04-18 15:42:12 +00002944 {"count", (PyCFunction)bytearray_count, METH_VARARGS, count__doc__},
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002945 BYTEARRAY_DECODE_METHODDEF
Benjamin Peterson153c70f2009-04-18 15:42:12 +00002946 {"endswith", (PyCFunction)bytearray_endswith, METH_VARARGS, endswith__doc__},
Ezio Melotti745d54d2013-11-16 19:10:57 +02002947 {"expandtabs", (PyCFunction)stringlib_expandtabs, METH_VARARGS | METH_KEYWORDS,
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002948 expandtabs__doc__},
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002949 BYTEARRAY_EXTEND_METHODDEF
Benjamin Peterson153c70f2009-04-18 15:42:12 +00002950 {"find", (PyCFunction)bytearray_find, METH_VARARGS, find__doc__},
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002951 BYTEARRAY_FROMHEX_METHODDEF
Gregory P. Smith8cb65692015-04-25 23:22:26 +00002952 {"hex", (PyCFunction)bytearray_hex, METH_NOARGS, hex__doc__},
Benjamin Peterson153c70f2009-04-18 15:42:12 +00002953 {"index", (PyCFunction)bytearray_index, METH_VARARGS, index__doc__},
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002954 BYTEARRAY_INSERT_METHODDEF
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002955 {"isalnum", (PyCFunction)stringlib_isalnum, METH_NOARGS,
2956 _Py_isalnum__doc__},
2957 {"isalpha", (PyCFunction)stringlib_isalpha, METH_NOARGS,
2958 _Py_isalpha__doc__},
2959 {"isdigit", (PyCFunction)stringlib_isdigit, METH_NOARGS,
2960 _Py_isdigit__doc__},
2961 {"islower", (PyCFunction)stringlib_islower, METH_NOARGS,
2962 _Py_islower__doc__},
2963 {"isspace", (PyCFunction)stringlib_isspace, METH_NOARGS,
2964 _Py_isspace__doc__},
2965 {"istitle", (PyCFunction)stringlib_istitle, METH_NOARGS,
2966 _Py_istitle__doc__},
2967 {"isupper", (PyCFunction)stringlib_isupper, METH_NOARGS,
2968 _Py_isupper__doc__},
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002969 BYTEARRAY_JOIN_METHODDEF
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002970 {"ljust", (PyCFunction)stringlib_ljust, METH_VARARGS, ljust__doc__},
2971 {"lower", (PyCFunction)stringlib_lower, METH_NOARGS, _Py_lower__doc__},
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002972 BYTEARRAY_LSTRIP_METHODDEF
2973 BYTEARRAY_MAKETRANS_METHODDEF
2974 BYTEARRAY_PARTITION_METHODDEF
2975 BYTEARRAY_POP_METHODDEF
2976 BYTEARRAY_REMOVE_METHODDEF
2977 BYTEARRAY_REPLACE_METHODDEF
2978 BYTEARRAY_REVERSE_METHODDEF
Benjamin Peterson153c70f2009-04-18 15:42:12 +00002979 {"rfind", (PyCFunction)bytearray_rfind, METH_VARARGS, rfind__doc__},
2980 {"rindex", (PyCFunction)bytearray_rindex, METH_VARARGS, rindex__doc__},
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002981 {"rjust", (PyCFunction)stringlib_rjust, METH_VARARGS, rjust__doc__},
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002982 BYTEARRAY_RPARTITION_METHODDEF
2983 BYTEARRAY_RSPLIT_METHODDEF
2984 BYTEARRAY_RSTRIP_METHODDEF
2985 BYTEARRAY_SPLIT_METHODDEF
2986 BYTEARRAY_SPLITLINES_METHODDEF
Benjamin Peterson153c70f2009-04-18 15:42:12 +00002987 {"startswith", (PyCFunction)bytearray_startswith, METH_VARARGS ,
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002988 startswith__doc__},
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002989 BYTEARRAY_STRIP_METHODDEF
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002990 {"swapcase", (PyCFunction)stringlib_swapcase, METH_NOARGS,
2991 _Py_swapcase__doc__},
2992 {"title", (PyCFunction)stringlib_title, METH_NOARGS, _Py_title__doc__},
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002993 BYTEARRAY_TRANSLATE_METHODDEF
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002994 {"upper", (PyCFunction)stringlib_upper, METH_NOARGS, _Py_upper__doc__},
2995 {"zfill", (PyCFunction)stringlib_zfill, METH_VARARGS, zfill__doc__},
2996 {NULL}
2997};
2998
Ethan Furmanb95b5612015-01-23 20:05:18 -08002999static PyObject *
3000bytearray_mod(PyObject *v, PyObject *w)
3001{
3002 if (!PyByteArray_Check(v))
3003 Py_RETURN_NOTIMPLEMENTED;
Berker Peksag43de36d2016-04-16 01:20:47 +03003004 return _PyBytes_FormatEx(PyByteArray_AS_STRING(v), PyByteArray_GET_SIZE(v), w, 1);
Ethan Furmanb95b5612015-01-23 20:05:18 -08003005}
3006
3007static PyNumberMethods bytearray_as_number = {
3008 0, /*nb_add*/
3009 0, /*nb_subtract*/
3010 0, /*nb_multiply*/
3011 bytearray_mod, /*nb_remainder*/
3012};
3013
Benjamin Peterson153c70f2009-04-18 15:42:12 +00003014PyDoc_STRVAR(bytearray_doc,
Georg Brandl17cb8a82008-05-30 08:20:09 +00003015"bytearray(iterable_of_ints) -> bytearray\n\
3016bytearray(string, encoding[, errors]) -> bytearray\n\
Victor Stinnerbb2e9c42011-12-17 23:18:07 +01003017bytearray(bytes_or_buffer) -> mutable copy of bytes_or_buffer\n\
3018bytearray(int) -> bytes array of size given by the parameter initialized with null bytes\n\
3019bytearray() -> empty bytes array\n\
Christian Heimes2c9c7a52008-05-26 13:42:13 +00003020\n\
Serhiy Storchaka6a7b3a72016-04-17 08:32:47 +03003021Construct a mutable bytearray object from:\n\
Christian Heimes2c9c7a52008-05-26 13:42:13 +00003022 - an iterable yielding integers in range(256)\n\
3023 - a text string encoded using the specified encoding\n\
Victor Stinnerbb2e9c42011-12-17 23:18:07 +01003024 - a bytes or a buffer object\n\
Christian Heimes2c9c7a52008-05-26 13:42:13 +00003025 - any object implementing the buffer API.\n\
Victor Stinnerbb2e9c42011-12-17 23:18:07 +01003026 - an integer");
Christian Heimes2c9c7a52008-05-26 13:42:13 +00003027
3028
Benjamin Peterson153c70f2009-04-18 15:42:12 +00003029static PyObject *bytearray_iter(PyObject *seq);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00003030
3031PyTypeObject PyByteArray_Type = {
3032 PyVarObject_HEAD_INIT(&PyType_Type, 0)
3033 "bytearray",
3034 sizeof(PyByteArrayObject),
3035 0,
Benjamin Peterson153c70f2009-04-18 15:42:12 +00003036 (destructor)bytearray_dealloc, /* tp_dealloc */
Christian Heimes2c9c7a52008-05-26 13:42:13 +00003037 0, /* tp_print */
3038 0, /* tp_getattr */
3039 0, /* tp_setattr */
Mark Dickinsone94c6792009-02-02 20:36:42 +00003040 0, /* tp_reserved */
Benjamin Peterson153c70f2009-04-18 15:42:12 +00003041 (reprfunc)bytearray_repr, /* tp_repr */
Ethan Furmanb95b5612015-01-23 20:05:18 -08003042 &bytearray_as_number, /* tp_as_number */
Benjamin Peterson153c70f2009-04-18 15:42:12 +00003043 &bytearray_as_sequence, /* tp_as_sequence */
3044 &bytearray_as_mapping, /* tp_as_mapping */
Christian Heimes2c9c7a52008-05-26 13:42:13 +00003045 0, /* tp_hash */
3046 0, /* tp_call */
Benjamin Peterson153c70f2009-04-18 15:42:12 +00003047 bytearray_str, /* tp_str */
Christian Heimes2c9c7a52008-05-26 13:42:13 +00003048 PyObject_GenericGetAttr, /* tp_getattro */
3049 0, /* tp_setattro */
Benjamin Peterson153c70f2009-04-18 15:42:12 +00003050 &bytearray_as_buffer, /* tp_as_buffer */
Christian Heimes2c9c7a52008-05-26 13:42:13 +00003051 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
Benjamin Peterson153c70f2009-04-18 15:42:12 +00003052 bytearray_doc, /* tp_doc */
Christian Heimes2c9c7a52008-05-26 13:42:13 +00003053 0, /* tp_traverse */
3054 0, /* tp_clear */
Benjamin Peterson153c70f2009-04-18 15:42:12 +00003055 (richcmpfunc)bytearray_richcompare, /* tp_richcompare */
Christian Heimes2c9c7a52008-05-26 13:42:13 +00003056 0, /* tp_weaklistoffset */
Benjamin Peterson153c70f2009-04-18 15:42:12 +00003057 bytearray_iter, /* tp_iter */
Christian Heimes2c9c7a52008-05-26 13:42:13 +00003058 0, /* tp_iternext */
Benjamin Peterson153c70f2009-04-18 15:42:12 +00003059 bytearray_methods, /* tp_methods */
Christian Heimes2c9c7a52008-05-26 13:42:13 +00003060 0, /* tp_members */
3061 0, /* tp_getset */
3062 0, /* tp_base */
3063 0, /* tp_dict */
3064 0, /* tp_descr_get */
3065 0, /* tp_descr_set */
3066 0, /* tp_dictoffset */
Benjamin Peterson153c70f2009-04-18 15:42:12 +00003067 (initproc)bytearray_init, /* tp_init */
Christian Heimes2c9c7a52008-05-26 13:42:13 +00003068 PyType_GenericAlloc, /* tp_alloc */
3069 PyType_GenericNew, /* tp_new */
3070 PyObject_Del, /* tp_free */
3071};
3072
3073/*********************** Bytes Iterator ****************************/
3074
3075typedef struct {
3076 PyObject_HEAD
3077 Py_ssize_t it_index;
3078 PyByteArrayObject *it_seq; /* Set to NULL when iterator is exhausted */
3079} bytesiterobject;
3080
3081static void
Benjamin Peterson153c70f2009-04-18 15:42:12 +00003082bytearrayiter_dealloc(bytesiterobject *it)
Christian Heimes2c9c7a52008-05-26 13:42:13 +00003083{
3084 _PyObject_GC_UNTRACK(it);
3085 Py_XDECREF(it->it_seq);
3086 PyObject_GC_Del(it);
3087}
3088
3089static int
Benjamin Peterson153c70f2009-04-18 15:42:12 +00003090bytearrayiter_traverse(bytesiterobject *it, visitproc visit, void *arg)
Christian Heimes2c9c7a52008-05-26 13:42:13 +00003091{
3092 Py_VISIT(it->it_seq);
3093 return 0;
3094}
3095
3096static PyObject *
Benjamin Peterson153c70f2009-04-18 15:42:12 +00003097bytearrayiter_next(bytesiterobject *it)
Christian Heimes2c9c7a52008-05-26 13:42:13 +00003098{
3099 PyByteArrayObject *seq;
3100 PyObject *item;
3101
3102 assert(it != NULL);
3103 seq = it->it_seq;
3104 if (seq == NULL)
3105 return NULL;
3106 assert(PyByteArray_Check(seq));
3107
3108 if (it->it_index < PyByteArray_GET_SIZE(seq)) {
3109 item = PyLong_FromLong(
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +02003110 (unsigned char)PyByteArray_AS_STRING(seq)[it->it_index]);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00003111 if (item != NULL)
3112 ++it->it_index;
3113 return item;
3114 }
3115
Christian Heimes2c9c7a52008-05-26 13:42:13 +00003116 it->it_seq = NULL;
Serhiy Storchakafbb1c5e2016-03-30 20:40:02 +03003117 Py_DECREF(seq);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00003118 return NULL;
3119}
3120
3121static PyObject *
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00003122bytearrayiter_length_hint(bytesiterobject *it)
Christian Heimes2c9c7a52008-05-26 13:42:13 +00003123{
3124 Py_ssize_t len = 0;
3125 if (it->it_seq)
3126 len = PyByteArray_GET_SIZE(it->it_seq) - it->it_index;
3127 return PyLong_FromSsize_t(len);
3128}
3129
3130PyDoc_STRVAR(length_hint_doc,
3131 "Private method returning an estimate of len(list(it)).");
3132
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00003133static PyObject *
3134bytearrayiter_reduce(bytesiterobject *it)
3135{
3136 if (it->it_seq != NULL) {
Antoine Pitroua7013882012-04-05 00:04:20 +02003137 return Py_BuildValue("N(O)n", _PyObject_GetBuiltin("iter"),
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00003138 it->it_seq, it->it_index);
3139 } else {
3140 PyObject *u = PyUnicode_FromUnicode(NULL, 0);
3141 if (u == NULL)
3142 return NULL;
Antoine Pitroua7013882012-04-05 00:04:20 +02003143 return Py_BuildValue("N(N)", _PyObject_GetBuiltin("iter"), u);
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00003144 }
3145}
3146
3147static PyObject *
3148bytearrayiter_setstate(bytesiterobject *it, PyObject *state)
3149{
3150 Py_ssize_t index = PyLong_AsSsize_t(state);
3151 if (index == -1 && PyErr_Occurred())
3152 return NULL;
Kristján Valur Jónsson25dded02014-03-05 13:47:57 +00003153 if (it->it_seq != NULL) {
3154 if (index < 0)
3155 index = 0;
3156 else if (index > PyByteArray_GET_SIZE(it->it_seq))
3157 index = PyByteArray_GET_SIZE(it->it_seq); /* iterator exhausted */
3158 it->it_index = index;
3159 }
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00003160 Py_RETURN_NONE;
3161}
3162
3163PyDoc_STRVAR(setstate_doc, "Set state information for unpickling.");
3164
Benjamin Peterson153c70f2009-04-18 15:42:12 +00003165static PyMethodDef bytearrayiter_methods[] = {
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00003166 {"__length_hint__", (PyCFunction)bytearrayiter_length_hint, METH_NOARGS,
Christian Heimes2c9c7a52008-05-26 13:42:13 +00003167 length_hint_doc},
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00003168 {"__reduce__", (PyCFunction)bytearrayiter_reduce, METH_NOARGS,
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02003169 bytearray_reduce__doc__},
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00003170 {"__setstate__", (PyCFunction)bytearrayiter_setstate, METH_O,
3171 setstate_doc},
Christian Heimes2c9c7a52008-05-26 13:42:13 +00003172 {NULL, NULL} /* sentinel */
3173};
3174
3175PyTypeObject PyByteArrayIter_Type = {
3176 PyVarObject_HEAD_INIT(&PyType_Type, 0)
3177 "bytearray_iterator", /* tp_name */
3178 sizeof(bytesiterobject), /* tp_basicsize */
3179 0, /* tp_itemsize */
3180 /* methods */
Benjamin Peterson153c70f2009-04-18 15:42:12 +00003181 (destructor)bytearrayiter_dealloc, /* tp_dealloc */
Christian Heimes2c9c7a52008-05-26 13:42:13 +00003182 0, /* tp_print */
3183 0, /* tp_getattr */
3184 0, /* tp_setattr */
Mark Dickinsone94c6792009-02-02 20:36:42 +00003185 0, /* tp_reserved */
Christian Heimes2c9c7a52008-05-26 13:42:13 +00003186 0, /* tp_repr */
3187 0, /* tp_as_number */
3188 0, /* tp_as_sequence */
3189 0, /* tp_as_mapping */
3190 0, /* tp_hash */
3191 0, /* tp_call */
3192 0, /* tp_str */
3193 PyObject_GenericGetAttr, /* tp_getattro */
3194 0, /* tp_setattro */
3195 0, /* tp_as_buffer */
3196 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC, /* tp_flags */
3197 0, /* tp_doc */
Benjamin Peterson153c70f2009-04-18 15:42:12 +00003198 (traverseproc)bytearrayiter_traverse, /* tp_traverse */
Christian Heimes2c9c7a52008-05-26 13:42:13 +00003199 0, /* tp_clear */
3200 0, /* tp_richcompare */
3201 0, /* tp_weaklistoffset */
3202 PyObject_SelfIter, /* tp_iter */
Benjamin Peterson153c70f2009-04-18 15:42:12 +00003203 (iternextfunc)bytearrayiter_next, /* tp_iternext */
3204 bytearrayiter_methods, /* tp_methods */
Christian Heimes2c9c7a52008-05-26 13:42:13 +00003205 0,
3206};
3207
3208static PyObject *
Benjamin Peterson153c70f2009-04-18 15:42:12 +00003209bytearray_iter(PyObject *seq)
Christian Heimes2c9c7a52008-05-26 13:42:13 +00003210{
3211 bytesiterobject *it;
3212
3213 if (!PyByteArray_Check(seq)) {
3214 PyErr_BadInternalCall();
3215 return NULL;
3216 }
3217 it = PyObject_GC_New(bytesiterobject, &PyByteArrayIter_Type);
3218 if (it == NULL)
3219 return NULL;
3220 it->it_index = 0;
3221 Py_INCREF(seq);
3222 it->it_seq = (PyByteArrayObject *)seq;
3223 _PyObject_GC_TRACK(it);
3224 return (PyObject *)it;
3225}