blob: d76f15f3acbd7c861442553947a9658cf35fd49c [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"
Christian Heimes2c9c7a52008-05-26 13:42:13 +00008
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02009/*[clinic input]
10class bytearray "PyByteArrayObject *" "&PyByteArray_Type"
11[clinic start generated code]*/
12/*[clinic end generated code: output=da39a3ee5e6b4b0d input=5535b77c37a119e0]*/
13
Antoine Pitroufc8d6f42010-01-17 12:38:54 +000014char _PyByteArray_empty_string[] = "";
Christian Heimes2c9c7a52008-05-26 13:42:13 +000015
16void
17PyByteArray_Fini(void)
18{
Christian Heimes2c9c7a52008-05-26 13:42:13 +000019}
20
21int
22PyByteArray_Init(void)
23{
Christian Heimes2c9c7a52008-05-26 13:42:13 +000024 return 1;
25}
26
27/* end nullbytes support */
28
29/* Helpers */
30
31static int
32_getbytevalue(PyObject* arg, int *value)
33{
34 long face_value;
35
36 if (PyLong_Check(arg)) {
37 face_value = PyLong_AsLong(arg);
Georg Brandl9a54d7c2008-07-16 23:15:30 +000038 } else {
39 PyObject *index = PyNumber_Index(arg);
40 if (index == NULL) {
41 PyErr_Format(PyExc_TypeError, "an integer is required");
Mark Dickinson10de93a2010-07-09 19:25:48 +000042 *value = -1;
Christian Heimes2c9c7a52008-05-26 13:42:13 +000043 return 0;
44 }
Georg Brandl9a54d7c2008-07-16 23:15:30 +000045 face_value = PyLong_AsLong(index);
46 Py_DECREF(index);
47 }
48
49 if (face_value < 0 || face_value >= 256) {
50 /* this includes the OverflowError in case the long is too large */
51 PyErr_SetString(PyExc_ValueError, "byte must be in range(0, 256)");
Mark Dickinson10de93a2010-07-09 19:25:48 +000052 *value = -1;
Christian Heimes2c9c7a52008-05-26 13:42:13 +000053 return 0;
54 }
55
56 *value = face_value;
57 return 1;
58}
59
60static int
Benjamin Peterson153c70f2009-04-18 15:42:12 +000061bytearray_getbuffer(PyByteArrayObject *obj, Py_buffer *view, int flags)
Christian Heimes2c9c7a52008-05-26 13:42:13 +000062{
Christian Heimes2c9c7a52008-05-26 13:42:13 +000063 void *ptr;
64 if (view == NULL) {
Stefan Krah5178d912015-02-03 16:57:21 +010065 PyErr_SetString(PyExc_BufferError,
66 "bytearray_getbuffer: view==NULL argument is obsolete");
67 return -1;
Christian Heimes2c9c7a52008-05-26 13:42:13 +000068 }
Antoine Pitroufc8d6f42010-01-17 12:38:54 +000069 ptr = (void *) PyByteArray_AS_STRING(obj);
Stefan Krah5178d912015-02-03 16:57:21 +010070 /* cannot fail if view != NULL and readonly == 0 */
71 (void)PyBuffer_FillInfo(view, (PyObject*)obj, ptr, Py_SIZE(obj), 0, flags);
72 obj->ob_exports++;
73 return 0;
Christian Heimes2c9c7a52008-05-26 13:42:13 +000074}
75
76static void
Benjamin Peterson153c70f2009-04-18 15:42:12 +000077bytearray_releasebuffer(PyByteArrayObject *obj, Py_buffer *view)
Christian Heimes2c9c7a52008-05-26 13:42:13 +000078{
79 obj->ob_exports--;
80}
81
Antoine Pitrou5504e892008-12-06 21:27:53 +000082static int
83_canresize(PyByteArrayObject *self)
84{
85 if (self->ob_exports > 0) {
86 PyErr_SetString(PyExc_BufferError,
87 "Existing exports of data: object cannot be re-sized");
88 return 0;
89 }
90 return 1;
91}
92
Serhiy Storchaka1009bf12015-04-03 23:53:51 +030093#include "clinic/bytearrayobject.c.h"
94
Christian Heimes2c9c7a52008-05-26 13:42:13 +000095/* Direct API functions */
96
97PyObject *
98PyByteArray_FromObject(PyObject *input)
99{
100 return PyObject_CallFunctionObjArgs((PyObject *)&PyByteArray_Type,
101 input, NULL);
102}
103
104PyObject *
105PyByteArray_FromStringAndSize(const char *bytes, Py_ssize_t size)
106{
107 PyByteArrayObject *new;
108 Py_ssize_t alloc;
109
110 if (size < 0) {
111 PyErr_SetString(PyExc_SystemError,
112 "Negative size passed to PyByteArray_FromStringAndSize");
113 return NULL;
114 }
115
Neal Norwitz3ce5d922008-08-24 07:08:55 +0000116 /* Prevent buffer overflow when setting alloc to size+1. */
117 if (size == PY_SSIZE_T_MAX) {
118 return PyErr_NoMemory();
119 }
120
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000121 new = PyObject_New(PyByteArrayObject, &PyByteArray_Type);
122 if (new == NULL)
123 return NULL;
124
125 if (size == 0) {
126 new->ob_bytes = NULL;
127 alloc = 0;
128 }
129 else {
130 alloc = size + 1;
Antoine Pitrou39aba4f2011-11-12 21:15:28 +0100131 new->ob_bytes = PyObject_Malloc(alloc);
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000132 if (new->ob_bytes == NULL) {
133 Py_DECREF(new);
134 return PyErr_NoMemory();
135 }
Antoine Pitroufc8d6f42010-01-17 12:38:54 +0000136 if (bytes != NULL && size > 0)
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000137 memcpy(new->ob_bytes, bytes, size);
138 new->ob_bytes[size] = '\0'; /* Trailing null byte */
139 }
140 Py_SIZE(new) = size;
141 new->ob_alloc = alloc;
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200142 new->ob_start = new->ob_bytes;
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000143 new->ob_exports = 0;
144
145 return (PyObject *)new;
146}
147
148Py_ssize_t
149PyByteArray_Size(PyObject *self)
150{
151 assert(self != NULL);
152 assert(PyByteArray_Check(self));
153
154 return PyByteArray_GET_SIZE(self);
155}
156
157char *
158PyByteArray_AsString(PyObject *self)
159{
160 assert(self != NULL);
161 assert(PyByteArray_Check(self));
162
163 return PyByteArray_AS_STRING(self);
164}
165
166int
Antoine Pitroucc231542014-11-02 18:40:09 +0100167PyByteArray_Resize(PyObject *self, Py_ssize_t requested_size)
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000168{
169 void *sval;
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200170 PyByteArrayObject *obj = ((PyByteArrayObject *)self);
Antoine Pitroucc231542014-11-02 18:40:09 +0100171 /* All computations are done unsigned to avoid integer overflows
172 (see issue #22335). */
173 size_t alloc = (size_t) obj->ob_alloc;
174 size_t logical_offset = (size_t) (obj->ob_start - obj->ob_bytes);
175 size_t size = (size_t) requested_size;
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000176
177 assert(self != NULL);
178 assert(PyByteArray_Check(self));
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200179 assert(logical_offset <= alloc);
Antoine Pitroucc231542014-11-02 18:40:09 +0100180 assert(requested_size >= 0);
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000181
Antoine Pitroucc231542014-11-02 18:40:09 +0100182 if (requested_size == Py_SIZE(self)) {
Antoine Pitrou5504e892008-12-06 21:27:53 +0000183 return 0;
184 }
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200185 if (!_canresize(obj)) {
Antoine Pitrou5504e892008-12-06 21:27:53 +0000186 return -1;
187 }
188
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200189 if (size + logical_offset + 1 < alloc) {
190 /* Current buffer is large enough to host the requested size,
191 decide on a strategy. */
192 if (size < alloc / 2) {
193 /* Major downsize; resize down to exact size */
194 alloc = size + 1;
195 }
196 else {
197 /* Minor downsize; quick exit */
198 Py_SIZE(self) = size;
199 PyByteArray_AS_STRING(self)[size] = '\0'; /* Trailing null */
200 return 0;
201 }
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000202 }
203 else {
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200204 /* Need growing, decide on a strategy */
205 if (size <= alloc * 1.125) {
206 /* Moderate upsize; overallocate similar to list_resize() */
207 alloc = size + (size >> 3) + (size < 9 ? 3 : 6);
208 }
209 else {
210 /* Major upsize; resize up to exact size */
211 alloc = size + 1;
212 }
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000213 }
Antoine Pitroucc231542014-11-02 18:40:09 +0100214 if (alloc > PY_SSIZE_T_MAX) {
215 PyErr_NoMemory();
216 return -1;
217 }
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000218
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200219 if (logical_offset > 0) {
220 sval = PyObject_Malloc(alloc);
221 if (sval == NULL) {
222 PyErr_NoMemory();
223 return -1;
224 }
Antoine Pitroucc231542014-11-02 18:40:09 +0100225 memcpy(sval, PyByteArray_AS_STRING(self),
226 Py_MIN(requested_size, Py_SIZE(self)));
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200227 PyObject_Free(obj->ob_bytes);
228 }
229 else {
230 sval = PyObject_Realloc(obj->ob_bytes, alloc);
231 if (sval == NULL) {
232 PyErr_NoMemory();
233 return -1;
234 }
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000235 }
236
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200237 obj->ob_bytes = obj->ob_start = sval;
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000238 Py_SIZE(self) = size;
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200239 obj->ob_alloc = alloc;
240 obj->ob_bytes[size] = '\0'; /* Trailing null byte */
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000241
242 return 0;
243}
244
245PyObject *
246PyByteArray_Concat(PyObject *a, PyObject *b)
247{
248 Py_ssize_t size;
249 Py_buffer va, vb;
250 PyByteArrayObject *result = NULL;
251
252 va.len = -1;
253 vb.len = -1;
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +0200254 if (PyObject_GetBuffer(a, &va, PyBUF_SIMPLE) != 0 ||
255 PyObject_GetBuffer(b, &vb, PyBUF_SIMPLE) != 0) {
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000256 PyErr_Format(PyExc_TypeError, "can't concat %.100s to %.100s",
257 Py_TYPE(a)->tp_name, Py_TYPE(b)->tp_name);
258 goto done;
259 }
260
261 size = va.len + vb.len;
262 if (size < 0) {
Benjamin Petersone0124bd2009-03-09 21:04:33 +0000263 PyErr_NoMemory();
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000264 goto done;
265 }
266
267 result = (PyByteArrayObject *) PyByteArray_FromStringAndSize(NULL, size);
268 if (result != NULL) {
269 memcpy(result->ob_bytes, va.buf, va.len);
270 memcpy(result->ob_bytes + va.len, vb.buf, vb.len);
271 }
272
273 done:
274 if (va.len != -1)
Martin v. Löwis423be952008-08-13 15:53:07 +0000275 PyBuffer_Release(&va);
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000276 if (vb.len != -1)
Martin v. Löwis423be952008-08-13 15:53:07 +0000277 PyBuffer_Release(&vb);
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000278 return (PyObject *)result;
279}
280
Ethan Furmanb95b5612015-01-23 20:05:18 -0800281static PyObject *
282bytearray_format(PyByteArrayObject *self, PyObject *args)
283{
284 PyObject *bytes_in, *bytes_out, *res;
285 char *bytestring;
286
287 if (self == NULL || !PyByteArray_Check(self) || args == NULL) {
288 PyErr_BadInternalCall();
289 return NULL;
290 }
291 bytestring = PyByteArray_AS_STRING(self);
292 bytes_in = PyBytes_FromString(bytestring);
293 if (bytes_in == NULL)
294 return NULL;
295 bytes_out = _PyBytes_Format(bytes_in, args);
296 Py_DECREF(bytes_in);
297 if (bytes_out == NULL)
298 return NULL;
299 res = PyByteArray_FromObject(bytes_out);
300 Py_DECREF(bytes_out);
301 if (res == NULL)
302 return NULL;
303 return res;
304}
305
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000306/* Functions stuffed into the type object */
307
308static Py_ssize_t
Benjamin Peterson153c70f2009-04-18 15:42:12 +0000309bytearray_length(PyByteArrayObject *self)
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000310{
311 return Py_SIZE(self);
312}
313
314static PyObject *
Benjamin Peterson153c70f2009-04-18 15:42:12 +0000315bytearray_iconcat(PyByteArrayObject *self, PyObject *other)
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000316{
317 Py_ssize_t mysize;
318 Py_ssize_t size;
319 Py_buffer vo;
320
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +0200321 if (PyObject_GetBuffer(other, &vo, PyBUF_SIMPLE) != 0) {
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000322 PyErr_Format(PyExc_TypeError, "can't concat %.100s to %.100s",
323 Py_TYPE(other)->tp_name, Py_TYPE(self)->tp_name);
324 return NULL;
325 }
326
327 mysize = Py_SIZE(self);
328 size = mysize + vo.len;
329 if (size < 0) {
Martin v. Löwis423be952008-08-13 15:53:07 +0000330 PyBuffer_Release(&vo);
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000331 return PyErr_NoMemory();
332 }
333 if (size < self->ob_alloc) {
334 Py_SIZE(self) = size;
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200335 PyByteArray_AS_STRING(self)[Py_SIZE(self)] = '\0'; /* Trailing null byte */
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000336 }
337 else if (PyByteArray_Resize((PyObject *)self, size) < 0) {
Martin v. Löwis423be952008-08-13 15:53:07 +0000338 PyBuffer_Release(&vo);
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000339 return NULL;
340 }
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200341 memcpy(PyByteArray_AS_STRING(self) + mysize, vo.buf, vo.len);
Martin v. Löwis423be952008-08-13 15:53:07 +0000342 PyBuffer_Release(&vo);
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000343 Py_INCREF(self);
344 return (PyObject *)self;
345}
346
347static PyObject *
Benjamin Peterson153c70f2009-04-18 15:42:12 +0000348bytearray_repeat(PyByteArrayObject *self, Py_ssize_t count)
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000349{
350 PyByteArrayObject *result;
351 Py_ssize_t mysize;
352 Py_ssize_t size;
353
354 if (count < 0)
355 count = 0;
356 mysize = Py_SIZE(self);
Mark Dickinsoncf940c72010-08-10 18:35:01 +0000357 if (count > 0 && mysize > PY_SSIZE_T_MAX / count)
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000358 return PyErr_NoMemory();
Mark Dickinsoncf940c72010-08-10 18:35:01 +0000359 size = mysize * count;
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000360 result = (PyByteArrayObject *)PyByteArray_FromStringAndSize(NULL, size);
361 if (result != NULL && size != 0) {
362 if (mysize == 1)
363 memset(result->ob_bytes, self->ob_bytes[0], size);
364 else {
365 Py_ssize_t i;
366 for (i = 0; i < count; i++)
367 memcpy(result->ob_bytes + i*mysize, self->ob_bytes, mysize);
368 }
369 }
370 return (PyObject *)result;
371}
372
373static PyObject *
Benjamin Peterson153c70f2009-04-18 15:42:12 +0000374bytearray_irepeat(PyByteArrayObject *self, Py_ssize_t count)
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000375{
376 Py_ssize_t mysize;
377 Py_ssize_t size;
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200378 char *buf;
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000379
380 if (count < 0)
381 count = 0;
382 mysize = Py_SIZE(self);
Mark Dickinsoncf940c72010-08-10 18:35:01 +0000383 if (count > 0 && mysize > PY_SSIZE_T_MAX / count)
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000384 return PyErr_NoMemory();
Mark Dickinsoncf940c72010-08-10 18:35:01 +0000385 size = mysize * count;
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200386 if (PyByteArray_Resize((PyObject *)self, size) < 0)
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000387 return NULL;
388
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200389 buf = PyByteArray_AS_STRING(self);
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000390 if (mysize == 1)
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200391 memset(buf, buf[0], size);
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000392 else {
393 Py_ssize_t i;
394 for (i = 1; i < count; i++)
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200395 memcpy(buf + i*mysize, buf, mysize);
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000396 }
397
398 Py_INCREF(self);
399 return (PyObject *)self;
400}
401
402static PyObject *
Benjamin Peterson153c70f2009-04-18 15:42:12 +0000403bytearray_getitem(PyByteArrayObject *self, Py_ssize_t i)
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000404{
405 if (i < 0)
406 i += Py_SIZE(self);
407 if (i < 0 || i >= Py_SIZE(self)) {
408 PyErr_SetString(PyExc_IndexError, "bytearray index out of range");
409 return NULL;
410 }
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200411 return PyLong_FromLong((unsigned char)(PyByteArray_AS_STRING(self)[i]));
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000412}
413
414static PyObject *
Benjamin Peterson153c70f2009-04-18 15:42:12 +0000415bytearray_subscript(PyByteArrayObject *self, PyObject *index)
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000416{
Georg Brandl9a54d7c2008-07-16 23:15:30 +0000417 if (PyIndex_Check(index)) {
418 Py_ssize_t i = PyNumber_AsSsize_t(index, PyExc_IndexError);
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000419
420 if (i == -1 && PyErr_Occurred())
421 return NULL;
422
423 if (i < 0)
424 i += PyByteArray_GET_SIZE(self);
425
426 if (i < 0 || i >= Py_SIZE(self)) {
427 PyErr_SetString(PyExc_IndexError, "bytearray index out of range");
428 return NULL;
429 }
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200430 return PyLong_FromLong((unsigned char)(PyByteArray_AS_STRING(self)[i]));
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000431 }
Georg Brandl9a54d7c2008-07-16 23:15:30 +0000432 else if (PySlice_Check(index)) {
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000433 Py_ssize_t start, stop, step, slicelength, cur, i;
Martin v. Löwis4d0d4712010-12-03 20:14:31 +0000434 if (PySlice_GetIndicesEx(index,
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000435 PyByteArray_GET_SIZE(self),
436 &start, &stop, &step, &slicelength) < 0) {
437 return NULL;
438 }
439
440 if (slicelength <= 0)
441 return PyByteArray_FromStringAndSize("", 0);
442 else if (step == 1) {
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200443 return PyByteArray_FromStringAndSize(
444 PyByteArray_AS_STRING(self) + start, slicelength);
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000445 }
446 else {
447 char *source_buf = PyByteArray_AS_STRING(self);
Alexandre Vassalottie2641f42009-04-03 06:38:02 +0000448 char *result_buf;
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000449 PyObject *result;
450
Alexandre Vassalottie2641f42009-04-03 06:38:02 +0000451 result = PyByteArray_FromStringAndSize(NULL, slicelength);
452 if (result == NULL)
453 return NULL;
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000454
Alexandre Vassalottie2641f42009-04-03 06:38:02 +0000455 result_buf = PyByteArray_AS_STRING(result);
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000456 for (cur = start, i = 0; i < slicelength;
457 cur += step, i++) {
458 result_buf[i] = source_buf[cur];
459 }
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000460 return result;
461 }
462 }
463 else {
Terry Jan Reedyffff1442014-08-02 01:30:37 -0400464 PyErr_Format(PyExc_TypeError,
465 "bytearray indices must be integers or slices, not %.200s",
466 Py_TYPE(index)->tp_name);
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000467 return NULL;
468 }
469}
470
471static int
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200472bytearray_setslice_linear(PyByteArrayObject *self,
473 Py_ssize_t lo, Py_ssize_t hi,
474 char *bytes, Py_ssize_t bytes_len)
475{
476 Py_ssize_t avail = hi - lo;
477 char *buf = PyByteArray_AS_STRING(self);
478 Py_ssize_t growth = bytes_len - avail;
Victor Stinner84557232013-11-21 12:29:51 +0100479 int res = 0;
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200480 assert(avail >= 0);
481
Victor Stinner84557232013-11-21 12:29:51 +0100482 if (growth < 0) {
483 if (!_canresize(self))
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200484 return -1;
Victor Stinner84557232013-11-21 12:29:51 +0100485
486 if (lo == 0) {
487 /* Shrink the buffer by advancing its logical start */
488 self->ob_start -= growth;
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200489 /*
Victor Stinner84557232013-11-21 12:29:51 +0100490 0 lo hi old_size
491 | |<----avail----->|<-----tail------>|
492 | |<-bytes_len->|<-----tail------>|
493 0 new_lo new_hi new_size
494 */
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200495 }
Victor Stinner84557232013-11-21 12:29:51 +0100496 else {
497 /*
498 0 lo hi old_size
499 | |<----avail----->|<-----tomove------>|
500 | |<-bytes_len->|<-----tomove------>|
501 0 lo new_hi new_size
502 */
503 memmove(buf + lo + bytes_len, buf + hi,
504 Py_SIZE(self) - hi);
505 }
506 if (PyByteArray_Resize((PyObject *)self,
507 Py_SIZE(self) + growth) < 0) {
508 /* Issue #19578: Handling the memory allocation failure here is
509 tricky here because the bytearray object has already been
510 modified. Depending on growth and lo, the behaviour is
511 different.
512
513 If growth < 0 and lo != 0, the operation is completed, but a
514 MemoryError is still raised and the memory block is not
515 shrinked. Otherwise, the bytearray is restored in its previous
516 state and a MemoryError is raised. */
517 if (lo == 0) {
518 self->ob_start += growth;
519 return -1;
520 }
521 /* memmove() removed bytes, the bytearray object cannot be
522 restored in its previous state. */
523 Py_SIZE(self) += growth;
524 res = -1;
525 }
526 buf = PyByteArray_AS_STRING(self);
527 }
528 else if (growth > 0) {
529 if (Py_SIZE(self) > (Py_ssize_t)PY_SSIZE_T_MAX - growth) {
530 PyErr_NoMemory();
531 return -1;
532 }
533
534 if (PyByteArray_Resize((PyObject *)self,
535 Py_SIZE(self) + growth) < 0) {
536 return -1;
537 }
538 buf = PyByteArray_AS_STRING(self);
539 /* Make the place for the additional bytes */
540 /*
541 0 lo hi old_size
542 | |<-avail->|<-----tomove------>|
543 | |<---bytes_len-->|<-----tomove------>|
544 0 lo new_hi new_size
545 */
546 memmove(buf + lo + bytes_len, buf + hi,
547 Py_SIZE(self) - lo - bytes_len);
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200548 }
549
550 if (bytes_len > 0)
551 memcpy(buf + lo, bytes, bytes_len);
Victor Stinner84557232013-11-21 12:29:51 +0100552 return res;
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200553}
554
555static int
Benjamin Peterson153c70f2009-04-18 15:42:12 +0000556bytearray_setslice(PyByteArrayObject *self, Py_ssize_t lo, Py_ssize_t hi,
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000557 PyObject *values)
558{
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200559 Py_ssize_t needed;
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000560 void *bytes;
561 Py_buffer vbytes;
562 int res = 0;
563
564 vbytes.len = -1;
565 if (values == (PyObject *)self) {
566 /* Make a copy and call this function recursively */
567 int err;
568 values = PyByteArray_FromObject(values);
569 if (values == NULL)
570 return -1;
Benjamin Peterson153c70f2009-04-18 15:42:12 +0000571 err = bytearray_setslice(self, lo, hi, values);
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000572 Py_DECREF(values);
573 return err;
574 }
575 if (values == NULL) {
576 /* del b[lo:hi] */
577 bytes = NULL;
578 needed = 0;
579 }
580 else {
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +0200581 if (PyObject_GetBuffer(values, &vbytes, PyBUF_SIMPLE) != 0) {
582 PyErr_Format(PyExc_TypeError,
583 "can't set bytearray slice from %.100s",
584 Py_TYPE(values)->tp_name);
585 return -1;
586 }
587 needed = vbytes.len;
588 bytes = vbytes.buf;
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000589 }
590
591 if (lo < 0)
592 lo = 0;
593 if (hi < lo)
594 hi = lo;
595 if (hi > Py_SIZE(self))
596 hi = Py_SIZE(self);
597
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200598 res = bytearray_setslice_linear(self, lo, hi, bytes, needed);
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000599 if (vbytes.len != -1)
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200600 PyBuffer_Release(&vbytes);
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000601 return res;
602}
603
604static int
Benjamin Peterson153c70f2009-04-18 15:42:12 +0000605bytearray_setitem(PyByteArrayObject *self, Py_ssize_t i, PyObject *value)
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000606{
Georg Brandl9a54d7c2008-07-16 23:15:30 +0000607 int ival;
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000608
609 if (i < 0)
610 i += Py_SIZE(self);
611
612 if (i < 0 || i >= Py_SIZE(self)) {
613 PyErr_SetString(PyExc_IndexError, "bytearray index out of range");
614 return -1;
615 }
616
617 if (value == NULL)
Benjamin Peterson153c70f2009-04-18 15:42:12 +0000618 return bytearray_setslice(self, i, i+1, NULL);
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000619
Georg Brandl9a54d7c2008-07-16 23:15:30 +0000620 if (!_getbytevalue(value, &ival))
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000621 return -1;
622
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200623 PyByteArray_AS_STRING(self)[i] = ival;
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000624 return 0;
625}
626
627static int
Benjamin Peterson153c70f2009-04-18 15:42:12 +0000628bytearray_ass_subscript(PyByteArrayObject *self, PyObject *index, PyObject *values)
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000629{
630 Py_ssize_t start, stop, step, slicelen, needed;
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200631 char *buf, *bytes;
632 buf = PyByteArray_AS_STRING(self);
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000633
Georg Brandl9a54d7c2008-07-16 23:15:30 +0000634 if (PyIndex_Check(index)) {
635 Py_ssize_t i = PyNumber_AsSsize_t(index, PyExc_IndexError);
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000636
637 if (i == -1 && PyErr_Occurred())
638 return -1;
639
640 if (i < 0)
641 i += PyByteArray_GET_SIZE(self);
642
643 if (i < 0 || i >= Py_SIZE(self)) {
644 PyErr_SetString(PyExc_IndexError, "bytearray index out of range");
645 return -1;
646 }
647
648 if (values == NULL) {
649 /* Fall through to slice assignment */
650 start = i;
651 stop = i + 1;
652 step = 1;
653 slicelen = 1;
654 }
655 else {
Georg Brandl9a54d7c2008-07-16 23:15:30 +0000656 int ival;
657 if (!_getbytevalue(values, &ival))
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000658 return -1;
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200659 buf[i] = (char)ival;
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000660 return 0;
661 }
662 }
Georg Brandl9a54d7c2008-07-16 23:15:30 +0000663 else if (PySlice_Check(index)) {
Martin v. Löwis4d0d4712010-12-03 20:14:31 +0000664 if (PySlice_GetIndicesEx(index,
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000665 PyByteArray_GET_SIZE(self),
666 &start, &stop, &step, &slicelen) < 0) {
667 return -1;
668 }
669 }
670 else {
Terry Jan Reedyffff1442014-08-02 01:30:37 -0400671 PyErr_Format(PyExc_TypeError,
672 "bytearray indices must be integers or slices, not %.200s",
673 Py_TYPE(index)->tp_name);
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000674 return -1;
675 }
676
677 if (values == NULL) {
678 bytes = NULL;
679 needed = 0;
680 }
681 else if (values == (PyObject *)self || !PyByteArray_Check(values)) {
Christian Heimes6d26ade2012-11-03 23:07:59 +0100682 int err;
Ezio Melottic64bcbe2012-11-03 21:19:06 +0200683 if (PyNumber_Check(values) || PyUnicode_Check(values)) {
684 PyErr_SetString(PyExc_TypeError,
685 "can assign only bytes, buffers, or iterables "
686 "of ints in range(0, 256)");
687 return -1;
688 }
Georg Brandlf3fa5682010-12-04 17:09:30 +0000689 /* Make a copy and call this function recursively */
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000690 values = PyByteArray_FromObject(values);
691 if (values == NULL)
692 return -1;
Benjamin Peterson153c70f2009-04-18 15:42:12 +0000693 err = bytearray_ass_subscript(self, index, values);
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000694 Py_DECREF(values);
695 return err;
696 }
697 else {
698 assert(PyByteArray_Check(values));
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200699 bytes = PyByteArray_AS_STRING(values);
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000700 needed = Py_SIZE(values);
701 }
702 /* Make sure b[5:2] = ... inserts before 5, not before 2. */
703 if ((step < 0 && start < stop) ||
704 (step > 0 && start > stop))
705 stop = start;
706 if (step == 1) {
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200707 return bytearray_setslice_linear(self, start, stop, bytes, needed);
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000708 }
709 else {
710 if (needed == 0) {
711 /* Delete slice */
Mark Dickinsonbc099642010-01-29 17:27:24 +0000712 size_t cur;
713 Py_ssize_t i;
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000714
Antoine Pitrou5504e892008-12-06 21:27:53 +0000715 if (!_canresize(self))
716 return -1;
Mark Dickinson7e3b9482010-08-06 21:33:18 +0000717
718 if (slicelen == 0)
719 /* Nothing to do here. */
720 return 0;
721
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000722 if (step < 0) {
723 stop = start + 1;
724 start = stop + step * (slicelen - 1) - 1;
725 step = -step;
726 }
727 for (cur = start, i = 0;
728 i < slicelen; cur += step, i++) {
729 Py_ssize_t lim = step - 1;
730
Mark Dickinson66f575b2010-02-14 12:53:32 +0000731 if (cur + step >= (size_t)PyByteArray_GET_SIZE(self))
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000732 lim = PyByteArray_GET_SIZE(self) - cur - 1;
733
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200734 memmove(buf + cur - i,
735 buf + cur + 1, lim);
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000736 }
737 /* Move the tail of the bytes, in one chunk */
Mark Dickinson7e3b9482010-08-06 21:33:18 +0000738 cur = start + (size_t)slicelen*step;
Mark Dickinson66f575b2010-02-14 12:53:32 +0000739 if (cur < (size_t)PyByteArray_GET_SIZE(self)) {
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200740 memmove(buf + cur - slicelen,
741 buf + cur,
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000742 PyByteArray_GET_SIZE(self) - cur);
743 }
744 if (PyByteArray_Resize((PyObject *)self,
745 PyByteArray_GET_SIZE(self) - slicelen) < 0)
746 return -1;
747
748 return 0;
749 }
750 else {
751 /* Assign slice */
Mark Dickinson7e3b9482010-08-06 21:33:18 +0000752 Py_ssize_t i;
753 size_t cur;
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000754
755 if (needed != slicelen) {
756 PyErr_Format(PyExc_ValueError,
757 "attempt to assign bytes of size %zd "
758 "to extended slice of size %zd",
759 needed, slicelen);
760 return -1;
761 }
762 for (cur = start, i = 0; i < slicelen; cur += step, i++)
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200763 buf[cur] = bytes[i];
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000764 return 0;
765 }
766 }
767}
768
769static int
Benjamin Peterson153c70f2009-04-18 15:42:12 +0000770bytearray_init(PyByteArrayObject *self, PyObject *args, PyObject *kwds)
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000771{
772 static char *kwlist[] = {"source", "encoding", "errors", 0};
773 PyObject *arg = NULL;
774 const char *encoding = NULL;
775 const char *errors = NULL;
776 Py_ssize_t count;
777 PyObject *it;
778 PyObject *(*iternext)(PyObject *);
779
780 if (Py_SIZE(self) != 0) {
781 /* Empty previous contents (yes, do this first of all!) */
782 if (PyByteArray_Resize((PyObject *)self, 0) < 0)
783 return -1;
784 }
785
786 /* Parse arguments */
Georg Brandl3dbca812008-07-23 16:10:53 +0000787 if (!PyArg_ParseTupleAndKeywords(args, kwds, "|Oss:bytearray", kwlist,
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000788 &arg, &encoding, &errors))
789 return -1;
790
791 /* Make a quick exit if no first argument */
792 if (arg == NULL) {
793 if (encoding != NULL || errors != NULL) {
794 PyErr_SetString(PyExc_TypeError,
795 "encoding or errors without sequence argument");
796 return -1;
797 }
798 return 0;
799 }
800
801 if (PyUnicode_Check(arg)) {
802 /* Encode via the codec registry */
803 PyObject *encoded, *new;
804 if (encoding == NULL) {
805 PyErr_SetString(PyExc_TypeError,
806 "string argument without an encoding");
807 return -1;
808 }
Marc-André Lemburgb2750b52008-06-06 12:18:17 +0000809 encoded = PyUnicode_AsEncodedString(arg, encoding, errors);
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000810 if (encoded == NULL)
811 return -1;
812 assert(PyBytes_Check(encoded));
Benjamin Peterson153c70f2009-04-18 15:42:12 +0000813 new = bytearray_iconcat(self, encoded);
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000814 Py_DECREF(encoded);
815 if (new == NULL)
816 return -1;
817 Py_DECREF(new);
818 return 0;
819 }
820
821 /* If it's not unicode, there can't be encoding or errors */
822 if (encoding != NULL || errors != NULL) {
823 PyErr_SetString(PyExc_TypeError,
824 "encoding or errors without a string argument");
825 return -1;
826 }
827
828 /* Is it an int? */
Benjamin Peterson8380dd52010-04-16 22:51:37 +0000829 count = PyNumber_AsSsize_t(arg, PyExc_OverflowError);
830 if (count == -1 && PyErr_Occurred()) {
831 if (PyErr_ExceptionMatches(PyExc_OverflowError))
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000832 return -1;
Benjamin Peterson9c0e94f2010-04-16 23:00:53 +0000833 PyErr_Clear();
Benjamin Peterson8380dd52010-04-16 22:51:37 +0000834 }
835 else if (count < 0) {
836 PyErr_SetString(PyExc_ValueError, "negative count");
837 return -1;
838 }
839 else {
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000840 if (count > 0) {
Victor Stinner2bc4d952014-06-02 22:22:42 +0200841 if (PyByteArray_Resize((PyObject *)self, count))
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000842 return -1;
Victor Stinner2bc4d952014-06-02 22:22:42 +0200843 memset(PyByteArray_AS_STRING(self), 0, count);
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000844 }
845 return 0;
846 }
847
848 /* Use the buffer API */
849 if (PyObject_CheckBuffer(arg)) {
850 Py_ssize_t size;
851 Py_buffer view;
852 if (PyObject_GetBuffer(arg, &view, PyBUF_FULL_RO) < 0)
853 return -1;
854 size = view.len;
855 if (PyByteArray_Resize((PyObject *)self, size) < 0) goto fail;
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200856 if (PyBuffer_ToContiguous(PyByteArray_AS_STRING(self),
857 &view, size, 'C') < 0)
Stefan Krah7d12d9d2012-07-28 12:25:55 +0200858 goto fail;
Martin v. Löwis423be952008-08-13 15:53:07 +0000859 PyBuffer_Release(&view);
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000860 return 0;
861 fail:
Martin v. Löwis423be952008-08-13 15:53:07 +0000862 PyBuffer_Release(&view);
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000863 return -1;
864 }
865
866 /* XXX Optimize this if the arguments is a list, tuple */
867
868 /* Get the iterator */
869 it = PyObject_GetIter(arg);
870 if (it == NULL)
871 return -1;
872 iternext = *Py_TYPE(it)->tp_iternext;
873
874 /* Run the iterator to exhaustion */
875 for (;;) {
876 PyObject *item;
Georg Brandl9a54d7c2008-07-16 23:15:30 +0000877 int rc, value;
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000878
879 /* Get the next item */
880 item = iternext(it);
881 if (item == NULL) {
882 if (PyErr_Occurred()) {
883 if (!PyErr_ExceptionMatches(PyExc_StopIteration))
884 goto error;
885 PyErr_Clear();
886 }
887 break;
888 }
889
890 /* Interpret it as an int (__index__) */
Georg Brandl9a54d7c2008-07-16 23:15:30 +0000891 rc = _getbytevalue(item, &value);
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000892 Py_DECREF(item);
Georg Brandl9a54d7c2008-07-16 23:15:30 +0000893 if (!rc)
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000894 goto error;
895
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000896 /* Append the byte */
897 if (Py_SIZE(self) < self->ob_alloc)
898 Py_SIZE(self)++;
899 else if (PyByteArray_Resize((PyObject *)self, Py_SIZE(self)+1) < 0)
900 goto error;
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200901 PyByteArray_AS_STRING(self)[Py_SIZE(self)-1] = value;
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000902 }
903
904 /* Clean up and return success */
905 Py_DECREF(it);
906 return 0;
907
908 error:
909 /* Error handling when it != NULL */
910 Py_DECREF(it);
911 return -1;
912}
913
914/* Mostly copied from string_repr, but without the
915 "smart quote" functionality. */
916static PyObject *
Benjamin Peterson153c70f2009-04-18 15:42:12 +0000917bytearray_repr(PyByteArrayObject *self)
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000918{
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000919 const char *quote_prefix = "bytearray(b";
920 const char *quote_postfix = ")";
921 Py_ssize_t length = Py_SIZE(self);
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200922 /* 15 == strlen(quote_prefix) + 2 + strlen(quote_postfix) + 1 */
Mark Dickinson66f575b2010-02-14 12:53:32 +0000923 size_t newsize;
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000924 PyObject *v;
Antoine Pitrou9ed5f272013-08-13 20:18:52 +0200925 Py_ssize_t i;
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200926 char *bytes;
Antoine Pitrou9ed5f272013-08-13 20:18:52 +0200927 char c;
928 char *p;
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200929 int quote;
930 char *test, *start;
931 char *buffer;
932
933 if (length > (PY_SSIZE_T_MAX - 15) / 4) {
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000934 PyErr_SetString(PyExc_OverflowError,
935 "bytearray object is too large to make repr");
936 return NULL;
937 }
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200938
939 newsize = 15 + length * 4;
Antoine Pitrou39aba4f2011-11-12 21:15:28 +0100940 buffer = PyObject_Malloc(newsize);
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200941 if (buffer == NULL) {
942 PyErr_NoMemory();
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000943 return NULL;
944 }
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000945
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200946 /* Figure out which quote to use; single is preferred */
947 quote = '\'';
948 start = PyByteArray_AS_STRING(self);
949 for (test = start; test < start+length; ++test) {
950 if (*test == '"') {
951 quote = '\''; /* back to single */
952 break;
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000953 }
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200954 else if (*test == '\'')
955 quote = '"';
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000956 }
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200957
958 p = buffer;
959 while (*quote_prefix)
960 *p++ = *quote_prefix++;
961 *p++ = quote;
962
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200963 bytes = PyByteArray_AS_STRING(self);
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200964 for (i = 0; i < length; i++) {
965 /* There's at least enough room for a hex escape
966 and a closing quote. */
967 assert(newsize - (p - buffer) >= 5);
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200968 c = bytes[i];
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200969 if (c == '\'' || c == '\\')
970 *p++ = '\\', *p++ = c;
971 else if (c == '\t')
972 *p++ = '\\', *p++ = 't';
973 else if (c == '\n')
974 *p++ = '\\', *p++ = 'n';
975 else if (c == '\r')
976 *p++ = '\\', *p++ = 'r';
977 else if (c == 0)
978 *p++ = '\\', *p++ = 'x', *p++ = '0', *p++ = '0';
979 else if (c < ' ' || c >= 0x7f) {
980 *p++ = '\\';
981 *p++ = 'x';
Victor Stinnerf5cff562011-10-14 02:13:11 +0200982 *p++ = Py_hexdigits[(c & 0xf0) >> 4];
983 *p++ = Py_hexdigits[c & 0xf];
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200984 }
985 else
986 *p++ = c;
987 }
988 assert(newsize - (p - buffer) >= 1);
989 *p++ = quote;
990 while (*quote_postfix) {
991 *p++ = *quote_postfix++;
992 }
993
994 v = PyUnicode_DecodeASCII(buffer, p - buffer, NULL);
Antoine Pitrou39aba4f2011-11-12 21:15:28 +0100995 PyObject_Free(buffer);
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200996 return v;
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000997}
998
999static PyObject *
Benjamin Peterson153c70f2009-04-18 15:42:12 +00001000bytearray_str(PyObject *op)
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001001{
Alexander Belopolskyf0f45142010-08-11 17:31:17 +00001002 if (Py_BytesWarningFlag) {
1003 if (PyErr_WarnEx(PyExc_BytesWarning,
1004 "str() on a bytearray instance", 1))
1005 return NULL;
1006 }
1007 return bytearray_repr((PyByteArrayObject*)op);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001008}
1009
1010static PyObject *
Benjamin Peterson153c70f2009-04-18 15:42:12 +00001011bytearray_richcompare(PyObject *self, PyObject *other, int op)
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001012{
1013 Py_ssize_t self_size, other_size;
1014 Py_buffer self_bytes, other_bytes;
1015 PyObject *res;
1016 Py_ssize_t minsize;
1017 int cmp;
1018
1019 /* Bytes can be compared to anything that supports the (binary)
1020 buffer API. Except that a comparison with Unicode is always an
1021 error, even if the comparison is for equality. */
1022 if (PyObject_IsInstance(self, (PyObject*)&PyUnicode_Type) ||
1023 PyObject_IsInstance(other, (PyObject*)&PyUnicode_Type)) {
Barry Warsaw9e9dcd62008-10-17 01:50:37 +00001024 if (Py_BytesWarningFlag && (op == Py_EQ || op == Py_NE)) {
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001025 if (PyErr_WarnEx(PyExc_BytesWarning,
Georg Brandle5d68ac2008-06-04 11:30:26 +00001026 "Comparison between bytearray and string", 1))
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001027 return NULL;
1028 }
1029
Brian Curtindfc80e32011-08-10 20:28:54 -05001030 Py_RETURN_NOTIMPLEMENTED;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001031 }
1032
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +02001033 if (PyObject_GetBuffer(self, &self_bytes, PyBUF_SIMPLE) != 0) {
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001034 PyErr_Clear();
Brian Curtindfc80e32011-08-10 20:28:54 -05001035 Py_RETURN_NOTIMPLEMENTED;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001036 }
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +02001037 self_size = self_bytes.len;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001038
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +02001039 if (PyObject_GetBuffer(other, &other_bytes, PyBUF_SIMPLE) != 0) {
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001040 PyErr_Clear();
Martin v. Löwis423be952008-08-13 15:53:07 +00001041 PyBuffer_Release(&self_bytes);
Brian Curtindfc80e32011-08-10 20:28:54 -05001042 Py_RETURN_NOTIMPLEMENTED;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001043 }
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +02001044 other_size = other_bytes.len;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001045
1046 if (self_size != other_size && (op == Py_EQ || op == Py_NE)) {
1047 /* Shortcut: if the lengths differ, the objects differ */
1048 cmp = (op == Py_NE);
1049 }
1050 else {
1051 minsize = self_size;
1052 if (other_size < minsize)
1053 minsize = other_size;
1054
1055 cmp = memcmp(self_bytes.buf, other_bytes.buf, minsize);
1056 /* In ISO C, memcmp() guarantees to use unsigned bytes! */
1057
1058 if (cmp == 0) {
1059 if (self_size < other_size)
1060 cmp = -1;
1061 else if (self_size > other_size)
1062 cmp = 1;
1063 }
1064
1065 switch (op) {
1066 case Py_LT: cmp = cmp < 0; break;
1067 case Py_LE: cmp = cmp <= 0; break;
1068 case Py_EQ: cmp = cmp == 0; break;
1069 case Py_NE: cmp = cmp != 0; break;
1070 case Py_GT: cmp = cmp > 0; break;
1071 case Py_GE: cmp = cmp >= 0; break;
1072 }
1073 }
1074
1075 res = cmp ? Py_True : Py_False;
Martin v. Löwis423be952008-08-13 15:53:07 +00001076 PyBuffer_Release(&self_bytes);
1077 PyBuffer_Release(&other_bytes);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001078 Py_INCREF(res);
1079 return res;
1080}
1081
1082static void
Benjamin Peterson153c70f2009-04-18 15:42:12 +00001083bytearray_dealloc(PyByteArrayObject *self)
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001084{
Benjamin Petersone0124bd2009-03-09 21:04:33 +00001085 if (self->ob_exports > 0) {
1086 PyErr_SetString(PyExc_SystemError,
Benjamin Petersonef3e4c22009-04-11 19:48:14 +00001087 "deallocated bytearray object has exported buffers");
Benjamin Petersone0124bd2009-03-09 21:04:33 +00001088 PyErr_Print();
1089 }
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001090 if (self->ob_bytes != 0) {
Antoine Pitrou39aba4f2011-11-12 21:15:28 +01001091 PyObject_Free(self->ob_bytes);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001092 }
1093 Py_TYPE(self)->tp_free((PyObject *)self);
1094}
1095
1096
1097/* -------------------------------------------------------------------- */
1098/* Methods */
1099
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02001100#define FASTSEARCH fastsearch
1101#define STRINGLIB(F) stringlib_##F
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001102#define STRINGLIB_CHAR char
Antoine Pitroucfc22b42012-10-16 21:07:23 +02001103#define STRINGLIB_SIZEOF_CHAR 1
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001104#define STRINGLIB_LEN PyByteArray_GET_SIZE
1105#define STRINGLIB_STR PyByteArray_AS_STRING
1106#define STRINGLIB_NEW PyByteArray_FromStringAndSize
Antoine Pitrouf2c54842010-01-13 08:07:53 +00001107#define STRINGLIB_ISSPACE Py_ISSPACE
1108#define STRINGLIB_ISLINEBREAK(x) ((x == '\n') || (x == '\r'))
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001109#define STRINGLIB_CHECK_EXACT PyByteArray_CheckExact
1110#define STRINGLIB_MUTABLE 1
1111
1112#include "stringlib/fastsearch.h"
1113#include "stringlib/count.h"
1114#include "stringlib/find.h"
Antoine Pitroucfc22b42012-10-16 21:07:23 +02001115#include "stringlib/join.h"
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001116#include "stringlib/partition.h"
Antoine Pitrouf2c54842010-01-13 08:07:53 +00001117#include "stringlib/split.h"
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001118#include "stringlib/ctype.h"
1119#include "stringlib/transmogrify.h"
1120
1121
1122/* The following Py_LOCAL_INLINE and Py_LOCAL functions
1123were copied from the old char* style string object. */
1124
Antoine Pitrouf2c54842010-01-13 08:07:53 +00001125/* helper macro to fixup start/end slice values */
1126#define ADJUST_INDICES(start, end, len) \
1127 if (end > len) \
1128 end = len; \
1129 else if (end < 0) { \
1130 end += len; \
1131 if (end < 0) \
1132 end = 0; \
1133 } \
1134 if (start < 0) { \
1135 start += len; \
1136 if (start < 0) \
1137 start = 0; \
1138 }
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001139
1140Py_LOCAL_INLINE(Py_ssize_t)
Benjamin Peterson153c70f2009-04-18 15:42:12 +00001141bytearray_find_internal(PyByteArrayObject *self, PyObject *args, int dir)
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001142{
1143 PyObject *subobj;
Antoine Pitrouac65d962011-10-20 23:54:17 +02001144 char byte;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001145 Py_buffer subbuf;
Antoine Pitrouac65d962011-10-20 23:54:17 +02001146 const char *sub;
Serhiy Storchakad9d769f2015-03-24 21:55:47 +02001147 Py_ssize_t len, sub_len;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001148 Py_ssize_t start=0, end=PY_SSIZE_T_MAX;
1149 Py_ssize_t res;
1150
Antoine Pitrouac65d962011-10-20 23:54:17 +02001151 if (!stringlib_parse_args_finds_byte("find/rfind/index/rindex",
1152 args, &subobj, &byte, &start, &end))
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001153 return -2;
Antoine Pitrouac65d962011-10-20 23:54:17 +02001154
1155 if (subobj) {
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +02001156 if (PyObject_GetBuffer(subobj, &subbuf, PyBUF_SIMPLE) != 0)
Antoine Pitrouac65d962011-10-20 23:54:17 +02001157 return -2;
1158
1159 sub = subbuf.buf;
1160 sub_len = subbuf.len;
1161 }
1162 else {
1163 sub = &byte;
1164 sub_len = 1;
1165 }
Serhiy Storchakad9d769f2015-03-24 21:55:47 +02001166 len = PyByteArray_GET_SIZE(self);
Antoine Pitrouac65d962011-10-20 23:54:17 +02001167
Serhiy Storchakad9d769f2015-03-24 21:55:47 +02001168 ADJUST_INDICES(start, end, len);
1169 if (end - start < sub_len)
1170 res = -1;
Victor Stinnerdabbfe72015-03-25 03:16:32 +01001171 /* Issue #23573: FIXME, windows has no memrchr() */
1172 else if (sub_len == 1 && dir > 0) {
Serhiy Storchakad9d769f2015-03-24 21:55:47 +02001173 unsigned char needle = *sub;
Serhiy Storchakad9d769f2015-03-24 21:55:47 +02001174 res = stringlib_fastsearch_memchr_1char(
1175 PyByteArray_AS_STRING(self) + start, end - start,
Christian Heimes4e259132015-04-18 05:54:02 +02001176 needle, needle, FAST_SEARCH);
Serhiy Storchakad9d769f2015-03-24 21:55:47 +02001177 if (res >= 0)
1178 res += start;
1179 }
1180 else {
1181 if (dir > 0)
1182 res = stringlib_find_slice(
1183 PyByteArray_AS_STRING(self), len,
1184 sub, sub_len, start, end);
1185 else
1186 res = stringlib_rfind_slice(
1187 PyByteArray_AS_STRING(self), len,
1188 sub, sub_len, start, end);
1189 }
Antoine Pitrouac65d962011-10-20 23:54:17 +02001190
1191 if (subobj)
1192 PyBuffer_Release(&subbuf);
1193
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001194 return res;
1195}
1196
1197PyDoc_STRVAR(find__doc__,
Georg Brandl17cb8a82008-05-30 08:20:09 +00001198"B.find(sub[, start[, end]]) -> int\n\
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001199\n\
1200Return the lowest index in B where subsection sub is found,\n\
Senthil Kumaran53516a82011-07-27 23:33:54 +08001201such that sub is contained within B[start,end]. Optional\n\
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001202arguments start and end are interpreted as in slice notation.\n\
1203\n\
1204Return -1 on failure.");
1205
1206static PyObject *
Benjamin Peterson153c70f2009-04-18 15:42:12 +00001207bytearray_find(PyByteArrayObject *self, PyObject *args)
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001208{
Benjamin Peterson153c70f2009-04-18 15:42:12 +00001209 Py_ssize_t result = bytearray_find_internal(self, args, +1);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001210 if (result == -2)
1211 return NULL;
1212 return PyLong_FromSsize_t(result);
1213}
1214
1215PyDoc_STRVAR(count__doc__,
Georg Brandl17cb8a82008-05-30 08:20:09 +00001216"B.count(sub[, start[, end]]) -> int\n\
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001217\n\
1218Return the number of non-overlapping occurrences of subsection sub in\n\
1219bytes B[start:end]. Optional arguments start and end are interpreted\n\
1220as in slice notation.");
1221
1222static PyObject *
Benjamin Peterson153c70f2009-04-18 15:42:12 +00001223bytearray_count(PyByteArrayObject *self, PyObject *args)
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001224{
1225 PyObject *sub_obj;
Antoine Pitrouac65d962011-10-20 23:54:17 +02001226 const char *str = PyByteArray_AS_STRING(self), *sub;
1227 Py_ssize_t sub_len;
1228 char byte;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001229 Py_ssize_t start = 0, end = PY_SSIZE_T_MAX;
Antoine Pitrouac65d962011-10-20 23:54:17 +02001230
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001231 Py_buffer vsub;
1232 PyObject *count_obj;
1233
Antoine Pitrouac65d962011-10-20 23:54:17 +02001234 if (!stringlib_parse_args_finds_byte("count", args, &sub_obj, &byte,
1235 &start, &end))
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001236 return NULL;
1237
Antoine Pitrouac65d962011-10-20 23:54:17 +02001238 if (sub_obj) {
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +02001239 if (PyObject_GetBuffer(sub_obj, &vsub, PyBUF_SIMPLE) != 0)
Antoine Pitrouac65d962011-10-20 23:54:17 +02001240 return NULL;
1241
1242 sub = vsub.buf;
1243 sub_len = vsub.len;
1244 }
1245 else {
1246 sub = &byte;
1247 sub_len = 1;
1248 }
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001249
Antoine Pitrouf2c54842010-01-13 08:07:53 +00001250 ADJUST_INDICES(start, end, PyByteArray_GET_SIZE(self));
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001251
1252 count_obj = PyLong_FromSsize_t(
Antoine Pitrouac65d962011-10-20 23:54:17 +02001253 stringlib_count(str + start, end - start, sub, sub_len, PY_SSIZE_T_MAX)
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001254 );
Antoine Pitrouac65d962011-10-20 23:54:17 +02001255
1256 if (sub_obj)
1257 PyBuffer_Release(&vsub);
1258
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001259 return count_obj;
1260}
1261
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001262/*[clinic input]
1263bytearray.clear
1264
1265 self: self(type="PyByteArrayObject *")
1266
1267Remove all items from the bytearray.
1268[clinic start generated code]*/
1269
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001270static PyObject *
1271bytearray_clear_impl(PyByteArrayObject *self)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03001272/*[clinic end generated code: output=85c2fe6aede0956c input=e524fd330abcdc18]*/
Eli Bendersky4db28d32011-03-03 18:21:02 +00001273{
1274 if (PyByteArray_Resize((PyObject *)self, 0) < 0)
1275 return NULL;
1276 Py_RETURN_NONE;
1277}
1278
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001279/*[clinic input]
1280bytearray.copy
1281
1282 self: self(type="PyByteArrayObject *")
1283
1284Return a copy of B.
1285[clinic start generated code]*/
1286
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001287static PyObject *
1288bytearray_copy_impl(PyByteArrayObject *self)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03001289/*[clinic end generated code: output=68cfbcfed484c132 input=6d5d2975aa0f33f3]*/
Eli Bendersky4db28d32011-03-03 18:21:02 +00001290{
1291 return PyByteArray_FromStringAndSize(PyByteArray_AS_STRING((PyObject *)self),
1292 PyByteArray_GET_SIZE(self));
1293}
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001294
1295PyDoc_STRVAR(index__doc__,
Georg Brandl17cb8a82008-05-30 08:20:09 +00001296"B.index(sub[, start[, end]]) -> int\n\
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001297\n\
1298Like B.find() but raise ValueError when the subsection is not found.");
1299
1300static PyObject *
Benjamin Peterson153c70f2009-04-18 15:42:12 +00001301bytearray_index(PyByteArrayObject *self, PyObject *args)
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001302{
Benjamin Peterson153c70f2009-04-18 15:42:12 +00001303 Py_ssize_t result = bytearray_find_internal(self, args, +1);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001304 if (result == -2)
1305 return NULL;
1306 if (result == -1) {
1307 PyErr_SetString(PyExc_ValueError,
1308 "subsection not found");
1309 return NULL;
1310 }
1311 return PyLong_FromSsize_t(result);
1312}
1313
1314
1315PyDoc_STRVAR(rfind__doc__,
Georg Brandl17cb8a82008-05-30 08:20:09 +00001316"B.rfind(sub[, start[, end]]) -> int\n\
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001317\n\
1318Return the highest index in B where subsection sub is found,\n\
Senthil Kumaran53516a82011-07-27 23:33:54 +08001319such that sub is contained within B[start,end]. Optional\n\
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001320arguments start and end are interpreted as in slice notation.\n\
1321\n\
1322Return -1 on failure.");
1323
1324static PyObject *
Benjamin Peterson153c70f2009-04-18 15:42:12 +00001325bytearray_rfind(PyByteArrayObject *self, PyObject *args)
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001326{
Benjamin Peterson153c70f2009-04-18 15:42:12 +00001327 Py_ssize_t result = bytearray_find_internal(self, args, -1);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001328 if (result == -2)
1329 return NULL;
1330 return PyLong_FromSsize_t(result);
1331}
1332
1333
1334PyDoc_STRVAR(rindex__doc__,
Georg Brandl17cb8a82008-05-30 08:20:09 +00001335"B.rindex(sub[, start[, end]]) -> int\n\
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001336\n\
1337Like B.rfind() but raise ValueError when the subsection is not found.");
1338
1339static PyObject *
Benjamin Peterson153c70f2009-04-18 15:42:12 +00001340bytearray_rindex(PyByteArrayObject *self, PyObject *args)
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001341{
Benjamin Peterson153c70f2009-04-18 15:42:12 +00001342 Py_ssize_t result = bytearray_find_internal(self, args, -1);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001343 if (result == -2)
1344 return NULL;
1345 if (result == -1) {
1346 PyErr_SetString(PyExc_ValueError,
1347 "subsection not found");
1348 return NULL;
1349 }
1350 return PyLong_FromSsize_t(result);
1351}
1352
1353
1354static int
Benjamin Peterson153c70f2009-04-18 15:42:12 +00001355bytearray_contains(PyObject *self, PyObject *arg)
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001356{
1357 Py_ssize_t ival = PyNumber_AsSsize_t(arg, PyExc_ValueError);
1358 if (ival == -1 && PyErr_Occurred()) {
1359 Py_buffer varg;
Antoine Pitrou0010d372010-08-15 17:12:55 +00001360 Py_ssize_t pos;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001361 PyErr_Clear();
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +02001362 if (PyObject_GetBuffer(arg, &varg, PyBUF_SIMPLE) != 0)
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001363 return -1;
1364 pos = stringlib_find(PyByteArray_AS_STRING(self), Py_SIZE(self),
1365 varg.buf, varg.len, 0);
Martin v. Löwis423be952008-08-13 15:53:07 +00001366 PyBuffer_Release(&varg);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001367 return pos >= 0;
1368 }
1369 if (ival < 0 || ival >= 256) {
1370 PyErr_SetString(PyExc_ValueError, "byte must be in range(0, 256)");
1371 return -1;
1372 }
1373
Antoine Pitrou0010d372010-08-15 17:12:55 +00001374 return memchr(PyByteArray_AS_STRING(self), (int) ival, Py_SIZE(self)) != NULL;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001375}
1376
1377
1378/* Matches the end (direction >= 0) or start (direction < 0) of self
1379 * against substr, using the start and end arguments. Returns
1380 * -1 on error, 0 if not found and 1 if found.
1381 */
1382Py_LOCAL(int)
Benjamin Peterson153c70f2009-04-18 15:42:12 +00001383_bytearray_tailmatch(PyByteArrayObject *self, PyObject *substr, Py_ssize_t start,
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001384 Py_ssize_t end, int direction)
1385{
1386 Py_ssize_t len = PyByteArray_GET_SIZE(self);
1387 const char* str;
1388 Py_buffer vsubstr;
1389 int rv = 0;
1390
1391 str = PyByteArray_AS_STRING(self);
1392
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +02001393 if (PyObject_GetBuffer(substr, &vsubstr, PyBUF_SIMPLE) != 0)
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001394 return -1;
1395
Antoine Pitrouf2c54842010-01-13 08:07:53 +00001396 ADJUST_INDICES(start, end, len);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001397
1398 if (direction < 0) {
1399 /* startswith */
1400 if (start+vsubstr.len > len) {
1401 goto done;
1402 }
1403 } else {
1404 /* endswith */
1405 if (end-start < vsubstr.len || start > len) {
1406 goto done;
1407 }
1408
1409 if (end-vsubstr.len > start)
1410 start = end - vsubstr.len;
1411 }
1412 if (end-start >= vsubstr.len)
1413 rv = ! memcmp(str+start, vsubstr.buf, vsubstr.len);
1414
1415done:
Martin v. Löwis423be952008-08-13 15:53:07 +00001416 PyBuffer_Release(&vsubstr);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001417 return rv;
1418}
1419
1420
1421PyDoc_STRVAR(startswith__doc__,
Georg Brandl17cb8a82008-05-30 08:20:09 +00001422"B.startswith(prefix[, start[, end]]) -> bool\n\
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001423\n\
1424Return True if B starts with the specified prefix, False otherwise.\n\
1425With optional start, test B beginning at that position.\n\
1426With optional end, stop comparing B at that position.\n\
Ezio Melottiba42fd52011-04-26 06:09:45 +03001427prefix can also be a tuple of bytes to try.");
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001428
1429static PyObject *
Benjamin Peterson153c70f2009-04-18 15:42:12 +00001430bytearray_startswith(PyByteArrayObject *self, PyObject *args)
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001431{
1432 Py_ssize_t start = 0;
1433 Py_ssize_t end = PY_SSIZE_T_MAX;
1434 PyObject *subobj;
1435 int result;
1436
Jesus Ceaac451502011-04-20 17:09:23 +02001437 if (!stringlib_parse_args_finds("startswith", args, &subobj, &start, &end))
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001438 return NULL;
1439 if (PyTuple_Check(subobj)) {
1440 Py_ssize_t i;
1441 for (i = 0; i < PyTuple_GET_SIZE(subobj); i++) {
Benjamin Peterson153c70f2009-04-18 15:42:12 +00001442 result = _bytearray_tailmatch(self,
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001443 PyTuple_GET_ITEM(subobj, i),
1444 start, end, -1);
1445 if (result == -1)
1446 return NULL;
1447 else if (result) {
1448 Py_RETURN_TRUE;
1449 }
1450 }
1451 Py_RETURN_FALSE;
1452 }
Benjamin Peterson153c70f2009-04-18 15:42:12 +00001453 result = _bytearray_tailmatch(self, subobj, start, end, -1);
Ezio Melottiba42fd52011-04-26 06:09:45 +03001454 if (result == -1) {
1455 if (PyErr_ExceptionMatches(PyExc_TypeError))
1456 PyErr_Format(PyExc_TypeError, "startswith first arg must be bytes "
1457 "or a tuple of bytes, not %s", Py_TYPE(subobj)->tp_name);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001458 return NULL;
Ezio Melottiba42fd52011-04-26 06:09:45 +03001459 }
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001460 else
1461 return PyBool_FromLong(result);
1462}
1463
1464PyDoc_STRVAR(endswith__doc__,
Georg Brandl17cb8a82008-05-30 08:20:09 +00001465"B.endswith(suffix[, start[, end]]) -> bool\n\
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001466\n\
1467Return True if B ends with the specified suffix, False otherwise.\n\
1468With optional start, test B beginning at that position.\n\
1469With optional end, stop comparing B at that position.\n\
Ezio Melottiba42fd52011-04-26 06:09:45 +03001470suffix can also be a tuple of bytes to try.");
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001471
1472static PyObject *
Benjamin Peterson153c70f2009-04-18 15:42:12 +00001473bytearray_endswith(PyByteArrayObject *self, PyObject *args)
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001474{
1475 Py_ssize_t start = 0;
1476 Py_ssize_t end = PY_SSIZE_T_MAX;
1477 PyObject *subobj;
1478 int result;
1479
Jesus Ceaac451502011-04-20 17:09:23 +02001480 if (!stringlib_parse_args_finds("endswith", args, &subobj, &start, &end))
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001481 return NULL;
1482 if (PyTuple_Check(subobj)) {
1483 Py_ssize_t i;
1484 for (i = 0; i < PyTuple_GET_SIZE(subobj); i++) {
Benjamin Peterson153c70f2009-04-18 15:42:12 +00001485 result = _bytearray_tailmatch(self,
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001486 PyTuple_GET_ITEM(subobj, i),
1487 start, end, +1);
1488 if (result == -1)
1489 return NULL;
1490 else if (result) {
1491 Py_RETURN_TRUE;
1492 }
1493 }
1494 Py_RETURN_FALSE;
1495 }
Benjamin Peterson153c70f2009-04-18 15:42:12 +00001496 result = _bytearray_tailmatch(self, subobj, start, end, +1);
Ezio Melottiba42fd52011-04-26 06:09:45 +03001497 if (result == -1) {
1498 if (PyErr_ExceptionMatches(PyExc_TypeError))
1499 PyErr_Format(PyExc_TypeError, "endswith first arg must be bytes or "
1500 "a tuple of bytes, not %s", Py_TYPE(subobj)->tp_name);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001501 return NULL;
Ezio Melottiba42fd52011-04-26 06:09:45 +03001502 }
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001503 else
1504 return PyBool_FromLong(result);
1505}
1506
1507
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001508/*[clinic input]
1509bytearray.translate
1510
1511 self: self(type="PyByteArrayObject *")
1512 table: object
1513 Translation table, which must be a bytes object of length 256.
1514 [
1515 deletechars: object
1516 ]
1517 /
1518
1519Return a copy with each character mapped by the given translation table.
1520
1521All characters occurring in the optional argument deletechars are removed.
1522The remaining characters are mapped through the given translation table.
1523[clinic start generated code]*/
1524
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001525static PyObject *
Larry Hastings89964c42015-04-14 18:07:59 -04001526bytearray_translate_impl(PyByteArrayObject *self, PyObject *table,
1527 int group_right_1, PyObject *deletechars)
1528/*[clinic end generated code: output=2bebc86a9a1ff083 input=b749ad85f4860824]*/
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001529{
Antoine Pitrou9ed5f272013-08-13 20:18:52 +02001530 char *input, *output;
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001531 const char *table_chars;
Antoine Pitrou9ed5f272013-08-13 20:18:52 +02001532 Py_ssize_t i, c;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001533 PyObject *input_obj = (PyObject*)self;
1534 const char *output_start;
1535 Py_ssize_t inlen;
Georg Brandlccc47b62008-12-28 11:44:14 +00001536 PyObject *result = NULL;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001537 int trans_table[256];
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001538 Py_buffer vtable, vdel;
1539
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001540 if (table == Py_None) {
1541 table_chars = NULL;
Georg Brandlccc47b62008-12-28 11:44:14 +00001542 table = NULL;
Serhiy Storchaka3dd3e262015-02-03 01:25:42 +02001543 } else if (PyObject_GetBuffer(table, &vtable, PyBUF_SIMPLE) != 0) {
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001544 return NULL;
Georg Brandlccc47b62008-12-28 11:44:14 +00001545 } else {
1546 if (vtable.len != 256) {
1547 PyErr_SetString(PyExc_ValueError,
1548 "translation table must be 256 characters long");
Georg Brandl953152f2009-07-22 12:03:59 +00001549 PyBuffer_Release(&vtable);
1550 return NULL;
Georg Brandlccc47b62008-12-28 11:44:14 +00001551 }
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001552 table_chars = (const char*)vtable.buf;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001553 }
1554
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001555 if (deletechars != NULL) {
Serhiy Storchaka3dd3e262015-02-03 01:25:42 +02001556 if (PyObject_GetBuffer(deletechars, &vdel, PyBUF_SIMPLE) != 0) {
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001557 if (table != NULL)
Georg Brandl953152f2009-07-22 12:03:59 +00001558 PyBuffer_Release(&vtable);
1559 return NULL;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001560 }
1561 }
1562 else {
1563 vdel.buf = NULL;
1564 vdel.len = 0;
1565 }
1566
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001567 inlen = PyByteArray_GET_SIZE(input_obj);
1568 result = PyByteArray_FromStringAndSize((char *)NULL, inlen);
1569 if (result == NULL)
1570 goto done;
1571 output_start = output = PyByteArray_AsString(result);
1572 input = PyByteArray_AS_STRING(input_obj);
1573
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001574 if (vdel.len == 0 && table_chars != NULL) {
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001575 /* If no deletions are required, use faster code */
1576 for (i = inlen; --i >= 0; ) {
1577 c = Py_CHARMASK(*input++);
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001578 *output++ = table_chars[c];
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001579 }
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001580 goto done;
1581 }
Georg Brandlccc47b62008-12-28 11:44:14 +00001582
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001583 if (table_chars == NULL) {
Georg Brandlccc47b62008-12-28 11:44:14 +00001584 for (i = 0; i < 256; i++)
1585 trans_table[i] = Py_CHARMASK(i);
1586 } else {
1587 for (i = 0; i < 256; i++)
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001588 trans_table[i] = Py_CHARMASK(table_chars[i]);
Georg Brandlccc47b62008-12-28 11:44:14 +00001589 }
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001590
1591 for (i = 0; i < vdel.len; i++)
1592 trans_table[(int) Py_CHARMASK( ((unsigned char*)vdel.buf)[i] )] = -1;
1593
1594 for (i = inlen; --i >= 0; ) {
1595 c = Py_CHARMASK(*input++);
1596 if (trans_table[c] != -1)
1597 if (Py_CHARMASK(*output++ = (char)trans_table[c]) == c)
1598 continue;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001599 }
1600 /* Fix the size of the resulting string */
1601 if (inlen > 0)
Christian Heimesc731bbe2013-07-21 02:04:35 +02001602 if (PyByteArray_Resize(result, output - output_start) < 0) {
1603 Py_CLEAR(result);
1604 goto done;
1605 }
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001606
1607done:
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001608 if (table != NULL)
Georg Brandlccc47b62008-12-28 11:44:14 +00001609 PyBuffer_Release(&vtable);
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001610 if (deletechars != NULL)
Martin v. Löwis423be952008-08-13 15:53:07 +00001611 PyBuffer_Release(&vdel);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001612 return result;
1613}
1614
1615
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001616/*[clinic input]
1617
1618@staticmethod
1619bytearray.maketrans
1620
Serhiy Storchaka3dd3e262015-02-03 01:25:42 +02001621 frm: Py_buffer
1622 to: Py_buffer
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001623 /
1624
1625Return a translation table useable for the bytes or bytearray translate method.
1626
1627The returned table will be one where each byte in frm is mapped to the byte at
1628the same position in to.
1629
1630The bytes objects frm and to must be of the same length.
1631[clinic start generated code]*/
1632
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001633static PyObject *
Serhiy Storchaka3dd3e262015-02-03 01:25:42 +02001634bytearray_maketrans_impl(Py_buffer *frm, Py_buffer *to)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03001635/*[clinic end generated code: output=1df267d99f56b15e input=5925a81d2fbbf151]*/
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001636{
1637 return _Py_bytes_maketrans(frm, to);
Georg Brandlabc38772009-04-12 15:51:51 +00001638}
1639
1640
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001641/* find and count characters and substrings */
1642
1643#define findchar(target, target_len, c) \
1644 ((char *)memchr((const void *)(target), c, target_len))
1645
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001646
Benjamin Peterson0f3641c2008-11-19 22:05:52 +00001647/* Bytes ops must return a string, create a copy */
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001648Py_LOCAL(PyByteArrayObject *)
1649return_self(PyByteArrayObject *self)
1650{
Georg Brandl1e7217d2008-05-30 12:02:38 +00001651 /* always return a new bytearray */
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001652 return (PyByteArrayObject *)PyByteArray_FromStringAndSize(
1653 PyByteArray_AS_STRING(self),
1654 PyByteArray_GET_SIZE(self));
1655}
1656
1657Py_LOCAL_INLINE(Py_ssize_t)
1658countchar(const char *target, Py_ssize_t target_len, char c, Py_ssize_t maxcount)
1659{
1660 Py_ssize_t count=0;
1661 const char *start=target;
1662 const char *end=target+target_len;
1663
1664 while ( (start=findchar(start, end-start, c)) != NULL ) {
1665 count++;
1666 if (count >= maxcount)
1667 break;
1668 start += 1;
1669 }
1670 return count;
1671}
1672
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001673
1674/* Algorithms for different cases of string replacement */
1675
1676/* len(self)>=1, from="", len(to)>=1, maxcount>=1 */
1677Py_LOCAL(PyByteArrayObject *)
1678replace_interleave(PyByteArrayObject *self,
1679 const char *to_s, Py_ssize_t to_len,
1680 Py_ssize_t maxcount)
1681{
1682 char *self_s, *result_s;
1683 Py_ssize_t self_len, result_len;
Mark Dickinsoncf940c72010-08-10 18:35:01 +00001684 Py_ssize_t count, i;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001685 PyByteArrayObject *result;
1686
1687 self_len = PyByteArray_GET_SIZE(self);
1688
Mark Dickinsoncf940c72010-08-10 18:35:01 +00001689 /* 1 at the end plus 1 after every character;
1690 count = min(maxcount, self_len + 1) */
1691 if (maxcount <= self_len)
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001692 count = maxcount;
Mark Dickinsoncf940c72010-08-10 18:35:01 +00001693 else
1694 /* Can't overflow: self_len + 1 <= maxcount <= PY_SSIZE_T_MAX. */
1695 count = self_len + 1;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001696
1697 /* Check for overflow */
1698 /* result_len = count * to_len + self_len; */
Mark Dickinsoncf940c72010-08-10 18:35:01 +00001699 assert(count > 0);
1700 if (to_len > (PY_SSIZE_T_MAX - self_len) / count) {
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001701 PyErr_SetString(PyExc_OverflowError,
1702 "replace string is too long");
1703 return NULL;
1704 }
Mark Dickinsoncf940c72010-08-10 18:35:01 +00001705 result_len = count * to_len + self_len;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001706
1707 if (! (result = (PyByteArrayObject *)
1708 PyByteArray_FromStringAndSize(NULL, result_len)) )
1709 return NULL;
1710
1711 self_s = PyByteArray_AS_STRING(self);
1712 result_s = PyByteArray_AS_STRING(result);
1713
1714 /* TODO: special case single character, which doesn't need memcpy */
1715
1716 /* Lay the first one down (guaranteed this will occur) */
1717 Py_MEMCPY(result_s, to_s, to_len);
1718 result_s += to_len;
1719 count -= 1;
1720
1721 for (i=0; i<count; i++) {
1722 *result_s++ = *self_s++;
1723 Py_MEMCPY(result_s, to_s, to_len);
1724 result_s += to_len;
1725 }
1726
1727 /* Copy the rest of the original string */
1728 Py_MEMCPY(result_s, self_s, self_len-i);
1729
1730 return result;
1731}
1732
1733/* Special case for deleting a single character */
1734/* len(self)>=1, len(from)==1, to="", maxcount>=1 */
1735Py_LOCAL(PyByteArrayObject *)
1736replace_delete_single_character(PyByteArrayObject *self,
1737 char from_c, Py_ssize_t maxcount)
1738{
1739 char *self_s, *result_s;
1740 char *start, *next, *end;
1741 Py_ssize_t self_len, result_len;
1742 Py_ssize_t count;
1743 PyByteArrayObject *result;
1744
1745 self_len = PyByteArray_GET_SIZE(self);
1746 self_s = PyByteArray_AS_STRING(self);
1747
1748 count = countchar(self_s, self_len, from_c, maxcount);
1749 if (count == 0) {
1750 return return_self(self);
1751 }
1752
1753 result_len = self_len - count; /* from_len == 1 */
1754 assert(result_len>=0);
1755
1756 if ( (result = (PyByteArrayObject *)
1757 PyByteArray_FromStringAndSize(NULL, result_len)) == NULL)
1758 return NULL;
1759 result_s = PyByteArray_AS_STRING(result);
1760
1761 start = self_s;
1762 end = self_s + self_len;
1763 while (count-- > 0) {
1764 next = findchar(start, end-start, from_c);
1765 if (next == NULL)
1766 break;
1767 Py_MEMCPY(result_s, start, next-start);
1768 result_s += (next-start);
1769 start = next+1;
1770 }
1771 Py_MEMCPY(result_s, start, end-start);
1772
1773 return result;
1774}
1775
1776/* len(self)>=1, len(from)>=2, to="", maxcount>=1 */
1777
1778Py_LOCAL(PyByteArrayObject *)
1779replace_delete_substring(PyByteArrayObject *self,
1780 const char *from_s, Py_ssize_t from_len,
1781 Py_ssize_t maxcount)
1782{
1783 char *self_s, *result_s;
1784 char *start, *next, *end;
1785 Py_ssize_t self_len, result_len;
1786 Py_ssize_t count, offset;
1787 PyByteArrayObject *result;
1788
1789 self_len = PyByteArray_GET_SIZE(self);
1790 self_s = PyByteArray_AS_STRING(self);
1791
Antoine Pitrouf2c54842010-01-13 08:07:53 +00001792 count = stringlib_count(self_s, self_len,
1793 from_s, from_len,
1794 maxcount);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001795
1796 if (count == 0) {
1797 /* no matches */
1798 return return_self(self);
1799 }
1800
1801 result_len = self_len - (count * from_len);
1802 assert (result_len>=0);
1803
1804 if ( (result = (PyByteArrayObject *)
1805 PyByteArray_FromStringAndSize(NULL, result_len)) == NULL )
1806 return NULL;
1807
1808 result_s = PyByteArray_AS_STRING(result);
1809
1810 start = self_s;
1811 end = self_s + self_len;
1812 while (count-- > 0) {
Antoine Pitrouf2c54842010-01-13 08:07:53 +00001813 offset = stringlib_find(start, end-start,
1814 from_s, from_len,
1815 0);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001816 if (offset == -1)
1817 break;
1818 next = start + offset;
1819
1820 Py_MEMCPY(result_s, start, next-start);
1821
1822 result_s += (next-start);
1823 start = next+from_len;
1824 }
1825 Py_MEMCPY(result_s, start, end-start);
1826 return result;
1827}
1828
1829/* len(self)>=1, len(from)==len(to)==1, maxcount>=1 */
1830Py_LOCAL(PyByteArrayObject *)
1831replace_single_character_in_place(PyByteArrayObject *self,
1832 char from_c, char to_c,
1833 Py_ssize_t maxcount)
1834{
Antoine Pitroud1188562010-06-09 16:38:55 +00001835 char *self_s, *result_s, *start, *end, *next;
1836 Py_ssize_t self_len;
1837 PyByteArrayObject *result;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001838
Antoine Pitroud1188562010-06-09 16:38:55 +00001839 /* The result string will be the same size */
1840 self_s = PyByteArray_AS_STRING(self);
1841 self_len = PyByteArray_GET_SIZE(self);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001842
Antoine Pitroud1188562010-06-09 16:38:55 +00001843 next = findchar(self_s, self_len, from_c);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001844
Antoine Pitroud1188562010-06-09 16:38:55 +00001845 if (next == NULL) {
1846 /* No matches; return the original bytes */
1847 return return_self(self);
1848 }
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001849
Antoine Pitroud1188562010-06-09 16:38:55 +00001850 /* Need to make a new bytes */
1851 result = (PyByteArrayObject *) PyByteArray_FromStringAndSize(NULL, self_len);
1852 if (result == NULL)
1853 return NULL;
1854 result_s = PyByteArray_AS_STRING(result);
1855 Py_MEMCPY(result_s, self_s, self_len);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001856
Antoine Pitroud1188562010-06-09 16:38:55 +00001857 /* change everything in-place, starting with this one */
1858 start = result_s + (next-self_s);
1859 *start = to_c;
1860 start++;
1861 end = result_s + self_len;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001862
Antoine Pitroud1188562010-06-09 16:38:55 +00001863 while (--maxcount > 0) {
1864 next = findchar(start, end-start, from_c);
1865 if (next == NULL)
1866 break;
1867 *next = to_c;
1868 start = next+1;
1869 }
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001870
Antoine Pitroud1188562010-06-09 16:38:55 +00001871 return result;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001872}
1873
1874/* len(self)>=1, len(from)==len(to)>=2, maxcount>=1 */
1875Py_LOCAL(PyByteArrayObject *)
1876replace_substring_in_place(PyByteArrayObject *self,
1877 const char *from_s, Py_ssize_t from_len,
1878 const char *to_s, Py_ssize_t to_len,
1879 Py_ssize_t maxcount)
1880{
1881 char *result_s, *start, *end;
1882 char *self_s;
1883 Py_ssize_t self_len, offset;
1884 PyByteArrayObject *result;
1885
1886 /* The result bytes will be the same size */
1887
1888 self_s = PyByteArray_AS_STRING(self);
1889 self_len = PyByteArray_GET_SIZE(self);
1890
Antoine Pitrouf2c54842010-01-13 08:07:53 +00001891 offset = stringlib_find(self_s, self_len,
1892 from_s, from_len,
1893 0);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001894 if (offset == -1) {
1895 /* No matches; return the original bytes */
1896 return return_self(self);
1897 }
1898
1899 /* Need to make a new bytes */
1900 result = (PyByteArrayObject *) PyByteArray_FromStringAndSize(NULL, self_len);
1901 if (result == NULL)
1902 return NULL;
1903 result_s = PyByteArray_AS_STRING(result);
1904 Py_MEMCPY(result_s, self_s, self_len);
1905
1906 /* change everything in-place, starting with this one */
1907 start = result_s + offset;
1908 Py_MEMCPY(start, to_s, from_len);
1909 start += from_len;
1910 end = result_s + self_len;
1911
1912 while ( --maxcount > 0) {
Antoine Pitrouf2c54842010-01-13 08:07:53 +00001913 offset = stringlib_find(start, end-start,
1914 from_s, from_len,
1915 0);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001916 if (offset==-1)
1917 break;
1918 Py_MEMCPY(start+offset, to_s, from_len);
1919 start += offset+from_len;
1920 }
1921
1922 return result;
1923}
1924
1925/* len(self)>=1, len(from)==1, len(to)>=2, maxcount>=1 */
1926Py_LOCAL(PyByteArrayObject *)
1927replace_single_character(PyByteArrayObject *self,
1928 char from_c,
1929 const char *to_s, Py_ssize_t to_len,
1930 Py_ssize_t maxcount)
1931{
1932 char *self_s, *result_s;
1933 char *start, *next, *end;
1934 Py_ssize_t self_len, result_len;
Mark Dickinsoncf940c72010-08-10 18:35:01 +00001935 Py_ssize_t count;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001936 PyByteArrayObject *result;
1937
1938 self_s = PyByteArray_AS_STRING(self);
1939 self_len = PyByteArray_GET_SIZE(self);
1940
1941 count = countchar(self_s, self_len, from_c, maxcount);
1942 if (count == 0) {
1943 /* no matches, return unchanged */
1944 return return_self(self);
1945 }
1946
1947 /* use the difference between current and new, hence the "-1" */
1948 /* result_len = self_len + count * (to_len-1) */
Mark Dickinsoncf940c72010-08-10 18:35:01 +00001949 assert(count > 0);
1950 if (to_len - 1 > (PY_SSIZE_T_MAX - self_len) / count) {
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001951 PyErr_SetString(PyExc_OverflowError, "replace bytes is too long");
1952 return NULL;
1953 }
Mark Dickinsoncf940c72010-08-10 18:35:01 +00001954 result_len = self_len + count * (to_len - 1);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001955
1956 if ( (result = (PyByteArrayObject *)
1957 PyByteArray_FromStringAndSize(NULL, result_len)) == NULL)
1958 return NULL;
1959 result_s = PyByteArray_AS_STRING(result);
1960
1961 start = self_s;
1962 end = self_s + self_len;
1963 while (count-- > 0) {
1964 next = findchar(start, end-start, from_c);
1965 if (next == NULL)
1966 break;
1967
1968 if (next == start) {
1969 /* replace with the 'to' */
1970 Py_MEMCPY(result_s, to_s, to_len);
1971 result_s += to_len;
1972 start += 1;
1973 } else {
1974 /* copy the unchanged old then the 'to' */
1975 Py_MEMCPY(result_s, start, next-start);
1976 result_s += (next-start);
1977 Py_MEMCPY(result_s, to_s, to_len);
1978 result_s += to_len;
1979 start = next+1;
1980 }
1981 }
1982 /* Copy the remainder of the remaining bytes */
1983 Py_MEMCPY(result_s, start, end-start);
1984
1985 return result;
1986}
1987
1988/* len(self)>=1, len(from)>=2, len(to)>=2, maxcount>=1 */
1989Py_LOCAL(PyByteArrayObject *)
1990replace_substring(PyByteArrayObject *self,
1991 const char *from_s, Py_ssize_t from_len,
1992 const char *to_s, Py_ssize_t to_len,
1993 Py_ssize_t maxcount)
1994{
1995 char *self_s, *result_s;
1996 char *start, *next, *end;
1997 Py_ssize_t self_len, result_len;
Mark Dickinsoncf940c72010-08-10 18:35:01 +00001998 Py_ssize_t count, offset;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001999 PyByteArrayObject *result;
2000
2001 self_s = PyByteArray_AS_STRING(self);
2002 self_len = PyByteArray_GET_SIZE(self);
2003
Antoine Pitrouf2c54842010-01-13 08:07:53 +00002004 count = stringlib_count(self_s, self_len,
2005 from_s, from_len,
2006 maxcount);
2007
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002008 if (count == 0) {
2009 /* no matches, return unchanged */
2010 return return_self(self);
2011 }
2012
2013 /* Check for overflow */
2014 /* result_len = self_len + count * (to_len-from_len) */
Mark Dickinsoncf940c72010-08-10 18:35:01 +00002015 assert(count > 0);
2016 if (to_len - from_len > (PY_SSIZE_T_MAX - self_len) / count) {
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002017 PyErr_SetString(PyExc_OverflowError, "replace bytes is too long");
2018 return NULL;
2019 }
Mark Dickinsoncf940c72010-08-10 18:35:01 +00002020 result_len = self_len + count * (to_len - from_len);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002021
2022 if ( (result = (PyByteArrayObject *)
2023 PyByteArray_FromStringAndSize(NULL, result_len)) == NULL)
2024 return NULL;
2025 result_s = PyByteArray_AS_STRING(result);
2026
2027 start = self_s;
2028 end = self_s + self_len;
2029 while (count-- > 0) {
Antoine Pitrouf2c54842010-01-13 08:07:53 +00002030 offset = stringlib_find(start, end-start,
2031 from_s, from_len,
2032 0);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002033 if (offset == -1)
2034 break;
2035 next = start+offset;
2036 if (next == start) {
2037 /* replace with the 'to' */
2038 Py_MEMCPY(result_s, to_s, to_len);
2039 result_s += to_len;
2040 start += from_len;
2041 } else {
2042 /* copy the unchanged old then the 'to' */
2043 Py_MEMCPY(result_s, start, next-start);
2044 result_s += (next-start);
2045 Py_MEMCPY(result_s, to_s, to_len);
2046 result_s += to_len;
2047 start = next+from_len;
2048 }
2049 }
2050 /* Copy the remainder of the remaining bytes */
2051 Py_MEMCPY(result_s, start, end-start);
2052
2053 return result;
2054}
2055
2056
2057Py_LOCAL(PyByteArrayObject *)
2058replace(PyByteArrayObject *self,
2059 const char *from_s, Py_ssize_t from_len,
2060 const char *to_s, Py_ssize_t to_len,
2061 Py_ssize_t maxcount)
2062{
2063 if (maxcount < 0) {
2064 maxcount = PY_SSIZE_T_MAX;
2065 } else if (maxcount == 0 || PyByteArray_GET_SIZE(self) == 0) {
2066 /* nothing to do; return the original bytes */
2067 return return_self(self);
2068 }
2069
2070 if (maxcount == 0 ||
2071 (from_len == 0 && to_len == 0)) {
2072 /* nothing to do; return the original bytes */
2073 return return_self(self);
2074 }
2075
2076 /* Handle zero-length special cases */
2077
2078 if (from_len == 0) {
2079 /* insert the 'to' bytes everywhere. */
2080 /* >>> "Python".replace("", ".") */
2081 /* '.P.y.t.h.o.n.' */
2082 return replace_interleave(self, to_s, to_len, maxcount);
2083 }
2084
2085 /* Except for "".replace("", "A") == "A" there is no way beyond this */
2086 /* point for an empty self bytes to generate a non-empty bytes */
2087 /* Special case so the remaining code always gets a non-empty bytes */
2088 if (PyByteArray_GET_SIZE(self) == 0) {
2089 return return_self(self);
2090 }
2091
2092 if (to_len == 0) {
Georg Brandl17cb8a82008-05-30 08:20:09 +00002093 /* delete all occurrences of 'from' bytes */
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002094 if (from_len == 1) {
2095 return replace_delete_single_character(
2096 self, from_s[0], maxcount);
2097 } else {
2098 return replace_delete_substring(self, from_s, from_len, maxcount);
2099 }
2100 }
2101
2102 /* Handle special case where both bytes have the same length */
2103
2104 if (from_len == to_len) {
2105 if (from_len == 1) {
2106 return replace_single_character_in_place(
2107 self,
2108 from_s[0],
2109 to_s[0],
2110 maxcount);
2111 } else {
2112 return replace_substring_in_place(
2113 self, from_s, from_len, to_s, to_len, maxcount);
2114 }
2115 }
2116
2117 /* Otherwise use the more generic algorithms */
2118 if (from_len == 1) {
2119 return replace_single_character(self, from_s[0],
2120 to_s, to_len, maxcount);
2121 } else {
2122 /* len('from')>=2, len('to')>=1 */
2123 return replace_substring(self, from_s, from_len, to_s, to_len, maxcount);
2124 }
2125}
2126
2127
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002128/*[clinic input]
2129bytearray.replace
2130
Serhiy Storchaka3dd3e262015-02-03 01:25:42 +02002131 old: Py_buffer
2132 new: Py_buffer
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002133 count: Py_ssize_t = -1
2134 Maximum number of occurrences to replace.
2135 -1 (the default value) means replace all occurrences.
2136 /
2137
2138Return a copy with all occurrences of substring old replaced by new.
2139
2140If the optional argument count is given, only the first count occurrences are
2141replaced.
2142[clinic start generated code]*/
2143
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002144static PyObject *
Larry Hastings89964c42015-04-14 18:07:59 -04002145bytearray_replace_impl(PyByteArrayObject *self, Py_buffer *old,
2146 Py_buffer *new, Py_ssize_t count)
2147/*[clinic end generated code: output=d39884c4dc59412a input=aa379d988637c7fb]*/
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002148{
Serhiy Storchaka3dd3e262015-02-03 01:25:42 +02002149 return (PyObject *)replace((PyByteArrayObject *) self,
2150 old->buf, old->len,
2151 new->buf, new->len, count);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002152}
2153
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002154/*[clinic input]
2155bytearray.split
2156
2157 sep: object = None
2158 The delimiter according which to split the bytearray.
2159 None (the default value) means split on ASCII whitespace characters
2160 (space, tab, return, newline, formfeed, vertical tab).
2161 maxsplit: Py_ssize_t = -1
2162 Maximum number of splits to do.
2163 -1 (the default value) means no limit.
2164
2165Return a list of the sections in the bytearray, using sep as the delimiter.
2166[clinic start generated code]*/
2167
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002168static PyObject *
Larry Hastings89964c42015-04-14 18:07:59 -04002169bytearray_split_impl(PyByteArrayObject *self, PyObject *sep,
2170 Py_ssize_t maxsplit)
2171/*[clinic end generated code: output=833e2cf385d9a04d input=24f82669f41bf523]*/
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002172{
2173 Py_ssize_t len = PyByteArray_GET_SIZE(self), n;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002174 const char *s = PyByteArray_AS_STRING(self), *sub;
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002175 PyObject *list;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002176 Py_buffer vsub;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002177
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002178 if (maxsplit < 0)
2179 maxsplit = PY_SSIZE_T_MAX;
2180
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002181 if (sep == Py_None)
Antoine Pitrouf2c54842010-01-13 08:07:53 +00002182 return stringlib_split_whitespace((PyObject*) self, s, len, maxsplit);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002183
Serhiy Storchaka3dd3e262015-02-03 01:25:42 +02002184 if (PyObject_GetBuffer(sep, &vsub, PyBUF_SIMPLE) != 0)
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002185 return NULL;
2186 sub = vsub.buf;
2187 n = vsub.len;
2188
Antoine Pitrouf2c54842010-01-13 08:07:53 +00002189 list = stringlib_split(
2190 (PyObject*) self, s, len, sub, n, maxsplit
2191 );
Martin v. Löwis423be952008-08-13 15:53:07 +00002192 PyBuffer_Release(&vsub);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002193 return list;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002194}
2195
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002196/*[clinic input]
2197bytearray.partition
2198
2199 self: self(type="PyByteArrayObject *")
2200 sep: object
2201 /
2202
2203Partition the bytearray into three parts using the given separator.
2204
2205This will search for the separator sep in the bytearray. If the separator is
2206found, returns a 3-tuple containing the part before the separator, the
2207separator itself, and the part after it.
2208
2209If the separator is not found, returns a 3-tuple containing the original
2210bytearray object and two empty bytearray objects.
2211[clinic start generated code]*/
2212
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002213static PyObject *
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002214bytearray_partition(PyByteArrayObject *self, PyObject *sep)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03002215/*[clinic end generated code: output=45d2525ddd35f957 input=7d7fe37b1696d506]*/
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002216{
2217 PyObject *bytesep, *result;
2218
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002219 bytesep = PyByteArray_FromObject(sep);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002220 if (! bytesep)
2221 return NULL;
2222
2223 result = stringlib_partition(
2224 (PyObject*) self,
2225 PyByteArray_AS_STRING(self), PyByteArray_GET_SIZE(self),
2226 bytesep,
2227 PyByteArray_AS_STRING(bytesep), PyByteArray_GET_SIZE(bytesep)
2228 );
2229
2230 Py_DECREF(bytesep);
Antoine Pitrouf2c54842010-01-13 08:07:53 +00002231 return result;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002232}
2233
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002234/*[clinic input]
2235bytearray.rpartition
2236
2237 self: self(type="PyByteArrayObject *")
2238 sep: object
2239 /
2240
2241Partition the bytes into three parts using the given separator.
2242
2243This will search for the separator sep in the bytearray, starting and the end.
2244If the separator is found, returns a 3-tuple containing the part before the
2245separator, the separator itself, and the part after it.
2246
2247If the separator is not found, returns a 3-tuple containing two empty bytearray
2248objects and the original bytearray object.
2249[clinic start generated code]*/
2250
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002251static PyObject *
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002252bytearray_rpartition(PyByteArrayObject *self, PyObject *sep)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03002253/*[clinic end generated code: output=440de3c9426115e8 input=9b8cd540c1b75853]*/
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002254{
2255 PyObject *bytesep, *result;
2256
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002257 bytesep = PyByteArray_FromObject(sep);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002258 if (! bytesep)
2259 return NULL;
2260
2261 result = stringlib_rpartition(
2262 (PyObject*) self,
2263 PyByteArray_AS_STRING(self), PyByteArray_GET_SIZE(self),
2264 bytesep,
2265 PyByteArray_AS_STRING(bytesep), PyByteArray_GET_SIZE(bytesep)
2266 );
2267
2268 Py_DECREF(bytesep);
Antoine Pitrouf2c54842010-01-13 08:07:53 +00002269 return result;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002270}
2271
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002272/*[clinic input]
2273bytearray.rsplit = bytearray.split
2274
2275Return a list of the sections in the bytearray, using sep as the delimiter.
2276
2277Splitting is done starting at the end of the bytearray and working to the front.
2278[clinic start generated code]*/
2279
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002280static PyObject *
Larry Hastings89964c42015-04-14 18:07:59 -04002281bytearray_rsplit_impl(PyByteArrayObject *self, PyObject *sep,
2282 Py_ssize_t maxsplit)
2283/*[clinic end generated code: output=a55e0b5a03cb6190 input=a68286e4dd692ffe]*/
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002284{
2285 Py_ssize_t len = PyByteArray_GET_SIZE(self), n;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002286 const char *s = PyByteArray_AS_STRING(self), *sub;
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002287 PyObject *list;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002288 Py_buffer vsub;
2289
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002290 if (maxsplit < 0)
2291 maxsplit = PY_SSIZE_T_MAX;
2292
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002293 if (sep == Py_None)
Antoine Pitrouf2c54842010-01-13 08:07:53 +00002294 return stringlib_rsplit_whitespace((PyObject*) self, s, len, maxsplit);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002295
Serhiy Storchaka3dd3e262015-02-03 01:25:42 +02002296 if (PyObject_GetBuffer(sep, &vsub, PyBUF_SIMPLE) != 0)
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002297 return NULL;
2298 sub = vsub.buf;
2299 n = vsub.len;
2300
Antoine Pitrouf2c54842010-01-13 08:07:53 +00002301 list = stringlib_rsplit(
2302 (PyObject*) self, s, len, sub, n, maxsplit
2303 );
Martin v. Löwis423be952008-08-13 15:53:07 +00002304 PyBuffer_Release(&vsub);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002305 return list;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002306}
2307
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002308/*[clinic input]
2309bytearray.reverse
2310
2311 self: self(type="PyByteArrayObject *")
2312
2313Reverse the order of the values in B in place.
2314[clinic start generated code]*/
2315
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002316static PyObject *
2317bytearray_reverse_impl(PyByteArrayObject *self)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03002318/*[clinic end generated code: output=9f7616f29ab309d3 input=7933a499b8597bd1]*/
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002319{
2320 char swap, *head, *tail;
2321 Py_ssize_t i, j, n = Py_SIZE(self);
2322
2323 j = n / 2;
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +02002324 head = PyByteArray_AS_STRING(self);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002325 tail = head + n - 1;
2326 for (i = 0; i < j; i++) {
2327 swap = *head;
2328 *head++ = *tail;
2329 *tail-- = swap;
2330 }
2331
2332 Py_RETURN_NONE;
2333}
2334
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002335
2336/*[python input]
2337class bytesvalue_converter(CConverter):
2338 type = 'int'
2339 converter = '_getbytevalue'
2340[python start generated code]*/
2341/*[python end generated code: output=da39a3ee5e6b4b0d input=29c2e7c26c212812]*/
2342
2343
2344/*[clinic input]
2345bytearray.insert
2346
2347 self: self(type="PyByteArrayObject *")
2348 index: Py_ssize_t
2349 The index where the value is to be inserted.
2350 item: bytesvalue
2351 The item to be inserted.
2352 /
2353
2354Insert a single item into the bytearray before the given index.
2355[clinic start generated code]*/
2356
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002357static PyObject *
2358bytearray_insert_impl(PyByteArrayObject *self, Py_ssize_t index, int item)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03002359/*[clinic end generated code: output=76c775a70e7b07b7 input=833766836ba30e1e]*/
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002360{
2361 Py_ssize_t n = Py_SIZE(self);
2362 char *buf;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002363
2364 if (n == PY_SSIZE_T_MAX) {
2365 PyErr_SetString(PyExc_OverflowError,
Mark Dickinson2b6705f2009-09-06 10:34:47 +00002366 "cannot add more objects to bytearray");
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002367 return NULL;
2368 }
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002369 if (PyByteArray_Resize((PyObject *)self, n + 1) < 0)
2370 return NULL;
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +02002371 buf = PyByteArray_AS_STRING(self);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002372
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002373 if (index < 0) {
2374 index += n;
2375 if (index < 0)
2376 index = 0;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002377 }
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002378 if (index > n)
2379 index = n;
2380 memmove(buf + index + 1, buf + index, n - index);
2381 buf[index] = item;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002382
2383 Py_RETURN_NONE;
2384}
2385
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002386/*[clinic input]
2387bytearray.append
2388
2389 self: self(type="PyByteArrayObject *")
2390 item: bytesvalue
2391 The item to be appended.
2392 /
2393
2394Append a single item to the end of the bytearray.
2395[clinic start generated code]*/
2396
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002397static PyObject *
2398bytearray_append_impl(PyByteArrayObject *self, int item)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03002399/*[clinic end generated code: output=a154e19ed1886cb6 input=ae56ea87380407cc]*/
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002400{
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002401 Py_ssize_t n = Py_SIZE(self);
2402
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002403 if (n == PY_SSIZE_T_MAX) {
2404 PyErr_SetString(PyExc_OverflowError,
Mark Dickinson2b6705f2009-09-06 10:34:47 +00002405 "cannot add more objects to bytearray");
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002406 return NULL;
2407 }
2408 if (PyByteArray_Resize((PyObject *)self, n + 1) < 0)
2409 return NULL;
2410
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002411 PyByteArray_AS_STRING(self)[n] = item;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002412
2413 Py_RETURN_NONE;
2414}
2415
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002416/*[clinic input]
2417bytearray.extend
2418
2419 self: self(type="PyByteArrayObject *")
2420 iterable_of_ints: object
2421 The iterable of items to append.
2422 /
2423
2424Append all the items from the iterator or sequence to the end of the bytearray.
2425[clinic start generated code]*/
2426
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002427static PyObject *
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002428bytearray_extend(PyByteArrayObject *self, PyObject *iterable_of_ints)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03002429/*[clinic end generated code: output=98155dbe249170b1 input=ce83a5d75b70d850]*/
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002430{
Benjamin Peterson153c70f2009-04-18 15:42:12 +00002431 PyObject *it, *item, *bytearray_obj;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002432 Py_ssize_t buf_size = 0, len = 0;
2433 int value;
2434 char *buf;
2435
Benjamin Peterson153c70f2009-04-18 15:42:12 +00002436 /* bytearray_setslice code only accepts something supporting PEP 3118. */
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002437 if (PyObject_CheckBuffer(iterable_of_ints)) {
2438 if (bytearray_setslice(self, Py_SIZE(self), Py_SIZE(self), iterable_of_ints) == -1)
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002439 return NULL;
2440
2441 Py_RETURN_NONE;
2442 }
2443
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002444 it = PyObject_GetIter(iterable_of_ints);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002445 if (it == NULL)
2446 return NULL;
2447
Ezio Melotti42da6632011-03-15 05:18:48 +02002448 /* Try to determine the length of the argument. 32 is arbitrary. */
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002449 buf_size = PyObject_LengthHint(iterable_of_ints, 32);
Benjamin Petersonef3e4c22009-04-11 19:48:14 +00002450 if (buf_size == -1) {
2451 Py_DECREF(it);
2452 return NULL;
2453 }
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002454
Benjamin Peterson153c70f2009-04-18 15:42:12 +00002455 bytearray_obj = PyByteArray_FromStringAndSize(NULL, buf_size);
Antoine Pitrou58bb82e2012-04-01 16:05:46 +02002456 if (bytearray_obj == NULL) {
2457 Py_DECREF(it);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002458 return NULL;
Antoine Pitrou58bb82e2012-04-01 16:05:46 +02002459 }
Benjamin Peterson153c70f2009-04-18 15:42:12 +00002460 buf = PyByteArray_AS_STRING(bytearray_obj);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002461
2462 while ((item = PyIter_Next(it)) != NULL) {
2463 if (! _getbytevalue(item, &value)) {
2464 Py_DECREF(item);
2465 Py_DECREF(it);
Benjamin Peterson153c70f2009-04-18 15:42:12 +00002466 Py_DECREF(bytearray_obj);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002467 return NULL;
2468 }
2469 buf[len++] = value;
2470 Py_DECREF(item);
2471
2472 if (len >= buf_size) {
2473 buf_size = len + (len >> 1) + 1;
Benjamin Peterson153c70f2009-04-18 15:42:12 +00002474 if (PyByteArray_Resize((PyObject *)bytearray_obj, buf_size) < 0) {
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002475 Py_DECREF(it);
Benjamin Peterson153c70f2009-04-18 15:42:12 +00002476 Py_DECREF(bytearray_obj);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002477 return NULL;
2478 }
2479 /* Recompute the `buf' pointer, since the resizing operation may
2480 have invalidated it. */
Benjamin Peterson153c70f2009-04-18 15:42:12 +00002481 buf = PyByteArray_AS_STRING(bytearray_obj);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002482 }
2483 }
2484 Py_DECREF(it);
2485
2486 /* Resize down to exact size. */
Benjamin Peterson153c70f2009-04-18 15:42:12 +00002487 if (PyByteArray_Resize((PyObject *)bytearray_obj, len) < 0) {
2488 Py_DECREF(bytearray_obj);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002489 return NULL;
2490 }
2491
Antoine Pitrou58bb82e2012-04-01 16:05:46 +02002492 if (bytearray_setslice(self, Py_SIZE(self), Py_SIZE(self), bytearray_obj) == -1) {
2493 Py_DECREF(bytearray_obj);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002494 return NULL;
Antoine Pitrou58bb82e2012-04-01 16:05:46 +02002495 }
Benjamin Peterson153c70f2009-04-18 15:42:12 +00002496 Py_DECREF(bytearray_obj);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002497
2498 Py_RETURN_NONE;
2499}
2500
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002501/*[clinic input]
2502bytearray.pop
2503
2504 self: self(type="PyByteArrayObject *")
2505 index: Py_ssize_t = -1
2506 The index from where to remove the item.
2507 -1 (the default value) means remove the last item.
2508 /
2509
2510Remove and return a single item from B.
2511
2512If no index argument is given, will pop the last item.
2513[clinic start generated code]*/
2514
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002515static PyObject *
2516bytearray_pop_impl(PyByteArrayObject *self, Py_ssize_t index)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03002517/*[clinic end generated code: output=e0ccd401f8021da8 input=0797e6c0ca9d5a85]*/
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002518{
2519 int value;
2520 Py_ssize_t n = Py_SIZE(self);
2521 char *buf;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002522
2523 if (n == 0) {
Eli Bendersky1bc4f192011-03-04 04:55:25 +00002524 PyErr_SetString(PyExc_IndexError,
2525 "pop from empty bytearray");
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002526 return NULL;
2527 }
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002528 if (index < 0)
2529 index += Py_SIZE(self);
2530 if (index < 0 || index >= Py_SIZE(self)) {
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002531 PyErr_SetString(PyExc_IndexError, "pop index out of range");
2532 return NULL;
2533 }
Antoine Pitrou5504e892008-12-06 21:27:53 +00002534 if (!_canresize(self))
2535 return NULL;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002536
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +02002537 buf = PyByteArray_AS_STRING(self);
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002538 value = buf[index];
2539 memmove(buf + index, buf + index + 1, n - index);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002540 if (PyByteArray_Resize((PyObject *)self, n - 1) < 0)
2541 return NULL;
2542
Mark Dickinson54a3db92009-09-06 10:19:23 +00002543 return PyLong_FromLong((unsigned char)value);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002544}
2545
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002546/*[clinic input]
2547bytearray.remove
2548
2549 self: self(type="PyByteArrayObject *")
2550 value: bytesvalue
2551 The value to remove.
2552 /
2553
2554Remove the first occurrence of a value in the bytearray.
2555[clinic start generated code]*/
2556
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002557static PyObject *
2558bytearray_remove_impl(PyByteArrayObject *self, int value)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03002559/*[clinic end generated code: output=d659e37866709c13 input=47560b11fd856c24]*/
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002560{
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002561 Py_ssize_t where, n = Py_SIZE(self);
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +02002562 char *buf = PyByteArray_AS_STRING(self);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002563
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002564 for (where = 0; where < n; where++) {
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +02002565 if (buf[where] == value)
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002566 break;
2567 }
2568 if (where == n) {
Mark Dickinson2b6705f2009-09-06 10:34:47 +00002569 PyErr_SetString(PyExc_ValueError, "value not found in bytearray");
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002570 return NULL;
2571 }
Antoine Pitrou5504e892008-12-06 21:27:53 +00002572 if (!_canresize(self))
2573 return NULL;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002574
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +02002575 memmove(buf + where, buf + where + 1, n - where);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002576 if (PyByteArray_Resize((PyObject *)self, n - 1) < 0)
2577 return NULL;
2578
2579 Py_RETURN_NONE;
2580}
2581
2582/* XXX These two helpers could be optimized if argsize == 1 */
2583
2584static Py_ssize_t
Antoine Pitrou5b720752013-10-05 21:24:10 +02002585lstrip_helper(char *myptr, Py_ssize_t mysize,
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002586 void *argptr, Py_ssize_t argsize)
2587{
2588 Py_ssize_t i = 0;
Antoine Pitrou5b720752013-10-05 21:24:10 +02002589 while (i < mysize && memchr(argptr, (unsigned char) myptr[i], argsize))
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002590 i++;
2591 return i;
2592}
2593
2594static Py_ssize_t
Antoine Pitrou5b720752013-10-05 21:24:10 +02002595rstrip_helper(char *myptr, Py_ssize_t mysize,
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002596 void *argptr, Py_ssize_t argsize)
2597{
2598 Py_ssize_t i = mysize - 1;
Antoine Pitrou5b720752013-10-05 21:24:10 +02002599 while (i >= 0 && memchr(argptr, (unsigned char) myptr[i], argsize))
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002600 i--;
2601 return i + 1;
2602}
2603
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002604/*[clinic input]
2605bytearray.strip
2606
2607 bytes: object = None
2608 /
2609
2610Strip leading and trailing bytes contained in the argument.
2611
2612If the argument is omitted or None, strip leading and trailing ASCII whitespace.
2613[clinic start generated code]*/
2614
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002615static PyObject *
2616bytearray_strip_impl(PyByteArrayObject *self, PyObject *bytes)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03002617/*[clinic end generated code: output=760412661a34ad5a input=ef7bb59b09c21d62]*/
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002618{
2619 Py_ssize_t left, right, mysize, byteslen;
2620 char *myptr, *bytesptr;
2621 Py_buffer vbytes;
2622
2623 if (bytes == Py_None) {
2624 bytesptr = "\t\n\r\f\v ";
2625 byteslen = 6;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002626 }
2627 else {
Serhiy Storchaka3dd3e262015-02-03 01:25:42 +02002628 if (PyObject_GetBuffer(bytes, &vbytes, PyBUF_SIMPLE) != 0)
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002629 return NULL;
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002630 bytesptr = (char *) vbytes.buf;
2631 byteslen = vbytes.len;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002632 }
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +02002633 myptr = PyByteArray_AS_STRING(self);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002634 mysize = Py_SIZE(self);
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002635 left = lstrip_helper(myptr, mysize, bytesptr, byteslen);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002636 if (left == mysize)
2637 right = left;
2638 else
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002639 right = rstrip_helper(myptr, mysize, bytesptr, byteslen);
2640 if (bytes != Py_None)
2641 PyBuffer_Release(&vbytes);
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +02002642 return PyByteArray_FromStringAndSize(myptr + left, right - left);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002643}
2644
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002645/*[clinic input]
2646bytearray.lstrip
2647
2648 bytes: object = None
2649 /
2650
2651Strip leading bytes contained in the argument.
2652
2653If the argument is omitted or None, strip leading ASCII whitespace.
2654[clinic start generated code]*/
2655
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002656static PyObject *
2657bytearray_lstrip_impl(PyByteArrayObject *self, PyObject *bytes)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03002658/*[clinic end generated code: output=d005c9d0ab909e66 input=80843f975dd7c480]*/
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002659{
2660 Py_ssize_t left, right, mysize, byteslen;
2661 char *myptr, *bytesptr;
2662 Py_buffer vbytes;
2663
2664 if (bytes == Py_None) {
2665 bytesptr = "\t\n\r\f\v ";
2666 byteslen = 6;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002667 }
2668 else {
Serhiy Storchaka3dd3e262015-02-03 01:25:42 +02002669 if (PyObject_GetBuffer(bytes, &vbytes, PyBUF_SIMPLE) != 0)
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002670 return NULL;
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002671 bytesptr = (char *) vbytes.buf;
2672 byteslen = vbytes.len;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002673 }
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +02002674 myptr = PyByteArray_AS_STRING(self);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002675 mysize = Py_SIZE(self);
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002676 left = lstrip_helper(myptr, mysize, bytesptr, byteslen);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002677 right = mysize;
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002678 if (bytes != Py_None)
2679 PyBuffer_Release(&vbytes);
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +02002680 return PyByteArray_FromStringAndSize(myptr + left, right - left);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002681}
2682
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002683/*[clinic input]
2684bytearray.rstrip
2685
2686 bytes: object = None
2687 /
2688
2689Strip trailing bytes contained in the argument.
2690
2691If the argument is omitted or None, strip trailing ASCII whitespace.
2692[clinic start generated code]*/
2693
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002694static PyObject *
2695bytearray_rstrip_impl(PyByteArrayObject *self, PyObject *bytes)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03002696/*[clinic end generated code: output=030e2fbd2f7276bd input=e728b994954cfd91]*/
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002697{
2698 Py_ssize_t right, mysize, byteslen;
2699 char *myptr, *bytesptr;
2700 Py_buffer vbytes;
2701
2702 if (bytes == Py_None) {
2703 bytesptr = "\t\n\r\f\v ";
2704 byteslen = 6;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002705 }
2706 else {
Serhiy Storchaka3dd3e262015-02-03 01:25:42 +02002707 if (PyObject_GetBuffer(bytes, &vbytes, PyBUF_SIMPLE) != 0)
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002708 return NULL;
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002709 bytesptr = (char *) vbytes.buf;
2710 byteslen = vbytes.len;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002711 }
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +02002712 myptr = PyByteArray_AS_STRING(self);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002713 mysize = Py_SIZE(self);
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002714 right = rstrip_helper(myptr, mysize, bytesptr, byteslen);
2715 if (bytes != Py_None)
2716 PyBuffer_Release(&vbytes);
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +02002717 return PyByteArray_FromStringAndSize(myptr, right);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002718}
2719
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002720/*[clinic input]
2721bytearray.decode
2722
2723 encoding: str(c_default="NULL") = 'utf-8'
2724 The encoding with which to decode the bytearray.
2725 errors: str(c_default="NULL") = 'strict'
2726 The error handling scheme to use for the handling of decoding errors.
2727 The default is 'strict' meaning that decoding errors raise a
2728 UnicodeDecodeError. Other possible values are 'ignore' and 'replace'
2729 as well as any other name registered with codecs.register_error that
2730 can handle UnicodeDecodeErrors.
2731
2732Decode the bytearray using the codec registered for encoding.
2733[clinic start generated code]*/
2734
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002735static PyObject *
Larry Hastings89964c42015-04-14 18:07:59 -04002736bytearray_decode_impl(PyByteArrayObject *self, const char *encoding,
2737 const char *errors)
2738/*[clinic end generated code: output=f57d43f4a00b42c5 input=f28d8f903020257b]*/
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002739{
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002740 if (encoding == NULL)
2741 encoding = PyUnicode_GetDefaultEncoding();
Martin v. Löwis0efea322014-07-27 17:29:17 +02002742 return PyUnicode_FromEncodedObject((PyObject*)self, encoding, errors);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002743}
2744
2745PyDoc_STRVAR(alloc_doc,
2746"B.__alloc__() -> int\n\
2747\n\
Georg Brandl17cb8a82008-05-30 08:20:09 +00002748Return the number of bytes actually allocated.");
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002749
2750static PyObject *
Benjamin Peterson153c70f2009-04-18 15:42:12 +00002751bytearray_alloc(PyByteArrayObject *self)
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002752{
2753 return PyLong_FromSsize_t(self->ob_alloc);
2754}
2755
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002756/*[clinic input]
2757bytearray.join
2758
2759 iterable_of_bytes: object
2760 /
2761
2762Concatenate any number of bytes/bytearray objects.
2763
2764The bytearray whose method is called is inserted in between each pair.
2765
2766The result is returned as a new bytearray object.
2767[clinic start generated code]*/
2768
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002769static PyObject *
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002770bytearray_join(PyByteArrayObject *self, PyObject *iterable_of_bytes)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03002771/*[clinic end generated code: output=a8516370bf68ae08 input=aba6b1f9b30fcb8e]*/
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002772{
Martin v. Löwis0efea322014-07-27 17:29:17 +02002773 return stringlib_bytes_join((PyObject*)self, iterable_of_bytes);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002774}
2775
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002776/*[clinic input]
2777bytearray.splitlines
Antoine Pitrouf2c54842010-01-13 08:07:53 +00002778
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002779 keepends: int(py_default="False") = 0
2780
2781Return a list of the lines in the bytearray, breaking at line boundaries.
2782
2783Line breaks are not included in the resulting list unless keepends is given and
2784true.
2785[clinic start generated code]*/
2786
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002787static PyObject *
2788bytearray_splitlines_impl(PyByteArrayObject *self, int keepends)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03002789/*[clinic end generated code: output=4223c94b895f6ad9 input=36f0b25bc792f6c0]*/
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002790{
Antoine Pitrouf2c54842010-01-13 08:07:53 +00002791 return stringlib_splitlines(
2792 (PyObject*) self, PyByteArray_AS_STRING(self),
2793 PyByteArray_GET_SIZE(self), keepends
2794 );
2795}
2796
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002797static int
Victor Stinner6430fd52011-09-29 04:02:13 +02002798hex_digit_to_int(Py_UCS4 c)
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002799{
2800 if (c >= 128)
2801 return -1;
Eric Smith6dc46f52009-04-27 20:39:49 +00002802 if (Py_ISDIGIT(c))
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002803 return c - '0';
2804 else {
Eric Smith6dc46f52009-04-27 20:39:49 +00002805 if (Py_ISUPPER(c))
2806 c = Py_TOLOWER(c);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002807 if (c >= 'a' && c <= 'f')
2808 return c - 'a' + 10;
2809 }
2810 return -1;
2811}
2812
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002813/*[clinic input]
2814@classmethod
2815bytearray.fromhex
2816
2817 cls: self(type="PyObject*")
2818 string: unicode
2819 /
2820
2821Create a bytearray object from a string of hexadecimal numbers.
2822
2823Spaces between two numbers are accepted.
2824Example: bytearray.fromhex('B9 01EF') -> bytearray(b'\\xb9\\x01\\xef')
2825[clinic start generated code]*/
2826
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002827static PyObject *
2828bytearray_fromhex_impl(PyObject*cls, PyObject *string)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03002829/*[clinic end generated code: output=df3da60129b3700c input=907bbd2d34d9367a]*/
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002830{
2831 PyObject *newbytes;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002832 char *buf;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002833 Py_ssize_t hexlen, byteslen, i, j;
2834 int top, bot;
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02002835 void *data;
2836 unsigned int kind;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002837
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002838 assert(PyUnicode_Check(string));
2839 if (PyUnicode_READY(string))
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002840 return NULL;
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002841 kind = PyUnicode_KIND(string);
2842 data = PyUnicode_DATA(string);
2843 hexlen = PyUnicode_GET_LENGTH(string);
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02002844
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002845 byteslen = hexlen/2; /* This overestimates if there are spaces */
2846 newbytes = PyByteArray_FromStringAndSize(NULL, byteslen);
2847 if (!newbytes)
2848 return NULL;
2849 buf = PyByteArray_AS_STRING(newbytes);
2850 for (i = j = 0; i < hexlen; i += 2) {
2851 /* skip over spaces in the input */
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02002852 while (PyUnicode_READ(kind, data, i) == ' ')
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002853 i++;
2854 if (i >= hexlen)
2855 break;
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02002856 top = hex_digit_to_int(PyUnicode_READ(kind, data, i));
2857 bot = hex_digit_to_int(PyUnicode_READ(kind, data, i+1));
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002858 if (top == -1 || bot == -1) {
2859 PyErr_Format(PyExc_ValueError,
2860 "non-hexadecimal number found in "
2861 "fromhex() arg at position %zd", i);
2862 goto error;
2863 }
2864 buf[j++] = (top << 4) + bot;
2865 }
2866 if (PyByteArray_Resize(newbytes, j) < 0)
2867 goto error;
2868 return newbytes;
2869
2870 error:
2871 Py_DECREF(newbytes);
2872 return NULL;
2873}
2874
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002875
2876static PyObject *
Antoine Pitroub0e1f8b2011-12-05 20:40:08 +01002877_common_reduce(PyByteArrayObject *self, int proto)
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002878{
Antoine Pitroub0e1f8b2011-12-05 20:40:08 +01002879 PyObject *dict;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02002880 _Py_IDENTIFIER(__dict__);
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +02002881 char *buf;
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02002882
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02002883 dict = _PyObject_GetAttrId((PyObject *)self, &PyId___dict__);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002884 if (dict == NULL) {
2885 PyErr_Clear();
2886 dict = Py_None;
2887 Py_INCREF(dict);
2888 }
2889
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +02002890 buf = PyByteArray_AS_STRING(self);
Antoine Pitroub0e1f8b2011-12-05 20:40:08 +01002891 if (proto < 3) {
2892 /* use str based reduction for backwards compatibility with Python 2.x */
2893 PyObject *latin1;
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +02002894 if (Py_SIZE(self))
2895 latin1 = PyUnicode_DecodeLatin1(buf, Py_SIZE(self), NULL);
Antoine Pitroub0e1f8b2011-12-05 20:40:08 +01002896 else
2897 latin1 = PyUnicode_FromString("");
2898 return Py_BuildValue("(O(Ns)N)", Py_TYPE(self), latin1, "latin-1", dict);
2899 }
2900 else {
2901 /* use more efficient byte based reduction */
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +02002902 if (Py_SIZE(self)) {
2903 return Py_BuildValue("(O(y#)N)", Py_TYPE(self), buf, Py_SIZE(self), dict);
Antoine Pitroub0e1f8b2011-12-05 20:40:08 +01002904 }
2905 else {
2906 return Py_BuildValue("(O()N)", Py_TYPE(self), dict);
2907 }
2908 }
2909}
2910
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002911/*[clinic input]
2912bytearray.__reduce__ as bytearray_reduce
2913
2914 self: self(type="PyByteArrayObject *")
2915
2916Return state information for pickling.
2917[clinic start generated code]*/
2918
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002919static PyObject *
2920bytearray_reduce_impl(PyByteArrayObject *self)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03002921/*[clinic end generated code: output=52bf304086464cab input=fbb07de4d102a03a]*/
Antoine Pitroub0e1f8b2011-12-05 20:40:08 +01002922{
2923 return _common_reduce(self, 2);
2924}
2925
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002926/*[clinic input]
2927bytearray.__reduce_ex__ as bytearray_reduce_ex
2928
2929 self: self(type="PyByteArrayObject *")
2930 proto: int = 0
2931 /
2932
2933Return state information for pickling.
2934[clinic start generated code]*/
2935
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002936static PyObject *
2937bytearray_reduce_ex_impl(PyByteArrayObject *self, int proto)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03002938/*[clinic end generated code: output=52eac33377197520 input=0e091a42ca6dbd91]*/
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002939{
Antoine Pitroub0e1f8b2011-12-05 20:40:08 +01002940 return _common_reduce(self, proto);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002941}
2942
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002943/*[clinic input]
2944bytearray.__sizeof__ as bytearray_sizeof
2945
2946 self: self(type="PyByteArrayObject *")
2947
2948Returns the size of the bytearray object in memory, in bytes.
2949[clinic start generated code]*/
2950
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002951static PyObject *
2952bytearray_sizeof_impl(PyByteArrayObject *self)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03002953/*[clinic end generated code: output=738abdd17951c427 input=6b23d305362b462b]*/
Robert Schuppeniesfbe94c52008-07-14 10:13:31 +00002954{
Benjamin Petersonef3e4c22009-04-11 19:48:14 +00002955 Py_ssize_t res;
Robert Schuppeniesfbe94c52008-07-14 10:13:31 +00002956
Benjamin Petersonef3e4c22009-04-11 19:48:14 +00002957 res = sizeof(PyByteArrayObject) + self->ob_alloc * sizeof(char);
2958 return PyLong_FromSsize_t(res);
Robert Schuppeniesfbe94c52008-07-14 10:13:31 +00002959}
2960
Benjamin Peterson153c70f2009-04-18 15:42:12 +00002961static PySequenceMethods bytearray_as_sequence = {
2962 (lenfunc)bytearray_length, /* sq_length */
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002963 (binaryfunc)PyByteArray_Concat, /* sq_concat */
Benjamin Peterson153c70f2009-04-18 15:42:12 +00002964 (ssizeargfunc)bytearray_repeat, /* sq_repeat */
2965 (ssizeargfunc)bytearray_getitem, /* sq_item */
2966 0, /* sq_slice */
2967 (ssizeobjargproc)bytearray_setitem, /* sq_ass_item */
2968 0, /* sq_ass_slice */
2969 (objobjproc)bytearray_contains, /* sq_contains */
2970 (binaryfunc)bytearray_iconcat, /* sq_inplace_concat */
2971 (ssizeargfunc)bytearray_irepeat, /* sq_inplace_repeat */
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002972};
2973
Benjamin Peterson153c70f2009-04-18 15:42:12 +00002974static PyMappingMethods bytearray_as_mapping = {
2975 (lenfunc)bytearray_length,
2976 (binaryfunc)bytearray_subscript,
2977 (objobjargproc)bytearray_ass_subscript,
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002978};
2979
Benjamin Peterson153c70f2009-04-18 15:42:12 +00002980static PyBufferProcs bytearray_as_buffer = {
2981 (getbufferproc)bytearray_getbuffer,
2982 (releasebufferproc)bytearray_releasebuffer,
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002983};
2984
2985static PyMethodDef
Benjamin Peterson153c70f2009-04-18 15:42:12 +00002986bytearray_methods[] = {
2987 {"__alloc__", (PyCFunction)bytearray_alloc, METH_NOARGS, alloc_doc},
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002988 BYTEARRAY_REDUCE_METHODDEF
2989 BYTEARRAY_REDUCE_EX_METHODDEF
2990 BYTEARRAY_SIZEOF_METHODDEF
2991 BYTEARRAY_APPEND_METHODDEF
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002992 {"capitalize", (PyCFunction)stringlib_capitalize, METH_NOARGS,
2993 _Py_capitalize__doc__},
2994 {"center", (PyCFunction)stringlib_center, METH_VARARGS, center__doc__},
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002995 BYTEARRAY_CLEAR_METHODDEF
2996 BYTEARRAY_COPY_METHODDEF
Benjamin Peterson153c70f2009-04-18 15:42:12 +00002997 {"count", (PyCFunction)bytearray_count, METH_VARARGS, count__doc__},
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002998 BYTEARRAY_DECODE_METHODDEF
Benjamin Peterson153c70f2009-04-18 15:42:12 +00002999 {"endswith", (PyCFunction)bytearray_endswith, METH_VARARGS, endswith__doc__},
Ezio Melotti745d54d2013-11-16 19:10:57 +02003000 {"expandtabs", (PyCFunction)stringlib_expandtabs, METH_VARARGS | METH_KEYWORDS,
Christian Heimes2c9c7a52008-05-26 13:42:13 +00003001 expandtabs__doc__},
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02003002 BYTEARRAY_EXTEND_METHODDEF
Benjamin Peterson153c70f2009-04-18 15:42:12 +00003003 {"find", (PyCFunction)bytearray_find, METH_VARARGS, find__doc__},
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02003004 BYTEARRAY_FROMHEX_METHODDEF
Benjamin Peterson153c70f2009-04-18 15:42:12 +00003005 {"index", (PyCFunction)bytearray_index, METH_VARARGS, index__doc__},
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02003006 BYTEARRAY_INSERT_METHODDEF
Christian Heimes2c9c7a52008-05-26 13:42:13 +00003007 {"isalnum", (PyCFunction)stringlib_isalnum, METH_NOARGS,
3008 _Py_isalnum__doc__},
3009 {"isalpha", (PyCFunction)stringlib_isalpha, METH_NOARGS,
3010 _Py_isalpha__doc__},
3011 {"isdigit", (PyCFunction)stringlib_isdigit, METH_NOARGS,
3012 _Py_isdigit__doc__},
3013 {"islower", (PyCFunction)stringlib_islower, METH_NOARGS,
3014 _Py_islower__doc__},
3015 {"isspace", (PyCFunction)stringlib_isspace, METH_NOARGS,
3016 _Py_isspace__doc__},
3017 {"istitle", (PyCFunction)stringlib_istitle, METH_NOARGS,
3018 _Py_istitle__doc__},
3019 {"isupper", (PyCFunction)stringlib_isupper, METH_NOARGS,
3020 _Py_isupper__doc__},
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02003021 BYTEARRAY_JOIN_METHODDEF
Christian Heimes2c9c7a52008-05-26 13:42:13 +00003022 {"ljust", (PyCFunction)stringlib_ljust, METH_VARARGS, ljust__doc__},
3023 {"lower", (PyCFunction)stringlib_lower, METH_NOARGS, _Py_lower__doc__},
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02003024 BYTEARRAY_LSTRIP_METHODDEF
3025 BYTEARRAY_MAKETRANS_METHODDEF
3026 BYTEARRAY_PARTITION_METHODDEF
3027 BYTEARRAY_POP_METHODDEF
3028 BYTEARRAY_REMOVE_METHODDEF
3029 BYTEARRAY_REPLACE_METHODDEF
3030 BYTEARRAY_REVERSE_METHODDEF
Benjamin Peterson153c70f2009-04-18 15:42:12 +00003031 {"rfind", (PyCFunction)bytearray_rfind, METH_VARARGS, rfind__doc__},
3032 {"rindex", (PyCFunction)bytearray_rindex, METH_VARARGS, rindex__doc__},
Christian Heimes2c9c7a52008-05-26 13:42:13 +00003033 {"rjust", (PyCFunction)stringlib_rjust, METH_VARARGS, rjust__doc__},
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02003034 BYTEARRAY_RPARTITION_METHODDEF
3035 BYTEARRAY_RSPLIT_METHODDEF
3036 BYTEARRAY_RSTRIP_METHODDEF
3037 BYTEARRAY_SPLIT_METHODDEF
3038 BYTEARRAY_SPLITLINES_METHODDEF
Benjamin Peterson153c70f2009-04-18 15:42:12 +00003039 {"startswith", (PyCFunction)bytearray_startswith, METH_VARARGS ,
Christian Heimes2c9c7a52008-05-26 13:42:13 +00003040 startswith__doc__},
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02003041 BYTEARRAY_STRIP_METHODDEF
Christian Heimes2c9c7a52008-05-26 13:42:13 +00003042 {"swapcase", (PyCFunction)stringlib_swapcase, METH_NOARGS,
3043 _Py_swapcase__doc__},
3044 {"title", (PyCFunction)stringlib_title, METH_NOARGS, _Py_title__doc__},
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02003045 BYTEARRAY_TRANSLATE_METHODDEF
Christian Heimes2c9c7a52008-05-26 13:42:13 +00003046 {"upper", (PyCFunction)stringlib_upper, METH_NOARGS, _Py_upper__doc__},
3047 {"zfill", (PyCFunction)stringlib_zfill, METH_VARARGS, zfill__doc__},
3048 {NULL}
3049};
3050
Ethan Furmanb95b5612015-01-23 20:05:18 -08003051static PyObject *
3052bytearray_mod(PyObject *v, PyObject *w)
3053{
3054 if (!PyByteArray_Check(v))
3055 Py_RETURN_NOTIMPLEMENTED;
3056 return bytearray_format((PyByteArrayObject *)v, w);
3057}
3058
3059static PyNumberMethods bytearray_as_number = {
3060 0, /*nb_add*/
3061 0, /*nb_subtract*/
3062 0, /*nb_multiply*/
3063 bytearray_mod, /*nb_remainder*/
3064};
3065
Benjamin Peterson153c70f2009-04-18 15:42:12 +00003066PyDoc_STRVAR(bytearray_doc,
Georg Brandl17cb8a82008-05-30 08:20:09 +00003067"bytearray(iterable_of_ints) -> bytearray\n\
3068bytearray(string, encoding[, errors]) -> bytearray\n\
Victor Stinnerbb2e9c42011-12-17 23:18:07 +01003069bytearray(bytes_or_buffer) -> mutable copy of bytes_or_buffer\n\
3070bytearray(int) -> bytes array of size given by the parameter initialized with null bytes\n\
3071bytearray() -> empty bytes array\n\
Christian Heimes2c9c7a52008-05-26 13:42:13 +00003072\n\
3073Construct an mutable bytearray object from:\n\
3074 - an iterable yielding integers in range(256)\n\
3075 - a text string encoded using the specified encoding\n\
Victor Stinnerbb2e9c42011-12-17 23:18:07 +01003076 - a bytes or a buffer object\n\
Christian Heimes2c9c7a52008-05-26 13:42:13 +00003077 - any object implementing the buffer API.\n\
Victor Stinnerbb2e9c42011-12-17 23:18:07 +01003078 - an integer");
Christian Heimes2c9c7a52008-05-26 13:42:13 +00003079
3080
Benjamin Peterson153c70f2009-04-18 15:42:12 +00003081static PyObject *bytearray_iter(PyObject *seq);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00003082
3083PyTypeObject PyByteArray_Type = {
3084 PyVarObject_HEAD_INIT(&PyType_Type, 0)
3085 "bytearray",
3086 sizeof(PyByteArrayObject),
3087 0,
Benjamin Peterson153c70f2009-04-18 15:42:12 +00003088 (destructor)bytearray_dealloc, /* tp_dealloc */
Christian Heimes2c9c7a52008-05-26 13:42:13 +00003089 0, /* tp_print */
3090 0, /* tp_getattr */
3091 0, /* tp_setattr */
Mark Dickinsone94c6792009-02-02 20:36:42 +00003092 0, /* tp_reserved */
Benjamin Peterson153c70f2009-04-18 15:42:12 +00003093 (reprfunc)bytearray_repr, /* tp_repr */
Ethan Furmanb95b5612015-01-23 20:05:18 -08003094 &bytearray_as_number, /* tp_as_number */
Benjamin Peterson153c70f2009-04-18 15:42:12 +00003095 &bytearray_as_sequence, /* tp_as_sequence */
3096 &bytearray_as_mapping, /* tp_as_mapping */
Christian Heimes2c9c7a52008-05-26 13:42:13 +00003097 0, /* tp_hash */
3098 0, /* tp_call */
Benjamin Peterson153c70f2009-04-18 15:42:12 +00003099 bytearray_str, /* tp_str */
Christian Heimes2c9c7a52008-05-26 13:42:13 +00003100 PyObject_GenericGetAttr, /* tp_getattro */
3101 0, /* tp_setattro */
Benjamin Peterson153c70f2009-04-18 15:42:12 +00003102 &bytearray_as_buffer, /* tp_as_buffer */
Christian Heimes2c9c7a52008-05-26 13:42:13 +00003103 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
Benjamin Peterson153c70f2009-04-18 15:42:12 +00003104 bytearray_doc, /* tp_doc */
Christian Heimes2c9c7a52008-05-26 13:42:13 +00003105 0, /* tp_traverse */
3106 0, /* tp_clear */
Benjamin Peterson153c70f2009-04-18 15:42:12 +00003107 (richcmpfunc)bytearray_richcompare, /* tp_richcompare */
Christian Heimes2c9c7a52008-05-26 13:42:13 +00003108 0, /* tp_weaklistoffset */
Benjamin Peterson153c70f2009-04-18 15:42:12 +00003109 bytearray_iter, /* tp_iter */
Christian Heimes2c9c7a52008-05-26 13:42:13 +00003110 0, /* tp_iternext */
Benjamin Peterson153c70f2009-04-18 15:42:12 +00003111 bytearray_methods, /* tp_methods */
Christian Heimes2c9c7a52008-05-26 13:42:13 +00003112 0, /* tp_members */
3113 0, /* tp_getset */
3114 0, /* tp_base */
3115 0, /* tp_dict */
3116 0, /* tp_descr_get */
3117 0, /* tp_descr_set */
3118 0, /* tp_dictoffset */
Benjamin Peterson153c70f2009-04-18 15:42:12 +00003119 (initproc)bytearray_init, /* tp_init */
Christian Heimes2c9c7a52008-05-26 13:42:13 +00003120 PyType_GenericAlloc, /* tp_alloc */
3121 PyType_GenericNew, /* tp_new */
3122 PyObject_Del, /* tp_free */
3123};
3124
3125/*********************** Bytes Iterator ****************************/
3126
3127typedef struct {
3128 PyObject_HEAD
3129 Py_ssize_t it_index;
3130 PyByteArrayObject *it_seq; /* Set to NULL when iterator is exhausted */
3131} bytesiterobject;
3132
3133static void
Benjamin Peterson153c70f2009-04-18 15:42:12 +00003134bytearrayiter_dealloc(bytesiterobject *it)
Christian Heimes2c9c7a52008-05-26 13:42:13 +00003135{
3136 _PyObject_GC_UNTRACK(it);
3137 Py_XDECREF(it->it_seq);
3138 PyObject_GC_Del(it);
3139}
3140
3141static int
Benjamin Peterson153c70f2009-04-18 15:42:12 +00003142bytearrayiter_traverse(bytesiterobject *it, visitproc visit, void *arg)
Christian Heimes2c9c7a52008-05-26 13:42:13 +00003143{
3144 Py_VISIT(it->it_seq);
3145 return 0;
3146}
3147
3148static PyObject *
Benjamin Peterson153c70f2009-04-18 15:42:12 +00003149bytearrayiter_next(bytesiterobject *it)
Christian Heimes2c9c7a52008-05-26 13:42:13 +00003150{
3151 PyByteArrayObject *seq;
3152 PyObject *item;
3153
3154 assert(it != NULL);
3155 seq = it->it_seq;
3156 if (seq == NULL)
3157 return NULL;
3158 assert(PyByteArray_Check(seq));
3159
3160 if (it->it_index < PyByteArray_GET_SIZE(seq)) {
3161 item = PyLong_FromLong(
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +02003162 (unsigned char)PyByteArray_AS_STRING(seq)[it->it_index]);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00003163 if (item != NULL)
3164 ++it->it_index;
3165 return item;
3166 }
3167
3168 Py_DECREF(seq);
3169 it->it_seq = NULL;
3170 return NULL;
3171}
3172
3173static PyObject *
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00003174bytearrayiter_length_hint(bytesiterobject *it)
Christian Heimes2c9c7a52008-05-26 13:42:13 +00003175{
3176 Py_ssize_t len = 0;
3177 if (it->it_seq)
3178 len = PyByteArray_GET_SIZE(it->it_seq) - it->it_index;
3179 return PyLong_FromSsize_t(len);
3180}
3181
3182PyDoc_STRVAR(length_hint_doc,
3183 "Private method returning an estimate of len(list(it)).");
3184
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00003185static PyObject *
3186bytearrayiter_reduce(bytesiterobject *it)
3187{
3188 if (it->it_seq != NULL) {
Antoine Pitroua7013882012-04-05 00:04:20 +02003189 return Py_BuildValue("N(O)n", _PyObject_GetBuiltin("iter"),
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00003190 it->it_seq, it->it_index);
3191 } else {
3192 PyObject *u = PyUnicode_FromUnicode(NULL, 0);
3193 if (u == NULL)
3194 return NULL;
Antoine Pitroua7013882012-04-05 00:04:20 +02003195 return Py_BuildValue("N(N)", _PyObject_GetBuiltin("iter"), u);
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00003196 }
3197}
3198
3199static PyObject *
3200bytearrayiter_setstate(bytesiterobject *it, PyObject *state)
3201{
3202 Py_ssize_t index = PyLong_AsSsize_t(state);
3203 if (index == -1 && PyErr_Occurred())
3204 return NULL;
Kristján Valur Jónsson25dded02014-03-05 13:47:57 +00003205 if (it->it_seq != NULL) {
3206 if (index < 0)
3207 index = 0;
3208 else if (index > PyByteArray_GET_SIZE(it->it_seq))
3209 index = PyByteArray_GET_SIZE(it->it_seq); /* iterator exhausted */
3210 it->it_index = index;
3211 }
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00003212 Py_RETURN_NONE;
3213}
3214
3215PyDoc_STRVAR(setstate_doc, "Set state information for unpickling.");
3216
Benjamin Peterson153c70f2009-04-18 15:42:12 +00003217static PyMethodDef bytearrayiter_methods[] = {
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00003218 {"__length_hint__", (PyCFunction)bytearrayiter_length_hint, METH_NOARGS,
Christian Heimes2c9c7a52008-05-26 13:42:13 +00003219 length_hint_doc},
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00003220 {"__reduce__", (PyCFunction)bytearrayiter_reduce, METH_NOARGS,
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02003221 bytearray_reduce__doc__},
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00003222 {"__setstate__", (PyCFunction)bytearrayiter_setstate, METH_O,
3223 setstate_doc},
Christian Heimes2c9c7a52008-05-26 13:42:13 +00003224 {NULL, NULL} /* sentinel */
3225};
3226
3227PyTypeObject PyByteArrayIter_Type = {
3228 PyVarObject_HEAD_INIT(&PyType_Type, 0)
3229 "bytearray_iterator", /* tp_name */
3230 sizeof(bytesiterobject), /* tp_basicsize */
3231 0, /* tp_itemsize */
3232 /* methods */
Benjamin Peterson153c70f2009-04-18 15:42:12 +00003233 (destructor)bytearrayiter_dealloc, /* tp_dealloc */
Christian Heimes2c9c7a52008-05-26 13:42:13 +00003234 0, /* tp_print */
3235 0, /* tp_getattr */
3236 0, /* tp_setattr */
Mark Dickinsone94c6792009-02-02 20:36:42 +00003237 0, /* tp_reserved */
Christian Heimes2c9c7a52008-05-26 13:42:13 +00003238 0, /* tp_repr */
3239 0, /* tp_as_number */
3240 0, /* tp_as_sequence */
3241 0, /* tp_as_mapping */
3242 0, /* tp_hash */
3243 0, /* tp_call */
3244 0, /* tp_str */
3245 PyObject_GenericGetAttr, /* tp_getattro */
3246 0, /* tp_setattro */
3247 0, /* tp_as_buffer */
3248 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC, /* tp_flags */
3249 0, /* tp_doc */
Benjamin Peterson153c70f2009-04-18 15:42:12 +00003250 (traverseproc)bytearrayiter_traverse, /* tp_traverse */
Christian Heimes2c9c7a52008-05-26 13:42:13 +00003251 0, /* tp_clear */
3252 0, /* tp_richcompare */
3253 0, /* tp_weaklistoffset */
3254 PyObject_SelfIter, /* tp_iter */
Benjamin Peterson153c70f2009-04-18 15:42:12 +00003255 (iternextfunc)bytearrayiter_next, /* tp_iternext */
3256 bytearrayiter_methods, /* tp_methods */
Christian Heimes2c9c7a52008-05-26 13:42:13 +00003257 0,
3258};
3259
3260static PyObject *
Benjamin Peterson153c70f2009-04-18 15:42:12 +00003261bytearray_iter(PyObject *seq)
Christian Heimes2c9c7a52008-05-26 13:42:13 +00003262{
3263 bytesiterobject *it;
3264
3265 if (!PyByteArray_Check(seq)) {
3266 PyErr_BadInternalCall();
3267 return NULL;
3268 }
3269 it = PyObject_GC_New(bytesiterobject, &PyByteArrayIter_Type);
3270 if (it == NULL)
3271 return NULL;
3272 it->it_index = 0;
3273 Py_INCREF(seq);
3274 it->it_seq = (PyByteArrayObject *)seq;
3275 _PyObject_GC_TRACK(it);
3276 return (PyObject *)it;
3277}