blob: 58fe53bcca4734dfda5d9f76479ba0ced60ffb43 [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"
Eric Snow2ebc5ce2017-09-07 23:51:28 -06005#include "internal/mem.h"
6#include "internal/pystate.h"
Christian Heimes2c9c7a52008-05-26 13:42:13 +00007#include "structmember.h"
8#include "bytes_methods.h"
Ethan Furmanb95b5612015-01-23 20:05:18 -08009#include "bytesobject.h"
Gregory P. Smith8cb65692015-04-25 23:22:26 +000010#include "pystrhex.h"
Christian Heimes2c9c7a52008-05-26 13:42:13 +000011
Martin v. Löwis7252a6e2014-07-27 16:25:09 +020012/*[clinic input]
13class bytearray "PyByteArrayObject *" "&PyByteArray_Type"
14[clinic start generated code]*/
15/*[clinic end generated code: output=da39a3ee5e6b4b0d input=5535b77c37a119e0]*/
16
Antoine Pitroufc8d6f42010-01-17 12:38:54 +000017char _PyByteArray_empty_string[] = "";
Christian Heimes2c9c7a52008-05-26 13:42:13 +000018
19void
20PyByteArray_Fini(void)
21{
Christian Heimes2c9c7a52008-05-26 13:42:13 +000022}
23
24int
25PyByteArray_Init(void)
26{
Christian Heimes2c9c7a52008-05-26 13:42:13 +000027 return 1;
28}
29
30/* end nullbytes support */
31
32/* Helpers */
33
34static int
35_getbytevalue(PyObject* arg, int *value)
36{
37 long face_value;
38
39 if (PyLong_Check(arg)) {
40 face_value = PyLong_AsLong(arg);
Georg Brandl9a54d7c2008-07-16 23:15:30 +000041 } else {
42 PyObject *index = PyNumber_Index(arg);
43 if (index == NULL) {
Mark Dickinson10de93a2010-07-09 19:25:48 +000044 *value = -1;
Christian Heimes2c9c7a52008-05-26 13:42:13 +000045 return 0;
46 }
Georg Brandl9a54d7c2008-07-16 23:15:30 +000047 face_value = PyLong_AsLong(index);
48 Py_DECREF(index);
49 }
50
51 if (face_value < 0 || face_value >= 256) {
52 /* this includes the OverflowError in case the long is too large */
53 PyErr_SetString(PyExc_ValueError, "byte must be in range(0, 256)");
Mark Dickinson10de93a2010-07-09 19:25:48 +000054 *value = -1;
Christian Heimes2c9c7a52008-05-26 13:42:13 +000055 return 0;
56 }
57
58 *value = face_value;
59 return 1;
60}
61
62static int
Benjamin Peterson153c70f2009-04-18 15:42:12 +000063bytearray_getbuffer(PyByteArrayObject *obj, Py_buffer *view, int flags)
Christian Heimes2c9c7a52008-05-26 13:42:13 +000064{
Christian Heimes2c9c7a52008-05-26 13:42:13 +000065 void *ptr;
66 if (view == NULL) {
Stefan Krah5178d912015-02-03 16:57:21 +010067 PyErr_SetString(PyExc_BufferError,
68 "bytearray_getbuffer: view==NULL argument is obsolete");
69 return -1;
Christian Heimes2c9c7a52008-05-26 13:42:13 +000070 }
Antoine Pitroufc8d6f42010-01-17 12:38:54 +000071 ptr = (void *) PyByteArray_AS_STRING(obj);
Stefan Krah5178d912015-02-03 16:57:21 +010072 /* cannot fail if view != NULL and readonly == 0 */
73 (void)PyBuffer_FillInfo(view, (PyObject*)obj, ptr, Py_SIZE(obj), 0, flags);
74 obj->ob_exports++;
75 return 0;
Christian Heimes2c9c7a52008-05-26 13:42:13 +000076}
77
78static void
Benjamin Peterson153c70f2009-04-18 15:42:12 +000079bytearray_releasebuffer(PyByteArrayObject *obj, Py_buffer *view)
Christian Heimes2c9c7a52008-05-26 13:42:13 +000080{
81 obj->ob_exports--;
82}
83
Antoine Pitrou5504e892008-12-06 21:27:53 +000084static int
85_canresize(PyByteArrayObject *self)
86{
87 if (self->ob_exports > 0) {
88 PyErr_SetString(PyExc_BufferError,
89 "Existing exports of data: object cannot be re-sized");
90 return 0;
91 }
92 return 1;
93}
94
Serhiy Storchaka1009bf12015-04-03 23:53:51 +030095#include "clinic/bytearrayobject.c.h"
96
Christian Heimes2c9c7a52008-05-26 13:42:13 +000097/* Direct API functions */
98
99PyObject *
100PyByteArray_FromObject(PyObject *input)
101{
Victor Stinnerde4ae3d2016-12-04 22:59:09 +0100102 return PyObject_CallFunctionObjArgs((PyObject *)&PyByteArray_Type,
103 input, NULL);
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000104}
105
Serhiy Storchakaa2314282017-10-29 02:11:54 +0300106static PyObject *
107_PyByteArray_FromBufferObject(PyObject *obj)
108{
109 PyObject *result;
110 Py_buffer view;
111
112 if (PyObject_GetBuffer(obj, &view, PyBUF_FULL_RO) < 0) {
113 return NULL;
114 }
115 result = PyByteArray_FromStringAndSize(NULL, view.len);
116 if (result != NULL &&
117 PyBuffer_ToContiguous(PyByteArray_AS_STRING(result),
118 &view, view.len, 'C') < 0)
119 {
120 Py_CLEAR(result);
121 }
122 PyBuffer_Release(&view);
123 return result;
124}
125
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000126PyObject *
127PyByteArray_FromStringAndSize(const char *bytes, Py_ssize_t size)
128{
129 PyByteArrayObject *new;
130 Py_ssize_t alloc;
131
132 if (size < 0) {
133 PyErr_SetString(PyExc_SystemError,
134 "Negative size passed to PyByteArray_FromStringAndSize");
135 return NULL;
136 }
137
Neal Norwitz3ce5d922008-08-24 07:08:55 +0000138 /* Prevent buffer overflow when setting alloc to size+1. */
139 if (size == PY_SSIZE_T_MAX) {
140 return PyErr_NoMemory();
141 }
142
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000143 new = PyObject_New(PyByteArrayObject, &PyByteArray_Type);
144 if (new == NULL)
145 return NULL;
146
147 if (size == 0) {
148 new->ob_bytes = NULL;
149 alloc = 0;
150 }
151 else {
152 alloc = size + 1;
Antoine Pitrou39aba4f2011-11-12 21:15:28 +0100153 new->ob_bytes = PyObject_Malloc(alloc);
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000154 if (new->ob_bytes == NULL) {
155 Py_DECREF(new);
156 return PyErr_NoMemory();
157 }
Antoine Pitroufc8d6f42010-01-17 12:38:54 +0000158 if (bytes != NULL && size > 0)
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000159 memcpy(new->ob_bytes, bytes, size);
160 new->ob_bytes[size] = '\0'; /* Trailing null byte */
161 }
162 Py_SIZE(new) = size;
163 new->ob_alloc = alloc;
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200164 new->ob_start = new->ob_bytes;
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000165 new->ob_exports = 0;
166
167 return (PyObject *)new;
168}
169
170Py_ssize_t
171PyByteArray_Size(PyObject *self)
172{
173 assert(self != NULL);
174 assert(PyByteArray_Check(self));
175
176 return PyByteArray_GET_SIZE(self);
177}
178
179char *
180PyByteArray_AsString(PyObject *self)
181{
182 assert(self != NULL);
183 assert(PyByteArray_Check(self));
184
185 return PyByteArray_AS_STRING(self);
186}
187
188int
Antoine Pitroucc231542014-11-02 18:40:09 +0100189PyByteArray_Resize(PyObject *self, Py_ssize_t requested_size)
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000190{
191 void *sval;
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200192 PyByteArrayObject *obj = ((PyByteArrayObject *)self);
Antoine Pitroucc231542014-11-02 18:40:09 +0100193 /* All computations are done unsigned to avoid integer overflows
194 (see issue #22335). */
195 size_t alloc = (size_t) obj->ob_alloc;
196 size_t logical_offset = (size_t) (obj->ob_start - obj->ob_bytes);
197 size_t size = (size_t) requested_size;
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000198
199 assert(self != NULL);
200 assert(PyByteArray_Check(self));
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200201 assert(logical_offset <= alloc);
Antoine Pitroucc231542014-11-02 18:40:09 +0100202 assert(requested_size >= 0);
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000203
Antoine Pitroucc231542014-11-02 18:40:09 +0100204 if (requested_size == Py_SIZE(self)) {
Antoine Pitrou5504e892008-12-06 21:27:53 +0000205 return 0;
206 }
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200207 if (!_canresize(obj)) {
Antoine Pitrou5504e892008-12-06 21:27:53 +0000208 return -1;
209 }
210
Antoine Pitrou25454112015-05-19 20:52:27 +0200211 if (size + logical_offset + 1 <= alloc) {
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200212 /* Current buffer is large enough to host the requested size,
213 decide on a strategy. */
214 if (size < alloc / 2) {
215 /* Major downsize; resize down to exact size */
216 alloc = size + 1;
217 }
218 else {
219 /* Minor downsize; quick exit */
220 Py_SIZE(self) = size;
221 PyByteArray_AS_STRING(self)[size] = '\0'; /* Trailing null */
222 return 0;
223 }
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000224 }
225 else {
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200226 /* Need growing, decide on a strategy */
227 if (size <= alloc * 1.125) {
228 /* Moderate upsize; overallocate similar to list_resize() */
229 alloc = size + (size >> 3) + (size < 9 ? 3 : 6);
230 }
231 else {
232 /* Major upsize; resize up to exact size */
233 alloc = size + 1;
234 }
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000235 }
Antoine Pitroucc231542014-11-02 18:40:09 +0100236 if (alloc > PY_SSIZE_T_MAX) {
237 PyErr_NoMemory();
238 return -1;
239 }
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000240
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200241 if (logical_offset > 0) {
242 sval = PyObject_Malloc(alloc);
243 if (sval == NULL) {
244 PyErr_NoMemory();
245 return -1;
246 }
Antoine Pitroucc231542014-11-02 18:40:09 +0100247 memcpy(sval, PyByteArray_AS_STRING(self),
Stefan Krahdce65022017-08-25 20:12:05 +0200248 Py_MIN((size_t)requested_size, (size_t)Py_SIZE(self)));
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200249 PyObject_Free(obj->ob_bytes);
250 }
251 else {
252 sval = PyObject_Realloc(obj->ob_bytes, alloc);
253 if (sval == NULL) {
254 PyErr_NoMemory();
255 return -1;
256 }
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000257 }
258
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200259 obj->ob_bytes = obj->ob_start = sval;
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000260 Py_SIZE(self) = size;
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200261 obj->ob_alloc = alloc;
262 obj->ob_bytes[size] = '\0'; /* Trailing null byte */
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000263
264 return 0;
265}
266
267PyObject *
268PyByteArray_Concat(PyObject *a, PyObject *b)
269{
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000270 Py_buffer va, vb;
271 PyByteArrayObject *result = NULL;
272
273 va.len = -1;
274 vb.len = -1;
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +0200275 if (PyObject_GetBuffer(a, &va, PyBUF_SIMPLE) != 0 ||
276 PyObject_GetBuffer(b, &vb, PyBUF_SIMPLE) != 0) {
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000277 PyErr_Format(PyExc_TypeError, "can't concat %.100s to %.100s",
Serhiy Storchaka6b5a9ec2017-03-19 19:47:02 +0200278 Py_TYPE(b)->tp_name, Py_TYPE(a)->tp_name);
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000279 goto done;
280 }
281
Serhiy Storchaka06cfb0c2016-07-10 20:48:43 +0300282 if (va.len > PY_SSIZE_T_MAX - vb.len) {
283 PyErr_NoMemory();
284 goto done;
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000285 }
286
Serhiy Storchaka06cfb0c2016-07-10 20:48:43 +0300287 result = (PyByteArrayObject *) \
288 PyByteArray_FromStringAndSize(NULL, va.len + vb.len);
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000289 if (result != NULL) {
290 memcpy(result->ob_bytes, va.buf, va.len);
291 memcpy(result->ob_bytes + va.len, vb.buf, vb.len);
292 }
293
294 done:
295 if (va.len != -1)
Martin v. Löwis423be952008-08-13 15:53:07 +0000296 PyBuffer_Release(&va);
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000297 if (vb.len != -1)
Martin v. Löwis423be952008-08-13 15:53:07 +0000298 PyBuffer_Release(&vb);
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000299 return (PyObject *)result;
300}
301
302/* Functions stuffed into the type object */
303
304static Py_ssize_t
Benjamin Peterson153c70f2009-04-18 15:42:12 +0000305bytearray_length(PyByteArrayObject *self)
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000306{
307 return Py_SIZE(self);
308}
309
310static PyObject *
Benjamin Peterson153c70f2009-04-18 15:42:12 +0000311bytearray_iconcat(PyByteArrayObject *self, PyObject *other)
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000312{
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000313 Py_ssize_t size;
314 Py_buffer vo;
315
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +0200316 if (PyObject_GetBuffer(other, &vo, PyBUF_SIMPLE) != 0) {
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000317 PyErr_Format(PyExc_TypeError, "can't concat %.100s to %.100s",
318 Py_TYPE(other)->tp_name, Py_TYPE(self)->tp_name);
319 return NULL;
320 }
321
Serhiy Storchaka06cfb0c2016-07-10 20:48:43 +0300322 size = Py_SIZE(self);
323 if (size > PY_SSIZE_T_MAX - vo.len) {
Martin v. Löwis423be952008-08-13 15:53:07 +0000324 PyBuffer_Release(&vo);
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000325 return PyErr_NoMemory();
326 }
Serhiy Storchaka06cfb0c2016-07-10 20:48:43 +0300327 if (PyByteArray_Resize((PyObject *)self, size + vo.len) < 0) {
Martin v. Löwis423be952008-08-13 15:53:07 +0000328 PyBuffer_Release(&vo);
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000329 return NULL;
330 }
Serhiy Storchaka06cfb0c2016-07-10 20:48:43 +0300331 memcpy(PyByteArray_AS_STRING(self) + size, vo.buf, vo.len);
Martin v. Löwis423be952008-08-13 15:53:07 +0000332 PyBuffer_Release(&vo);
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000333 Py_INCREF(self);
334 return (PyObject *)self;
335}
336
337static PyObject *
Benjamin Peterson153c70f2009-04-18 15:42:12 +0000338bytearray_repeat(PyByteArrayObject *self, Py_ssize_t count)
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000339{
340 PyByteArrayObject *result;
341 Py_ssize_t mysize;
342 Py_ssize_t size;
343
344 if (count < 0)
345 count = 0;
346 mysize = Py_SIZE(self);
Mark Dickinsoncf940c72010-08-10 18:35:01 +0000347 if (count > 0 && mysize > PY_SSIZE_T_MAX / count)
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000348 return PyErr_NoMemory();
Mark Dickinsoncf940c72010-08-10 18:35:01 +0000349 size = mysize * count;
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000350 result = (PyByteArrayObject *)PyByteArray_FromStringAndSize(NULL, size);
351 if (result != NULL && size != 0) {
352 if (mysize == 1)
353 memset(result->ob_bytes, self->ob_bytes[0], size);
354 else {
355 Py_ssize_t i;
356 for (i = 0; i < count; i++)
357 memcpy(result->ob_bytes + i*mysize, self->ob_bytes, mysize);
358 }
359 }
360 return (PyObject *)result;
361}
362
363static PyObject *
Benjamin Peterson153c70f2009-04-18 15:42:12 +0000364bytearray_irepeat(PyByteArrayObject *self, Py_ssize_t count)
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000365{
366 Py_ssize_t mysize;
367 Py_ssize_t size;
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200368 char *buf;
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000369
370 if (count < 0)
371 count = 0;
372 mysize = Py_SIZE(self);
Mark Dickinsoncf940c72010-08-10 18:35:01 +0000373 if (count > 0 && mysize > PY_SSIZE_T_MAX / count)
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000374 return PyErr_NoMemory();
Mark Dickinsoncf940c72010-08-10 18:35:01 +0000375 size = mysize * count;
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200376 if (PyByteArray_Resize((PyObject *)self, size) < 0)
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000377 return NULL;
378
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200379 buf = PyByteArray_AS_STRING(self);
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000380 if (mysize == 1)
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200381 memset(buf, buf[0], size);
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000382 else {
383 Py_ssize_t i;
384 for (i = 1; i < count; i++)
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200385 memcpy(buf + i*mysize, buf, mysize);
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000386 }
387
388 Py_INCREF(self);
389 return (PyObject *)self;
390}
391
392static PyObject *
Benjamin Peterson153c70f2009-04-18 15:42:12 +0000393bytearray_getitem(PyByteArrayObject *self, Py_ssize_t i)
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000394{
395 if (i < 0)
396 i += Py_SIZE(self);
397 if (i < 0 || i >= Py_SIZE(self)) {
398 PyErr_SetString(PyExc_IndexError, "bytearray index out of range");
399 return NULL;
400 }
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200401 return PyLong_FromLong((unsigned char)(PyByteArray_AS_STRING(self)[i]));
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000402}
403
404static PyObject *
Benjamin Peterson153c70f2009-04-18 15:42:12 +0000405bytearray_subscript(PyByteArrayObject *self, PyObject *index)
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000406{
Georg Brandl9a54d7c2008-07-16 23:15:30 +0000407 if (PyIndex_Check(index)) {
408 Py_ssize_t i = PyNumber_AsSsize_t(index, PyExc_IndexError);
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000409
410 if (i == -1 && PyErr_Occurred())
411 return NULL;
412
413 if (i < 0)
414 i += PyByteArray_GET_SIZE(self);
415
416 if (i < 0 || i >= Py_SIZE(self)) {
417 PyErr_SetString(PyExc_IndexError, "bytearray index out of range");
418 return NULL;
419 }
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200420 return PyLong_FromLong((unsigned char)(PyByteArray_AS_STRING(self)[i]));
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000421 }
Georg Brandl9a54d7c2008-07-16 23:15:30 +0000422 else if (PySlice_Check(index)) {
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000423 Py_ssize_t start, stop, step, slicelength, cur, i;
Serhiy Storchakab879fe82017-04-08 09:53:51 +0300424 if (PySlice_Unpack(index, &start, &stop, &step) < 0) {
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000425 return NULL;
426 }
Serhiy Storchakab879fe82017-04-08 09:53:51 +0300427 slicelength = PySlice_AdjustIndices(PyByteArray_GET_SIZE(self),
428 &start, &stop, step);
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000429
430 if (slicelength <= 0)
431 return PyByteArray_FromStringAndSize("", 0);
432 else if (step == 1) {
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200433 return PyByteArray_FromStringAndSize(
434 PyByteArray_AS_STRING(self) + start, slicelength);
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000435 }
436 else {
437 char *source_buf = PyByteArray_AS_STRING(self);
Alexandre Vassalottie2641f42009-04-03 06:38:02 +0000438 char *result_buf;
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000439 PyObject *result;
440
Alexandre Vassalottie2641f42009-04-03 06:38:02 +0000441 result = PyByteArray_FromStringAndSize(NULL, slicelength);
442 if (result == NULL)
443 return NULL;
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000444
Alexandre Vassalottie2641f42009-04-03 06:38:02 +0000445 result_buf = PyByteArray_AS_STRING(result);
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000446 for (cur = start, i = 0; i < slicelength;
447 cur += step, i++) {
448 result_buf[i] = source_buf[cur];
449 }
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000450 return result;
451 }
452 }
453 else {
Terry Jan Reedyffff1442014-08-02 01:30:37 -0400454 PyErr_Format(PyExc_TypeError,
455 "bytearray indices must be integers or slices, not %.200s",
456 Py_TYPE(index)->tp_name);
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000457 return NULL;
458 }
459}
460
461static int
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200462bytearray_setslice_linear(PyByteArrayObject *self,
463 Py_ssize_t lo, Py_ssize_t hi,
464 char *bytes, Py_ssize_t bytes_len)
465{
466 Py_ssize_t avail = hi - lo;
467 char *buf = PyByteArray_AS_STRING(self);
468 Py_ssize_t growth = bytes_len - avail;
Victor Stinner84557232013-11-21 12:29:51 +0100469 int res = 0;
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200470 assert(avail >= 0);
471
Victor Stinner84557232013-11-21 12:29:51 +0100472 if (growth < 0) {
473 if (!_canresize(self))
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200474 return -1;
Victor Stinner84557232013-11-21 12:29:51 +0100475
476 if (lo == 0) {
477 /* Shrink the buffer by advancing its logical start */
478 self->ob_start -= growth;
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200479 /*
Victor Stinner84557232013-11-21 12:29:51 +0100480 0 lo hi old_size
481 | |<----avail----->|<-----tail------>|
482 | |<-bytes_len->|<-----tail------>|
483 0 new_lo new_hi new_size
484 */
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200485 }
Victor Stinner84557232013-11-21 12:29:51 +0100486 else {
487 /*
488 0 lo hi old_size
489 | |<----avail----->|<-----tomove------>|
490 | |<-bytes_len->|<-----tomove------>|
491 0 lo new_hi new_size
492 */
493 memmove(buf + lo + bytes_len, buf + hi,
494 Py_SIZE(self) - hi);
495 }
496 if (PyByteArray_Resize((PyObject *)self,
497 Py_SIZE(self) + growth) < 0) {
498 /* Issue #19578: Handling the memory allocation failure here is
499 tricky here because the bytearray object has already been
500 modified. Depending on growth and lo, the behaviour is
501 different.
502
503 If growth < 0 and lo != 0, the operation is completed, but a
504 MemoryError is still raised and the memory block is not
Raymond Hettinger15f44ab2016-08-30 10:47:49 -0700505 shrunk. Otherwise, the bytearray is restored in its previous
Victor Stinner84557232013-11-21 12:29:51 +0100506 state and a MemoryError is raised. */
507 if (lo == 0) {
508 self->ob_start += growth;
509 return -1;
510 }
511 /* memmove() removed bytes, the bytearray object cannot be
512 restored in its previous state. */
513 Py_SIZE(self) += growth;
514 res = -1;
515 }
516 buf = PyByteArray_AS_STRING(self);
517 }
518 else if (growth > 0) {
519 if (Py_SIZE(self) > (Py_ssize_t)PY_SSIZE_T_MAX - growth) {
520 PyErr_NoMemory();
521 return -1;
522 }
523
524 if (PyByteArray_Resize((PyObject *)self,
525 Py_SIZE(self) + growth) < 0) {
526 return -1;
527 }
528 buf = PyByteArray_AS_STRING(self);
529 /* Make the place for the additional bytes */
530 /*
531 0 lo hi old_size
532 | |<-avail->|<-----tomove------>|
533 | |<---bytes_len-->|<-----tomove------>|
534 0 lo new_hi new_size
535 */
536 memmove(buf + lo + bytes_len, buf + hi,
537 Py_SIZE(self) - lo - bytes_len);
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200538 }
539
540 if (bytes_len > 0)
541 memcpy(buf + lo, bytes, bytes_len);
Victor Stinner84557232013-11-21 12:29:51 +0100542 return res;
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200543}
544
545static int
Benjamin Peterson153c70f2009-04-18 15:42:12 +0000546bytearray_setslice(PyByteArrayObject *self, Py_ssize_t lo, Py_ssize_t hi,
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000547 PyObject *values)
548{
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200549 Py_ssize_t needed;
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000550 void *bytes;
551 Py_buffer vbytes;
552 int res = 0;
553
554 vbytes.len = -1;
555 if (values == (PyObject *)self) {
556 /* Make a copy and call this function recursively */
557 int err;
Serhiy Storchakaa2314282017-10-29 02:11:54 +0300558 values = PyByteArray_FromStringAndSize(PyByteArray_AS_STRING(values),
559 PyByteArray_GET_SIZE(values));
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000560 if (values == NULL)
561 return -1;
Benjamin Peterson153c70f2009-04-18 15:42:12 +0000562 err = bytearray_setslice(self, lo, hi, values);
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000563 Py_DECREF(values);
564 return err;
565 }
566 if (values == NULL) {
567 /* del b[lo:hi] */
568 bytes = NULL;
569 needed = 0;
570 }
571 else {
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +0200572 if (PyObject_GetBuffer(values, &vbytes, PyBUF_SIMPLE) != 0) {
573 PyErr_Format(PyExc_TypeError,
574 "can't set bytearray slice from %.100s",
575 Py_TYPE(values)->tp_name);
576 return -1;
577 }
578 needed = vbytes.len;
579 bytes = vbytes.buf;
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000580 }
581
582 if (lo < 0)
583 lo = 0;
584 if (hi < lo)
585 hi = lo;
586 if (hi > Py_SIZE(self))
587 hi = Py_SIZE(self);
588
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200589 res = bytearray_setslice_linear(self, lo, hi, bytes, needed);
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000590 if (vbytes.len != -1)
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200591 PyBuffer_Release(&vbytes);
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000592 return res;
593}
594
595static int
Benjamin Peterson153c70f2009-04-18 15:42:12 +0000596bytearray_setitem(PyByteArrayObject *self, Py_ssize_t i, PyObject *value)
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000597{
Georg Brandl9a54d7c2008-07-16 23:15:30 +0000598 int ival;
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000599
600 if (i < 0)
601 i += Py_SIZE(self);
602
603 if (i < 0 || i >= Py_SIZE(self)) {
604 PyErr_SetString(PyExc_IndexError, "bytearray index out of range");
605 return -1;
606 }
607
608 if (value == NULL)
Benjamin Peterson153c70f2009-04-18 15:42:12 +0000609 return bytearray_setslice(self, i, i+1, NULL);
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000610
Georg Brandl9a54d7c2008-07-16 23:15:30 +0000611 if (!_getbytevalue(value, &ival))
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000612 return -1;
613
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200614 PyByteArray_AS_STRING(self)[i] = ival;
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000615 return 0;
616}
617
618static int
Benjamin Peterson153c70f2009-04-18 15:42:12 +0000619bytearray_ass_subscript(PyByteArrayObject *self, PyObject *index, PyObject *values)
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000620{
621 Py_ssize_t start, stop, step, slicelen, needed;
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200622 char *buf, *bytes;
623 buf = PyByteArray_AS_STRING(self);
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000624
Georg Brandl9a54d7c2008-07-16 23:15:30 +0000625 if (PyIndex_Check(index)) {
626 Py_ssize_t i = PyNumber_AsSsize_t(index, PyExc_IndexError);
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000627
628 if (i == -1 && PyErr_Occurred())
629 return -1;
630
631 if (i < 0)
632 i += PyByteArray_GET_SIZE(self);
633
634 if (i < 0 || i >= Py_SIZE(self)) {
635 PyErr_SetString(PyExc_IndexError, "bytearray index out of range");
636 return -1;
637 }
638
639 if (values == NULL) {
640 /* Fall through to slice assignment */
641 start = i;
642 stop = i + 1;
643 step = 1;
644 slicelen = 1;
645 }
646 else {
Georg Brandl9a54d7c2008-07-16 23:15:30 +0000647 int ival;
648 if (!_getbytevalue(values, &ival))
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000649 return -1;
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200650 buf[i] = (char)ival;
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000651 return 0;
652 }
653 }
Georg Brandl9a54d7c2008-07-16 23:15:30 +0000654 else if (PySlice_Check(index)) {
Serhiy Storchakab879fe82017-04-08 09:53:51 +0300655 if (PySlice_Unpack(index, &start, &stop, &step) < 0) {
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000656 return -1;
657 }
Serhiy Storchakab879fe82017-04-08 09:53:51 +0300658 slicelen = PySlice_AdjustIndices(PyByteArray_GET_SIZE(self), &start,
659 &stop, step);
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000660 }
661 else {
Terry Jan Reedyffff1442014-08-02 01:30:37 -0400662 PyErr_Format(PyExc_TypeError,
663 "bytearray indices must be integers or slices, not %.200s",
664 Py_TYPE(index)->tp_name);
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000665 return -1;
666 }
667
668 if (values == NULL) {
669 bytes = NULL;
670 needed = 0;
671 }
672 else if (values == (PyObject *)self || !PyByteArray_Check(values)) {
Christian Heimes6d26ade2012-11-03 23:07:59 +0100673 int err;
Ezio Melottic64bcbe2012-11-03 21:19:06 +0200674 if (PyNumber_Check(values) || PyUnicode_Check(values)) {
675 PyErr_SetString(PyExc_TypeError,
676 "can assign only bytes, buffers, or iterables "
677 "of ints in range(0, 256)");
678 return -1;
679 }
Georg Brandlf3fa5682010-12-04 17:09:30 +0000680 /* Make a copy and call this function recursively */
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000681 values = PyByteArray_FromObject(values);
682 if (values == NULL)
683 return -1;
Benjamin Peterson153c70f2009-04-18 15:42:12 +0000684 err = bytearray_ass_subscript(self, index, values);
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000685 Py_DECREF(values);
686 return err;
687 }
688 else {
689 assert(PyByteArray_Check(values));
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200690 bytes = PyByteArray_AS_STRING(values);
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000691 needed = Py_SIZE(values);
692 }
693 /* Make sure b[5:2] = ... inserts before 5, not before 2. */
694 if ((step < 0 && start < stop) ||
695 (step > 0 && start > stop))
696 stop = start;
697 if (step == 1) {
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200698 return bytearray_setslice_linear(self, start, stop, bytes, needed);
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000699 }
700 else {
701 if (needed == 0) {
702 /* Delete slice */
Mark Dickinsonbc099642010-01-29 17:27:24 +0000703 size_t cur;
704 Py_ssize_t i;
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000705
Antoine Pitrou5504e892008-12-06 21:27:53 +0000706 if (!_canresize(self))
707 return -1;
Mark Dickinson7e3b9482010-08-06 21:33:18 +0000708
709 if (slicelen == 0)
710 /* Nothing to do here. */
711 return 0;
712
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000713 if (step < 0) {
714 stop = start + 1;
715 start = stop + step * (slicelen - 1) - 1;
716 step = -step;
717 }
718 for (cur = start, i = 0;
719 i < slicelen; cur += step, i++) {
720 Py_ssize_t lim = step - 1;
721
Mark Dickinson66f575b2010-02-14 12:53:32 +0000722 if (cur + step >= (size_t)PyByteArray_GET_SIZE(self))
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000723 lim = PyByteArray_GET_SIZE(self) - cur - 1;
724
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200725 memmove(buf + cur - i,
726 buf + cur + 1, lim);
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000727 }
728 /* Move the tail of the bytes, in one chunk */
Mark Dickinson7e3b9482010-08-06 21:33:18 +0000729 cur = start + (size_t)slicelen*step;
Mark Dickinson66f575b2010-02-14 12:53:32 +0000730 if (cur < (size_t)PyByteArray_GET_SIZE(self)) {
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200731 memmove(buf + cur - slicelen,
732 buf + cur,
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000733 PyByteArray_GET_SIZE(self) - cur);
734 }
735 if (PyByteArray_Resize((PyObject *)self,
736 PyByteArray_GET_SIZE(self) - slicelen) < 0)
737 return -1;
738
739 return 0;
740 }
741 else {
742 /* Assign slice */
Mark Dickinson7e3b9482010-08-06 21:33:18 +0000743 Py_ssize_t i;
744 size_t cur;
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000745
746 if (needed != slicelen) {
747 PyErr_Format(PyExc_ValueError,
748 "attempt to assign bytes of size %zd "
749 "to extended slice of size %zd",
750 needed, slicelen);
751 return -1;
752 }
753 for (cur = start, i = 0; i < slicelen; cur += step, i++)
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200754 buf[cur] = bytes[i];
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000755 return 0;
756 }
757 }
758}
759
760static int
Benjamin Peterson153c70f2009-04-18 15:42:12 +0000761bytearray_init(PyByteArrayObject *self, PyObject *args, PyObject *kwds)
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000762{
763 static char *kwlist[] = {"source", "encoding", "errors", 0};
764 PyObject *arg = NULL;
765 const char *encoding = NULL;
766 const char *errors = NULL;
767 Py_ssize_t count;
768 PyObject *it;
769 PyObject *(*iternext)(PyObject *);
770
771 if (Py_SIZE(self) != 0) {
772 /* Empty previous contents (yes, do this first of all!) */
773 if (PyByteArray_Resize((PyObject *)self, 0) < 0)
774 return -1;
775 }
776
777 /* Parse arguments */
Georg Brandl3dbca812008-07-23 16:10:53 +0000778 if (!PyArg_ParseTupleAndKeywords(args, kwds, "|Oss:bytearray", kwlist,
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000779 &arg, &encoding, &errors))
780 return -1;
781
782 /* Make a quick exit if no first argument */
783 if (arg == NULL) {
784 if (encoding != NULL || errors != NULL) {
785 PyErr_SetString(PyExc_TypeError,
786 "encoding or errors without sequence argument");
787 return -1;
788 }
789 return 0;
790 }
791
792 if (PyUnicode_Check(arg)) {
793 /* Encode via the codec registry */
794 PyObject *encoded, *new;
795 if (encoding == NULL) {
796 PyErr_SetString(PyExc_TypeError,
797 "string argument without an encoding");
798 return -1;
799 }
Marc-André Lemburgb2750b52008-06-06 12:18:17 +0000800 encoded = PyUnicode_AsEncodedString(arg, encoding, errors);
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000801 if (encoded == NULL)
802 return -1;
803 assert(PyBytes_Check(encoded));
Benjamin Peterson153c70f2009-04-18 15:42:12 +0000804 new = bytearray_iconcat(self, encoded);
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000805 Py_DECREF(encoded);
806 if (new == NULL)
807 return -1;
808 Py_DECREF(new);
809 return 0;
810 }
811
812 /* If it's not unicode, there can't be encoding or errors */
813 if (encoding != NULL || errors != NULL) {
814 PyErr_SetString(PyExc_TypeError,
815 "encoding or errors without a string argument");
816 return -1;
817 }
818
819 /* Is it an int? */
Serhiy Storchakaeb249882016-08-15 09:46:07 +0300820 if (PyIndex_Check(arg)) {
821 count = PyNumber_AsSsize_t(arg, PyExc_OverflowError);
822 if (count == -1 && PyErr_Occurred()) {
Serhiy Storchakae8904212018-10-15 00:02:57 +0300823 if (!PyErr_ExceptionMatches(PyExc_TypeError))
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000824 return -1;
INADA Naokia634e232017-01-06 17:32:01 +0900825 PyErr_Clear(); /* fall through */
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000826 }
INADA Naokia634e232017-01-06 17:32:01 +0900827 else {
828 if (count < 0) {
829 PyErr_SetString(PyExc_ValueError, "negative count");
830 return -1;
831 }
832 if (count > 0) {
833 if (PyByteArray_Resize((PyObject *)self, count))
834 return -1;
835 memset(PyByteArray_AS_STRING(self), 0, count);
836 }
837 return 0;
838 }
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000839 }
840
841 /* Use the buffer API */
842 if (PyObject_CheckBuffer(arg)) {
843 Py_ssize_t size;
844 Py_buffer view;
845 if (PyObject_GetBuffer(arg, &view, PyBUF_FULL_RO) < 0)
846 return -1;
847 size = view.len;
848 if (PyByteArray_Resize((PyObject *)self, size) < 0) goto fail;
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200849 if (PyBuffer_ToContiguous(PyByteArray_AS_STRING(self),
850 &view, size, 'C') < 0)
Stefan Krah7d12d9d2012-07-28 12:25:55 +0200851 goto fail;
Martin v. Löwis423be952008-08-13 15:53:07 +0000852 PyBuffer_Release(&view);
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000853 return 0;
854 fail:
Martin v. Löwis423be952008-08-13 15:53:07 +0000855 PyBuffer_Release(&view);
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000856 return -1;
857 }
858
859 /* XXX Optimize this if the arguments is a list, tuple */
860
861 /* Get the iterator */
862 it = PyObject_GetIter(arg);
863 if (it == NULL)
864 return -1;
865 iternext = *Py_TYPE(it)->tp_iternext;
866
867 /* Run the iterator to exhaustion */
868 for (;;) {
869 PyObject *item;
Georg Brandl9a54d7c2008-07-16 23:15:30 +0000870 int rc, value;
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000871
872 /* Get the next item */
873 item = iternext(it);
874 if (item == NULL) {
875 if (PyErr_Occurred()) {
876 if (!PyErr_ExceptionMatches(PyExc_StopIteration))
877 goto error;
878 PyErr_Clear();
879 }
880 break;
881 }
882
883 /* Interpret it as an int (__index__) */
Georg Brandl9a54d7c2008-07-16 23:15:30 +0000884 rc = _getbytevalue(item, &value);
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000885 Py_DECREF(item);
Georg Brandl9a54d7c2008-07-16 23:15:30 +0000886 if (!rc)
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000887 goto error;
888
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000889 /* Append the byte */
Serhiy Storchaka7b6e3b92015-06-29 21:14:06 +0300890 if (Py_SIZE(self) + 1 < self->ob_alloc) {
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000891 Py_SIZE(self)++;
Serhiy Storchaka7b6e3b92015-06-29 21:14:06 +0300892 PyByteArray_AS_STRING(self)[Py_SIZE(self)] = '\0';
893 }
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000894 else if (PyByteArray_Resize((PyObject *)self, Py_SIZE(self)+1) < 0)
895 goto error;
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200896 PyByteArray_AS_STRING(self)[Py_SIZE(self)-1] = value;
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000897 }
898
899 /* Clean up and return success */
900 Py_DECREF(it);
901 return 0;
902
903 error:
904 /* Error handling when it != NULL */
905 Py_DECREF(it);
906 return -1;
907}
908
909/* Mostly copied from string_repr, but without the
910 "smart quote" functionality. */
911static PyObject *
Benjamin Peterson153c70f2009-04-18 15:42:12 +0000912bytearray_repr(PyByteArrayObject *self)
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000913{
Serhiy Storchakab3a77962017-09-21 14:24:13 +0300914 const char *className = _PyType_Name(Py_TYPE(self));
915 const char *quote_prefix = "(b";
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000916 const char *quote_postfix = ")";
917 Py_ssize_t length = Py_SIZE(self);
Serhiy Storchakab3a77962017-09-21 14:24:13 +0300918 /* 6 == strlen(quote_prefix) + 2 + strlen(quote_postfix) + 1 */
919 Py_ssize_t newsize;
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000920 PyObject *v;
Antoine Pitrou9ed5f272013-08-13 20:18:52 +0200921 Py_ssize_t i;
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200922 char *bytes;
Antoine Pitrou9ed5f272013-08-13 20:18:52 +0200923 char c;
924 char *p;
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200925 int quote;
926 char *test, *start;
927 char *buffer;
928
Serhiy Storchakab3a77962017-09-21 14:24:13 +0300929 newsize = strlen(className);
930 if (length > (PY_SSIZE_T_MAX - 6 - newsize) / 4) {
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000931 PyErr_SetString(PyExc_OverflowError,
932 "bytearray object is too large to make repr");
933 return NULL;
934 }
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200935
Serhiy Storchakab3a77962017-09-21 14:24:13 +0300936 newsize += 6 + length * 4;
Antoine Pitrou39aba4f2011-11-12 21:15:28 +0100937 buffer = PyObject_Malloc(newsize);
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200938 if (buffer == NULL) {
939 PyErr_NoMemory();
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000940 return NULL;
941 }
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000942
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200943 /* Figure out which quote to use; single is preferred */
944 quote = '\'';
945 start = PyByteArray_AS_STRING(self);
946 for (test = start; test < start+length; ++test) {
947 if (*test == '"') {
948 quote = '\''; /* back to single */
949 break;
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000950 }
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200951 else if (*test == '\'')
952 quote = '"';
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000953 }
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200954
955 p = buffer;
Serhiy Storchakab3a77962017-09-21 14:24:13 +0300956 while (*className)
957 *p++ = *className++;
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200958 while (*quote_prefix)
959 *p++ = *quote_prefix++;
960 *p++ = quote;
961
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200962 bytes = PyByteArray_AS_STRING(self);
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200963 for (i = 0; i < length; i++) {
964 /* There's at least enough room for a hex escape
965 and a closing quote. */
966 assert(newsize - (p - buffer) >= 5);
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200967 c = bytes[i];
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200968 if (c == '\'' || c == '\\')
969 *p++ = '\\', *p++ = c;
970 else if (c == '\t')
971 *p++ = '\\', *p++ = 't';
972 else if (c == '\n')
973 *p++ = '\\', *p++ = 'n';
974 else if (c == '\r')
975 *p++ = '\\', *p++ = 'r';
976 else if (c == 0)
977 *p++ = '\\', *p++ = 'x', *p++ = '0', *p++ = '0';
978 else if (c < ' ' || c >= 0x7f) {
979 *p++ = '\\';
980 *p++ = 'x';
Victor Stinnerf5cff562011-10-14 02:13:11 +0200981 *p++ = Py_hexdigits[(c & 0xf0) >> 4];
982 *p++ = Py_hexdigits[c & 0xf];
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200983 }
984 else
985 *p++ = c;
986 }
987 assert(newsize - (p - buffer) >= 1);
988 *p++ = quote;
989 while (*quote_postfix) {
990 *p++ = *quote_postfix++;
991 }
992
Serhiy Storchakab3a77962017-09-21 14:24:13 +0300993 v = PyUnicode_FromStringAndSize(buffer, p - buffer);
Antoine Pitrou39aba4f2011-11-12 21:15:28 +0100994 PyObject_Free(buffer);
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200995 return v;
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000996}
997
998static PyObject *
Benjamin Peterson153c70f2009-04-18 15:42:12 +0000999bytearray_str(PyObject *op)
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001000{
Victor Stinner53b7d4e2018-07-25 01:37:05 +02001001 if (Py_BytesWarningFlag) {
1002 if (PyErr_WarnEx(PyExc_BytesWarning,
1003 "str() on a bytearray instance", 1)) {
1004 return NULL;
Alexander Belopolskyf0f45142010-08-11 17:31:17 +00001005 }
Victor Stinner53b7d4e2018-07-25 01:37:05 +02001006 }
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;
Serhiy Storchakafa494fd2015-05-30 17:45:22 +03001015 int cmp, rc;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001016
1017 /* Bytes can be compared to anything that supports the (binary)
1018 buffer API. Except that a comparison with Unicode is always an
1019 error, even if the comparison is for equality. */
Serhiy Storchakafa494fd2015-05-30 17:45:22 +03001020 rc = PyObject_IsInstance(self, (PyObject*)&PyUnicode_Type);
1021 if (!rc)
1022 rc = PyObject_IsInstance(other, (PyObject*)&PyUnicode_Type);
1023 if (rc < 0)
1024 return NULL;
1025 if (rc) {
Barry Warsaw9e9dcd62008-10-17 01:50:37 +00001026 if (Py_BytesWarningFlag && (op == Py_EQ || op == Py_NE)) {
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001027 if (PyErr_WarnEx(PyExc_BytesWarning,
Georg Brandle5d68ac2008-06-04 11:30:26 +00001028 "Comparison between bytearray and string", 1))
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001029 return NULL;
1030 }
1031
Brian Curtindfc80e32011-08-10 20:28:54 -05001032 Py_RETURN_NOTIMPLEMENTED;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001033 }
1034
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +02001035 if (PyObject_GetBuffer(self, &self_bytes, PyBUF_SIMPLE) != 0) {
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001036 PyErr_Clear();
Brian Curtindfc80e32011-08-10 20:28:54 -05001037 Py_RETURN_NOTIMPLEMENTED;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001038 }
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +02001039 self_size = self_bytes.len;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001040
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +02001041 if (PyObject_GetBuffer(other, &other_bytes, PyBUF_SIMPLE) != 0) {
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001042 PyErr_Clear();
Martin v. Löwis423be952008-08-13 15:53:07 +00001043 PyBuffer_Release(&self_bytes);
Brian Curtindfc80e32011-08-10 20:28:54 -05001044 Py_RETURN_NOTIMPLEMENTED;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001045 }
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +02001046 other_size = other_bytes.len;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001047
1048 if (self_size != other_size && (op == Py_EQ || op == Py_NE)) {
1049 /* Shortcut: if the lengths differ, the objects differ */
stratakise8b19652017-11-02 11:32:54 +01001050 PyBuffer_Release(&self_bytes);
1051 PyBuffer_Release(&other_bytes);
1052 return PyBool_FromLong((op == Py_NE));
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001053 }
1054 else {
stratakise8b19652017-11-02 11:32:54 +01001055 cmp = memcmp(self_bytes.buf, other_bytes.buf,
1056 Py_MIN(self_size, other_size));
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001057 /* In ISO C, memcmp() guarantees to use unsigned bytes! */
1058
stratakise8b19652017-11-02 11:32:54 +01001059 PyBuffer_Release(&self_bytes);
1060 PyBuffer_Release(&other_bytes);
1061
1062 if (cmp != 0) {
1063 Py_RETURN_RICHCOMPARE(cmp, 0, op);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001064 }
1065
stratakise8b19652017-11-02 11:32:54 +01001066 Py_RETURN_RICHCOMPARE(self_size, other_size, op);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001067 }
1068
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001069}
1070
1071static void
Benjamin Peterson153c70f2009-04-18 15:42:12 +00001072bytearray_dealloc(PyByteArrayObject *self)
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001073{
Benjamin Petersone0124bd2009-03-09 21:04:33 +00001074 if (self->ob_exports > 0) {
1075 PyErr_SetString(PyExc_SystemError,
Benjamin Petersonef3e4c22009-04-11 19:48:14 +00001076 "deallocated bytearray object has exported buffers");
Benjamin Petersone0124bd2009-03-09 21:04:33 +00001077 PyErr_Print();
1078 }
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001079 if (self->ob_bytes != 0) {
Antoine Pitrou39aba4f2011-11-12 21:15:28 +01001080 PyObject_Free(self->ob_bytes);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001081 }
1082 Py_TYPE(self)->tp_free((PyObject *)self);
1083}
1084
1085
1086/* -------------------------------------------------------------------- */
1087/* Methods */
1088
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02001089#define FASTSEARCH fastsearch
1090#define STRINGLIB(F) stringlib_##F
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001091#define STRINGLIB_CHAR char
Antoine Pitroucfc22b42012-10-16 21:07:23 +02001092#define STRINGLIB_SIZEOF_CHAR 1
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001093#define STRINGLIB_LEN PyByteArray_GET_SIZE
1094#define STRINGLIB_STR PyByteArray_AS_STRING
1095#define STRINGLIB_NEW PyByteArray_FromStringAndSize
Antoine Pitrouf2c54842010-01-13 08:07:53 +00001096#define STRINGLIB_ISSPACE Py_ISSPACE
1097#define STRINGLIB_ISLINEBREAK(x) ((x == '\n') || (x == '\r'))
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001098#define STRINGLIB_CHECK_EXACT PyByteArray_CheckExact
1099#define STRINGLIB_MUTABLE 1
1100
1101#include "stringlib/fastsearch.h"
1102#include "stringlib/count.h"
1103#include "stringlib/find.h"
Antoine Pitroucfc22b42012-10-16 21:07:23 +02001104#include "stringlib/join.h"
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001105#include "stringlib/partition.h"
Antoine Pitrouf2c54842010-01-13 08:07:53 +00001106#include "stringlib/split.h"
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001107#include "stringlib/ctype.h"
1108#include "stringlib/transmogrify.h"
1109
1110
Serhiy Storchakae09132f2016-07-03 13:57:48 +03001111static PyObject *
1112bytearray_find(PyByteArrayObject *self, PyObject *args)
1113{
1114 return _Py_bytes_find(PyByteArray_AS_STRING(self), PyByteArray_GET_SIZE(self), args);
1115}
1116
1117static PyObject *
1118bytearray_count(PyByteArrayObject *self, PyObject *args)
1119{
1120 return _Py_bytes_count(PyByteArray_AS_STRING(self), PyByteArray_GET_SIZE(self), args);
1121}
1122
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001123/*[clinic input]
1124bytearray.clear
1125
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001126Remove all items from the bytearray.
1127[clinic start generated code]*/
1128
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001129static PyObject *
1130bytearray_clear_impl(PyByteArrayObject *self)
Serhiy Storchaka7a9579c2016-05-02 13:45:20 +03001131/*[clinic end generated code: output=85c2fe6aede0956c input=ed6edae9de447ac4]*/
Eli Bendersky4db28d32011-03-03 18:21:02 +00001132{
1133 if (PyByteArray_Resize((PyObject *)self, 0) < 0)
1134 return NULL;
1135 Py_RETURN_NONE;
1136}
1137
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001138/*[clinic input]
1139bytearray.copy
1140
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001141Return a copy of B.
1142[clinic start generated code]*/
1143
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001144static PyObject *
1145bytearray_copy_impl(PyByteArrayObject *self)
Serhiy Storchaka7a9579c2016-05-02 13:45:20 +03001146/*[clinic end generated code: output=68cfbcfed484c132 input=6597b0c01bccaa9e]*/
Eli Bendersky4db28d32011-03-03 18:21:02 +00001147{
1148 return PyByteArray_FromStringAndSize(PyByteArray_AS_STRING((PyObject *)self),
1149 PyByteArray_GET_SIZE(self));
1150}
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001151
Serhiy Storchakae09132f2016-07-03 13:57:48 +03001152static PyObject *
1153bytearray_index(PyByteArrayObject *self, PyObject *args)
1154{
1155 return _Py_bytes_index(PyByteArray_AS_STRING(self), PyByteArray_GET_SIZE(self), args);
1156}
1157
1158static PyObject *
1159bytearray_rfind(PyByteArrayObject *self, PyObject *args)
1160{
1161 return _Py_bytes_rfind(PyByteArray_AS_STRING(self), PyByteArray_GET_SIZE(self), args);
1162}
1163
1164static PyObject *
1165bytearray_rindex(PyByteArrayObject *self, PyObject *args)
1166{
1167 return _Py_bytes_rindex(PyByteArray_AS_STRING(self), PyByteArray_GET_SIZE(self), args);
1168}
1169
1170static int
1171bytearray_contains(PyObject *self, PyObject *arg)
1172{
1173 return _Py_bytes_contains(PyByteArray_AS_STRING(self), PyByteArray_GET_SIZE(self), arg);
1174}
1175
1176static PyObject *
1177bytearray_startswith(PyByteArrayObject *self, PyObject *args)
1178{
1179 return _Py_bytes_startswith(PyByteArray_AS_STRING(self), PyByteArray_GET_SIZE(self), args);
1180}
1181
1182static PyObject *
1183bytearray_endswith(PyByteArrayObject *self, PyObject *args)
1184{
1185 return _Py_bytes_endswith(PyByteArray_AS_STRING(self), PyByteArray_GET_SIZE(self), args);
1186}
1187
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001188
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001189/*[clinic input]
1190bytearray.translate
1191
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001192 table: object
1193 Translation table, which must be a bytes object of length 256.
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001194 /
Martin Panter1b6c6da2016-08-27 08:35:02 +00001195 delete as deletechars: object(c_default="NULL") = b''
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001196
1197Return a copy with each character mapped by the given translation table.
1198
Martin Panter1b6c6da2016-08-27 08:35:02 +00001199All characters occurring in the optional argument delete are removed.
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001200The remaining characters are mapped through the given translation table.
1201[clinic start generated code]*/
1202
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001203static PyObject *
Larry Hastings89964c42015-04-14 18:07:59 -04001204bytearray_translate_impl(PyByteArrayObject *self, PyObject *table,
Martin Panter1b6c6da2016-08-27 08:35:02 +00001205 PyObject *deletechars)
1206/*[clinic end generated code: output=b6a8f01c2a74e446 input=cfff956d4d127a9b]*/
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001207{
Antoine Pitrou9ed5f272013-08-13 20:18:52 +02001208 char *input, *output;
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001209 const char *table_chars;
Antoine Pitrou9ed5f272013-08-13 20:18:52 +02001210 Py_ssize_t i, c;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001211 PyObject *input_obj = (PyObject*)self;
1212 const char *output_start;
1213 Py_ssize_t inlen;
Georg Brandlccc47b62008-12-28 11:44:14 +00001214 PyObject *result = NULL;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001215 int trans_table[256];
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001216 Py_buffer vtable, vdel;
1217
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001218 if (table == Py_None) {
1219 table_chars = NULL;
Georg Brandlccc47b62008-12-28 11:44:14 +00001220 table = NULL;
Serhiy Storchaka3dd3e262015-02-03 01:25:42 +02001221 } else if (PyObject_GetBuffer(table, &vtable, PyBUF_SIMPLE) != 0) {
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001222 return NULL;
Georg Brandlccc47b62008-12-28 11:44:14 +00001223 } else {
1224 if (vtable.len != 256) {
1225 PyErr_SetString(PyExc_ValueError,
1226 "translation table must be 256 characters long");
Georg Brandl953152f2009-07-22 12:03:59 +00001227 PyBuffer_Release(&vtable);
1228 return NULL;
Georg Brandlccc47b62008-12-28 11:44:14 +00001229 }
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001230 table_chars = (const char*)vtable.buf;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001231 }
1232
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001233 if (deletechars != NULL) {
Serhiy Storchaka3dd3e262015-02-03 01:25:42 +02001234 if (PyObject_GetBuffer(deletechars, &vdel, PyBUF_SIMPLE) != 0) {
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001235 if (table != NULL)
Georg Brandl953152f2009-07-22 12:03:59 +00001236 PyBuffer_Release(&vtable);
1237 return NULL;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001238 }
1239 }
1240 else {
1241 vdel.buf = NULL;
1242 vdel.len = 0;
1243 }
1244
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001245 inlen = PyByteArray_GET_SIZE(input_obj);
1246 result = PyByteArray_FromStringAndSize((char *)NULL, inlen);
1247 if (result == NULL)
1248 goto done;
Serhiy Storchakadd40fc32016-05-04 22:23:26 +03001249 output_start = output = PyByteArray_AS_STRING(result);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001250 input = PyByteArray_AS_STRING(input_obj);
1251
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001252 if (vdel.len == 0 && table_chars != NULL) {
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001253 /* If no deletions are required, use faster code */
1254 for (i = inlen; --i >= 0; ) {
1255 c = Py_CHARMASK(*input++);
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001256 *output++ = table_chars[c];
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001257 }
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001258 goto done;
1259 }
Georg Brandlccc47b62008-12-28 11:44:14 +00001260
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001261 if (table_chars == NULL) {
Georg Brandlccc47b62008-12-28 11:44:14 +00001262 for (i = 0; i < 256; i++)
1263 trans_table[i] = Py_CHARMASK(i);
1264 } else {
1265 for (i = 0; i < 256; i++)
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001266 trans_table[i] = Py_CHARMASK(table_chars[i]);
Georg Brandlccc47b62008-12-28 11:44:14 +00001267 }
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001268
1269 for (i = 0; i < vdel.len; i++)
1270 trans_table[(int) Py_CHARMASK( ((unsigned char*)vdel.buf)[i] )] = -1;
1271
1272 for (i = inlen; --i >= 0; ) {
1273 c = Py_CHARMASK(*input++);
1274 if (trans_table[c] != -1)
Martin Panter1b6c6da2016-08-27 08:35:02 +00001275 *output++ = (char)trans_table[c];
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001276 }
1277 /* Fix the size of the resulting string */
1278 if (inlen > 0)
Christian Heimesc731bbe2013-07-21 02:04:35 +02001279 if (PyByteArray_Resize(result, output - output_start) < 0) {
1280 Py_CLEAR(result);
1281 goto done;
1282 }
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001283
1284done:
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001285 if (table != NULL)
Georg Brandlccc47b62008-12-28 11:44:14 +00001286 PyBuffer_Release(&vtable);
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001287 if (deletechars != NULL)
Martin v. Löwis423be952008-08-13 15:53:07 +00001288 PyBuffer_Release(&vdel);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001289 return result;
1290}
1291
1292
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001293/*[clinic input]
1294
1295@staticmethod
1296bytearray.maketrans
1297
Serhiy Storchaka3dd3e262015-02-03 01:25:42 +02001298 frm: Py_buffer
1299 to: Py_buffer
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001300 /
1301
1302Return a translation table useable for the bytes or bytearray translate method.
1303
1304The returned table will be one where each byte in frm is mapped to the byte at
1305the same position in to.
1306
1307The bytes objects frm and to must be of the same length.
1308[clinic start generated code]*/
1309
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001310static PyObject *
Serhiy Storchaka3dd3e262015-02-03 01:25:42 +02001311bytearray_maketrans_impl(Py_buffer *frm, Py_buffer *to)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03001312/*[clinic end generated code: output=1df267d99f56b15e input=5925a81d2fbbf151]*/
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001313{
1314 return _Py_bytes_maketrans(frm, to);
Georg Brandlabc38772009-04-12 15:51:51 +00001315}
1316
1317
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001318/*[clinic input]
1319bytearray.replace
1320
Serhiy Storchaka3dd3e262015-02-03 01:25:42 +02001321 old: Py_buffer
1322 new: Py_buffer
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001323 count: Py_ssize_t = -1
1324 Maximum number of occurrences to replace.
1325 -1 (the default value) means replace all occurrences.
1326 /
1327
1328Return a copy with all occurrences of substring old replaced by new.
1329
1330If the optional argument count is given, only the first count occurrences are
1331replaced.
1332[clinic start generated code]*/
1333
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001334static PyObject *
Larry Hastings89964c42015-04-14 18:07:59 -04001335bytearray_replace_impl(PyByteArrayObject *self, Py_buffer *old,
1336 Py_buffer *new, Py_ssize_t count)
1337/*[clinic end generated code: output=d39884c4dc59412a input=aa379d988637c7fb]*/
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001338{
Serhiy Storchakafb81d3c2016-05-05 09:26:07 +03001339 return stringlib_replace((PyObject *)self,
Serhiy Storchakae09132f2016-07-03 13:57:48 +03001340 (const char *)old->buf, old->len,
1341 (const char *)new->buf, new->len, count);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001342}
1343
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001344/*[clinic input]
1345bytearray.split
1346
1347 sep: object = None
1348 The delimiter according which to split the bytearray.
1349 None (the default value) means split on ASCII whitespace characters
1350 (space, tab, return, newline, formfeed, vertical tab).
1351 maxsplit: Py_ssize_t = -1
1352 Maximum number of splits to do.
1353 -1 (the default value) means no limit.
1354
1355Return a list of the sections in the bytearray, using sep as the delimiter.
1356[clinic start generated code]*/
1357
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001358static PyObject *
Larry Hastings89964c42015-04-14 18:07:59 -04001359bytearray_split_impl(PyByteArrayObject *self, PyObject *sep,
1360 Py_ssize_t maxsplit)
1361/*[clinic end generated code: output=833e2cf385d9a04d input=24f82669f41bf523]*/
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001362{
1363 Py_ssize_t len = PyByteArray_GET_SIZE(self), n;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001364 const char *s = PyByteArray_AS_STRING(self), *sub;
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001365 PyObject *list;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001366 Py_buffer vsub;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001367
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001368 if (maxsplit < 0)
1369 maxsplit = PY_SSIZE_T_MAX;
1370
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001371 if (sep == Py_None)
Antoine Pitrouf2c54842010-01-13 08:07:53 +00001372 return stringlib_split_whitespace((PyObject*) self, s, len, maxsplit);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001373
Serhiy Storchaka3dd3e262015-02-03 01:25:42 +02001374 if (PyObject_GetBuffer(sep, &vsub, PyBUF_SIMPLE) != 0)
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001375 return NULL;
1376 sub = vsub.buf;
1377 n = vsub.len;
1378
Antoine Pitrouf2c54842010-01-13 08:07:53 +00001379 list = stringlib_split(
1380 (PyObject*) self, s, len, sub, n, maxsplit
1381 );
Martin v. Löwis423be952008-08-13 15:53:07 +00001382 PyBuffer_Release(&vsub);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001383 return list;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001384}
1385
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001386/*[clinic input]
1387bytearray.partition
1388
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001389 sep: object
1390 /
1391
1392Partition the bytearray into three parts using the given separator.
1393
1394This will search for the separator sep in the bytearray. If the separator is
1395found, returns a 3-tuple containing the part before the separator, the
Serhiy Storchakaa2314282017-10-29 02:11:54 +03001396separator itself, and the part after it as new bytearray objects.
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001397
Serhiy Storchakaa2314282017-10-29 02:11:54 +03001398If the separator is not found, returns a 3-tuple containing the copy of the
1399original bytearray object and two empty bytearray objects.
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001400[clinic start generated code]*/
1401
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001402static PyObject *
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001403bytearray_partition(PyByteArrayObject *self, PyObject *sep)
Serhiy Storchakaa2314282017-10-29 02:11:54 +03001404/*[clinic end generated code: output=45d2525ddd35f957 input=8f644749ee4fc83a]*/
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001405{
1406 PyObject *bytesep, *result;
1407
Serhiy Storchakaa2314282017-10-29 02:11:54 +03001408 bytesep = _PyByteArray_FromBufferObject(sep);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001409 if (! bytesep)
1410 return NULL;
1411
1412 result = stringlib_partition(
1413 (PyObject*) self,
1414 PyByteArray_AS_STRING(self), PyByteArray_GET_SIZE(self),
1415 bytesep,
1416 PyByteArray_AS_STRING(bytesep), PyByteArray_GET_SIZE(bytesep)
1417 );
1418
1419 Py_DECREF(bytesep);
Antoine Pitrouf2c54842010-01-13 08:07:53 +00001420 return result;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001421}
1422
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001423/*[clinic input]
1424bytearray.rpartition
1425
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001426 sep: object
1427 /
1428
Serhiy Storchakaa2314282017-10-29 02:11:54 +03001429Partition the bytearray into three parts using the given separator.
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001430
Serhiy Storchakaa2314282017-10-29 02:11:54 +03001431This will search for the separator sep in the bytearray, starting at the end.
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001432If the separator is found, returns a 3-tuple containing the part before the
Serhiy Storchakaa2314282017-10-29 02:11:54 +03001433separator, the separator itself, and the part after it as new bytearray
1434objects.
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001435
1436If the separator is not found, returns a 3-tuple containing two empty bytearray
Serhiy Storchakaa2314282017-10-29 02:11:54 +03001437objects and the copy of the original bytearray object.
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001438[clinic start generated code]*/
1439
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001440static PyObject *
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001441bytearray_rpartition(PyByteArrayObject *self, PyObject *sep)
Serhiy Storchakaa2314282017-10-29 02:11:54 +03001442/*[clinic end generated code: output=440de3c9426115e8 input=7e3df3e6cb8fa0ac]*/
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001443{
1444 PyObject *bytesep, *result;
1445
Serhiy Storchakaa2314282017-10-29 02:11:54 +03001446 bytesep = _PyByteArray_FromBufferObject(sep);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001447 if (! bytesep)
1448 return NULL;
1449
1450 result = stringlib_rpartition(
1451 (PyObject*) self,
1452 PyByteArray_AS_STRING(self), PyByteArray_GET_SIZE(self),
1453 bytesep,
1454 PyByteArray_AS_STRING(bytesep), PyByteArray_GET_SIZE(bytesep)
1455 );
1456
1457 Py_DECREF(bytesep);
Antoine Pitrouf2c54842010-01-13 08:07:53 +00001458 return result;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001459}
1460
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001461/*[clinic input]
1462bytearray.rsplit = bytearray.split
1463
1464Return a list of the sections in the bytearray, using sep as the delimiter.
1465
1466Splitting is done starting at the end of the bytearray and working to the front.
1467[clinic start generated code]*/
1468
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001469static PyObject *
Larry Hastings89964c42015-04-14 18:07:59 -04001470bytearray_rsplit_impl(PyByteArrayObject *self, PyObject *sep,
1471 Py_ssize_t maxsplit)
1472/*[clinic end generated code: output=a55e0b5a03cb6190 input=a68286e4dd692ffe]*/
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001473{
1474 Py_ssize_t len = PyByteArray_GET_SIZE(self), n;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001475 const char *s = PyByteArray_AS_STRING(self), *sub;
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001476 PyObject *list;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001477 Py_buffer vsub;
1478
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001479 if (maxsplit < 0)
1480 maxsplit = PY_SSIZE_T_MAX;
1481
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001482 if (sep == Py_None)
Antoine Pitrouf2c54842010-01-13 08:07:53 +00001483 return stringlib_rsplit_whitespace((PyObject*) self, s, len, maxsplit);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001484
Serhiy Storchaka3dd3e262015-02-03 01:25:42 +02001485 if (PyObject_GetBuffer(sep, &vsub, PyBUF_SIMPLE) != 0)
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001486 return NULL;
1487 sub = vsub.buf;
1488 n = vsub.len;
1489
Antoine Pitrouf2c54842010-01-13 08:07:53 +00001490 list = stringlib_rsplit(
1491 (PyObject*) self, s, len, sub, n, maxsplit
1492 );
Martin v. Löwis423be952008-08-13 15:53:07 +00001493 PyBuffer_Release(&vsub);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001494 return list;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001495}
1496
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001497/*[clinic input]
1498bytearray.reverse
1499
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001500Reverse the order of the values in B in place.
1501[clinic start generated code]*/
1502
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001503static PyObject *
1504bytearray_reverse_impl(PyByteArrayObject *self)
Serhiy Storchaka7a9579c2016-05-02 13:45:20 +03001505/*[clinic end generated code: output=9f7616f29ab309d3 input=543356319fc78557]*/
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001506{
1507 char swap, *head, *tail;
1508 Py_ssize_t i, j, n = Py_SIZE(self);
1509
1510 j = n / 2;
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +02001511 head = PyByteArray_AS_STRING(self);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001512 tail = head + n - 1;
1513 for (i = 0; i < j; i++) {
1514 swap = *head;
1515 *head++ = *tail;
1516 *tail-- = swap;
1517 }
1518
1519 Py_RETURN_NONE;
1520}
1521
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001522
1523/*[python input]
1524class bytesvalue_converter(CConverter):
1525 type = 'int'
1526 converter = '_getbytevalue'
1527[python start generated code]*/
1528/*[python end generated code: output=da39a3ee5e6b4b0d input=29c2e7c26c212812]*/
1529
1530
1531/*[clinic input]
1532bytearray.insert
1533
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001534 index: Py_ssize_t
1535 The index where the value is to be inserted.
1536 item: bytesvalue
1537 The item to be inserted.
1538 /
1539
1540Insert a single item into the bytearray before the given index.
1541[clinic start generated code]*/
1542
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001543static PyObject *
1544bytearray_insert_impl(PyByteArrayObject *self, Py_ssize_t index, int item)
Serhiy Storchaka7a9579c2016-05-02 13:45:20 +03001545/*[clinic end generated code: output=76c775a70e7b07b7 input=b2b5d07e9de6c070]*/
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001546{
1547 Py_ssize_t n = Py_SIZE(self);
1548 char *buf;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001549
1550 if (n == PY_SSIZE_T_MAX) {
1551 PyErr_SetString(PyExc_OverflowError,
Mark Dickinson2b6705f2009-09-06 10:34:47 +00001552 "cannot add more objects to bytearray");
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001553 return NULL;
1554 }
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001555 if (PyByteArray_Resize((PyObject *)self, n + 1) < 0)
1556 return NULL;
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +02001557 buf = PyByteArray_AS_STRING(self);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001558
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001559 if (index < 0) {
1560 index += n;
1561 if (index < 0)
1562 index = 0;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001563 }
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001564 if (index > n)
1565 index = n;
1566 memmove(buf + index + 1, buf + index, n - index);
1567 buf[index] = item;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001568
1569 Py_RETURN_NONE;
1570}
1571
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001572/*[clinic input]
1573bytearray.append
1574
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001575 item: bytesvalue
1576 The item to be appended.
1577 /
1578
1579Append a single item to the end of the bytearray.
1580[clinic start generated code]*/
1581
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001582static PyObject *
1583bytearray_append_impl(PyByteArrayObject *self, int item)
Serhiy Storchaka7a9579c2016-05-02 13:45:20 +03001584/*[clinic end generated code: output=a154e19ed1886cb6 input=20d6bec3d1340593]*/
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001585{
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001586 Py_ssize_t n = Py_SIZE(self);
1587
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001588 if (n == PY_SSIZE_T_MAX) {
1589 PyErr_SetString(PyExc_OverflowError,
Mark Dickinson2b6705f2009-09-06 10:34:47 +00001590 "cannot add more objects to bytearray");
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001591 return NULL;
1592 }
1593 if (PyByteArray_Resize((PyObject *)self, n + 1) < 0)
1594 return NULL;
1595
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001596 PyByteArray_AS_STRING(self)[n] = item;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001597
1598 Py_RETURN_NONE;
1599}
1600
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001601/*[clinic input]
1602bytearray.extend
1603
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001604 iterable_of_ints: object
1605 The iterable of items to append.
1606 /
1607
1608Append all the items from the iterator or sequence to the end of the bytearray.
1609[clinic start generated code]*/
1610
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001611static PyObject *
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001612bytearray_extend(PyByteArrayObject *self, PyObject *iterable_of_ints)
Serhiy Storchaka7a9579c2016-05-02 13:45:20 +03001613/*[clinic end generated code: output=98155dbe249170b1 input=c617b3a93249ba28]*/
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001614{
Benjamin Peterson153c70f2009-04-18 15:42:12 +00001615 PyObject *it, *item, *bytearray_obj;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001616 Py_ssize_t buf_size = 0, len = 0;
1617 int value;
1618 char *buf;
1619
Benjamin Peterson153c70f2009-04-18 15:42:12 +00001620 /* bytearray_setslice code only accepts something supporting PEP 3118. */
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001621 if (PyObject_CheckBuffer(iterable_of_ints)) {
1622 if (bytearray_setslice(self, Py_SIZE(self), Py_SIZE(self), iterable_of_ints) == -1)
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001623 return NULL;
1624
1625 Py_RETURN_NONE;
1626 }
1627
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001628 it = PyObject_GetIter(iterable_of_ints);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001629 if (it == NULL)
1630 return NULL;
1631
Ezio Melotti42da6632011-03-15 05:18:48 +02001632 /* Try to determine the length of the argument. 32 is arbitrary. */
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001633 buf_size = PyObject_LengthHint(iterable_of_ints, 32);
Benjamin Petersonef3e4c22009-04-11 19:48:14 +00001634 if (buf_size == -1) {
1635 Py_DECREF(it);
1636 return NULL;
1637 }
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001638
Benjamin Peterson153c70f2009-04-18 15:42:12 +00001639 bytearray_obj = PyByteArray_FromStringAndSize(NULL, buf_size);
Antoine Pitrou58bb82e2012-04-01 16:05:46 +02001640 if (bytearray_obj == NULL) {
1641 Py_DECREF(it);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001642 return NULL;
Antoine Pitrou58bb82e2012-04-01 16:05:46 +02001643 }
Benjamin Peterson153c70f2009-04-18 15:42:12 +00001644 buf = PyByteArray_AS_STRING(bytearray_obj);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001645
1646 while ((item = PyIter_Next(it)) != NULL) {
1647 if (! _getbytevalue(item, &value)) {
1648 Py_DECREF(item);
1649 Py_DECREF(it);
Benjamin Peterson153c70f2009-04-18 15:42:12 +00001650 Py_DECREF(bytearray_obj);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001651 return NULL;
1652 }
1653 buf[len++] = value;
1654 Py_DECREF(item);
1655
1656 if (len >= buf_size) {
Martin Panter371731e2016-07-18 07:53:13 +00001657 Py_ssize_t addition;
1658 if (len == PY_SSIZE_T_MAX) {
1659 Py_DECREF(it);
1660 Py_DECREF(bytearray_obj);
1661 return PyErr_NoMemory();
1662 }
1663 addition = len >> 1;
1664 if (addition > PY_SSIZE_T_MAX - len - 1)
1665 buf_size = PY_SSIZE_T_MAX;
1666 else
1667 buf_size = len + addition + 1;
Benjamin Peterson153c70f2009-04-18 15:42:12 +00001668 if (PyByteArray_Resize((PyObject *)bytearray_obj, buf_size) < 0) {
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001669 Py_DECREF(it);
Benjamin Peterson153c70f2009-04-18 15:42:12 +00001670 Py_DECREF(bytearray_obj);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001671 return NULL;
1672 }
1673 /* Recompute the `buf' pointer, since the resizing operation may
1674 have invalidated it. */
Benjamin Peterson153c70f2009-04-18 15:42:12 +00001675 buf = PyByteArray_AS_STRING(bytearray_obj);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001676 }
1677 }
1678 Py_DECREF(it);
1679
1680 /* Resize down to exact size. */
Benjamin Peterson153c70f2009-04-18 15:42:12 +00001681 if (PyByteArray_Resize((PyObject *)bytearray_obj, len) < 0) {
1682 Py_DECREF(bytearray_obj);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001683 return NULL;
1684 }
1685
Antoine Pitrou58bb82e2012-04-01 16:05:46 +02001686 if (bytearray_setslice(self, Py_SIZE(self), Py_SIZE(self), bytearray_obj) == -1) {
1687 Py_DECREF(bytearray_obj);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001688 return NULL;
Antoine Pitrou58bb82e2012-04-01 16:05:46 +02001689 }
Benjamin Peterson153c70f2009-04-18 15:42:12 +00001690 Py_DECREF(bytearray_obj);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001691
1692 Py_RETURN_NONE;
1693}
1694
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001695/*[clinic input]
1696bytearray.pop
1697
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001698 index: Py_ssize_t = -1
1699 The index from where to remove the item.
1700 -1 (the default value) means remove the last item.
1701 /
1702
1703Remove and return a single item from B.
1704
1705If no index argument is given, will pop the last item.
1706[clinic start generated code]*/
1707
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001708static PyObject *
1709bytearray_pop_impl(PyByteArrayObject *self, Py_ssize_t index)
Serhiy Storchaka7a9579c2016-05-02 13:45:20 +03001710/*[clinic end generated code: output=e0ccd401f8021da8 input=3591df2d06c0d237]*/
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001711{
1712 int value;
1713 Py_ssize_t n = Py_SIZE(self);
1714 char *buf;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001715
1716 if (n == 0) {
Eli Bendersky1bc4f192011-03-04 04:55:25 +00001717 PyErr_SetString(PyExc_IndexError,
1718 "pop from empty bytearray");
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001719 return NULL;
1720 }
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001721 if (index < 0)
1722 index += Py_SIZE(self);
1723 if (index < 0 || index >= Py_SIZE(self)) {
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001724 PyErr_SetString(PyExc_IndexError, "pop index out of range");
1725 return NULL;
1726 }
Antoine Pitrou5504e892008-12-06 21:27:53 +00001727 if (!_canresize(self))
1728 return NULL;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001729
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +02001730 buf = PyByteArray_AS_STRING(self);
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001731 value = buf[index];
1732 memmove(buf + index, buf + index + 1, n - index);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001733 if (PyByteArray_Resize((PyObject *)self, n - 1) < 0)
1734 return NULL;
1735
Mark Dickinson54a3db92009-09-06 10:19:23 +00001736 return PyLong_FromLong((unsigned char)value);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001737}
1738
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001739/*[clinic input]
1740bytearray.remove
1741
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001742 value: bytesvalue
1743 The value to remove.
1744 /
1745
1746Remove the first occurrence of a value in the bytearray.
1747[clinic start generated code]*/
1748
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001749static PyObject *
1750bytearray_remove_impl(PyByteArrayObject *self, int value)
Serhiy Storchaka7a9579c2016-05-02 13:45:20 +03001751/*[clinic end generated code: output=d659e37866709c13 input=121831240cd51ddf]*/
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001752{
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001753 Py_ssize_t where, n = Py_SIZE(self);
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +02001754 char *buf = PyByteArray_AS_STRING(self);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001755
Serhiy Storchaka4b234942016-05-16 22:24:03 +03001756 where = stringlib_find_char(buf, n, value);
1757 if (where < 0) {
Mark Dickinson2b6705f2009-09-06 10:34:47 +00001758 PyErr_SetString(PyExc_ValueError, "value not found in bytearray");
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001759 return NULL;
1760 }
Antoine Pitrou5504e892008-12-06 21:27:53 +00001761 if (!_canresize(self))
1762 return NULL;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001763
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +02001764 memmove(buf + where, buf + where + 1, n - where);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001765 if (PyByteArray_Resize((PyObject *)self, n - 1) < 0)
1766 return NULL;
1767
1768 Py_RETURN_NONE;
1769}
1770
1771/* XXX These two helpers could be optimized if argsize == 1 */
1772
1773static Py_ssize_t
Serhiy Storchakaef1585e2015-12-25 20:01:53 +02001774lstrip_helper(const char *myptr, Py_ssize_t mysize,
1775 const void *argptr, Py_ssize_t argsize)
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001776{
1777 Py_ssize_t i = 0;
Antoine Pitrou5b720752013-10-05 21:24:10 +02001778 while (i < mysize && memchr(argptr, (unsigned char) myptr[i], argsize))
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001779 i++;
1780 return i;
1781}
1782
1783static Py_ssize_t
Serhiy Storchakaef1585e2015-12-25 20:01:53 +02001784rstrip_helper(const char *myptr, Py_ssize_t mysize,
1785 const void *argptr, Py_ssize_t argsize)
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001786{
1787 Py_ssize_t i = mysize - 1;
Antoine Pitrou5b720752013-10-05 21:24:10 +02001788 while (i >= 0 && memchr(argptr, (unsigned char) myptr[i], argsize))
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001789 i--;
1790 return i + 1;
1791}
1792
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001793/*[clinic input]
1794bytearray.strip
1795
1796 bytes: object = None
1797 /
1798
1799Strip leading and trailing bytes contained in the argument.
1800
1801If the argument is omitted or None, strip leading and trailing ASCII whitespace.
1802[clinic start generated code]*/
1803
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001804static PyObject *
1805bytearray_strip_impl(PyByteArrayObject *self, PyObject *bytes)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03001806/*[clinic end generated code: output=760412661a34ad5a input=ef7bb59b09c21d62]*/
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001807{
1808 Py_ssize_t left, right, mysize, byteslen;
Serhiy Storchakae2f92de2017-11-11 13:06:26 +02001809 char *myptr;
1810 const char *bytesptr;
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001811 Py_buffer vbytes;
1812
1813 if (bytes == Py_None) {
1814 bytesptr = "\t\n\r\f\v ";
1815 byteslen = 6;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001816 }
1817 else {
Serhiy Storchaka3dd3e262015-02-03 01:25:42 +02001818 if (PyObject_GetBuffer(bytes, &vbytes, PyBUF_SIMPLE) != 0)
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001819 return NULL;
Serhiy Storchakae2f92de2017-11-11 13:06:26 +02001820 bytesptr = (const char *) vbytes.buf;
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001821 byteslen = vbytes.len;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001822 }
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +02001823 myptr = PyByteArray_AS_STRING(self);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001824 mysize = Py_SIZE(self);
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001825 left = lstrip_helper(myptr, mysize, bytesptr, byteslen);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001826 if (left == mysize)
1827 right = left;
1828 else
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001829 right = rstrip_helper(myptr, mysize, bytesptr, byteslen);
1830 if (bytes != Py_None)
1831 PyBuffer_Release(&vbytes);
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +02001832 return PyByteArray_FromStringAndSize(myptr + left, right - left);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001833}
1834
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001835/*[clinic input]
1836bytearray.lstrip
1837
1838 bytes: object = None
1839 /
1840
1841Strip leading bytes contained in the argument.
1842
1843If the argument is omitted or None, strip leading ASCII whitespace.
1844[clinic start generated code]*/
1845
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001846static PyObject *
1847bytearray_lstrip_impl(PyByteArrayObject *self, PyObject *bytes)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03001848/*[clinic end generated code: output=d005c9d0ab909e66 input=80843f975dd7c480]*/
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001849{
1850 Py_ssize_t left, right, mysize, byteslen;
Serhiy Storchakae2f92de2017-11-11 13:06:26 +02001851 char *myptr;
1852 const char *bytesptr;
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001853 Py_buffer vbytes;
1854
1855 if (bytes == Py_None) {
1856 bytesptr = "\t\n\r\f\v ";
1857 byteslen = 6;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001858 }
1859 else {
Serhiy Storchaka3dd3e262015-02-03 01:25:42 +02001860 if (PyObject_GetBuffer(bytes, &vbytes, PyBUF_SIMPLE) != 0)
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001861 return NULL;
Serhiy Storchakae2f92de2017-11-11 13:06:26 +02001862 bytesptr = (const char *) vbytes.buf;
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001863 byteslen = vbytes.len;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001864 }
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +02001865 myptr = PyByteArray_AS_STRING(self);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001866 mysize = Py_SIZE(self);
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001867 left = lstrip_helper(myptr, mysize, bytesptr, byteslen);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001868 right = mysize;
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001869 if (bytes != Py_None)
1870 PyBuffer_Release(&vbytes);
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +02001871 return PyByteArray_FromStringAndSize(myptr + left, right - left);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001872}
1873
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001874/*[clinic input]
1875bytearray.rstrip
1876
1877 bytes: object = None
1878 /
1879
1880Strip trailing bytes contained in the argument.
1881
1882If the argument is omitted or None, strip trailing ASCII whitespace.
1883[clinic start generated code]*/
1884
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001885static PyObject *
1886bytearray_rstrip_impl(PyByteArrayObject *self, PyObject *bytes)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03001887/*[clinic end generated code: output=030e2fbd2f7276bd input=e728b994954cfd91]*/
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001888{
1889 Py_ssize_t right, mysize, byteslen;
Serhiy Storchakae2f92de2017-11-11 13:06:26 +02001890 char *myptr;
1891 const char *bytesptr;
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001892 Py_buffer vbytes;
1893
1894 if (bytes == Py_None) {
1895 bytesptr = "\t\n\r\f\v ";
1896 byteslen = 6;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001897 }
1898 else {
Serhiy Storchaka3dd3e262015-02-03 01:25:42 +02001899 if (PyObject_GetBuffer(bytes, &vbytes, PyBUF_SIMPLE) != 0)
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001900 return NULL;
Serhiy Storchakae2f92de2017-11-11 13:06:26 +02001901 bytesptr = (const char *) vbytes.buf;
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001902 byteslen = vbytes.len;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001903 }
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +02001904 myptr = PyByteArray_AS_STRING(self);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001905 mysize = Py_SIZE(self);
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001906 right = rstrip_helper(myptr, mysize, bytesptr, byteslen);
1907 if (bytes != Py_None)
1908 PyBuffer_Release(&vbytes);
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +02001909 return PyByteArray_FromStringAndSize(myptr, right);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001910}
1911
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001912/*[clinic input]
1913bytearray.decode
1914
1915 encoding: str(c_default="NULL") = 'utf-8'
1916 The encoding with which to decode the bytearray.
1917 errors: str(c_default="NULL") = 'strict'
1918 The error handling scheme to use for the handling of decoding errors.
1919 The default is 'strict' meaning that decoding errors raise a
1920 UnicodeDecodeError. Other possible values are 'ignore' and 'replace'
1921 as well as any other name registered with codecs.register_error that
1922 can handle UnicodeDecodeErrors.
1923
1924Decode the bytearray using the codec registered for encoding.
1925[clinic start generated code]*/
1926
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001927static PyObject *
Larry Hastings89964c42015-04-14 18:07:59 -04001928bytearray_decode_impl(PyByteArrayObject *self, const char *encoding,
1929 const char *errors)
1930/*[clinic end generated code: output=f57d43f4a00b42c5 input=f28d8f903020257b]*/
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001931{
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001932 if (encoding == NULL)
1933 encoding = PyUnicode_GetDefaultEncoding();
Martin v. Löwis0efea322014-07-27 17:29:17 +02001934 return PyUnicode_FromEncodedObject((PyObject*)self, encoding, errors);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001935}
1936
1937PyDoc_STRVAR(alloc_doc,
1938"B.__alloc__() -> int\n\
1939\n\
Georg Brandl17cb8a82008-05-30 08:20:09 +00001940Return the number of bytes actually allocated.");
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001941
1942static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05301943bytearray_alloc(PyByteArrayObject *self, PyObject *Py_UNUSED(ignored))
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001944{
1945 return PyLong_FromSsize_t(self->ob_alloc);
1946}
1947
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001948/*[clinic input]
1949bytearray.join
1950
1951 iterable_of_bytes: object
1952 /
1953
1954Concatenate any number of bytes/bytearray objects.
1955
1956The bytearray whose method is called is inserted in between each pair.
1957
1958The result is returned as a new bytearray object.
1959[clinic start generated code]*/
1960
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001961static PyObject *
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001962bytearray_join(PyByteArrayObject *self, PyObject *iterable_of_bytes)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03001963/*[clinic end generated code: output=a8516370bf68ae08 input=aba6b1f9b30fcb8e]*/
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001964{
Martin v. Löwis0efea322014-07-27 17:29:17 +02001965 return stringlib_bytes_join((PyObject*)self, iterable_of_bytes);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001966}
1967
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001968/*[clinic input]
1969bytearray.splitlines
Antoine Pitrouf2c54842010-01-13 08:07:53 +00001970
Serhiy Storchaka202fda52017-03-12 10:10:47 +02001971 keepends: bool(accept={int}) = False
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001972
1973Return a list of the lines in the bytearray, breaking at line boundaries.
1974
1975Line breaks are not included in the resulting list unless keepends is given and
1976true.
1977[clinic start generated code]*/
1978
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001979static PyObject *
1980bytearray_splitlines_impl(PyByteArrayObject *self, int keepends)
Serhiy Storchaka202fda52017-03-12 10:10:47 +02001981/*[clinic end generated code: output=4223c94b895f6ad9 input=99a27ad959b9cf6b]*/
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001982{
Antoine Pitrouf2c54842010-01-13 08:07:53 +00001983 return stringlib_splitlines(
1984 (PyObject*) self, PyByteArray_AS_STRING(self),
1985 PyByteArray_GET_SIZE(self), keepends
1986 );
1987}
1988
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001989/*[clinic input]
1990@classmethod
1991bytearray.fromhex
1992
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001993 string: unicode
1994 /
1995
1996Create a bytearray object from a string of hexadecimal numbers.
1997
1998Spaces between two numbers are accepted.
1999Example: bytearray.fromhex('B9 01EF') -> bytearray(b'\\xb9\\x01\\xef')
2000[clinic start generated code]*/
2001
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002002static PyObject *
Serhiy Storchaka0855e702016-07-01 17:22:31 +03002003bytearray_fromhex_impl(PyTypeObject *type, PyObject *string)
2004/*[clinic end generated code: output=8f0f0b6d30fb3ba0 input=f033a16d1fb21f48]*/
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002005{
Serhiy Storchaka0855e702016-07-01 17:22:31 +03002006 PyObject *result = _PyBytes_FromHex(string, type == &PyByteArray_Type);
2007 if (type != &PyByteArray_Type && result != NULL) {
Victor Stinnerde4ae3d2016-12-04 22:59:09 +01002008 Py_SETREF(result, PyObject_CallFunctionObjArgs((PyObject *)type,
2009 result, NULL));
Serhiy Storchaka0855e702016-07-01 17:22:31 +03002010 }
2011 return result;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002012}
2013
Gregory P. Smith8cb65692015-04-25 23:22:26 +00002014PyDoc_STRVAR(hex__doc__,
2015"B.hex() -> string\n\
2016\n\
2017Create a string of hexadecimal numbers from a bytearray object.\n\
2018Example: bytearray([0xb9, 0x01, 0xef]).hex() -> 'b901ef'.");
2019
2020static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05302021bytearray_hex(PyBytesObject *self, PyObject *Py_UNUSED(ignored))
Serhiy Storchakae09132f2016-07-03 13:57:48 +03002022{
2023 char* argbuf = PyByteArray_AS_STRING(self);
2024 Py_ssize_t arglen = PyByteArray_GET_SIZE(self);
2025 return _Py_strhex(argbuf, arglen);
2026}
2027
2028static PyObject *
Antoine Pitroub0e1f8b2011-12-05 20:40:08 +01002029_common_reduce(PyByteArrayObject *self, int proto)
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002030{
Antoine Pitroub0e1f8b2011-12-05 20:40:08 +01002031 PyObject *dict;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02002032 _Py_IDENTIFIER(__dict__);
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +02002033 char *buf;
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02002034
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02002035 dict = _PyObject_GetAttrId((PyObject *)self, &PyId___dict__);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002036 if (dict == NULL) {
2037 PyErr_Clear();
2038 dict = Py_None;
2039 Py_INCREF(dict);
2040 }
2041
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +02002042 buf = PyByteArray_AS_STRING(self);
Antoine Pitroub0e1f8b2011-12-05 20:40:08 +01002043 if (proto < 3) {
2044 /* use str based reduction for backwards compatibility with Python 2.x */
2045 PyObject *latin1;
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +02002046 if (Py_SIZE(self))
2047 latin1 = PyUnicode_DecodeLatin1(buf, Py_SIZE(self), NULL);
Antoine Pitroub0e1f8b2011-12-05 20:40:08 +01002048 else
2049 latin1 = PyUnicode_FromString("");
2050 return Py_BuildValue("(O(Ns)N)", Py_TYPE(self), latin1, "latin-1", dict);
2051 }
2052 else {
2053 /* use more efficient byte based reduction */
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +02002054 if (Py_SIZE(self)) {
2055 return Py_BuildValue("(O(y#)N)", Py_TYPE(self), buf, Py_SIZE(self), dict);
Antoine Pitroub0e1f8b2011-12-05 20:40:08 +01002056 }
2057 else {
2058 return Py_BuildValue("(O()N)", Py_TYPE(self), dict);
2059 }
2060 }
2061}
2062
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002063/*[clinic input]
2064bytearray.__reduce__ as bytearray_reduce
2065
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002066Return state information for pickling.
2067[clinic start generated code]*/
2068
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002069static PyObject *
2070bytearray_reduce_impl(PyByteArrayObject *self)
Serhiy Storchaka7a9579c2016-05-02 13:45:20 +03002071/*[clinic end generated code: output=52bf304086464cab input=44b5737ada62dd3f]*/
Antoine Pitroub0e1f8b2011-12-05 20:40:08 +01002072{
2073 return _common_reduce(self, 2);
2074}
2075
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002076/*[clinic input]
2077bytearray.__reduce_ex__ as bytearray_reduce_ex
2078
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002079 proto: int = 0
2080 /
2081
2082Return state information for pickling.
2083[clinic start generated code]*/
2084
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002085static PyObject *
2086bytearray_reduce_ex_impl(PyByteArrayObject *self, int proto)
Serhiy Storchaka7a9579c2016-05-02 13:45:20 +03002087/*[clinic end generated code: output=52eac33377197520 input=f129bc1a1aa151ee]*/
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002088{
Antoine Pitroub0e1f8b2011-12-05 20:40:08 +01002089 return _common_reduce(self, proto);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002090}
2091
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002092/*[clinic input]
2093bytearray.__sizeof__ as bytearray_sizeof
2094
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002095Returns the size of the bytearray object in memory, in bytes.
2096[clinic start generated code]*/
2097
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002098static PyObject *
2099bytearray_sizeof_impl(PyByteArrayObject *self)
Serhiy Storchaka7a9579c2016-05-02 13:45:20 +03002100/*[clinic end generated code: output=738abdd17951c427 input=e27320fd98a4bc5a]*/
Robert Schuppeniesfbe94c52008-07-14 10:13:31 +00002101{
Benjamin Petersonef3e4c22009-04-11 19:48:14 +00002102 Py_ssize_t res;
Robert Schuppeniesfbe94c52008-07-14 10:13:31 +00002103
Serhiy Storchaka5c4064e2015-12-19 20:05:25 +02002104 res = _PyObject_SIZE(Py_TYPE(self)) + self->ob_alloc * sizeof(char);
Benjamin Petersonef3e4c22009-04-11 19:48:14 +00002105 return PyLong_FromSsize_t(res);
Robert Schuppeniesfbe94c52008-07-14 10:13:31 +00002106}
2107
Benjamin Peterson153c70f2009-04-18 15:42:12 +00002108static PySequenceMethods bytearray_as_sequence = {
2109 (lenfunc)bytearray_length, /* sq_length */
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002110 (binaryfunc)PyByteArray_Concat, /* sq_concat */
Benjamin Peterson153c70f2009-04-18 15:42:12 +00002111 (ssizeargfunc)bytearray_repeat, /* sq_repeat */
2112 (ssizeargfunc)bytearray_getitem, /* sq_item */
2113 0, /* sq_slice */
2114 (ssizeobjargproc)bytearray_setitem, /* sq_ass_item */
2115 0, /* sq_ass_slice */
Serhiy Storchakae09132f2016-07-03 13:57:48 +03002116 (objobjproc)bytearray_contains, /* sq_contains */
Benjamin Peterson153c70f2009-04-18 15:42:12 +00002117 (binaryfunc)bytearray_iconcat, /* sq_inplace_concat */
2118 (ssizeargfunc)bytearray_irepeat, /* sq_inplace_repeat */
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002119};
2120
Benjamin Peterson153c70f2009-04-18 15:42:12 +00002121static PyMappingMethods bytearray_as_mapping = {
2122 (lenfunc)bytearray_length,
2123 (binaryfunc)bytearray_subscript,
2124 (objobjargproc)bytearray_ass_subscript,
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002125};
2126
Benjamin Peterson153c70f2009-04-18 15:42:12 +00002127static PyBufferProcs bytearray_as_buffer = {
2128 (getbufferproc)bytearray_getbuffer,
2129 (releasebufferproc)bytearray_releasebuffer,
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002130};
2131
2132static PyMethodDef
Benjamin Peterson153c70f2009-04-18 15:42:12 +00002133bytearray_methods[] = {
2134 {"__alloc__", (PyCFunction)bytearray_alloc, METH_NOARGS, alloc_doc},
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002135 BYTEARRAY_REDUCE_METHODDEF
2136 BYTEARRAY_REDUCE_EX_METHODDEF
2137 BYTEARRAY_SIZEOF_METHODDEF
2138 BYTEARRAY_APPEND_METHODDEF
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05302139 {"capitalize", stringlib_capitalize, METH_NOARGS,
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002140 _Py_capitalize__doc__},
Tal Einatc929df32018-07-06 13:17:38 +03002141 STRINGLIB_CENTER_METHODDEF
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002142 BYTEARRAY_CLEAR_METHODDEF
2143 BYTEARRAY_COPY_METHODDEF
Serhiy Storchakae09132f2016-07-03 13:57:48 +03002144 {"count", (PyCFunction)bytearray_count, METH_VARARGS,
Serhiy Storchakadd40fc32016-05-04 22:23:26 +03002145 _Py_count__doc__},
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002146 BYTEARRAY_DECODE_METHODDEF
Serhiy Storchakae09132f2016-07-03 13:57:48 +03002147 {"endswith", (PyCFunction)bytearray_endswith, METH_VARARGS,
Serhiy Storchakadd40fc32016-05-04 22:23:26 +03002148 _Py_endswith__doc__},
Tal Einatc929df32018-07-06 13:17:38 +03002149 STRINGLIB_EXPANDTABS_METHODDEF
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002150 BYTEARRAY_EXTEND_METHODDEF
Serhiy Storchakae09132f2016-07-03 13:57:48 +03002151 {"find", (PyCFunction)bytearray_find, METH_VARARGS,
Serhiy Storchakadd40fc32016-05-04 22:23:26 +03002152 _Py_find__doc__},
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002153 BYTEARRAY_FROMHEX_METHODDEF
Serhiy Storchakae09132f2016-07-03 13:57:48 +03002154 {"hex", (PyCFunction)bytearray_hex, METH_NOARGS, hex__doc__},
2155 {"index", (PyCFunction)bytearray_index, METH_VARARGS, _Py_index__doc__},
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002156 BYTEARRAY_INSERT_METHODDEF
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05302157 {"isalnum", stringlib_isalnum, METH_NOARGS,
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002158 _Py_isalnum__doc__},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05302159 {"isalpha", stringlib_isalpha, METH_NOARGS,
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002160 _Py_isalpha__doc__},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05302161 {"isascii", stringlib_isascii, METH_NOARGS,
INADA Naokia49ac992018-01-27 14:06:21 +09002162 _Py_isascii__doc__},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05302163 {"isdigit", stringlib_isdigit, METH_NOARGS,
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002164 _Py_isdigit__doc__},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05302165 {"islower", stringlib_islower, METH_NOARGS,
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002166 _Py_islower__doc__},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05302167 {"isspace", stringlib_isspace, METH_NOARGS,
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002168 _Py_isspace__doc__},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05302169 {"istitle", stringlib_istitle, METH_NOARGS,
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002170 _Py_istitle__doc__},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05302171 {"isupper", stringlib_isupper, METH_NOARGS,
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002172 _Py_isupper__doc__},
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002173 BYTEARRAY_JOIN_METHODDEF
Tal Einatc929df32018-07-06 13:17:38 +03002174 STRINGLIB_LJUST_METHODDEF
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05302175 {"lower", stringlib_lower, METH_NOARGS, _Py_lower__doc__},
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002176 BYTEARRAY_LSTRIP_METHODDEF
2177 BYTEARRAY_MAKETRANS_METHODDEF
2178 BYTEARRAY_PARTITION_METHODDEF
2179 BYTEARRAY_POP_METHODDEF
2180 BYTEARRAY_REMOVE_METHODDEF
2181 BYTEARRAY_REPLACE_METHODDEF
2182 BYTEARRAY_REVERSE_METHODDEF
Serhiy Storchakae09132f2016-07-03 13:57:48 +03002183 {"rfind", (PyCFunction)bytearray_rfind, METH_VARARGS, _Py_rfind__doc__},
2184 {"rindex", (PyCFunction)bytearray_rindex, METH_VARARGS, _Py_rindex__doc__},
Tal Einatc929df32018-07-06 13:17:38 +03002185 STRINGLIB_RJUST_METHODDEF
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002186 BYTEARRAY_RPARTITION_METHODDEF
2187 BYTEARRAY_RSPLIT_METHODDEF
2188 BYTEARRAY_RSTRIP_METHODDEF
2189 BYTEARRAY_SPLIT_METHODDEF
2190 BYTEARRAY_SPLITLINES_METHODDEF
Serhiy Storchakae09132f2016-07-03 13:57:48 +03002191 {"startswith", (PyCFunction)bytearray_startswith, METH_VARARGS ,
Serhiy Storchakadd40fc32016-05-04 22:23:26 +03002192 _Py_startswith__doc__},
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002193 BYTEARRAY_STRIP_METHODDEF
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05302194 {"swapcase", stringlib_swapcase, METH_NOARGS,
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002195 _Py_swapcase__doc__},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05302196 {"title", stringlib_title, METH_NOARGS, _Py_title__doc__},
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002197 BYTEARRAY_TRANSLATE_METHODDEF
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05302198 {"upper", stringlib_upper, METH_NOARGS, _Py_upper__doc__},
Tal Einatc929df32018-07-06 13:17:38 +03002199 STRINGLIB_ZFILL_METHODDEF
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002200 {NULL}
2201};
2202
Ethan Furmanb95b5612015-01-23 20:05:18 -08002203static PyObject *
2204bytearray_mod(PyObject *v, PyObject *w)
2205{
2206 if (!PyByteArray_Check(v))
2207 Py_RETURN_NOTIMPLEMENTED;
Berker Peksag43de36d2016-04-16 01:20:47 +03002208 return _PyBytes_FormatEx(PyByteArray_AS_STRING(v), PyByteArray_GET_SIZE(v), w, 1);
Ethan Furmanb95b5612015-01-23 20:05:18 -08002209}
2210
2211static PyNumberMethods bytearray_as_number = {
2212 0, /*nb_add*/
2213 0, /*nb_subtract*/
2214 0, /*nb_multiply*/
2215 bytearray_mod, /*nb_remainder*/
2216};
2217
Benjamin Peterson153c70f2009-04-18 15:42:12 +00002218PyDoc_STRVAR(bytearray_doc,
Georg Brandl17cb8a82008-05-30 08:20:09 +00002219"bytearray(iterable_of_ints) -> bytearray\n\
2220bytearray(string, encoding[, errors]) -> bytearray\n\
Victor Stinnerbb2e9c42011-12-17 23:18:07 +01002221bytearray(bytes_or_buffer) -> mutable copy of bytes_or_buffer\n\
2222bytearray(int) -> bytes array of size given by the parameter initialized with null bytes\n\
2223bytearray() -> empty bytes array\n\
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002224\n\
Serhiy Storchaka6a7b3a72016-04-17 08:32:47 +03002225Construct a mutable bytearray object from:\n\
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002226 - an iterable yielding integers in range(256)\n\
2227 - a text string encoded using the specified encoding\n\
Victor Stinnerbb2e9c42011-12-17 23:18:07 +01002228 - a bytes or a buffer object\n\
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002229 - any object implementing the buffer API.\n\
Victor Stinnerbb2e9c42011-12-17 23:18:07 +01002230 - an integer");
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002231
2232
Benjamin Peterson153c70f2009-04-18 15:42:12 +00002233static PyObject *bytearray_iter(PyObject *seq);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002234
2235PyTypeObject PyByteArray_Type = {
2236 PyVarObject_HEAD_INIT(&PyType_Type, 0)
2237 "bytearray",
2238 sizeof(PyByteArrayObject),
2239 0,
Benjamin Peterson153c70f2009-04-18 15:42:12 +00002240 (destructor)bytearray_dealloc, /* tp_dealloc */
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002241 0, /* tp_print */
2242 0, /* tp_getattr */
2243 0, /* tp_setattr */
Mark Dickinsone94c6792009-02-02 20:36:42 +00002244 0, /* tp_reserved */
Benjamin Peterson153c70f2009-04-18 15:42:12 +00002245 (reprfunc)bytearray_repr, /* tp_repr */
Ethan Furmanb95b5612015-01-23 20:05:18 -08002246 &bytearray_as_number, /* tp_as_number */
Benjamin Peterson153c70f2009-04-18 15:42:12 +00002247 &bytearray_as_sequence, /* tp_as_sequence */
2248 &bytearray_as_mapping, /* tp_as_mapping */
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002249 0, /* tp_hash */
2250 0, /* tp_call */
Benjamin Peterson153c70f2009-04-18 15:42:12 +00002251 bytearray_str, /* tp_str */
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002252 PyObject_GenericGetAttr, /* tp_getattro */
2253 0, /* tp_setattro */
Benjamin Peterson153c70f2009-04-18 15:42:12 +00002254 &bytearray_as_buffer, /* tp_as_buffer */
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002255 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
Benjamin Peterson153c70f2009-04-18 15:42:12 +00002256 bytearray_doc, /* tp_doc */
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002257 0, /* tp_traverse */
2258 0, /* tp_clear */
Benjamin Peterson153c70f2009-04-18 15:42:12 +00002259 (richcmpfunc)bytearray_richcompare, /* tp_richcompare */
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002260 0, /* tp_weaklistoffset */
Benjamin Peterson153c70f2009-04-18 15:42:12 +00002261 bytearray_iter, /* tp_iter */
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002262 0, /* tp_iternext */
Benjamin Peterson153c70f2009-04-18 15:42:12 +00002263 bytearray_methods, /* tp_methods */
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002264 0, /* tp_members */
2265 0, /* tp_getset */
2266 0, /* tp_base */
2267 0, /* tp_dict */
2268 0, /* tp_descr_get */
2269 0, /* tp_descr_set */
2270 0, /* tp_dictoffset */
Benjamin Peterson153c70f2009-04-18 15:42:12 +00002271 (initproc)bytearray_init, /* tp_init */
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002272 PyType_GenericAlloc, /* tp_alloc */
2273 PyType_GenericNew, /* tp_new */
2274 PyObject_Del, /* tp_free */
2275};
2276
2277/*********************** Bytes Iterator ****************************/
2278
2279typedef struct {
2280 PyObject_HEAD
2281 Py_ssize_t it_index;
2282 PyByteArrayObject *it_seq; /* Set to NULL when iterator is exhausted */
2283} bytesiterobject;
2284
2285static void
Benjamin Peterson153c70f2009-04-18 15:42:12 +00002286bytearrayiter_dealloc(bytesiterobject *it)
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002287{
2288 _PyObject_GC_UNTRACK(it);
2289 Py_XDECREF(it->it_seq);
2290 PyObject_GC_Del(it);
2291}
2292
2293static int
Benjamin Peterson153c70f2009-04-18 15:42:12 +00002294bytearrayiter_traverse(bytesiterobject *it, visitproc visit, void *arg)
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002295{
2296 Py_VISIT(it->it_seq);
2297 return 0;
2298}
2299
2300static PyObject *
Benjamin Peterson153c70f2009-04-18 15:42:12 +00002301bytearrayiter_next(bytesiterobject *it)
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002302{
2303 PyByteArrayObject *seq;
2304 PyObject *item;
2305
2306 assert(it != NULL);
2307 seq = it->it_seq;
2308 if (seq == NULL)
2309 return NULL;
2310 assert(PyByteArray_Check(seq));
2311
2312 if (it->it_index < PyByteArray_GET_SIZE(seq)) {
2313 item = PyLong_FromLong(
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +02002314 (unsigned char)PyByteArray_AS_STRING(seq)[it->it_index]);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002315 if (item != NULL)
2316 ++it->it_index;
2317 return item;
2318 }
2319
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002320 it->it_seq = NULL;
Serhiy Storchakafbb1c5e2016-03-30 20:40:02 +03002321 Py_DECREF(seq);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002322 return NULL;
2323}
2324
2325static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05302326bytearrayiter_length_hint(bytesiterobject *it, PyObject *Py_UNUSED(ignored))
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002327{
2328 Py_ssize_t len = 0;
Serhiy Storchakaaf658722016-07-03 14:41:36 +03002329 if (it->it_seq) {
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002330 len = PyByteArray_GET_SIZE(it->it_seq) - it->it_index;
Serhiy Storchakaaf658722016-07-03 14:41:36 +03002331 if (len < 0) {
2332 len = 0;
2333 }
2334 }
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002335 return PyLong_FromSsize_t(len);
2336}
2337
2338PyDoc_STRVAR(length_hint_doc,
2339 "Private method returning an estimate of len(list(it)).");
2340
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00002341static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05302342bytearrayiter_reduce(bytesiterobject *it, PyObject *Py_UNUSED(ignored))
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00002343{
2344 if (it->it_seq != NULL) {
Antoine Pitroua7013882012-04-05 00:04:20 +02002345 return Py_BuildValue("N(O)n", _PyObject_GetBuiltin("iter"),
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00002346 it->it_seq, it->it_index);
2347 } else {
Serhiy Storchaka460bd0d2016-11-20 12:16:46 +02002348 return Py_BuildValue("N(())", _PyObject_GetBuiltin("iter"));
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00002349 }
2350}
2351
2352static PyObject *
2353bytearrayiter_setstate(bytesiterobject *it, PyObject *state)
2354{
2355 Py_ssize_t index = PyLong_AsSsize_t(state);
2356 if (index == -1 && PyErr_Occurred())
2357 return NULL;
Kristján Valur Jónsson25dded02014-03-05 13:47:57 +00002358 if (it->it_seq != NULL) {
2359 if (index < 0)
2360 index = 0;
2361 else if (index > PyByteArray_GET_SIZE(it->it_seq))
2362 index = PyByteArray_GET_SIZE(it->it_seq); /* iterator exhausted */
2363 it->it_index = index;
2364 }
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00002365 Py_RETURN_NONE;
2366}
2367
2368PyDoc_STRVAR(setstate_doc, "Set state information for unpickling.");
2369
Benjamin Peterson153c70f2009-04-18 15:42:12 +00002370static PyMethodDef bytearrayiter_methods[] = {
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00002371 {"__length_hint__", (PyCFunction)bytearrayiter_length_hint, METH_NOARGS,
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002372 length_hint_doc},
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00002373 {"__reduce__", (PyCFunction)bytearrayiter_reduce, METH_NOARGS,
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002374 bytearray_reduce__doc__},
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00002375 {"__setstate__", (PyCFunction)bytearrayiter_setstate, METH_O,
2376 setstate_doc},
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002377 {NULL, NULL} /* sentinel */
2378};
2379
2380PyTypeObject PyByteArrayIter_Type = {
2381 PyVarObject_HEAD_INIT(&PyType_Type, 0)
2382 "bytearray_iterator", /* tp_name */
2383 sizeof(bytesiterobject), /* tp_basicsize */
2384 0, /* tp_itemsize */
2385 /* methods */
Benjamin Peterson153c70f2009-04-18 15:42:12 +00002386 (destructor)bytearrayiter_dealloc, /* tp_dealloc */
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002387 0, /* tp_print */
2388 0, /* tp_getattr */
2389 0, /* tp_setattr */
Mark Dickinsone94c6792009-02-02 20:36:42 +00002390 0, /* tp_reserved */
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002391 0, /* tp_repr */
2392 0, /* tp_as_number */
2393 0, /* tp_as_sequence */
2394 0, /* tp_as_mapping */
2395 0, /* tp_hash */
2396 0, /* tp_call */
2397 0, /* tp_str */
2398 PyObject_GenericGetAttr, /* tp_getattro */
2399 0, /* tp_setattro */
2400 0, /* tp_as_buffer */
2401 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC, /* tp_flags */
2402 0, /* tp_doc */
Benjamin Peterson153c70f2009-04-18 15:42:12 +00002403 (traverseproc)bytearrayiter_traverse, /* tp_traverse */
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002404 0, /* tp_clear */
2405 0, /* tp_richcompare */
2406 0, /* tp_weaklistoffset */
2407 PyObject_SelfIter, /* tp_iter */
Benjamin Peterson153c70f2009-04-18 15:42:12 +00002408 (iternextfunc)bytearrayiter_next, /* tp_iternext */
2409 bytearrayiter_methods, /* tp_methods */
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002410 0,
2411};
2412
2413static PyObject *
Benjamin Peterson153c70f2009-04-18 15:42:12 +00002414bytearray_iter(PyObject *seq)
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002415{
2416 bytesiterobject *it;
2417
2418 if (!PyByteArray_Check(seq)) {
2419 PyErr_BadInternalCall();
2420 return NULL;
2421 }
2422 it = PyObject_GC_New(bytesiterobject, &PyByteArrayIter_Type);
2423 if (it == NULL)
2424 return NULL;
2425 it->it_index = 0;
2426 Py_INCREF(seq);
2427 it->it_seq = (PyByteArrayObject *)seq;
2428 _PyObject_GC_TRACK(it);
2429 return (PyObject *)it;
2430}