blob: 3f3e6bcf0cb81e7fc286874b3922e8ca81aaeddb [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()) {
Miss Islington (bot)13708322018-10-14 14:26:28 -0700823 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{
Alexander Belopolskyf0f45142010-08-11 17:31:17 +00001001 if (Py_BytesWarningFlag) {
1002 if (PyErr_WarnEx(PyExc_BytesWarning,
1003 "str() on a bytearray instance", 1))
1004 return NULL;
1005 }
1006 return bytearray_repr((PyByteArrayObject*)op);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001007}
1008
1009static PyObject *
Benjamin Peterson153c70f2009-04-18 15:42:12 +00001010bytearray_richcompare(PyObject *self, PyObject *other, int op)
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001011{
1012 Py_ssize_t self_size, other_size;
1013 Py_buffer self_bytes, other_bytes;
Serhiy Storchakafa494fd2015-05-30 17:45:22 +03001014 int cmp, rc;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001015
1016 /* Bytes can be compared to anything that supports the (binary)
1017 buffer API. Except that a comparison with Unicode is always an
1018 error, even if the comparison is for equality. */
Serhiy Storchakafa494fd2015-05-30 17:45:22 +03001019 rc = PyObject_IsInstance(self, (PyObject*)&PyUnicode_Type);
1020 if (!rc)
1021 rc = PyObject_IsInstance(other, (PyObject*)&PyUnicode_Type);
1022 if (rc < 0)
1023 return NULL;
1024 if (rc) {
Barry Warsaw9e9dcd62008-10-17 01:50:37 +00001025 if (Py_BytesWarningFlag && (op == Py_EQ || op == Py_NE)) {
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001026 if (PyErr_WarnEx(PyExc_BytesWarning,
Georg Brandle5d68ac2008-06-04 11:30:26 +00001027 "Comparison between bytearray and string", 1))
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001028 return NULL;
1029 }
1030
Brian Curtindfc80e32011-08-10 20:28:54 -05001031 Py_RETURN_NOTIMPLEMENTED;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001032 }
1033
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +02001034 if (PyObject_GetBuffer(self, &self_bytes, PyBUF_SIMPLE) != 0) {
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001035 PyErr_Clear();
Brian Curtindfc80e32011-08-10 20:28:54 -05001036 Py_RETURN_NOTIMPLEMENTED;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001037 }
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +02001038 self_size = self_bytes.len;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001039
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +02001040 if (PyObject_GetBuffer(other, &other_bytes, PyBUF_SIMPLE) != 0) {
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001041 PyErr_Clear();
Martin v. Löwis423be952008-08-13 15:53:07 +00001042 PyBuffer_Release(&self_bytes);
Brian Curtindfc80e32011-08-10 20:28:54 -05001043 Py_RETURN_NOTIMPLEMENTED;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001044 }
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +02001045 other_size = other_bytes.len;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001046
1047 if (self_size != other_size && (op == Py_EQ || op == Py_NE)) {
1048 /* Shortcut: if the lengths differ, the objects differ */
stratakise8b19652017-11-02 11:32:54 +01001049 PyBuffer_Release(&self_bytes);
1050 PyBuffer_Release(&other_bytes);
1051 return PyBool_FromLong((op == Py_NE));
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001052 }
1053 else {
stratakise8b19652017-11-02 11:32:54 +01001054 cmp = memcmp(self_bytes.buf, other_bytes.buf,
1055 Py_MIN(self_size, other_size));
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001056 /* In ISO C, memcmp() guarantees to use unsigned bytes! */
1057
stratakise8b19652017-11-02 11:32:54 +01001058 PyBuffer_Release(&self_bytes);
1059 PyBuffer_Release(&other_bytes);
1060
1061 if (cmp != 0) {
1062 Py_RETURN_RICHCOMPARE(cmp, 0, op);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001063 }
1064
stratakise8b19652017-11-02 11:32:54 +01001065 Py_RETURN_RICHCOMPARE(self_size, other_size, op);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001066 }
1067
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001068}
1069
1070static void
Benjamin Peterson153c70f2009-04-18 15:42:12 +00001071bytearray_dealloc(PyByteArrayObject *self)
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001072{
Benjamin Petersone0124bd2009-03-09 21:04:33 +00001073 if (self->ob_exports > 0) {
1074 PyErr_SetString(PyExc_SystemError,
Benjamin Petersonef3e4c22009-04-11 19:48:14 +00001075 "deallocated bytearray object has exported buffers");
Benjamin Petersone0124bd2009-03-09 21:04:33 +00001076 PyErr_Print();
1077 }
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001078 if (self->ob_bytes != 0) {
Antoine Pitrou39aba4f2011-11-12 21:15:28 +01001079 PyObject_Free(self->ob_bytes);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001080 }
1081 Py_TYPE(self)->tp_free((PyObject *)self);
1082}
1083
1084
1085/* -------------------------------------------------------------------- */
1086/* Methods */
1087
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02001088#define FASTSEARCH fastsearch
1089#define STRINGLIB(F) stringlib_##F
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001090#define STRINGLIB_CHAR char
Antoine Pitroucfc22b42012-10-16 21:07:23 +02001091#define STRINGLIB_SIZEOF_CHAR 1
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001092#define STRINGLIB_LEN PyByteArray_GET_SIZE
1093#define STRINGLIB_STR PyByteArray_AS_STRING
1094#define STRINGLIB_NEW PyByteArray_FromStringAndSize
Antoine Pitrouf2c54842010-01-13 08:07:53 +00001095#define STRINGLIB_ISSPACE Py_ISSPACE
1096#define STRINGLIB_ISLINEBREAK(x) ((x == '\n') || (x == '\r'))
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001097#define STRINGLIB_CHECK_EXACT PyByteArray_CheckExact
1098#define STRINGLIB_MUTABLE 1
1099
1100#include "stringlib/fastsearch.h"
1101#include "stringlib/count.h"
1102#include "stringlib/find.h"
Antoine Pitroucfc22b42012-10-16 21:07:23 +02001103#include "stringlib/join.h"
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001104#include "stringlib/partition.h"
Antoine Pitrouf2c54842010-01-13 08:07:53 +00001105#include "stringlib/split.h"
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001106#include "stringlib/ctype.h"
1107#include "stringlib/transmogrify.h"
1108
1109
Serhiy Storchakae09132f2016-07-03 13:57:48 +03001110static PyObject *
1111bytearray_find(PyByteArrayObject *self, PyObject *args)
1112{
1113 return _Py_bytes_find(PyByteArray_AS_STRING(self), PyByteArray_GET_SIZE(self), args);
1114}
1115
1116static PyObject *
1117bytearray_count(PyByteArrayObject *self, PyObject *args)
1118{
1119 return _Py_bytes_count(PyByteArray_AS_STRING(self), PyByteArray_GET_SIZE(self), args);
1120}
1121
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001122/*[clinic input]
1123bytearray.clear
1124
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001125Remove all items from the bytearray.
1126[clinic start generated code]*/
1127
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001128static PyObject *
1129bytearray_clear_impl(PyByteArrayObject *self)
Serhiy Storchaka7a9579c2016-05-02 13:45:20 +03001130/*[clinic end generated code: output=85c2fe6aede0956c input=ed6edae9de447ac4]*/
Eli Bendersky4db28d32011-03-03 18:21:02 +00001131{
1132 if (PyByteArray_Resize((PyObject *)self, 0) < 0)
1133 return NULL;
1134 Py_RETURN_NONE;
1135}
1136
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001137/*[clinic input]
1138bytearray.copy
1139
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001140Return a copy of B.
1141[clinic start generated code]*/
1142
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001143static PyObject *
1144bytearray_copy_impl(PyByteArrayObject *self)
Serhiy Storchaka7a9579c2016-05-02 13:45:20 +03001145/*[clinic end generated code: output=68cfbcfed484c132 input=6597b0c01bccaa9e]*/
Eli Bendersky4db28d32011-03-03 18:21:02 +00001146{
1147 return PyByteArray_FromStringAndSize(PyByteArray_AS_STRING((PyObject *)self),
1148 PyByteArray_GET_SIZE(self));
1149}
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001150
Serhiy Storchakae09132f2016-07-03 13:57:48 +03001151static PyObject *
1152bytearray_index(PyByteArrayObject *self, PyObject *args)
1153{
1154 return _Py_bytes_index(PyByteArray_AS_STRING(self), PyByteArray_GET_SIZE(self), args);
1155}
1156
1157static PyObject *
1158bytearray_rfind(PyByteArrayObject *self, PyObject *args)
1159{
1160 return _Py_bytes_rfind(PyByteArray_AS_STRING(self), PyByteArray_GET_SIZE(self), args);
1161}
1162
1163static PyObject *
1164bytearray_rindex(PyByteArrayObject *self, PyObject *args)
1165{
1166 return _Py_bytes_rindex(PyByteArray_AS_STRING(self), PyByteArray_GET_SIZE(self), args);
1167}
1168
1169static int
1170bytearray_contains(PyObject *self, PyObject *arg)
1171{
1172 return _Py_bytes_contains(PyByteArray_AS_STRING(self), PyByteArray_GET_SIZE(self), arg);
1173}
1174
1175static PyObject *
1176bytearray_startswith(PyByteArrayObject *self, PyObject *args)
1177{
1178 return _Py_bytes_startswith(PyByteArray_AS_STRING(self), PyByteArray_GET_SIZE(self), args);
1179}
1180
1181static PyObject *
1182bytearray_endswith(PyByteArrayObject *self, PyObject *args)
1183{
1184 return _Py_bytes_endswith(PyByteArray_AS_STRING(self), PyByteArray_GET_SIZE(self), args);
1185}
1186
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001187
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001188/*[clinic input]
1189bytearray.translate
1190
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001191 table: object
1192 Translation table, which must be a bytes object of length 256.
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001193 /
Martin Panter1b6c6da2016-08-27 08:35:02 +00001194 delete as deletechars: object(c_default="NULL") = b''
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001195
1196Return a copy with each character mapped by the given translation table.
1197
Martin Panter1b6c6da2016-08-27 08:35:02 +00001198All characters occurring in the optional argument delete are removed.
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001199The remaining characters are mapped through the given translation table.
1200[clinic start generated code]*/
1201
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001202static PyObject *
Larry Hastings89964c42015-04-14 18:07:59 -04001203bytearray_translate_impl(PyByteArrayObject *self, PyObject *table,
Martin Panter1b6c6da2016-08-27 08:35:02 +00001204 PyObject *deletechars)
1205/*[clinic end generated code: output=b6a8f01c2a74e446 input=cfff956d4d127a9b]*/
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001206{
Antoine Pitrou9ed5f272013-08-13 20:18:52 +02001207 char *input, *output;
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001208 const char *table_chars;
Antoine Pitrou9ed5f272013-08-13 20:18:52 +02001209 Py_ssize_t i, c;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001210 PyObject *input_obj = (PyObject*)self;
1211 const char *output_start;
1212 Py_ssize_t inlen;
Georg Brandlccc47b62008-12-28 11:44:14 +00001213 PyObject *result = NULL;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001214 int trans_table[256];
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001215 Py_buffer vtable, vdel;
1216
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001217 if (table == Py_None) {
1218 table_chars = NULL;
Georg Brandlccc47b62008-12-28 11:44:14 +00001219 table = NULL;
Serhiy Storchaka3dd3e262015-02-03 01:25:42 +02001220 } else if (PyObject_GetBuffer(table, &vtable, PyBUF_SIMPLE) != 0) {
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001221 return NULL;
Georg Brandlccc47b62008-12-28 11:44:14 +00001222 } else {
1223 if (vtable.len != 256) {
1224 PyErr_SetString(PyExc_ValueError,
1225 "translation table must be 256 characters long");
Georg Brandl953152f2009-07-22 12:03:59 +00001226 PyBuffer_Release(&vtable);
1227 return NULL;
Georg Brandlccc47b62008-12-28 11:44:14 +00001228 }
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001229 table_chars = (const char*)vtable.buf;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001230 }
1231
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001232 if (deletechars != NULL) {
Serhiy Storchaka3dd3e262015-02-03 01:25:42 +02001233 if (PyObject_GetBuffer(deletechars, &vdel, PyBUF_SIMPLE) != 0) {
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001234 if (table != NULL)
Georg Brandl953152f2009-07-22 12:03:59 +00001235 PyBuffer_Release(&vtable);
1236 return NULL;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001237 }
1238 }
1239 else {
1240 vdel.buf = NULL;
1241 vdel.len = 0;
1242 }
1243
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001244 inlen = PyByteArray_GET_SIZE(input_obj);
1245 result = PyByteArray_FromStringAndSize((char *)NULL, inlen);
1246 if (result == NULL)
1247 goto done;
Serhiy Storchakadd40fc32016-05-04 22:23:26 +03001248 output_start = output = PyByteArray_AS_STRING(result);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001249 input = PyByteArray_AS_STRING(input_obj);
1250
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001251 if (vdel.len == 0 && table_chars != NULL) {
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001252 /* If no deletions are required, use faster code */
1253 for (i = inlen; --i >= 0; ) {
1254 c = Py_CHARMASK(*input++);
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001255 *output++ = table_chars[c];
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001256 }
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001257 goto done;
1258 }
Georg Brandlccc47b62008-12-28 11:44:14 +00001259
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001260 if (table_chars == NULL) {
Georg Brandlccc47b62008-12-28 11:44:14 +00001261 for (i = 0; i < 256; i++)
1262 trans_table[i] = Py_CHARMASK(i);
1263 } else {
1264 for (i = 0; i < 256; i++)
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001265 trans_table[i] = Py_CHARMASK(table_chars[i]);
Georg Brandlccc47b62008-12-28 11:44:14 +00001266 }
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001267
1268 for (i = 0; i < vdel.len; i++)
1269 trans_table[(int) Py_CHARMASK( ((unsigned char*)vdel.buf)[i] )] = -1;
1270
1271 for (i = inlen; --i >= 0; ) {
1272 c = Py_CHARMASK(*input++);
1273 if (trans_table[c] != -1)
Martin Panter1b6c6da2016-08-27 08:35:02 +00001274 *output++ = (char)trans_table[c];
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001275 }
1276 /* Fix the size of the resulting string */
1277 if (inlen > 0)
Christian Heimesc731bbe2013-07-21 02:04:35 +02001278 if (PyByteArray_Resize(result, output - output_start) < 0) {
1279 Py_CLEAR(result);
1280 goto done;
1281 }
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001282
1283done:
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001284 if (table != NULL)
Georg Brandlccc47b62008-12-28 11:44:14 +00001285 PyBuffer_Release(&vtable);
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001286 if (deletechars != NULL)
Martin v. Löwis423be952008-08-13 15:53:07 +00001287 PyBuffer_Release(&vdel);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001288 return result;
1289}
1290
1291
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001292/*[clinic input]
1293
1294@staticmethod
1295bytearray.maketrans
1296
Serhiy Storchaka3dd3e262015-02-03 01:25:42 +02001297 frm: Py_buffer
1298 to: Py_buffer
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001299 /
1300
1301Return a translation table useable for the bytes or bytearray translate method.
1302
1303The returned table will be one where each byte in frm is mapped to the byte at
1304the same position in to.
1305
1306The bytes objects frm and to must be of the same length.
1307[clinic start generated code]*/
1308
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001309static PyObject *
Serhiy Storchaka3dd3e262015-02-03 01:25:42 +02001310bytearray_maketrans_impl(Py_buffer *frm, Py_buffer *to)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03001311/*[clinic end generated code: output=1df267d99f56b15e input=5925a81d2fbbf151]*/
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001312{
1313 return _Py_bytes_maketrans(frm, to);
Georg Brandlabc38772009-04-12 15:51:51 +00001314}
1315
1316
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001317/*[clinic input]
1318bytearray.replace
1319
Serhiy Storchaka3dd3e262015-02-03 01:25:42 +02001320 old: Py_buffer
1321 new: Py_buffer
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001322 count: Py_ssize_t = -1
1323 Maximum number of occurrences to replace.
1324 -1 (the default value) means replace all occurrences.
1325 /
1326
1327Return a copy with all occurrences of substring old replaced by new.
1328
1329If the optional argument count is given, only the first count occurrences are
1330replaced.
1331[clinic start generated code]*/
1332
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001333static PyObject *
Larry Hastings89964c42015-04-14 18:07:59 -04001334bytearray_replace_impl(PyByteArrayObject *self, Py_buffer *old,
1335 Py_buffer *new, Py_ssize_t count)
1336/*[clinic end generated code: output=d39884c4dc59412a input=aa379d988637c7fb]*/
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001337{
Serhiy Storchakafb81d3c2016-05-05 09:26:07 +03001338 return stringlib_replace((PyObject *)self,
Serhiy Storchakae09132f2016-07-03 13:57:48 +03001339 (const char *)old->buf, old->len,
1340 (const char *)new->buf, new->len, count);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001341}
1342
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001343/*[clinic input]
1344bytearray.split
1345
1346 sep: object = None
1347 The delimiter according which to split the bytearray.
1348 None (the default value) means split on ASCII whitespace characters
1349 (space, tab, return, newline, formfeed, vertical tab).
1350 maxsplit: Py_ssize_t = -1
1351 Maximum number of splits to do.
1352 -1 (the default value) means no limit.
1353
1354Return a list of the sections in the bytearray, using sep as the delimiter.
1355[clinic start generated code]*/
1356
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001357static PyObject *
Larry Hastings89964c42015-04-14 18:07:59 -04001358bytearray_split_impl(PyByteArrayObject *self, PyObject *sep,
1359 Py_ssize_t maxsplit)
1360/*[clinic end generated code: output=833e2cf385d9a04d input=24f82669f41bf523]*/
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001361{
1362 Py_ssize_t len = PyByteArray_GET_SIZE(self), n;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001363 const char *s = PyByteArray_AS_STRING(self), *sub;
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001364 PyObject *list;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001365 Py_buffer vsub;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001366
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001367 if (maxsplit < 0)
1368 maxsplit = PY_SSIZE_T_MAX;
1369
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001370 if (sep == Py_None)
Antoine Pitrouf2c54842010-01-13 08:07:53 +00001371 return stringlib_split_whitespace((PyObject*) self, s, len, maxsplit);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001372
Serhiy Storchaka3dd3e262015-02-03 01:25:42 +02001373 if (PyObject_GetBuffer(sep, &vsub, PyBUF_SIMPLE) != 0)
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001374 return NULL;
1375 sub = vsub.buf;
1376 n = vsub.len;
1377
Antoine Pitrouf2c54842010-01-13 08:07:53 +00001378 list = stringlib_split(
1379 (PyObject*) self, s, len, sub, n, maxsplit
1380 );
Martin v. Löwis423be952008-08-13 15:53:07 +00001381 PyBuffer_Release(&vsub);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001382 return list;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001383}
1384
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001385/*[clinic input]
1386bytearray.partition
1387
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001388 sep: object
1389 /
1390
1391Partition the bytearray into three parts using the given separator.
1392
1393This will search for the separator sep in the bytearray. If the separator is
1394found, returns a 3-tuple containing the part before the separator, the
Serhiy Storchakaa2314282017-10-29 02:11:54 +03001395separator itself, and the part after it as new bytearray objects.
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001396
Serhiy Storchakaa2314282017-10-29 02:11:54 +03001397If the separator is not found, returns a 3-tuple containing the copy of the
1398original bytearray object and two empty bytearray objects.
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001399[clinic start generated code]*/
1400
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001401static PyObject *
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001402bytearray_partition(PyByteArrayObject *self, PyObject *sep)
Serhiy Storchakaa2314282017-10-29 02:11:54 +03001403/*[clinic end generated code: output=45d2525ddd35f957 input=8f644749ee4fc83a]*/
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001404{
1405 PyObject *bytesep, *result;
1406
Serhiy Storchakaa2314282017-10-29 02:11:54 +03001407 bytesep = _PyByteArray_FromBufferObject(sep);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001408 if (! bytesep)
1409 return NULL;
1410
1411 result = stringlib_partition(
1412 (PyObject*) self,
1413 PyByteArray_AS_STRING(self), PyByteArray_GET_SIZE(self),
1414 bytesep,
1415 PyByteArray_AS_STRING(bytesep), PyByteArray_GET_SIZE(bytesep)
1416 );
1417
1418 Py_DECREF(bytesep);
Antoine Pitrouf2c54842010-01-13 08:07:53 +00001419 return result;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001420}
1421
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001422/*[clinic input]
1423bytearray.rpartition
1424
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001425 sep: object
1426 /
1427
Serhiy Storchakaa2314282017-10-29 02:11:54 +03001428Partition the bytearray into three parts using the given separator.
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001429
Serhiy Storchakaa2314282017-10-29 02:11:54 +03001430This will search for the separator sep in the bytearray, starting at the end.
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001431If the separator is found, returns a 3-tuple containing the part before the
Serhiy Storchakaa2314282017-10-29 02:11:54 +03001432separator, the separator itself, and the part after it as new bytearray
1433objects.
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001434
1435If the separator is not found, returns a 3-tuple containing two empty bytearray
Serhiy Storchakaa2314282017-10-29 02:11:54 +03001436objects and the copy of the original bytearray object.
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001437[clinic start generated code]*/
1438
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001439static PyObject *
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001440bytearray_rpartition(PyByteArrayObject *self, PyObject *sep)
Serhiy Storchakaa2314282017-10-29 02:11:54 +03001441/*[clinic end generated code: output=440de3c9426115e8 input=7e3df3e6cb8fa0ac]*/
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001442{
1443 PyObject *bytesep, *result;
1444
Serhiy Storchakaa2314282017-10-29 02:11:54 +03001445 bytesep = _PyByteArray_FromBufferObject(sep);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001446 if (! bytesep)
1447 return NULL;
1448
1449 result = stringlib_rpartition(
1450 (PyObject*) self,
1451 PyByteArray_AS_STRING(self), PyByteArray_GET_SIZE(self),
1452 bytesep,
1453 PyByteArray_AS_STRING(bytesep), PyByteArray_GET_SIZE(bytesep)
1454 );
1455
1456 Py_DECREF(bytesep);
Antoine Pitrouf2c54842010-01-13 08:07:53 +00001457 return result;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001458}
1459
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001460/*[clinic input]
1461bytearray.rsplit = bytearray.split
1462
1463Return a list of the sections in the bytearray, using sep as the delimiter.
1464
1465Splitting is done starting at the end of the bytearray and working to the front.
1466[clinic start generated code]*/
1467
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001468static PyObject *
Larry Hastings89964c42015-04-14 18:07:59 -04001469bytearray_rsplit_impl(PyByteArrayObject *self, PyObject *sep,
1470 Py_ssize_t maxsplit)
1471/*[clinic end generated code: output=a55e0b5a03cb6190 input=a68286e4dd692ffe]*/
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001472{
1473 Py_ssize_t len = PyByteArray_GET_SIZE(self), n;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001474 const char *s = PyByteArray_AS_STRING(self), *sub;
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001475 PyObject *list;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001476 Py_buffer vsub;
1477
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001478 if (maxsplit < 0)
1479 maxsplit = PY_SSIZE_T_MAX;
1480
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001481 if (sep == Py_None)
Antoine Pitrouf2c54842010-01-13 08:07:53 +00001482 return stringlib_rsplit_whitespace((PyObject*) self, s, len, maxsplit);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001483
Serhiy Storchaka3dd3e262015-02-03 01:25:42 +02001484 if (PyObject_GetBuffer(sep, &vsub, PyBUF_SIMPLE) != 0)
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001485 return NULL;
1486 sub = vsub.buf;
1487 n = vsub.len;
1488
Antoine Pitrouf2c54842010-01-13 08:07:53 +00001489 list = stringlib_rsplit(
1490 (PyObject*) self, s, len, sub, n, maxsplit
1491 );
Martin v. Löwis423be952008-08-13 15:53:07 +00001492 PyBuffer_Release(&vsub);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001493 return list;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001494}
1495
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001496/*[clinic input]
1497bytearray.reverse
1498
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001499Reverse the order of the values in B in place.
1500[clinic start generated code]*/
1501
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001502static PyObject *
1503bytearray_reverse_impl(PyByteArrayObject *self)
Serhiy Storchaka7a9579c2016-05-02 13:45:20 +03001504/*[clinic end generated code: output=9f7616f29ab309d3 input=543356319fc78557]*/
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001505{
1506 char swap, *head, *tail;
1507 Py_ssize_t i, j, n = Py_SIZE(self);
1508
1509 j = n / 2;
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +02001510 head = PyByteArray_AS_STRING(self);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001511 tail = head + n - 1;
1512 for (i = 0; i < j; i++) {
1513 swap = *head;
1514 *head++ = *tail;
1515 *tail-- = swap;
1516 }
1517
1518 Py_RETURN_NONE;
1519}
1520
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001521
1522/*[python input]
1523class bytesvalue_converter(CConverter):
1524 type = 'int'
1525 converter = '_getbytevalue'
1526[python start generated code]*/
1527/*[python end generated code: output=da39a3ee5e6b4b0d input=29c2e7c26c212812]*/
1528
1529
1530/*[clinic input]
1531bytearray.insert
1532
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001533 index: Py_ssize_t
1534 The index where the value is to be inserted.
1535 item: bytesvalue
1536 The item to be inserted.
1537 /
1538
1539Insert a single item into the bytearray before the given index.
1540[clinic start generated code]*/
1541
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001542static PyObject *
1543bytearray_insert_impl(PyByteArrayObject *self, Py_ssize_t index, int item)
Serhiy Storchaka7a9579c2016-05-02 13:45:20 +03001544/*[clinic end generated code: output=76c775a70e7b07b7 input=b2b5d07e9de6c070]*/
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001545{
1546 Py_ssize_t n = Py_SIZE(self);
1547 char *buf;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001548
1549 if (n == PY_SSIZE_T_MAX) {
1550 PyErr_SetString(PyExc_OverflowError,
Mark Dickinson2b6705f2009-09-06 10:34:47 +00001551 "cannot add more objects to bytearray");
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001552 return NULL;
1553 }
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001554 if (PyByteArray_Resize((PyObject *)self, n + 1) < 0)
1555 return NULL;
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +02001556 buf = PyByteArray_AS_STRING(self);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001557
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001558 if (index < 0) {
1559 index += n;
1560 if (index < 0)
1561 index = 0;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001562 }
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001563 if (index > n)
1564 index = n;
1565 memmove(buf + index + 1, buf + index, n - index);
1566 buf[index] = item;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001567
1568 Py_RETURN_NONE;
1569}
1570
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001571/*[clinic input]
1572bytearray.append
1573
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001574 item: bytesvalue
1575 The item to be appended.
1576 /
1577
1578Append a single item to the end of the bytearray.
1579[clinic start generated code]*/
1580
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001581static PyObject *
1582bytearray_append_impl(PyByteArrayObject *self, int item)
Serhiy Storchaka7a9579c2016-05-02 13:45:20 +03001583/*[clinic end generated code: output=a154e19ed1886cb6 input=20d6bec3d1340593]*/
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001584{
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001585 Py_ssize_t n = Py_SIZE(self);
1586
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001587 if (n == PY_SSIZE_T_MAX) {
1588 PyErr_SetString(PyExc_OverflowError,
Mark Dickinson2b6705f2009-09-06 10:34:47 +00001589 "cannot add more objects to bytearray");
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001590 return NULL;
1591 }
1592 if (PyByteArray_Resize((PyObject *)self, n + 1) < 0)
1593 return NULL;
1594
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001595 PyByteArray_AS_STRING(self)[n] = item;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001596
1597 Py_RETURN_NONE;
1598}
1599
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001600/*[clinic input]
1601bytearray.extend
1602
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001603 iterable_of_ints: object
1604 The iterable of items to append.
1605 /
1606
1607Append all the items from the iterator or sequence to the end of the bytearray.
1608[clinic start generated code]*/
1609
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001610static PyObject *
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001611bytearray_extend(PyByteArrayObject *self, PyObject *iterable_of_ints)
Serhiy Storchaka7a9579c2016-05-02 13:45:20 +03001612/*[clinic end generated code: output=98155dbe249170b1 input=c617b3a93249ba28]*/
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001613{
Benjamin Peterson153c70f2009-04-18 15:42:12 +00001614 PyObject *it, *item, *bytearray_obj;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001615 Py_ssize_t buf_size = 0, len = 0;
1616 int value;
1617 char *buf;
1618
Benjamin Peterson153c70f2009-04-18 15:42:12 +00001619 /* bytearray_setslice code only accepts something supporting PEP 3118. */
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001620 if (PyObject_CheckBuffer(iterable_of_ints)) {
1621 if (bytearray_setslice(self, Py_SIZE(self), Py_SIZE(self), iterable_of_ints) == -1)
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001622 return NULL;
1623
1624 Py_RETURN_NONE;
1625 }
1626
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001627 it = PyObject_GetIter(iterable_of_ints);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001628 if (it == NULL)
1629 return NULL;
1630
Ezio Melotti42da6632011-03-15 05:18:48 +02001631 /* Try to determine the length of the argument. 32 is arbitrary. */
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001632 buf_size = PyObject_LengthHint(iterable_of_ints, 32);
Benjamin Petersonef3e4c22009-04-11 19:48:14 +00001633 if (buf_size == -1) {
1634 Py_DECREF(it);
1635 return NULL;
1636 }
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001637
Benjamin Peterson153c70f2009-04-18 15:42:12 +00001638 bytearray_obj = PyByteArray_FromStringAndSize(NULL, buf_size);
Antoine Pitrou58bb82e2012-04-01 16:05:46 +02001639 if (bytearray_obj == NULL) {
1640 Py_DECREF(it);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001641 return NULL;
Antoine Pitrou58bb82e2012-04-01 16:05:46 +02001642 }
Benjamin Peterson153c70f2009-04-18 15:42:12 +00001643 buf = PyByteArray_AS_STRING(bytearray_obj);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001644
1645 while ((item = PyIter_Next(it)) != NULL) {
1646 if (! _getbytevalue(item, &value)) {
1647 Py_DECREF(item);
1648 Py_DECREF(it);
Benjamin Peterson153c70f2009-04-18 15:42:12 +00001649 Py_DECREF(bytearray_obj);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001650 return NULL;
1651 }
1652 buf[len++] = value;
1653 Py_DECREF(item);
1654
1655 if (len >= buf_size) {
Martin Panter371731e2016-07-18 07:53:13 +00001656 Py_ssize_t addition;
1657 if (len == PY_SSIZE_T_MAX) {
1658 Py_DECREF(it);
1659 Py_DECREF(bytearray_obj);
1660 return PyErr_NoMemory();
1661 }
1662 addition = len >> 1;
1663 if (addition > PY_SSIZE_T_MAX - len - 1)
1664 buf_size = PY_SSIZE_T_MAX;
1665 else
1666 buf_size = len + addition + 1;
Benjamin Peterson153c70f2009-04-18 15:42:12 +00001667 if (PyByteArray_Resize((PyObject *)bytearray_obj, buf_size) < 0) {
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001668 Py_DECREF(it);
Benjamin Peterson153c70f2009-04-18 15:42:12 +00001669 Py_DECREF(bytearray_obj);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001670 return NULL;
1671 }
1672 /* Recompute the `buf' pointer, since the resizing operation may
1673 have invalidated it. */
Benjamin Peterson153c70f2009-04-18 15:42:12 +00001674 buf = PyByteArray_AS_STRING(bytearray_obj);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001675 }
1676 }
1677 Py_DECREF(it);
1678
1679 /* Resize down to exact size. */
Benjamin Peterson153c70f2009-04-18 15:42:12 +00001680 if (PyByteArray_Resize((PyObject *)bytearray_obj, len) < 0) {
1681 Py_DECREF(bytearray_obj);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001682 return NULL;
1683 }
1684
Antoine Pitrou58bb82e2012-04-01 16:05:46 +02001685 if (bytearray_setslice(self, Py_SIZE(self), Py_SIZE(self), bytearray_obj) == -1) {
1686 Py_DECREF(bytearray_obj);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001687 return NULL;
Antoine Pitrou58bb82e2012-04-01 16:05:46 +02001688 }
Benjamin Peterson153c70f2009-04-18 15:42:12 +00001689 Py_DECREF(bytearray_obj);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001690
1691 Py_RETURN_NONE;
1692}
1693
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001694/*[clinic input]
1695bytearray.pop
1696
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001697 index: Py_ssize_t = -1
1698 The index from where to remove the item.
1699 -1 (the default value) means remove the last item.
1700 /
1701
1702Remove and return a single item from B.
1703
1704If no index argument is given, will pop the last item.
1705[clinic start generated code]*/
1706
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001707static PyObject *
1708bytearray_pop_impl(PyByteArrayObject *self, Py_ssize_t index)
Serhiy Storchaka7a9579c2016-05-02 13:45:20 +03001709/*[clinic end generated code: output=e0ccd401f8021da8 input=3591df2d06c0d237]*/
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001710{
1711 int value;
1712 Py_ssize_t n = Py_SIZE(self);
1713 char *buf;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001714
1715 if (n == 0) {
Eli Bendersky1bc4f192011-03-04 04:55:25 +00001716 PyErr_SetString(PyExc_IndexError,
1717 "pop from empty bytearray");
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001718 return NULL;
1719 }
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001720 if (index < 0)
1721 index += Py_SIZE(self);
1722 if (index < 0 || index >= Py_SIZE(self)) {
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001723 PyErr_SetString(PyExc_IndexError, "pop index out of range");
1724 return NULL;
1725 }
Antoine Pitrou5504e892008-12-06 21:27:53 +00001726 if (!_canresize(self))
1727 return NULL;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001728
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +02001729 buf = PyByteArray_AS_STRING(self);
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001730 value = buf[index];
1731 memmove(buf + index, buf + index + 1, n - index);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001732 if (PyByteArray_Resize((PyObject *)self, n - 1) < 0)
1733 return NULL;
1734
Mark Dickinson54a3db92009-09-06 10:19:23 +00001735 return PyLong_FromLong((unsigned char)value);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001736}
1737
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001738/*[clinic input]
1739bytearray.remove
1740
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001741 value: bytesvalue
1742 The value to remove.
1743 /
1744
1745Remove the first occurrence of a value in the bytearray.
1746[clinic start generated code]*/
1747
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001748static PyObject *
1749bytearray_remove_impl(PyByteArrayObject *self, int value)
Serhiy Storchaka7a9579c2016-05-02 13:45:20 +03001750/*[clinic end generated code: output=d659e37866709c13 input=121831240cd51ddf]*/
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001751{
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001752 Py_ssize_t where, n = Py_SIZE(self);
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +02001753 char *buf = PyByteArray_AS_STRING(self);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001754
Serhiy Storchaka4b234942016-05-16 22:24:03 +03001755 where = stringlib_find_char(buf, n, value);
1756 if (where < 0) {
Mark Dickinson2b6705f2009-09-06 10:34:47 +00001757 PyErr_SetString(PyExc_ValueError, "value not found in bytearray");
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001758 return NULL;
1759 }
Antoine Pitrou5504e892008-12-06 21:27:53 +00001760 if (!_canresize(self))
1761 return NULL;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001762
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +02001763 memmove(buf + where, buf + where + 1, n - where);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001764 if (PyByteArray_Resize((PyObject *)self, n - 1) < 0)
1765 return NULL;
1766
1767 Py_RETURN_NONE;
1768}
1769
1770/* XXX These two helpers could be optimized if argsize == 1 */
1771
1772static Py_ssize_t
Serhiy Storchakaef1585e2015-12-25 20:01:53 +02001773lstrip_helper(const char *myptr, Py_ssize_t mysize,
1774 const void *argptr, Py_ssize_t argsize)
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001775{
1776 Py_ssize_t i = 0;
Antoine Pitrou5b720752013-10-05 21:24:10 +02001777 while (i < mysize && memchr(argptr, (unsigned char) myptr[i], argsize))
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001778 i++;
1779 return i;
1780}
1781
1782static Py_ssize_t
Serhiy Storchakaef1585e2015-12-25 20:01:53 +02001783rstrip_helper(const char *myptr, Py_ssize_t mysize,
1784 const void *argptr, Py_ssize_t argsize)
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001785{
1786 Py_ssize_t i = mysize - 1;
Antoine Pitrou5b720752013-10-05 21:24:10 +02001787 while (i >= 0 && memchr(argptr, (unsigned char) myptr[i], argsize))
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001788 i--;
1789 return i + 1;
1790}
1791
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001792/*[clinic input]
1793bytearray.strip
1794
1795 bytes: object = None
1796 /
1797
1798Strip leading and trailing bytes contained in the argument.
1799
1800If the argument is omitted or None, strip leading and trailing ASCII whitespace.
1801[clinic start generated code]*/
1802
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001803static PyObject *
1804bytearray_strip_impl(PyByteArrayObject *self, PyObject *bytes)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03001805/*[clinic end generated code: output=760412661a34ad5a input=ef7bb59b09c21d62]*/
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001806{
1807 Py_ssize_t left, right, mysize, byteslen;
Serhiy Storchakae2f92de2017-11-11 13:06:26 +02001808 char *myptr;
1809 const char *bytesptr;
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001810 Py_buffer vbytes;
1811
1812 if (bytes == Py_None) {
1813 bytesptr = "\t\n\r\f\v ";
1814 byteslen = 6;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001815 }
1816 else {
Serhiy Storchaka3dd3e262015-02-03 01:25:42 +02001817 if (PyObject_GetBuffer(bytes, &vbytes, PyBUF_SIMPLE) != 0)
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001818 return NULL;
Serhiy Storchakae2f92de2017-11-11 13:06:26 +02001819 bytesptr = (const char *) vbytes.buf;
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001820 byteslen = vbytes.len;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001821 }
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +02001822 myptr = PyByteArray_AS_STRING(self);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001823 mysize = Py_SIZE(self);
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001824 left = lstrip_helper(myptr, mysize, bytesptr, byteslen);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001825 if (left == mysize)
1826 right = left;
1827 else
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001828 right = rstrip_helper(myptr, mysize, bytesptr, byteslen);
1829 if (bytes != Py_None)
1830 PyBuffer_Release(&vbytes);
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +02001831 return PyByteArray_FromStringAndSize(myptr + left, right - left);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001832}
1833
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001834/*[clinic input]
1835bytearray.lstrip
1836
1837 bytes: object = None
1838 /
1839
1840Strip leading bytes contained in the argument.
1841
1842If the argument is omitted or None, strip leading ASCII whitespace.
1843[clinic start generated code]*/
1844
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001845static PyObject *
1846bytearray_lstrip_impl(PyByteArrayObject *self, PyObject *bytes)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03001847/*[clinic end generated code: output=d005c9d0ab909e66 input=80843f975dd7c480]*/
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001848{
1849 Py_ssize_t left, right, mysize, byteslen;
Serhiy Storchakae2f92de2017-11-11 13:06:26 +02001850 char *myptr;
1851 const char *bytesptr;
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001852 Py_buffer vbytes;
1853
1854 if (bytes == Py_None) {
1855 bytesptr = "\t\n\r\f\v ";
1856 byteslen = 6;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001857 }
1858 else {
Serhiy Storchaka3dd3e262015-02-03 01:25:42 +02001859 if (PyObject_GetBuffer(bytes, &vbytes, PyBUF_SIMPLE) != 0)
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001860 return NULL;
Serhiy Storchakae2f92de2017-11-11 13:06:26 +02001861 bytesptr = (const char *) vbytes.buf;
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001862 byteslen = vbytes.len;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001863 }
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +02001864 myptr = PyByteArray_AS_STRING(self);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001865 mysize = Py_SIZE(self);
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001866 left = lstrip_helper(myptr, mysize, bytesptr, byteslen);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001867 right = mysize;
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001868 if (bytes != Py_None)
1869 PyBuffer_Release(&vbytes);
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +02001870 return PyByteArray_FromStringAndSize(myptr + left, right - left);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001871}
1872
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001873/*[clinic input]
1874bytearray.rstrip
1875
1876 bytes: object = None
1877 /
1878
1879Strip trailing bytes contained in the argument.
1880
1881If the argument is omitted or None, strip trailing ASCII whitespace.
1882[clinic start generated code]*/
1883
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001884static PyObject *
1885bytearray_rstrip_impl(PyByteArrayObject *self, PyObject *bytes)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03001886/*[clinic end generated code: output=030e2fbd2f7276bd input=e728b994954cfd91]*/
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001887{
1888 Py_ssize_t right, mysize, byteslen;
Serhiy Storchakae2f92de2017-11-11 13:06:26 +02001889 char *myptr;
1890 const char *bytesptr;
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001891 Py_buffer vbytes;
1892
1893 if (bytes == Py_None) {
1894 bytesptr = "\t\n\r\f\v ";
1895 byteslen = 6;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001896 }
1897 else {
Serhiy Storchaka3dd3e262015-02-03 01:25:42 +02001898 if (PyObject_GetBuffer(bytes, &vbytes, PyBUF_SIMPLE) != 0)
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001899 return NULL;
Serhiy Storchakae2f92de2017-11-11 13:06:26 +02001900 bytesptr = (const char *) vbytes.buf;
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001901 byteslen = vbytes.len;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001902 }
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +02001903 myptr = PyByteArray_AS_STRING(self);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001904 mysize = Py_SIZE(self);
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001905 right = rstrip_helper(myptr, mysize, bytesptr, byteslen);
1906 if (bytes != Py_None)
1907 PyBuffer_Release(&vbytes);
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +02001908 return PyByteArray_FromStringAndSize(myptr, right);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001909}
1910
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001911/*[clinic input]
1912bytearray.decode
1913
1914 encoding: str(c_default="NULL") = 'utf-8'
1915 The encoding with which to decode the bytearray.
1916 errors: str(c_default="NULL") = 'strict'
1917 The error handling scheme to use for the handling of decoding errors.
1918 The default is 'strict' meaning that decoding errors raise a
1919 UnicodeDecodeError. Other possible values are 'ignore' and 'replace'
1920 as well as any other name registered with codecs.register_error that
1921 can handle UnicodeDecodeErrors.
1922
1923Decode the bytearray using the codec registered for encoding.
1924[clinic start generated code]*/
1925
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001926static PyObject *
Larry Hastings89964c42015-04-14 18:07:59 -04001927bytearray_decode_impl(PyByteArrayObject *self, const char *encoding,
1928 const char *errors)
1929/*[clinic end generated code: output=f57d43f4a00b42c5 input=f28d8f903020257b]*/
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001930{
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001931 if (encoding == NULL)
1932 encoding = PyUnicode_GetDefaultEncoding();
Martin v. Löwis0efea322014-07-27 17:29:17 +02001933 return PyUnicode_FromEncodedObject((PyObject*)self, encoding, errors);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001934}
1935
1936PyDoc_STRVAR(alloc_doc,
1937"B.__alloc__() -> int\n\
1938\n\
Georg Brandl17cb8a82008-05-30 08:20:09 +00001939Return the number of bytes actually allocated.");
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001940
1941static PyObject *
Benjamin Peterson153c70f2009-04-18 15:42:12 +00001942bytearray_alloc(PyByteArrayObject *self)
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001943{
1944 return PyLong_FromSsize_t(self->ob_alloc);
1945}
1946
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001947/*[clinic input]
1948bytearray.join
1949
1950 iterable_of_bytes: object
1951 /
1952
1953Concatenate any number of bytes/bytearray objects.
1954
1955The bytearray whose method is called is inserted in between each pair.
1956
1957The result is returned as a new bytearray object.
1958[clinic start generated code]*/
1959
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001960static PyObject *
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001961bytearray_join(PyByteArrayObject *self, PyObject *iterable_of_bytes)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03001962/*[clinic end generated code: output=a8516370bf68ae08 input=aba6b1f9b30fcb8e]*/
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001963{
Martin v. Löwis0efea322014-07-27 17:29:17 +02001964 return stringlib_bytes_join((PyObject*)self, iterable_of_bytes);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001965}
1966
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001967/*[clinic input]
1968bytearray.splitlines
Antoine Pitrouf2c54842010-01-13 08:07:53 +00001969
Serhiy Storchaka202fda52017-03-12 10:10:47 +02001970 keepends: bool(accept={int}) = False
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001971
1972Return a list of the lines in the bytearray, breaking at line boundaries.
1973
1974Line breaks are not included in the resulting list unless keepends is given and
1975true.
1976[clinic start generated code]*/
1977
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001978static PyObject *
1979bytearray_splitlines_impl(PyByteArrayObject *self, int keepends)
Serhiy Storchaka202fda52017-03-12 10:10:47 +02001980/*[clinic end generated code: output=4223c94b895f6ad9 input=99a27ad959b9cf6b]*/
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001981{
Antoine Pitrouf2c54842010-01-13 08:07:53 +00001982 return stringlib_splitlines(
1983 (PyObject*) self, PyByteArray_AS_STRING(self),
1984 PyByteArray_GET_SIZE(self), keepends
1985 );
1986}
1987
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001988/*[clinic input]
1989@classmethod
1990bytearray.fromhex
1991
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001992 string: unicode
1993 /
1994
1995Create a bytearray object from a string of hexadecimal numbers.
1996
1997Spaces between two numbers are accepted.
1998Example: bytearray.fromhex('B9 01EF') -> bytearray(b'\\xb9\\x01\\xef')
1999[clinic start generated code]*/
2000
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002001static PyObject *
Serhiy Storchaka0855e702016-07-01 17:22:31 +03002002bytearray_fromhex_impl(PyTypeObject *type, PyObject *string)
2003/*[clinic end generated code: output=8f0f0b6d30fb3ba0 input=f033a16d1fb21f48]*/
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002004{
Serhiy Storchaka0855e702016-07-01 17:22:31 +03002005 PyObject *result = _PyBytes_FromHex(string, type == &PyByteArray_Type);
2006 if (type != &PyByteArray_Type && result != NULL) {
Victor Stinnerde4ae3d2016-12-04 22:59:09 +01002007 Py_SETREF(result, PyObject_CallFunctionObjArgs((PyObject *)type,
2008 result, NULL));
Serhiy Storchaka0855e702016-07-01 17:22:31 +03002009 }
2010 return result;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002011}
2012
Gregory P. Smith8cb65692015-04-25 23:22:26 +00002013PyDoc_STRVAR(hex__doc__,
2014"B.hex() -> string\n\
2015\n\
2016Create a string of hexadecimal numbers from a bytearray object.\n\
2017Example: bytearray([0xb9, 0x01, 0xef]).hex() -> 'b901ef'.");
2018
2019static PyObject *
Serhiy Storchakae09132f2016-07-03 13:57:48 +03002020bytearray_hex(PyBytesObject *self)
2021{
2022 char* argbuf = PyByteArray_AS_STRING(self);
2023 Py_ssize_t arglen = PyByteArray_GET_SIZE(self);
2024 return _Py_strhex(argbuf, arglen);
2025}
2026
2027static PyObject *
Antoine Pitroub0e1f8b2011-12-05 20:40:08 +01002028_common_reduce(PyByteArrayObject *self, int proto)
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002029{
Antoine Pitroub0e1f8b2011-12-05 20:40:08 +01002030 PyObject *dict;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02002031 _Py_IDENTIFIER(__dict__);
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +02002032 char *buf;
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02002033
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02002034 dict = _PyObject_GetAttrId((PyObject *)self, &PyId___dict__);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002035 if (dict == NULL) {
2036 PyErr_Clear();
2037 dict = Py_None;
2038 Py_INCREF(dict);
2039 }
2040
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +02002041 buf = PyByteArray_AS_STRING(self);
Antoine Pitroub0e1f8b2011-12-05 20:40:08 +01002042 if (proto < 3) {
2043 /* use str based reduction for backwards compatibility with Python 2.x */
2044 PyObject *latin1;
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +02002045 if (Py_SIZE(self))
2046 latin1 = PyUnicode_DecodeLatin1(buf, Py_SIZE(self), NULL);
Antoine Pitroub0e1f8b2011-12-05 20:40:08 +01002047 else
2048 latin1 = PyUnicode_FromString("");
2049 return Py_BuildValue("(O(Ns)N)", Py_TYPE(self), latin1, "latin-1", dict);
2050 }
2051 else {
2052 /* use more efficient byte based reduction */
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +02002053 if (Py_SIZE(self)) {
2054 return Py_BuildValue("(O(y#)N)", Py_TYPE(self), buf, Py_SIZE(self), dict);
Antoine Pitroub0e1f8b2011-12-05 20:40:08 +01002055 }
2056 else {
2057 return Py_BuildValue("(O()N)", Py_TYPE(self), dict);
2058 }
2059 }
2060}
2061
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002062/*[clinic input]
2063bytearray.__reduce__ as bytearray_reduce
2064
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002065Return state information for pickling.
2066[clinic start generated code]*/
2067
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002068static PyObject *
2069bytearray_reduce_impl(PyByteArrayObject *self)
Serhiy Storchaka7a9579c2016-05-02 13:45:20 +03002070/*[clinic end generated code: output=52bf304086464cab input=44b5737ada62dd3f]*/
Antoine Pitroub0e1f8b2011-12-05 20:40:08 +01002071{
2072 return _common_reduce(self, 2);
2073}
2074
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002075/*[clinic input]
2076bytearray.__reduce_ex__ as bytearray_reduce_ex
2077
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002078 proto: int = 0
2079 /
2080
2081Return state information for pickling.
2082[clinic start generated code]*/
2083
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002084static PyObject *
2085bytearray_reduce_ex_impl(PyByteArrayObject *self, int proto)
Serhiy Storchaka7a9579c2016-05-02 13:45:20 +03002086/*[clinic end generated code: output=52eac33377197520 input=f129bc1a1aa151ee]*/
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002087{
Antoine Pitroub0e1f8b2011-12-05 20:40:08 +01002088 return _common_reduce(self, proto);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002089}
2090
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002091/*[clinic input]
2092bytearray.__sizeof__ as bytearray_sizeof
2093
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002094Returns the size of the bytearray object in memory, in bytes.
2095[clinic start generated code]*/
2096
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002097static PyObject *
2098bytearray_sizeof_impl(PyByteArrayObject *self)
Serhiy Storchaka7a9579c2016-05-02 13:45:20 +03002099/*[clinic end generated code: output=738abdd17951c427 input=e27320fd98a4bc5a]*/
Robert Schuppeniesfbe94c52008-07-14 10:13:31 +00002100{
Benjamin Petersonef3e4c22009-04-11 19:48:14 +00002101 Py_ssize_t res;
Robert Schuppeniesfbe94c52008-07-14 10:13:31 +00002102
Serhiy Storchaka5c4064e2015-12-19 20:05:25 +02002103 res = _PyObject_SIZE(Py_TYPE(self)) + self->ob_alloc * sizeof(char);
Benjamin Petersonef3e4c22009-04-11 19:48:14 +00002104 return PyLong_FromSsize_t(res);
Robert Schuppeniesfbe94c52008-07-14 10:13:31 +00002105}
2106
Benjamin Peterson153c70f2009-04-18 15:42:12 +00002107static PySequenceMethods bytearray_as_sequence = {
2108 (lenfunc)bytearray_length, /* sq_length */
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002109 (binaryfunc)PyByteArray_Concat, /* sq_concat */
Benjamin Peterson153c70f2009-04-18 15:42:12 +00002110 (ssizeargfunc)bytearray_repeat, /* sq_repeat */
2111 (ssizeargfunc)bytearray_getitem, /* sq_item */
2112 0, /* sq_slice */
2113 (ssizeobjargproc)bytearray_setitem, /* sq_ass_item */
2114 0, /* sq_ass_slice */
Serhiy Storchakae09132f2016-07-03 13:57:48 +03002115 (objobjproc)bytearray_contains, /* sq_contains */
Benjamin Peterson153c70f2009-04-18 15:42:12 +00002116 (binaryfunc)bytearray_iconcat, /* sq_inplace_concat */
2117 (ssizeargfunc)bytearray_irepeat, /* sq_inplace_repeat */
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002118};
2119
Benjamin Peterson153c70f2009-04-18 15:42:12 +00002120static PyMappingMethods bytearray_as_mapping = {
2121 (lenfunc)bytearray_length,
2122 (binaryfunc)bytearray_subscript,
2123 (objobjargproc)bytearray_ass_subscript,
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002124};
2125
Benjamin Peterson153c70f2009-04-18 15:42:12 +00002126static PyBufferProcs bytearray_as_buffer = {
2127 (getbufferproc)bytearray_getbuffer,
2128 (releasebufferproc)bytearray_releasebuffer,
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002129};
2130
2131static PyMethodDef
Benjamin Peterson153c70f2009-04-18 15:42:12 +00002132bytearray_methods[] = {
2133 {"__alloc__", (PyCFunction)bytearray_alloc, METH_NOARGS, alloc_doc},
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002134 BYTEARRAY_REDUCE_METHODDEF
2135 BYTEARRAY_REDUCE_EX_METHODDEF
2136 BYTEARRAY_SIZEOF_METHODDEF
2137 BYTEARRAY_APPEND_METHODDEF
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002138 {"capitalize", (PyCFunction)stringlib_capitalize, METH_NOARGS,
2139 _Py_capitalize__doc__},
Serhiy Storchakadd40fc32016-05-04 22:23:26 +03002140 {"center", (PyCFunction)stringlib_center, METH_VARARGS, _Py_center__doc__},
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002141 BYTEARRAY_CLEAR_METHODDEF
2142 BYTEARRAY_COPY_METHODDEF
Serhiy Storchakae09132f2016-07-03 13:57:48 +03002143 {"count", (PyCFunction)bytearray_count, METH_VARARGS,
Serhiy Storchakadd40fc32016-05-04 22:23:26 +03002144 _Py_count__doc__},
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002145 BYTEARRAY_DECODE_METHODDEF
Serhiy Storchakae09132f2016-07-03 13:57:48 +03002146 {"endswith", (PyCFunction)bytearray_endswith, METH_VARARGS,
Serhiy Storchakadd40fc32016-05-04 22:23:26 +03002147 _Py_endswith__doc__},
Ezio Melotti745d54d2013-11-16 19:10:57 +02002148 {"expandtabs", (PyCFunction)stringlib_expandtabs, METH_VARARGS | METH_KEYWORDS,
Serhiy Storchakadd40fc32016-05-04 22:23:26 +03002149 _Py_expandtabs__doc__},
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
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002157 {"isalnum", (PyCFunction)stringlib_isalnum, METH_NOARGS,
2158 _Py_isalnum__doc__},
2159 {"isalpha", (PyCFunction)stringlib_isalpha, METH_NOARGS,
2160 _Py_isalpha__doc__},
INADA Naokia49ac992018-01-27 14:06:21 +09002161 {"isascii", (PyCFunction)stringlib_isascii, METH_NOARGS,
2162 _Py_isascii__doc__},
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002163 {"isdigit", (PyCFunction)stringlib_isdigit, METH_NOARGS,
2164 _Py_isdigit__doc__},
2165 {"islower", (PyCFunction)stringlib_islower, METH_NOARGS,
2166 _Py_islower__doc__},
2167 {"isspace", (PyCFunction)stringlib_isspace, METH_NOARGS,
2168 _Py_isspace__doc__},
2169 {"istitle", (PyCFunction)stringlib_istitle, METH_NOARGS,
2170 _Py_istitle__doc__},
2171 {"isupper", (PyCFunction)stringlib_isupper, METH_NOARGS,
2172 _Py_isupper__doc__},
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002173 BYTEARRAY_JOIN_METHODDEF
Serhiy Storchakadd40fc32016-05-04 22:23:26 +03002174 {"ljust", (PyCFunction)stringlib_ljust, METH_VARARGS, _Py_ljust__doc__},
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002175 {"lower", (PyCFunction)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__},
Serhiy Storchakadd40fc32016-05-04 22:23:26 +03002185 {"rjust", (PyCFunction)stringlib_rjust, METH_VARARGS, _Py_rjust__doc__},
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
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002194 {"swapcase", (PyCFunction)stringlib_swapcase, METH_NOARGS,
2195 _Py_swapcase__doc__},
2196 {"title", (PyCFunction)stringlib_title, METH_NOARGS, _Py_title__doc__},
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002197 BYTEARRAY_TRANSLATE_METHODDEF
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002198 {"upper", (PyCFunction)stringlib_upper, METH_NOARGS, _Py_upper__doc__},
Serhiy Storchakadd40fc32016-05-04 22:23:26 +03002199 {"zfill", (PyCFunction)stringlib_zfill, METH_VARARGS, _Py_zfill__doc__},
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 *
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00002326bytearrayiter_length_hint(bytesiterobject *it)
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 *
2342bytearrayiter_reduce(bytesiterobject *it)
2343{
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}