blob: e32331d138aab7ea270364a2e8b932adee5e613f [file] [log] [blame]
Guido van Rossum254348e2007-11-21 19:29:53 +00001/* PyBytes (bytearray) implementation */
Guido van Rossum4dfe8a12006-04-22 23:28:04 +00002
Guido van Rossum4dfe8a12006-04-22 23:28:04 +00003#define PY_SSIZE_T_CLEAN
4#include "Python.h"
Guido van Rossuma0867f72006-05-05 04:34:18 +00005#include "structmember.h"
Gregory P. Smith60d241f2007-10-16 06:31:30 +00006#include "bytes_methods.h"
Guido van Rossum4dfe8a12006-04-22 23:28:04 +00007
Neal Norwitz6968b052007-02-27 19:02:19 +00008static PyBytesObject *nullbytes = NULL;
9
10void
11PyBytes_Fini(void)
12{
13 Py_CLEAR(nullbytes);
14}
15
16int
17PyBytes_Init(void)
18{
19 nullbytes = PyObject_New(PyBytesObject, &PyBytes_Type);
20 if (nullbytes == NULL)
21 return 0;
22 nullbytes->ob_bytes = NULL;
Christian Heimes90aa7642007-12-19 02:45:37 +000023 Py_SIZE(nullbytes) = nullbytes->ob_alloc = 0;
Travis E. Oliphantb99f7622007-08-18 11:21:56 +000024 nullbytes->ob_exports = 0;
Neal Norwitz6968b052007-02-27 19:02:19 +000025 return 1;
26}
27
28/* end nullbytes support */
29
Guido van Rossumad7d8d12007-04-13 01:39:34 +000030/* Helpers */
31
32static int
33_getbytevalue(PyObject* arg, int *value)
Neal Norwitz6968b052007-02-27 19:02:19 +000034{
Gregory P. Smith60d241f2007-10-16 06:31:30 +000035 long face_value;
36
Christian Heimes217cfd12007-12-02 14:31:20 +000037 if (PyLong_Check(arg)) {
38 face_value = PyLong_AsLong(arg);
Gregory P. Smith60d241f2007-10-16 06:31:30 +000039 if (face_value < 0 || face_value >= 256) {
40 PyErr_SetString(PyExc_ValueError, "byte must be in range(0, 256)");
41 return 0;
42 }
43 } else {
44 PyErr_Format(PyExc_TypeError, "an integer is required");
Neal Norwitz6968b052007-02-27 19:02:19 +000045 return 0;
46 }
Gregory P. Smith60d241f2007-10-16 06:31:30 +000047
48 *value = face_value;
Neal Norwitz6968b052007-02-27 19:02:19 +000049 return 1;
50}
51
Travis E. Oliphantb99f7622007-08-18 11:21:56 +000052static int
Travis E. Oliphant8ae62b62007-09-23 02:00:13 +000053bytes_getbuffer(PyBytesObject *obj, Py_buffer *view, int flags)
Guido van Rossum75d38e92007-08-24 17:33:11 +000054{
Alexandre Vassalottie0313f22008-04-14 20:53:13 +000055 int ret;
56 void *ptr;
57 if (view == NULL) {
58 obj->ob_exports++;
59 return 0;
60 }
61 if (obj->ob_bytes == NULL)
62 ptr = "";
63 else
64 ptr = obj->ob_bytes;
65 ret = PyBuffer_FillInfo(view, ptr, Py_SIZE(obj), 0, flags);
66 if (ret >= 0) {
67 obj->ob_exports++;
68 }
69 return ret;
Travis E. Oliphantb99f7622007-08-18 11:21:56 +000070}
71
72static void
Travis E. Oliphant8ae62b62007-09-23 02:00:13 +000073bytes_releasebuffer(PyBytesObject *obj, Py_buffer *view)
Travis E. Oliphantb99f7622007-08-18 11:21:56 +000074{
Alexandre Vassalottie0313f22008-04-14 20:53:13 +000075 obj->ob_exports--;
Travis E. Oliphantb99f7622007-08-18 11:21:56 +000076}
77
Neal Norwitz2bad9702007-08-27 06:19:22 +000078static Py_ssize_t
Travis E. Oliphant8ae62b62007-09-23 02:00:13 +000079_getbuffer(PyObject *obj, Py_buffer *view)
Guido van Rossumad7d8d12007-04-13 01:39:34 +000080{
Christian Heimes90aa7642007-12-19 02:45:37 +000081 PyBufferProcs *buffer = Py_TYPE(obj)->tp_as_buffer;
Guido van Rossumad7d8d12007-04-13 01:39:34 +000082
Gregory P. Smith60d241f2007-10-16 06:31:30 +000083 if (buffer == NULL || buffer->bf_getbuffer == NULL)
Guido van Rossuma74184e2007-08-29 04:05:57 +000084 {
85 PyErr_Format(PyExc_TypeError,
86 "Type %.100s doesn't support the buffer API",
Christian Heimes90aa7642007-12-19 02:45:37 +000087 Py_TYPE(obj)->tp_name);
Guido van Rossuma74184e2007-08-29 04:05:57 +000088 return -1;
89 }
Guido van Rossumad7d8d12007-04-13 01:39:34 +000090
Travis E. Oliphantb99f7622007-08-18 11:21:56 +000091 if (buffer->bf_getbuffer(obj, view, PyBUF_SIMPLE) < 0)
92 return -1;
93 return view->len;
Guido van Rossumad7d8d12007-04-13 01:39:34 +000094}
95
Guido van Rossum4dfe8a12006-04-22 23:28:04 +000096/* Direct API functions */
97
98PyObject *
Guido van Rossumd624f182006-04-24 13:47:05 +000099PyBytes_FromObject(PyObject *input)
100{
101 return PyObject_CallFunctionObjArgs((PyObject *)&PyBytes_Type,
102 input, NULL);
103}
104
105PyObject *
106PyBytes_FromStringAndSize(const char *bytes, Py_ssize_t size)
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000107{
108 PyBytesObject *new;
Neal Norwitz61ec0d32007-10-26 06:44:10 +0000109 Py_ssize_t alloc;
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000110
Christian Heimes33fe8092008-04-13 13:53:33 +0000111 if (size < 0) {
112 PyErr_SetString(PyExc_SystemError,
113 "Negative size passed to PyBytes_FromStringAndSize");
114 return NULL;
115 }
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000116
117 new = PyObject_New(PyBytesObject, &PyBytes_Type);
118 if (new == NULL)
Guido van Rossumd624f182006-04-24 13:47:05 +0000119 return NULL;
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000120
Guido van Rossumf15a29f2007-05-04 00:41:39 +0000121 if (size == 0) {
Guido van Rossumd624f182006-04-24 13:47:05 +0000122 new->ob_bytes = NULL;
Guido van Rossumf15a29f2007-05-04 00:41:39 +0000123 alloc = 0;
124 }
Guido van Rossumd624f182006-04-24 13:47:05 +0000125 else {
Guido van Rossumf15a29f2007-05-04 00:41:39 +0000126 alloc = size + 1;
127 new->ob_bytes = PyMem_Malloc(alloc);
Guido van Rossumd624f182006-04-24 13:47:05 +0000128 if (new->ob_bytes == NULL) {
129 Py_DECREF(new);
Neal Norwitz16596dd2007-08-30 05:44:54 +0000130 return PyErr_NoMemory();
Guido van Rossumd624f182006-04-24 13:47:05 +0000131 }
132 if (bytes != NULL)
133 memcpy(new->ob_bytes, bytes, size);
Guido van Rossumf15a29f2007-05-04 00:41:39 +0000134 new->ob_bytes[size] = '\0'; /* Trailing null byte */
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000135 }
Christian Heimes90aa7642007-12-19 02:45:37 +0000136 Py_SIZE(new) = size;
Guido van Rossumf15a29f2007-05-04 00:41:39 +0000137 new->ob_alloc = alloc;
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000138 new->ob_exports = 0;
Guido van Rossumb6f1fdc2007-04-12 22:49:52 +0000139
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000140 return (PyObject *)new;
141}
142
143Py_ssize_t
144PyBytes_Size(PyObject *self)
145{
146 assert(self != NULL);
147 assert(PyBytes_Check(self));
148
Guido van Rossum20188312006-05-05 15:15:40 +0000149 return PyBytes_GET_SIZE(self);
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000150}
151
152char *
153PyBytes_AsString(PyObject *self)
154{
155 assert(self != NULL);
156 assert(PyBytes_Check(self));
157
Guido van Rossum20188312006-05-05 15:15:40 +0000158 return PyBytes_AS_STRING(self);
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000159}
160
161int
162PyBytes_Resize(PyObject *self, Py_ssize_t size)
163{
164 void *sval;
Guido van Rossuma0867f72006-05-05 04:34:18 +0000165 Py_ssize_t alloc = ((PyBytesObject *)self)->ob_alloc;
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000166
167 assert(self != NULL);
168 assert(PyBytes_Check(self));
169 assert(size >= 0);
170
Guido van Rossuma0867f72006-05-05 04:34:18 +0000171 if (size < alloc / 2) {
172 /* Major downsize; resize down to exact size */
Guido van Rossum6c1e6742007-05-04 04:27:16 +0000173 alloc = size + 1;
Guido van Rossuma0867f72006-05-05 04:34:18 +0000174 }
Guido van Rossumf15a29f2007-05-04 00:41:39 +0000175 else if (size < alloc) {
Guido van Rossuma0867f72006-05-05 04:34:18 +0000176 /* Within allocated size; quick exit */
Christian Heimes90aa7642007-12-19 02:45:37 +0000177 Py_SIZE(self) = size;
Guido van Rossuma74184e2007-08-29 04:05:57 +0000178 ((PyBytesObject *)self)->ob_bytes[size] = '\0'; /* Trailing null */
Guido van Rossuma0867f72006-05-05 04:34:18 +0000179 return 0;
180 }
181 else if (size <= alloc * 1.125) {
182 /* Moderate upsize; overallocate similar to list_resize() */
183 alloc = size + (size >> 3) + (size < 9 ? 3 : 6);
184 }
185 else {
186 /* Major upsize; resize up to exact size */
Guido van Rossumf15a29f2007-05-04 00:41:39 +0000187 alloc = size + 1;
Guido van Rossum6c1e6742007-05-04 04:27:16 +0000188 }
Guido van Rossuma0867f72006-05-05 04:34:18 +0000189
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000190 if (((PyBytesObject *)self)->ob_exports > 0) {
191 /*
Guido van Rossuma74184e2007-08-29 04:05:57 +0000192 fprintf(stderr, "%d: %s", ((PyBytesObject *)self)->ob_exports,
193 ((PyBytesObject *)self)->ob_bytes);
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000194 */
195 PyErr_SetString(PyExc_BufferError,
Guido van Rossuma74184e2007-08-29 04:05:57 +0000196 "Existing exports of data: object cannot be re-sized");
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000197 return -1;
198 }
199
Guido van Rossuma0867f72006-05-05 04:34:18 +0000200 sval = PyMem_Realloc(((PyBytesObject *)self)->ob_bytes, alloc);
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000201 if (sval == NULL) {
Guido van Rossumd624f182006-04-24 13:47:05 +0000202 PyErr_NoMemory();
203 return -1;
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000204 }
205
Guido van Rossumd624f182006-04-24 13:47:05 +0000206 ((PyBytesObject *)self)->ob_bytes = sval;
Christian Heimes90aa7642007-12-19 02:45:37 +0000207 Py_SIZE(self) = size;
Guido van Rossuma0867f72006-05-05 04:34:18 +0000208 ((PyBytesObject *)self)->ob_alloc = alloc;
Guido van Rossumf15a29f2007-05-04 00:41:39 +0000209 ((PyBytesObject *)self)->ob_bytes[size] = '\0'; /* Trailing null byte */
210
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000211 return 0;
212}
213
Guido van Rossumad7d8d12007-04-13 01:39:34 +0000214PyObject *
215PyBytes_Concat(PyObject *a, PyObject *b)
216{
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000217 Py_ssize_t size;
Travis E. Oliphant8ae62b62007-09-23 02:00:13 +0000218 Py_buffer va, vb;
Guido van Rossum98297ee2007-11-06 21:34:58 +0000219 PyBytesObject *result = NULL;
Guido van Rossumad7d8d12007-04-13 01:39:34 +0000220
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000221 va.len = -1;
222 vb.len = -1;
223 if (_getbuffer(a, &va) < 0 ||
224 _getbuffer(b, &vb) < 0) {
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000225 PyErr_Format(PyExc_TypeError, "can't concat %.100s to %.100s",
Christian Heimes90aa7642007-12-19 02:45:37 +0000226 Py_TYPE(a)->tp_name, Py_TYPE(b)->tp_name);
Guido van Rossum98297ee2007-11-06 21:34:58 +0000227 goto done;
Guido van Rossumad7d8d12007-04-13 01:39:34 +0000228 }
229
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000230 size = va.len + vb.len;
231 if (size < 0) {
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000232 return PyErr_NoMemory();
Guido van Rossum98297ee2007-11-06 21:34:58 +0000233 goto done;
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000234 }
Guido van Rossumad7d8d12007-04-13 01:39:34 +0000235
236 result = (PyBytesObject *) PyBytes_FromStringAndSize(NULL, size);
237 if (result != NULL) {
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000238 memcpy(result->ob_bytes, va.buf, va.len);
239 memcpy(result->ob_bytes + va.len, vb.buf, vb.len);
Guido van Rossumad7d8d12007-04-13 01:39:34 +0000240 }
Guido van Rossum75d38e92007-08-24 17:33:11 +0000241
Guido van Rossum98297ee2007-11-06 21:34:58 +0000242 done:
243 if (va.len != -1)
244 PyObject_ReleaseBuffer(a, &va);
245 if (vb.len != -1)
246 PyObject_ReleaseBuffer(b, &vb);
Guido van Rossumad7d8d12007-04-13 01:39:34 +0000247 return (PyObject *)result;
248}
249
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000250/* Functions stuffed into the type object */
251
252static Py_ssize_t
253bytes_length(PyBytesObject *self)
254{
Christian Heimes90aa7642007-12-19 02:45:37 +0000255 return Py_SIZE(self);
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000256}
257
258static PyObject *
Guido van Rossum13e57212006-04-27 22:54:26 +0000259bytes_iconcat(PyBytesObject *self, PyObject *other)
260{
Guido van Rossumad7d8d12007-04-13 01:39:34 +0000261 Py_ssize_t mysize;
Guido van Rossum13e57212006-04-27 22:54:26 +0000262 Py_ssize_t size;
Travis E. Oliphant8ae62b62007-09-23 02:00:13 +0000263 Py_buffer vo;
Guido van Rossum13e57212006-04-27 22:54:26 +0000264
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000265 if (_getbuffer(other, &vo) < 0) {
Guido van Rossuma74184e2007-08-29 04:05:57 +0000266 PyErr_Format(PyExc_TypeError, "can't concat bytes to %.100s",
Christian Heimes90aa7642007-12-19 02:45:37 +0000267 Py_TYPE(self)->tp_name);
Guido van Rossuma74184e2007-08-29 04:05:57 +0000268 return NULL;
Guido van Rossum13e57212006-04-27 22:54:26 +0000269 }
270
Christian Heimes90aa7642007-12-19 02:45:37 +0000271 mysize = Py_SIZE(self);
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000272 size = mysize + vo.len;
273 if (size < 0) {
Guido van Rossuma74184e2007-08-29 04:05:57 +0000274 PyObject_ReleaseBuffer(other, &vo);
275 return PyErr_NoMemory();
Guido van Rossum6c1e6742007-05-04 04:27:16 +0000276 }
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000277 if (size < self->ob_alloc) {
Christian Heimes90aa7642007-12-19 02:45:37 +0000278 Py_SIZE(self) = size;
279 self->ob_bytes[Py_SIZE(self)] = '\0'; /* Trailing null byte */
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000280 }
281 else if (PyBytes_Resize((PyObject *)self, size) < 0) {
Guido van Rossuma74184e2007-08-29 04:05:57 +0000282 PyObject_ReleaseBuffer(other, &vo);
283 return NULL;
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000284 }
285 memcpy(self->ob_bytes + mysize, vo.buf, vo.len);
286 PyObject_ReleaseBuffer(other, &vo);
Guido van Rossum13e57212006-04-27 22:54:26 +0000287 Py_INCREF(self);
288 return (PyObject *)self;
289}
290
291static PyObject *
Guido van Rossumd624f182006-04-24 13:47:05 +0000292bytes_repeat(PyBytesObject *self, Py_ssize_t count)
293{
294 PyBytesObject *result;
295 Py_ssize_t mysize;
296 Py_ssize_t size;
297
298 if (count < 0)
299 count = 0;
Christian Heimes90aa7642007-12-19 02:45:37 +0000300 mysize = Py_SIZE(self);
Guido van Rossumd624f182006-04-24 13:47:05 +0000301 size = mysize * count;
302 if (count != 0 && size / count != mysize)
303 return PyErr_NoMemory();
Guido van Rossumf15a29f2007-05-04 00:41:39 +0000304 result = (PyBytesObject *)PyBytes_FromStringAndSize(NULL, size);
Guido van Rossumd624f182006-04-24 13:47:05 +0000305 if (result != NULL && size != 0) {
306 if (mysize == 1)
307 memset(result->ob_bytes, self->ob_bytes[0], size);
308 else {
Guido van Rossum13e57212006-04-27 22:54:26 +0000309 Py_ssize_t i;
Guido van Rossumd624f182006-04-24 13:47:05 +0000310 for (i = 0; i < count; i++)
311 memcpy(result->ob_bytes + i*mysize, self->ob_bytes, mysize);
312 }
313 }
314 return (PyObject *)result;
315}
316
317static PyObject *
Guido van Rossum13e57212006-04-27 22:54:26 +0000318bytes_irepeat(PyBytesObject *self, Py_ssize_t count)
319{
320 Py_ssize_t mysize;
321 Py_ssize_t size;
322
323 if (count < 0)
324 count = 0;
Christian Heimes90aa7642007-12-19 02:45:37 +0000325 mysize = Py_SIZE(self);
Guido van Rossum13e57212006-04-27 22:54:26 +0000326 size = mysize * count;
327 if (count != 0 && size / count != mysize)
328 return PyErr_NoMemory();
Guido van Rossum6c1e6742007-05-04 04:27:16 +0000329 if (size < self->ob_alloc) {
Christian Heimes90aa7642007-12-19 02:45:37 +0000330 Py_SIZE(self) = size;
331 self->ob_bytes[Py_SIZE(self)] = '\0'; /* Trailing null byte */
Guido van Rossum6c1e6742007-05-04 04:27:16 +0000332 }
Guido van Rossuma0867f72006-05-05 04:34:18 +0000333 else if (PyBytes_Resize((PyObject *)self, size) < 0)
Guido van Rossum13e57212006-04-27 22:54:26 +0000334 return NULL;
Guido van Rossumb6f1fdc2007-04-12 22:49:52 +0000335
Guido van Rossum13e57212006-04-27 22:54:26 +0000336 if (mysize == 1)
337 memset(self->ob_bytes, self->ob_bytes[0], size);
338 else {
339 Py_ssize_t i;
340 for (i = 1; i < count; i++)
341 memcpy(self->ob_bytes + i*mysize, self->ob_bytes, mysize);
342 }
343
344 Py_INCREF(self);
345 return (PyObject *)self;
346}
347
Guido van Rossum13e57212006-04-27 22:54:26 +0000348static PyObject *
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000349bytes_getitem(PyBytesObject *self, Py_ssize_t i)
350{
351 if (i < 0)
Christian Heimes90aa7642007-12-19 02:45:37 +0000352 i += Py_SIZE(self);
353 if (i < 0 || i >= Py_SIZE(self)) {
Guido van Rossum254348e2007-11-21 19:29:53 +0000354 PyErr_SetString(PyExc_IndexError, "bytearray index out of range");
Guido van Rossumd624f182006-04-24 13:47:05 +0000355 return NULL;
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000356 }
Christian Heimes217cfd12007-12-02 14:31:20 +0000357 return PyLong_FromLong((unsigned char)(self->ob_bytes[i]));
Guido van Rossumd624f182006-04-24 13:47:05 +0000358}
359
360static PyObject *
Thomas Wouters376446d2006-12-19 08:30:14 +0000361bytes_subscript(PyBytesObject *self, PyObject *item)
Guido van Rossumd624f182006-04-24 13:47:05 +0000362{
Thomas Wouters376446d2006-12-19 08:30:14 +0000363 if (PyIndex_Check(item)) {
364 Py_ssize_t i = PyNumber_AsSsize_t(item, PyExc_IndexError);
Guido van Rossumd624f182006-04-24 13:47:05 +0000365
Thomas Wouters376446d2006-12-19 08:30:14 +0000366 if (i == -1 && PyErr_Occurred())
367 return NULL;
368
369 if (i < 0)
370 i += PyBytes_GET_SIZE(self);
371
Christian Heimes90aa7642007-12-19 02:45:37 +0000372 if (i < 0 || i >= Py_SIZE(self)) {
Guido van Rossum254348e2007-11-21 19:29:53 +0000373 PyErr_SetString(PyExc_IndexError, "bytearray index out of range");
Thomas Wouters376446d2006-12-19 08:30:14 +0000374 return NULL;
375 }
Christian Heimes217cfd12007-12-02 14:31:20 +0000376 return PyLong_FromLong((unsigned char)(self->ob_bytes[i]));
Thomas Wouters376446d2006-12-19 08:30:14 +0000377 }
378 else if (PySlice_Check(item)) {
379 Py_ssize_t start, stop, step, slicelength, cur, i;
380 if (PySlice_GetIndicesEx((PySliceObject *)item,
381 PyBytes_GET_SIZE(self),
382 &start, &stop, &step, &slicelength) < 0) {
383 return NULL;
384 }
Guido van Rossumb6f1fdc2007-04-12 22:49:52 +0000385
Thomas Wouters376446d2006-12-19 08:30:14 +0000386 if (slicelength <= 0)
387 return PyBytes_FromStringAndSize("", 0);
388 else if (step == 1) {
389 return PyBytes_FromStringAndSize(self->ob_bytes + start,
390 slicelength);
391 }
392 else {
393 char *source_buf = PyBytes_AS_STRING(self);
394 char *result_buf = (char *)PyMem_Malloc(slicelength);
395 PyObject *result;
Guido van Rossumb6f1fdc2007-04-12 22:49:52 +0000396
Thomas Wouters376446d2006-12-19 08:30:14 +0000397 if (result_buf == NULL)
398 return PyErr_NoMemory();
Guido van Rossumb6f1fdc2007-04-12 22:49:52 +0000399
Thomas Wouters376446d2006-12-19 08:30:14 +0000400 for (cur = start, i = 0; i < slicelength;
401 cur += step, i++) {
402 result_buf[i] = source_buf[cur];
403 }
404 result = PyBytes_FromStringAndSize(result_buf, slicelength);
405 PyMem_Free(result_buf);
406 return result;
407 }
408 }
409 else {
Guido van Rossum254348e2007-11-21 19:29:53 +0000410 PyErr_SetString(PyExc_TypeError, "bytearray indices must be integers");
Thomas Wouters376446d2006-12-19 08:30:14 +0000411 return NULL;
412 }
413}
Guido van Rossumb6f1fdc2007-04-12 22:49:52 +0000414
Guido van Rossumd624f182006-04-24 13:47:05 +0000415static int
Thomas Wouters376446d2006-12-19 08:30:14 +0000416bytes_setslice(PyBytesObject *self, Py_ssize_t lo, Py_ssize_t hi,
Guido van Rossumd624f182006-04-24 13:47:05 +0000417 PyObject *values)
418{
Guido van Rossumad7d8d12007-04-13 01:39:34 +0000419 Py_ssize_t avail, needed;
420 void *bytes;
Travis E. Oliphant8ae62b62007-09-23 02:00:13 +0000421 Py_buffer vbytes;
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000422 int res = 0;
Guido van Rossumd624f182006-04-24 13:47:05 +0000423
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000424 vbytes.len = -1;
Guido van Rossumad7d8d12007-04-13 01:39:34 +0000425 if (values == (PyObject *)self) {
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000426 /* Make a copy and call this function recursively */
Guido van Rossumd624f182006-04-24 13:47:05 +0000427 int err;
428 values = PyBytes_FromObject(values);
429 if (values == NULL)
430 return -1;
431 err = bytes_setslice(self, lo, hi, values);
432 Py_DECREF(values);
433 return err;
434 }
Guido van Rossumad7d8d12007-04-13 01:39:34 +0000435 if (values == NULL) {
436 /* del b[lo:hi] */
437 bytes = NULL;
438 needed = 0;
439 }
Guido van Rossumd624f182006-04-24 13:47:05 +0000440 else {
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000441 if (_getbuffer(values, &vbytes) < 0) {
442 PyErr_Format(PyExc_TypeError,
443 "can't set bytes slice from %.100s",
Christian Heimes90aa7642007-12-19 02:45:37 +0000444 Py_TYPE(values)->tp_name);
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000445 return -1;
446 }
447 needed = vbytes.len;
448 bytes = vbytes.buf;
Guido van Rossumd624f182006-04-24 13:47:05 +0000449 }
450
451 if (lo < 0)
452 lo = 0;
Thomas Wouters9a6e62b2006-08-23 23:20:29 +0000453 if (hi < lo)
454 hi = lo;
Christian Heimes90aa7642007-12-19 02:45:37 +0000455 if (hi > Py_SIZE(self))
456 hi = Py_SIZE(self);
Guido van Rossumd624f182006-04-24 13:47:05 +0000457
458 avail = hi - lo;
459 if (avail < 0)
460 lo = hi = avail = 0;
461
462 if (avail != needed) {
463 if (avail > needed) {
464 /*
465 0 lo hi old_size
466 | |<----avail----->|<-----tomove------>|
467 | |<-needed->|<-----tomove------>|
468 0 lo new_hi new_size
469 */
470 memmove(self->ob_bytes + lo + needed, self->ob_bytes + hi,
Christian Heimes90aa7642007-12-19 02:45:37 +0000471 Py_SIZE(self) - hi);
Guido van Rossumd624f182006-04-24 13:47:05 +0000472 }
Guido van Rossuma74184e2007-08-29 04:05:57 +0000473 /* XXX(nnorwitz): need to verify this can't overflow! */
Thomas Wouters376446d2006-12-19 08:30:14 +0000474 if (PyBytes_Resize((PyObject *)self,
Christian Heimes90aa7642007-12-19 02:45:37 +0000475 Py_SIZE(self) + needed - avail) < 0) {
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000476 res = -1;
477 goto finish;
478 }
Guido van Rossumd624f182006-04-24 13:47:05 +0000479 if (avail < needed) {
480 /*
481 0 lo hi old_size
482 | |<-avail->|<-----tomove------>|
483 | |<----needed---->|<-----tomove------>|
484 0 lo new_hi new_size
485 */
486 memmove(self->ob_bytes + lo + needed, self->ob_bytes + hi,
Christian Heimes90aa7642007-12-19 02:45:37 +0000487 Py_SIZE(self) - lo - needed);
Guido van Rossumd624f182006-04-24 13:47:05 +0000488 }
489 }
490
491 if (needed > 0)
492 memcpy(self->ob_bytes + lo, bytes, needed);
493
Guido van Rossum75d38e92007-08-24 17:33:11 +0000494
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000495 finish:
Guido van Rossum75d38e92007-08-24 17:33:11 +0000496 if (vbytes.len != -1)
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000497 PyObject_ReleaseBuffer(values, &vbytes);
498 return res;
Guido van Rossumd624f182006-04-24 13:47:05 +0000499}
500
501static int
502bytes_setitem(PyBytesObject *self, Py_ssize_t i, PyObject *value)
503{
504 Py_ssize_t ival;
505
506 if (i < 0)
Christian Heimes90aa7642007-12-19 02:45:37 +0000507 i += Py_SIZE(self);
Guido van Rossumd624f182006-04-24 13:47:05 +0000508
Christian Heimes90aa7642007-12-19 02:45:37 +0000509 if (i < 0 || i >= Py_SIZE(self)) {
Guido van Rossum254348e2007-11-21 19:29:53 +0000510 PyErr_SetString(PyExc_IndexError, "bytearray index out of range");
Guido van Rossumd624f182006-04-24 13:47:05 +0000511 return -1;
512 }
513
514 if (value == NULL)
515 return bytes_setslice(self, i, i+1, NULL);
516
Thomas Woutersd204a712006-08-22 13:41:17 +0000517 ival = PyNumber_AsSsize_t(value, PyExc_ValueError);
Guido van Rossumd624f182006-04-24 13:47:05 +0000518 if (ival == -1 && PyErr_Occurred())
519 return -1;
520
521 if (ival < 0 || ival >= 256) {
522 PyErr_SetString(PyExc_ValueError, "byte must be in range(0, 256)");
523 return -1;
524 }
525
526 self->ob_bytes[i] = ival;
527 return 0;
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000528}
529
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000530static int
Thomas Wouters376446d2006-12-19 08:30:14 +0000531bytes_ass_subscript(PyBytesObject *self, PyObject *item, PyObject *values)
532{
533 Py_ssize_t start, stop, step, slicelen, needed;
534 char *bytes;
Guido van Rossumb6f1fdc2007-04-12 22:49:52 +0000535
Thomas Wouters376446d2006-12-19 08:30:14 +0000536 if (PyIndex_Check(item)) {
537 Py_ssize_t i = PyNumber_AsSsize_t(item, PyExc_IndexError);
538
539 if (i == -1 && PyErr_Occurred())
540 return -1;
541
542 if (i < 0)
543 i += PyBytes_GET_SIZE(self);
544
Christian Heimes90aa7642007-12-19 02:45:37 +0000545 if (i < 0 || i >= Py_SIZE(self)) {
Guido van Rossum254348e2007-11-21 19:29:53 +0000546 PyErr_SetString(PyExc_IndexError, "bytearray index out of range");
Thomas Wouters376446d2006-12-19 08:30:14 +0000547 return -1;
548 }
Guido van Rossumb6f1fdc2007-04-12 22:49:52 +0000549
Thomas Wouters376446d2006-12-19 08:30:14 +0000550 if (values == NULL) {
551 /* Fall through to slice assignment */
552 start = i;
553 stop = i + 1;
554 step = 1;
555 slicelen = 1;
556 }
557 else {
558 Py_ssize_t ival = PyNumber_AsSsize_t(values, PyExc_ValueError);
559 if (ival == -1 && PyErr_Occurred())
560 return -1;
561 if (ival < 0 || ival >= 256) {
562 PyErr_SetString(PyExc_ValueError,
563 "byte must be in range(0, 256)");
564 return -1;
565 }
566 self->ob_bytes[i] = (char)ival;
567 return 0;
568 }
569 }
570 else if (PySlice_Check(item)) {
571 if (PySlice_GetIndicesEx((PySliceObject *)item,
572 PyBytes_GET_SIZE(self),
573 &start, &stop, &step, &slicelen) < 0) {
574 return -1;
575 }
576 }
577 else {
Guido van Rossum254348e2007-11-21 19:29:53 +0000578 PyErr_SetString(PyExc_TypeError, "bytearray indices must be integer");
Thomas Wouters376446d2006-12-19 08:30:14 +0000579 return -1;
580 }
581
582 if (values == NULL) {
583 bytes = NULL;
584 needed = 0;
585 }
586 else if (values == (PyObject *)self || !PyBytes_Check(values)) {
587 /* Make a copy an call this function recursively */
588 int err;
589 values = PyBytes_FromObject(values);
590 if (values == NULL)
591 return -1;
592 err = bytes_ass_subscript(self, item, values);
593 Py_DECREF(values);
594 return err;
595 }
596 else {
597 assert(PyBytes_Check(values));
598 bytes = ((PyBytesObject *)values)->ob_bytes;
Christian Heimes90aa7642007-12-19 02:45:37 +0000599 needed = Py_SIZE(values);
Thomas Wouters376446d2006-12-19 08:30:14 +0000600 }
601 /* Make sure b[5:2] = ... inserts before 5, not before 2. */
602 if ((step < 0 && start < stop) ||
603 (step > 0 && start > stop))
604 stop = start;
605 if (step == 1) {
606 if (slicelen != needed) {
607 if (slicelen > needed) {
608 /*
609 0 start stop old_size
610 | |<---slicelen--->|<-----tomove------>|
611 | |<-needed->|<-----tomove------>|
612 0 lo new_hi new_size
613 */
614 memmove(self->ob_bytes + start + needed, self->ob_bytes + stop,
Christian Heimes90aa7642007-12-19 02:45:37 +0000615 Py_SIZE(self) - stop);
Thomas Wouters376446d2006-12-19 08:30:14 +0000616 }
617 if (PyBytes_Resize((PyObject *)self,
Christian Heimes90aa7642007-12-19 02:45:37 +0000618 Py_SIZE(self) + needed - slicelen) < 0)
Thomas Wouters376446d2006-12-19 08:30:14 +0000619 return -1;
620 if (slicelen < needed) {
621 /*
622 0 lo hi old_size
623 | |<-avail->|<-----tomove------>|
624 | |<----needed---->|<-----tomove------>|
625 0 lo new_hi new_size
626 */
627 memmove(self->ob_bytes + start + needed, self->ob_bytes + stop,
Christian Heimes90aa7642007-12-19 02:45:37 +0000628 Py_SIZE(self) - start - needed);
Thomas Wouters376446d2006-12-19 08:30:14 +0000629 }
630 }
631
632 if (needed > 0)
633 memcpy(self->ob_bytes + start, bytes, needed);
634
635 return 0;
636 }
637 else {
638 if (needed == 0) {
639 /* Delete slice */
640 Py_ssize_t cur, i;
Guido van Rossumb6f1fdc2007-04-12 22:49:52 +0000641
Thomas Wouters376446d2006-12-19 08:30:14 +0000642 if (step < 0) {
643 stop = start + 1;
644 start = stop + step * (slicelen - 1) - 1;
645 step = -step;
646 }
647 for (cur = start, i = 0;
648 i < slicelen; cur += step, i++) {
649 Py_ssize_t lim = step - 1;
650
651 if (cur + step >= PyBytes_GET_SIZE(self))
652 lim = PyBytes_GET_SIZE(self) - cur - 1;
Guido van Rossumb6f1fdc2007-04-12 22:49:52 +0000653
Thomas Wouters376446d2006-12-19 08:30:14 +0000654 memmove(self->ob_bytes + cur - i,
655 self->ob_bytes + cur + 1, lim);
656 }
657 /* Move the tail of the bytes, in one chunk */
658 cur = start + slicelen*step;
659 if (cur < PyBytes_GET_SIZE(self)) {
660 memmove(self->ob_bytes + cur - slicelen,
661 self->ob_bytes + cur,
662 PyBytes_GET_SIZE(self) - cur);
663 }
664 if (PyBytes_Resize((PyObject *)self,
665 PyBytes_GET_SIZE(self) - slicelen) < 0)
666 return -1;
667
668 return 0;
669 }
670 else {
671 /* Assign slice */
672 Py_ssize_t cur, i;
Guido van Rossumb6f1fdc2007-04-12 22:49:52 +0000673
Thomas Wouters376446d2006-12-19 08:30:14 +0000674 if (needed != slicelen) {
675 PyErr_Format(PyExc_ValueError,
676 "attempt to assign bytes of size %zd "
677 "to extended slice of size %zd",
678 needed, slicelen);
679 return -1;
680 }
681 for (cur = start, i = 0; i < slicelen; cur += step, i++)
682 self->ob_bytes[cur] = bytes[i];
683 return 0;
684 }
685 }
686}
687
688static int
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000689bytes_init(PyBytesObject *self, PyObject *args, PyObject *kwds)
690{
Guido van Rossumd624f182006-04-24 13:47:05 +0000691 static char *kwlist[] = {"source", "encoding", "errors", 0};
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000692 PyObject *arg = NULL;
Guido van Rossumd624f182006-04-24 13:47:05 +0000693 const char *encoding = NULL;
694 const char *errors = NULL;
695 Py_ssize_t count;
696 PyObject *it;
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000697 PyObject *(*iternext)(PyObject *);
698
Christian Heimes90aa7642007-12-19 02:45:37 +0000699 if (Py_SIZE(self) != 0) {
Guido van Rossuma0867f72006-05-05 04:34:18 +0000700 /* Empty previous contents (yes, do this first of all!) */
701 if (PyBytes_Resize((PyObject *)self, 0) < 0)
702 return -1;
703 }
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000704
Guido van Rossumd624f182006-04-24 13:47:05 +0000705 /* Parse arguments */
706 if (!PyArg_ParseTupleAndKeywords(args, kwds, "|Oss:bytes", kwlist,
707 &arg, &encoding, &errors))
708 return -1;
709
710 /* Make a quick exit if no first argument */
711 if (arg == NULL) {
712 if (encoding != NULL || errors != NULL) {
713 PyErr_SetString(PyExc_TypeError,
714 "encoding or errors without sequence argument");
715 return -1;
716 }
717 return 0;
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000718 }
719
Guido van Rossumd624f182006-04-24 13:47:05 +0000720 if (PyUnicode_Check(arg)) {
721 /* Encode via the codec registry */
Guido van Rossum4355a472007-05-04 05:00:04 +0000722 PyObject *encoded, *new;
Guido van Rossuma74184e2007-08-29 04:05:57 +0000723 if (encoding == NULL) {
724 PyErr_SetString(PyExc_TypeError,
725 "string argument without an encoding");
726 return -1;
727 }
Guido van Rossumd624f182006-04-24 13:47:05 +0000728 encoded = PyCodec_Encode(arg, encoding, errors);
729 if (encoded == NULL)
730 return -1;
Guido van Rossum98297ee2007-11-06 21:34:58 +0000731 assert(PyString_Check(encoded));
Guido van Rossuma74184e2007-08-29 04:05:57 +0000732 new = bytes_iconcat(self, encoded);
733 Py_DECREF(encoded);
734 if (new == NULL)
735 return -1;
736 Py_DECREF(new);
737 return 0;
Guido van Rossumd624f182006-04-24 13:47:05 +0000738 }
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000739
Guido van Rossumd624f182006-04-24 13:47:05 +0000740 /* If it's not unicode, there can't be encoding or errors */
741 if (encoding != NULL || errors != NULL) {
742 PyErr_SetString(PyExc_TypeError,
743 "encoding or errors without a string argument");
744 return -1;
745 }
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000746
Guido van Rossumd624f182006-04-24 13:47:05 +0000747 /* Is it an int? */
Thomas Woutersd204a712006-08-22 13:41:17 +0000748 count = PyNumber_AsSsize_t(arg, PyExc_ValueError);
Guido van Rossumd624f182006-04-24 13:47:05 +0000749 if (count == -1 && PyErr_Occurred())
750 PyErr_Clear();
751 else {
752 if (count < 0) {
753 PyErr_SetString(PyExc_ValueError, "negative count");
754 return -1;
755 }
756 if (count > 0) {
757 if (PyBytes_Resize((PyObject *)self, count))
758 return -1;
759 memset(self->ob_bytes, 0, count);
760 }
761 return 0;
762 }
Guido van Rossum75d38e92007-08-24 17:33:11 +0000763
Guido van Rossum254348e2007-11-21 19:29:53 +0000764 /* Use the buffer API */
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000765 if (PyObject_CheckBuffer(arg)) {
Guido van Rossumd624f182006-04-24 13:47:05 +0000766 Py_ssize_t size;
Travis E. Oliphant8ae62b62007-09-23 02:00:13 +0000767 Py_buffer view;
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000768 if (PyObject_GetBuffer(arg, &view, PyBUF_FULL_RO) < 0)
Guido van Rossumd624f182006-04-24 13:47:05 +0000769 return -1;
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000770 size = view.len;
771 if (PyBytes_Resize((PyObject *)self, size) < 0) goto fail;
772 if (PyBuffer_ToContiguous(self->ob_bytes, &view, size, 'C') < 0)
773 goto fail;
774 PyObject_ReleaseBuffer(arg, &view);
Guido van Rossumd624f182006-04-24 13:47:05 +0000775 return 0;
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000776 fail:
777 PyObject_ReleaseBuffer(arg, &view);
778 return -1;
Guido van Rossumd624f182006-04-24 13:47:05 +0000779 }
780
781 /* XXX Optimize this if the arguments is a list, tuple */
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000782
783 /* Get the iterator */
784 it = PyObject_GetIter(arg);
785 if (it == NULL)
Guido van Rossumd624f182006-04-24 13:47:05 +0000786 return -1;
Christian Heimes90aa7642007-12-19 02:45:37 +0000787 iternext = *Py_TYPE(it)->tp_iternext;
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000788
789 /* Run the iterator to exhaustion */
790 for (;;) {
Guido van Rossumd624f182006-04-24 13:47:05 +0000791 PyObject *item;
792 Py_ssize_t value;
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000793
Guido van Rossumd624f182006-04-24 13:47:05 +0000794 /* Get the next item */
795 item = iternext(it);
796 if (item == NULL) {
797 if (PyErr_Occurred()) {
798 if (!PyErr_ExceptionMatches(PyExc_StopIteration))
799 goto error;
800 PyErr_Clear();
801 }
802 break;
803 }
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000804
Guido van Rossumd624f182006-04-24 13:47:05 +0000805 /* Interpret it as an int (__index__) */
Thomas Woutersd204a712006-08-22 13:41:17 +0000806 value = PyNumber_AsSsize_t(item, PyExc_ValueError);
Guido van Rossumd624f182006-04-24 13:47:05 +0000807 Py_DECREF(item);
808 if (value == -1 && PyErr_Occurred())
809 goto error;
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000810
Guido van Rossumd624f182006-04-24 13:47:05 +0000811 /* Range check */
812 if (value < 0 || value >= 256) {
813 PyErr_SetString(PyExc_ValueError,
814 "bytes must be in range(0, 256)");
815 goto error;
816 }
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000817
Guido van Rossumd624f182006-04-24 13:47:05 +0000818 /* Append the byte */
Christian Heimes90aa7642007-12-19 02:45:37 +0000819 if (Py_SIZE(self) < self->ob_alloc)
820 Py_SIZE(self)++;
821 else if (PyBytes_Resize((PyObject *)self, Py_SIZE(self)+1) < 0)
Guido van Rossumd624f182006-04-24 13:47:05 +0000822 goto error;
Christian Heimes90aa7642007-12-19 02:45:37 +0000823 self->ob_bytes[Py_SIZE(self)-1] = value;
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000824 }
825
826 /* Clean up and return success */
827 Py_DECREF(it);
828 return 0;
829
830 error:
831 /* Error handling when it != NULL */
832 Py_DECREF(it);
833 return -1;
834}
835
Georg Brandlee91be42007-02-24 19:41:35 +0000836/* Mostly copied from string_repr, but without the
837 "smart quote" functionality. */
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000838static PyObject *
839bytes_repr(PyBytesObject *self)
840{
Walter Dörwald1ab83302007-05-18 17:15:44 +0000841 static const char *hexdigits = "0123456789abcdef";
Guido van Rossum254348e2007-11-21 19:29:53 +0000842 const char *quote_prefix = "bytearray(b";
Guido van Rossum98297ee2007-11-06 21:34:58 +0000843 const char *quote_postfix = ")";
Christian Heimes90aa7642007-12-19 02:45:37 +0000844 Py_ssize_t length = Py_SIZE(self);
Guido van Rossum254348e2007-11-21 19:29:53 +0000845 /* 14 == strlen(quote_prefix) + 2 + strlen(quote_postfix) */
846 size_t newsize = 14 + 4 * length;
Georg Brandlee91be42007-02-24 19:41:35 +0000847 PyObject *v;
Guido van Rossum254348e2007-11-21 19:29:53 +0000848 if (newsize > PY_SSIZE_T_MAX || newsize / 4 - 3 != length) {
Georg Brandlee91be42007-02-24 19:41:35 +0000849 PyErr_SetString(PyExc_OverflowError,
Guido van Rossum254348e2007-11-21 19:29:53 +0000850 "bytearray object is too large to make repr");
Guido van Rossumd624f182006-04-24 13:47:05 +0000851 return NULL;
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000852 }
Walter Dörwald1ab83302007-05-18 17:15:44 +0000853 v = PyUnicode_FromUnicode(NULL, newsize);
Georg Brandlee91be42007-02-24 19:41:35 +0000854 if (v == NULL) {
855 return NULL;
856 }
857 else {
858 register Py_ssize_t i;
Walter Dörwald1ab83302007-05-18 17:15:44 +0000859 register Py_UNICODE c;
860 register Py_UNICODE *p;
Guido van Rossum98297ee2007-11-06 21:34:58 +0000861 int quote;
862
863 /* Figure out which quote to use; single is preferred */
864 quote = '\'';
865 {
866 char *test, *start;
867 start = PyBytes_AS_STRING(self);
868 for (test = start; test < start+length; ++test) {
869 if (*test == '"') {
870 quote = '\''; /* back to single */
871 goto decided;
872 }
873 else if (*test == '\'')
874 quote = '"';
875 }
876 decided:
877 ;
878 }
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000879
Walter Dörwald1ab83302007-05-18 17:15:44 +0000880 p = PyUnicode_AS_UNICODE(v);
Guido van Rossum98297ee2007-11-06 21:34:58 +0000881 while (*quote_prefix)
882 *p++ = *quote_prefix++;
Georg Brandlee91be42007-02-24 19:41:35 +0000883 *p++ = quote;
Guido van Rossum98297ee2007-11-06 21:34:58 +0000884
885 for (i = 0; i < length; i++) {
Georg Brandlee91be42007-02-24 19:41:35 +0000886 /* There's at least enough room for a hex escape
887 and a closing quote. */
Walter Dörwald1ab83302007-05-18 17:15:44 +0000888 assert(newsize - (p - PyUnicode_AS_UNICODE(v)) >= 5);
Georg Brandlee91be42007-02-24 19:41:35 +0000889 c = self->ob_bytes[i];
Guido van Rossum98297ee2007-11-06 21:34:58 +0000890 if (c == '\'' || c == '\\')
Georg Brandlee91be42007-02-24 19:41:35 +0000891 *p++ = '\\', *p++ = c;
892 else if (c == '\t')
893 *p++ = '\\', *p++ = 't';
894 else if (c == '\n')
895 *p++ = '\\', *p++ = 'n';
896 else if (c == '\r')
897 *p++ = '\\', *p++ = 'r';
898 else if (c == 0)
Guido van Rossum57b93ad2007-05-08 19:09:34 +0000899 *p++ = '\\', *p++ = 'x', *p++ = '0', *p++ = '0';
Georg Brandlee91be42007-02-24 19:41:35 +0000900 else if (c < ' ' || c >= 0x7f) {
Walter Dörwald1ab83302007-05-18 17:15:44 +0000901 *p++ = '\\';
902 *p++ = 'x';
903 *p++ = hexdigits[(c & 0xf0) >> 4];
904 *p++ = hexdigits[c & 0xf];
Georg Brandlee91be42007-02-24 19:41:35 +0000905 }
906 else
907 *p++ = c;
908 }
Walter Dörwald1ab83302007-05-18 17:15:44 +0000909 assert(newsize - (p - PyUnicode_AS_UNICODE(v)) >= 1);
Georg Brandlee91be42007-02-24 19:41:35 +0000910 *p++ = quote;
Guido van Rossum98297ee2007-11-06 21:34:58 +0000911 while (*quote_postfix) {
912 *p++ = *quote_postfix++;
913 }
Georg Brandlee91be42007-02-24 19:41:35 +0000914 *p = '\0';
Walter Dörwald1ab83302007-05-18 17:15:44 +0000915 if (PyUnicode_Resize(&v, (p - PyUnicode_AS_UNICODE(v)))) {
916 Py_DECREF(v);
917 return NULL;
918 }
Georg Brandlee91be42007-02-24 19:41:35 +0000919 return v;
920 }
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000921}
922
923static PyObject *
Guido van Rossum98297ee2007-11-06 21:34:58 +0000924bytes_str(PyObject *op)
Guido van Rossumd624f182006-04-24 13:47:05 +0000925{
Guido van Rossum98297ee2007-11-06 21:34:58 +0000926 if (Py_BytesWarningFlag) {
927 if (PyErr_WarnEx(PyExc_BytesWarning,
Guido van Rossum254348e2007-11-21 19:29:53 +0000928 "str() on a bytearray instance", 1))
Guido van Rossum98297ee2007-11-06 21:34:58 +0000929 return NULL;
930 }
931 return bytes_repr((PyBytesObject*)op);
Guido van Rossumd624f182006-04-24 13:47:05 +0000932}
933
934static PyObject *
Guido van Rossum343e97f2007-04-09 00:43:24 +0000935bytes_richcompare(PyObject *self, PyObject *other, int op)
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000936{
Guido van Rossum343e97f2007-04-09 00:43:24 +0000937 Py_ssize_t self_size, other_size;
Travis E. Oliphant8ae62b62007-09-23 02:00:13 +0000938 Py_buffer self_bytes, other_bytes;
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000939 PyObject *res;
Guido van Rossum343e97f2007-04-09 00:43:24 +0000940 Py_ssize_t minsize;
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000941 int cmp;
942
Jeremy Hylton18c3ff82007-08-29 18:47:16 +0000943 /* Bytes can be compared to anything that supports the (binary)
944 buffer API. Except that a comparison with Unicode is always an
945 error, even if the comparison is for equality. */
946 if (PyObject_IsInstance(self, (PyObject*)&PyUnicode_Type) ||
947 PyObject_IsInstance(other, (PyObject*)&PyUnicode_Type)) {
Guido van Rossum98297ee2007-11-06 21:34:58 +0000948 if (Py_BytesWarningFlag && op == Py_EQ) {
949 if (PyErr_WarnEx(PyExc_BytesWarning,
Guido van Rossum254348e2007-11-21 19:29:53 +0000950 "Comparsion between bytearray and string", 1))
Guido van Rossum98297ee2007-11-06 21:34:58 +0000951 return NULL;
952 }
953
Guido van Rossum1e35e762007-10-09 17:21:10 +0000954 Py_INCREF(Py_NotImplemented);
955 return Py_NotImplemented;
Jeremy Hylton18c3ff82007-08-29 18:47:16 +0000956 }
Guido van Rossumebea9be2007-04-09 00:49:13 +0000957
Guido van Rossumad7d8d12007-04-13 01:39:34 +0000958 self_size = _getbuffer(self, &self_bytes);
959 if (self_size < 0) {
Guido van Rossuma74184e2007-08-29 04:05:57 +0000960 PyErr_Clear();
Guido van Rossumebea9be2007-04-09 00:49:13 +0000961 Py_INCREF(Py_NotImplemented);
962 return Py_NotImplemented;
963 }
Guido van Rossum343e97f2007-04-09 00:43:24 +0000964
Guido van Rossumad7d8d12007-04-13 01:39:34 +0000965 other_size = _getbuffer(other, &other_bytes);
966 if (other_size < 0) {
Guido van Rossuma74184e2007-08-29 04:05:57 +0000967 PyErr_Clear();
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000968 PyObject_ReleaseBuffer(self, &self_bytes);
Guido van Rossumd624f182006-04-24 13:47:05 +0000969 Py_INCREF(Py_NotImplemented);
970 return Py_NotImplemented;
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000971 }
Guido van Rossum343e97f2007-04-09 00:43:24 +0000972
973 if (self_size != other_size && (op == Py_EQ || op == Py_NE)) {
Guido van Rossumd624f182006-04-24 13:47:05 +0000974 /* Shortcut: if the lengths differ, the objects differ */
975 cmp = (op == Py_NE);
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000976 }
977 else {
Guido van Rossum343e97f2007-04-09 00:43:24 +0000978 minsize = self_size;
979 if (other_size < minsize)
980 minsize = other_size;
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000981
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000982 cmp = memcmp(self_bytes.buf, other_bytes.buf, minsize);
Guido van Rossumd624f182006-04-24 13:47:05 +0000983 /* In ISO C, memcmp() guarantees to use unsigned bytes! */
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000984
Guido van Rossumd624f182006-04-24 13:47:05 +0000985 if (cmp == 0) {
Guido van Rossum343e97f2007-04-09 00:43:24 +0000986 if (self_size < other_size)
Guido van Rossumd624f182006-04-24 13:47:05 +0000987 cmp = -1;
Guido van Rossum343e97f2007-04-09 00:43:24 +0000988 else if (self_size > other_size)
Guido van Rossumd624f182006-04-24 13:47:05 +0000989 cmp = 1;
990 }
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000991
Guido van Rossumd624f182006-04-24 13:47:05 +0000992 switch (op) {
993 case Py_LT: cmp = cmp < 0; break;
994 case Py_LE: cmp = cmp <= 0; break;
995 case Py_EQ: cmp = cmp == 0; break;
996 case Py_NE: cmp = cmp != 0; break;
997 case Py_GT: cmp = cmp > 0; break;
998 case Py_GE: cmp = cmp >= 0; break;
999 }
Guido van Rossum4dfe8a12006-04-22 23:28:04 +00001000 }
1001
1002 res = cmp ? Py_True : Py_False;
Travis E. Oliphantb99f7622007-08-18 11:21:56 +00001003 PyObject_ReleaseBuffer(self, &self_bytes);
Guido van Rossum75d38e92007-08-24 17:33:11 +00001004 PyObject_ReleaseBuffer(other, &other_bytes);
Guido van Rossum4dfe8a12006-04-22 23:28:04 +00001005 Py_INCREF(res);
1006 return res;
1007}
1008
1009static void
1010bytes_dealloc(PyBytesObject *self)
1011{
Guido van Rossumd624f182006-04-24 13:47:05 +00001012 if (self->ob_bytes != 0) {
1013 PyMem_Free(self->ob_bytes);
Guido van Rossum4dfe8a12006-04-22 23:28:04 +00001014 }
Christian Heimes90aa7642007-12-19 02:45:37 +00001015 Py_TYPE(self)->tp_free((PyObject *)self);
Guido van Rossum4dfe8a12006-04-22 23:28:04 +00001016}
1017
Neal Norwitz6968b052007-02-27 19:02:19 +00001018
1019/* -------------------------------------------------------------------- */
1020/* Methods */
1021
1022#define STRINGLIB_CHAR char
1023#define STRINGLIB_CMP memcmp
1024#define STRINGLIB_LEN PyBytes_GET_SIZE
Gregory P. Smith60d241f2007-10-16 06:31:30 +00001025#define STRINGLIB_STR PyBytes_AS_STRING
Neal Norwitz6968b052007-02-27 19:02:19 +00001026#define STRINGLIB_NEW PyBytes_FromStringAndSize
1027#define STRINGLIB_EMPTY nullbytes
Gregory P. Smith60d241f2007-10-16 06:31:30 +00001028#define STRINGLIB_CHECK_EXACT PyBytes_CheckExact
1029#define STRINGLIB_MUTABLE 1
Neal Norwitz6968b052007-02-27 19:02:19 +00001030
1031#include "stringlib/fastsearch.h"
1032#include "stringlib/count.h"
1033#include "stringlib/find.h"
1034#include "stringlib/partition.h"
Gregory P. Smith60d241f2007-10-16 06:31:30 +00001035#include "stringlib/ctype.h"
1036#include "stringlib/transmogrify.h"
Neal Norwitz6968b052007-02-27 19:02:19 +00001037
1038
1039/* The following Py_LOCAL_INLINE and Py_LOCAL functions
1040were copied from the old char* style string object. */
1041
1042Py_LOCAL_INLINE(void)
1043_adjust_indices(Py_ssize_t *start, Py_ssize_t *end, Py_ssize_t len)
1044{
1045 if (*end > len)
1046 *end = len;
1047 else if (*end < 0)
1048 *end += len;
1049 if (*end < 0)
1050 *end = 0;
1051 if (*start < 0)
1052 *start += len;
1053 if (*start < 0)
1054 *start = 0;
1055}
1056
1057
1058Py_LOCAL_INLINE(Py_ssize_t)
1059bytes_find_internal(PyBytesObject *self, PyObject *args, int dir)
1060{
1061 PyObject *subobj;
Travis E. Oliphant8ae62b62007-09-23 02:00:13 +00001062 Py_buffer subbuf;
Neal Norwitz6968b052007-02-27 19:02:19 +00001063 Py_ssize_t start=0, end=PY_SSIZE_T_MAX;
Guido van Rossum06b8b022007-08-31 13:48:41 +00001064 Py_ssize_t res;
Neal Norwitz6968b052007-02-27 19:02:19 +00001065
1066 if (!PyArg_ParseTuple(args, "O|O&O&:find/rfind/index/rindex", &subobj,
1067 _PyEval_SliceIndex, &start, _PyEval_SliceIndex, &end))
1068 return -2;
Guido van Rossum06b8b022007-08-31 13:48:41 +00001069 if (_getbuffer(subobj, &subbuf) < 0)
Neal Norwitz6968b052007-02-27 19:02:19 +00001070 return -2;
Neal Norwitz6968b052007-02-27 19:02:19 +00001071 if (dir > 0)
Guido van Rossum06b8b022007-08-31 13:48:41 +00001072 res = stringlib_find_slice(
Neal Norwitz6968b052007-02-27 19:02:19 +00001073 PyBytes_AS_STRING(self), PyBytes_GET_SIZE(self),
Guido van Rossum06b8b022007-08-31 13:48:41 +00001074 subbuf.buf, subbuf.len, start, end);
Neal Norwitz6968b052007-02-27 19:02:19 +00001075 else
Guido van Rossum06b8b022007-08-31 13:48:41 +00001076 res = stringlib_rfind_slice(
Neal Norwitz6968b052007-02-27 19:02:19 +00001077 PyBytes_AS_STRING(self), PyBytes_GET_SIZE(self),
Guido van Rossum06b8b022007-08-31 13:48:41 +00001078 subbuf.buf, subbuf.len, start, end);
1079 PyObject_ReleaseBuffer(subobj, &subbuf);
1080 return res;
Neal Norwitz6968b052007-02-27 19:02:19 +00001081}
1082
Neal Norwitz6968b052007-02-27 19:02:19 +00001083PyDoc_STRVAR(find__doc__,
1084"B.find(sub [,start [,end]]) -> int\n\
1085\n\
1086Return the lowest index in B where subsection sub is found,\n\
1087such that sub is contained within s[start,end]. Optional\n\
1088arguments start and end are interpreted as in slice notation.\n\
1089\n\
1090Return -1 on failure.");
1091
1092static PyObject *
1093bytes_find(PyBytesObject *self, PyObject *args)
1094{
1095 Py_ssize_t result = bytes_find_internal(self, args, +1);
1096 if (result == -2)
1097 return NULL;
Christian Heimes217cfd12007-12-02 14:31:20 +00001098 return PyLong_FromSsize_t(result);
Neal Norwitz6968b052007-02-27 19:02:19 +00001099}
1100
1101PyDoc_STRVAR(count__doc__,
Guido van Rossum98297ee2007-11-06 21:34:58 +00001102"B.count(sub [,start [,end]]) -> int\n\
Neal Norwitz6968b052007-02-27 19:02:19 +00001103\n\
1104Return the number of non-overlapping occurrences of subsection sub in\n\
1105bytes B[start:end]. Optional arguments start and end are interpreted\n\
1106as in slice notation.");
1107
1108static PyObject *
1109bytes_count(PyBytesObject *self, PyObject *args)
1110{
1111 PyObject *sub_obj;
Gregory P. Smith60d241f2007-10-16 06:31:30 +00001112 const char *str = PyBytes_AS_STRING(self);
Neal Norwitz6968b052007-02-27 19:02:19 +00001113 Py_ssize_t start = 0, end = PY_SSIZE_T_MAX;
Gregory P. Smith60d241f2007-10-16 06:31:30 +00001114 Py_buffer vsub;
1115 PyObject *count_obj;
Neal Norwitz6968b052007-02-27 19:02:19 +00001116
1117 if (!PyArg_ParseTuple(args, "O|O&O&:count", &sub_obj,
1118 _PyEval_SliceIndex, &start, _PyEval_SliceIndex, &end))
1119 return NULL;
1120
Gregory P. Smith60d241f2007-10-16 06:31:30 +00001121 if (_getbuffer(sub_obj, &vsub) < 0)
Neal Norwitz6968b052007-02-27 19:02:19 +00001122 return NULL;
1123
Martin v. Löwis5b222132007-06-10 09:51:05 +00001124 _adjust_indices(&start, &end, PyBytes_GET_SIZE(self));
Neal Norwitz6968b052007-02-27 19:02:19 +00001125
Christian Heimes217cfd12007-12-02 14:31:20 +00001126 count_obj = PyLong_FromSsize_t(
Gregory P. Smith60d241f2007-10-16 06:31:30 +00001127 stringlib_count(str + start, end - start, vsub.buf, vsub.len)
Neal Norwitz6968b052007-02-27 19:02:19 +00001128 );
Gregory P. Smith60d241f2007-10-16 06:31:30 +00001129 PyObject_ReleaseBuffer(sub_obj, &vsub);
1130 return count_obj;
Neal Norwitz6968b052007-02-27 19:02:19 +00001131}
1132
1133
1134PyDoc_STRVAR(index__doc__,
1135"B.index(sub [,start [,end]]) -> int\n\
1136\n\
1137Like B.find() but raise ValueError when the subsection is not found.");
1138
1139static PyObject *
1140bytes_index(PyBytesObject *self, PyObject *args)
1141{
1142 Py_ssize_t result = bytes_find_internal(self, args, +1);
1143 if (result == -2)
1144 return NULL;
1145 if (result == -1) {
1146 PyErr_SetString(PyExc_ValueError,
1147 "subsection not found");
1148 return NULL;
1149 }
Christian Heimes217cfd12007-12-02 14:31:20 +00001150 return PyLong_FromSsize_t(result);
Neal Norwitz6968b052007-02-27 19:02:19 +00001151}
1152
1153
1154PyDoc_STRVAR(rfind__doc__,
1155"B.rfind(sub [,start [,end]]) -> int\n\
1156\n\
1157Return the highest index in B where subsection sub is found,\n\
1158such that sub is contained within s[start,end]. Optional\n\
1159arguments start and end are interpreted as in slice notation.\n\
1160\n\
1161Return -1 on failure.");
1162
1163static PyObject *
1164bytes_rfind(PyBytesObject *self, PyObject *args)
1165{
1166 Py_ssize_t result = bytes_find_internal(self, args, -1);
1167 if (result == -2)
1168 return NULL;
Christian Heimes217cfd12007-12-02 14:31:20 +00001169 return PyLong_FromSsize_t(result);
Neal Norwitz6968b052007-02-27 19:02:19 +00001170}
1171
1172
1173PyDoc_STRVAR(rindex__doc__,
1174"B.rindex(sub [,start [,end]]) -> int\n\
1175\n\
1176Like B.rfind() but raise ValueError when the subsection is not found.");
1177
1178static PyObject *
1179bytes_rindex(PyBytesObject *self, PyObject *args)
1180{
1181 Py_ssize_t result = bytes_find_internal(self, args, -1);
1182 if (result == -2)
1183 return NULL;
1184 if (result == -1) {
1185 PyErr_SetString(PyExc_ValueError,
1186 "subsection not found");
1187 return NULL;
1188 }
Christian Heimes217cfd12007-12-02 14:31:20 +00001189 return PyLong_FromSsize_t(result);
Neal Norwitz6968b052007-02-27 19:02:19 +00001190}
1191
1192
Guido van Rossum98297ee2007-11-06 21:34:58 +00001193static int
1194bytes_contains(PyObject *self, PyObject *arg)
1195{
1196 Py_ssize_t ival = PyNumber_AsSsize_t(arg, PyExc_ValueError);
1197 if (ival == -1 && PyErr_Occurred()) {
1198 Py_buffer varg;
1199 int pos;
1200 PyErr_Clear();
1201 if (_getbuffer(arg, &varg) < 0)
1202 return -1;
Christian Heimes90aa7642007-12-19 02:45:37 +00001203 pos = stringlib_find(PyBytes_AS_STRING(self), Py_SIZE(self),
Guido van Rossum98297ee2007-11-06 21:34:58 +00001204 varg.buf, varg.len, 0);
1205 PyObject_ReleaseBuffer(arg, &varg);
1206 return pos >= 0;
1207 }
1208 if (ival < 0 || ival >= 256) {
1209 PyErr_SetString(PyExc_ValueError, "byte must be in range(0, 256)");
1210 return -1;
1211 }
1212
Christian Heimes90aa7642007-12-19 02:45:37 +00001213 return memchr(PyBytes_AS_STRING(self), ival, Py_SIZE(self)) != NULL;
Guido van Rossum98297ee2007-11-06 21:34:58 +00001214}
1215
1216
Neal Norwitz6968b052007-02-27 19:02:19 +00001217/* Matches the end (direction >= 0) or start (direction < 0) of self
1218 * against substr, using the start and end arguments. Returns
1219 * -1 on error, 0 if not found and 1 if found.
1220 */
1221Py_LOCAL(int)
1222_bytes_tailmatch(PyBytesObject *self, PyObject *substr, Py_ssize_t start,
1223 Py_ssize_t end, int direction)
1224{
1225 Py_ssize_t len = PyBytes_GET_SIZE(self);
Neal Norwitz6968b052007-02-27 19:02:19 +00001226 const char* str;
Gregory P. Smith60d241f2007-10-16 06:31:30 +00001227 Py_buffer vsubstr;
Guido van Rossum40d20bc2007-10-22 00:09:51 +00001228 int rv = 0;
Neal Norwitz6968b052007-02-27 19:02:19 +00001229
Neal Norwitz6968b052007-02-27 19:02:19 +00001230 str = PyBytes_AS_STRING(self);
1231
Gregory P. Smith60d241f2007-10-16 06:31:30 +00001232 if (_getbuffer(substr, &vsubstr) < 0)
1233 return -1;
1234
Neal Norwitz6968b052007-02-27 19:02:19 +00001235 _adjust_indices(&start, &end, len);
1236
1237 if (direction < 0) {
1238 /* startswith */
Gregory P. Smith60d241f2007-10-16 06:31:30 +00001239 if (start+vsubstr.len > len) {
Gregory P. Smith60d241f2007-10-16 06:31:30 +00001240 goto done;
1241 }
Neal Norwitz6968b052007-02-27 19:02:19 +00001242 } else {
1243 /* endswith */
Gregory P. Smith60d241f2007-10-16 06:31:30 +00001244 if (end-start < vsubstr.len || start > len) {
Gregory P. Smith60d241f2007-10-16 06:31:30 +00001245 goto done;
1246 }
Neal Norwitz6968b052007-02-27 19:02:19 +00001247
Gregory P. Smith60d241f2007-10-16 06:31:30 +00001248 if (end-vsubstr.len > start)
1249 start = end - vsubstr.len;
Neal Norwitz6968b052007-02-27 19:02:19 +00001250 }
Gregory P. Smith60d241f2007-10-16 06:31:30 +00001251 if (end-start >= vsubstr.len)
1252 rv = ! memcmp(str+start, vsubstr.buf, vsubstr.len);
1253
1254done:
1255 PyObject_ReleaseBuffer(substr, &vsubstr);
1256 return rv;
Neal Norwitz6968b052007-02-27 19:02:19 +00001257}
1258
1259
1260PyDoc_STRVAR(startswith__doc__,
Guido van Rossum98297ee2007-11-06 21:34:58 +00001261"B.startswith(prefix [,start [,end]]) -> bool\n\
Neal Norwitz6968b052007-02-27 19:02:19 +00001262\n\
1263Return True if B starts with the specified prefix, False otherwise.\n\
1264With optional start, test B beginning at that position.\n\
1265With optional end, stop comparing B at that position.\n\
1266prefix can also be a tuple of strings to try.");
1267
1268static PyObject *
1269bytes_startswith(PyBytesObject *self, PyObject *args)
1270{
1271 Py_ssize_t start = 0;
1272 Py_ssize_t end = PY_SSIZE_T_MAX;
1273 PyObject *subobj;
1274 int result;
1275
1276 if (!PyArg_ParseTuple(args, "O|O&O&:startswith", &subobj,
1277 _PyEval_SliceIndex, &start, _PyEval_SliceIndex, &end))
1278 return NULL;
1279 if (PyTuple_Check(subobj)) {
1280 Py_ssize_t i;
1281 for (i = 0; i < PyTuple_GET_SIZE(subobj); i++) {
1282 result = _bytes_tailmatch(self,
1283 PyTuple_GET_ITEM(subobj, i),
1284 start, end, -1);
1285 if (result == -1)
1286 return NULL;
1287 else if (result) {
1288 Py_RETURN_TRUE;
1289 }
1290 }
1291 Py_RETURN_FALSE;
1292 }
1293 result = _bytes_tailmatch(self, subobj, start, end, -1);
1294 if (result == -1)
1295 return NULL;
1296 else
1297 return PyBool_FromLong(result);
1298}
1299
1300PyDoc_STRVAR(endswith__doc__,
Guido van Rossum98297ee2007-11-06 21:34:58 +00001301"B.endswith(suffix [,start [,end]]) -> bool\n\
Neal Norwitz6968b052007-02-27 19:02:19 +00001302\n\
1303Return True if B ends with the specified suffix, False otherwise.\n\
1304With optional start, test B beginning at that position.\n\
1305With optional end, stop comparing B at that position.\n\
1306suffix can also be a tuple of strings to try.");
1307
1308static PyObject *
1309bytes_endswith(PyBytesObject *self, PyObject *args)
1310{
1311 Py_ssize_t start = 0;
1312 Py_ssize_t end = PY_SSIZE_T_MAX;
1313 PyObject *subobj;
1314 int result;
1315
1316 if (!PyArg_ParseTuple(args, "O|O&O&:endswith", &subobj,
1317 _PyEval_SliceIndex, &start, _PyEval_SliceIndex, &end))
1318 return NULL;
1319 if (PyTuple_Check(subobj)) {
1320 Py_ssize_t i;
1321 for (i = 0; i < PyTuple_GET_SIZE(subobj); i++) {
1322 result = _bytes_tailmatch(self,
1323 PyTuple_GET_ITEM(subobj, i),
1324 start, end, +1);
1325 if (result == -1)
1326 return NULL;
1327 else if (result) {
1328 Py_RETURN_TRUE;
1329 }
1330 }
1331 Py_RETURN_FALSE;
1332 }
1333 result = _bytes_tailmatch(self, subobj, start, end, +1);
1334 if (result == -1)
1335 return NULL;
1336 else
1337 return PyBool_FromLong(result);
1338}
1339
1340
Neal Norwitz6968b052007-02-27 19:02:19 +00001341PyDoc_STRVAR(translate__doc__,
Guido van Rossum254348e2007-11-21 19:29:53 +00001342"B.translate(table[, deletechars]) -> bytearray\n\
Neal Norwitz6968b052007-02-27 19:02:19 +00001343\n\
Guido van Rossum98297ee2007-11-06 21:34:58 +00001344Return a copy of B, where all characters occurring in the\n\
1345optional argument deletechars are removed, and the remaining\n\
1346characters have been mapped through the given translation\n\
1347table, which must be a bytes object of length 256.");
Neal Norwitz6968b052007-02-27 19:02:19 +00001348
1349static PyObject *
1350bytes_translate(PyBytesObject *self, PyObject *args)
1351{
1352 register char *input, *output;
1353 register const char *table;
1354 register Py_ssize_t i, c, changed = 0;
1355 PyObject *input_obj = (PyObject*)self;
Gregory P. Smith60d241f2007-10-16 06:31:30 +00001356 const char *output_start;
1357 Py_ssize_t inlen;
Neal Norwitz6968b052007-02-27 19:02:19 +00001358 PyObject *result;
1359 int trans_table[256];
1360 PyObject *tableobj, *delobj = NULL;
Gregory P. Smith60d241f2007-10-16 06:31:30 +00001361 Py_buffer vtable, vdel;
Neal Norwitz6968b052007-02-27 19:02:19 +00001362
1363 if (!PyArg_UnpackTuple(args, "translate", 1, 2,
1364 &tableobj, &delobj))
1365 return NULL;
1366
Gregory P. Smith60d241f2007-10-16 06:31:30 +00001367 if (_getbuffer(tableobj, &vtable) < 0)
Neal Norwitz6968b052007-02-27 19:02:19 +00001368 return NULL;
1369
Gregory P. Smith60d241f2007-10-16 06:31:30 +00001370 if (vtable.len != 256) {
Neal Norwitz6968b052007-02-27 19:02:19 +00001371 PyErr_SetString(PyExc_ValueError,
1372 "translation table must be 256 characters long");
Gregory P. Smith60d241f2007-10-16 06:31:30 +00001373 result = NULL;
1374 goto done;
Neal Norwitz6968b052007-02-27 19:02:19 +00001375 }
1376
1377 if (delobj != NULL) {
Gregory P. Smith60d241f2007-10-16 06:31:30 +00001378 if (_getbuffer(delobj, &vdel) < 0) {
1379 result = NULL;
1380 goto done;
Neal Norwitz6968b052007-02-27 19:02:19 +00001381 }
Neal Norwitz6968b052007-02-27 19:02:19 +00001382 }
1383 else {
Gregory P. Smith60d241f2007-10-16 06:31:30 +00001384 vdel.buf = NULL;
1385 vdel.len = 0;
Neal Norwitz6968b052007-02-27 19:02:19 +00001386 }
1387
Gregory P. Smith60d241f2007-10-16 06:31:30 +00001388 table = (const char *)vtable.buf;
Neal Norwitz6968b052007-02-27 19:02:19 +00001389 inlen = PyBytes_GET_SIZE(input_obj);
1390 result = PyBytes_FromStringAndSize((char *)NULL, inlen);
1391 if (result == NULL)
Gregory P. Smith60d241f2007-10-16 06:31:30 +00001392 goto done;
Neal Norwitz6968b052007-02-27 19:02:19 +00001393 output_start = output = PyBytes_AsString(result);
1394 input = PyBytes_AS_STRING(input_obj);
1395
Gregory P. Smith60d241f2007-10-16 06:31:30 +00001396 if (vdel.len == 0) {
Neal Norwitz6968b052007-02-27 19:02:19 +00001397 /* If no deletions are required, use faster code */
1398 for (i = inlen; --i >= 0; ) {
1399 c = Py_CHARMASK(*input++);
1400 if (Py_CHARMASK((*output++ = table[c])) != c)
1401 changed = 1;
1402 }
1403 if (changed || !PyBytes_CheckExact(input_obj))
Gregory P. Smith60d241f2007-10-16 06:31:30 +00001404 goto done;
Neal Norwitz6968b052007-02-27 19:02:19 +00001405 Py_DECREF(result);
1406 Py_INCREF(input_obj);
Gregory P. Smith60d241f2007-10-16 06:31:30 +00001407 result = input_obj;
1408 goto done;
Neal Norwitz6968b052007-02-27 19:02:19 +00001409 }
1410
1411 for (i = 0; i < 256; i++)
1412 trans_table[i] = Py_CHARMASK(table[i]);
1413
Gregory P. Smith60d241f2007-10-16 06:31:30 +00001414 for (i = 0; i < vdel.len; i++)
1415 trans_table[(int) Py_CHARMASK( ((unsigned char*)vdel.buf)[i] )] = -1;
Neal Norwitz6968b052007-02-27 19:02:19 +00001416
1417 for (i = inlen; --i >= 0; ) {
1418 c = Py_CHARMASK(*input++);
1419 if (trans_table[c] != -1)
1420 if (Py_CHARMASK(*output++ = (char)trans_table[c]) == c)
1421 continue;
1422 changed = 1;
1423 }
1424 if (!changed && PyBytes_CheckExact(input_obj)) {
1425 Py_DECREF(result);
1426 Py_INCREF(input_obj);
Gregory P. Smith60d241f2007-10-16 06:31:30 +00001427 result = input_obj;
1428 goto done;
Neal Norwitz6968b052007-02-27 19:02:19 +00001429 }
1430 /* Fix the size of the resulting string */
1431 if (inlen > 0)
1432 PyBytes_Resize(result, output - output_start);
Gregory P. Smith60d241f2007-10-16 06:31:30 +00001433
1434done:
1435 PyObject_ReleaseBuffer(tableobj, &vtable);
1436 if (delobj != NULL)
1437 PyObject_ReleaseBuffer(delobj, &vdel);
Neal Norwitz6968b052007-02-27 19:02:19 +00001438 return result;
1439}
1440
1441
1442#define FORWARD 1
1443#define REVERSE -1
1444
1445/* find and count characters and substrings */
1446
1447#define findchar(target, target_len, c) \
1448 ((char *)memchr((const void *)(target), c, target_len))
1449
1450/* Don't call if length < 2 */
1451#define Py_STRING_MATCH(target, offset, pattern, length) \
1452 (target[offset] == pattern[0] && \
1453 target[offset+length-1] == pattern[length-1] && \
1454 !memcmp(target+offset+1, pattern+1, length-2) )
1455
1456
1457/* Bytes ops must return a string. */
1458/* If the object is subclass of bytes, create a copy */
1459Py_LOCAL(PyBytesObject *)
1460return_self(PyBytesObject *self)
1461{
1462 if (PyBytes_CheckExact(self)) {
1463 Py_INCREF(self);
1464 return (PyBytesObject *)self;
1465 }
1466 return (PyBytesObject *)PyBytes_FromStringAndSize(
1467 PyBytes_AS_STRING(self),
1468 PyBytes_GET_SIZE(self));
1469}
1470
1471Py_LOCAL_INLINE(Py_ssize_t)
Neal Norwitz61ec0d32007-10-26 06:44:10 +00001472countchar(const char *target, Py_ssize_t target_len, char c, Py_ssize_t maxcount)
Neal Norwitz6968b052007-02-27 19:02:19 +00001473{
1474 Py_ssize_t count=0;
1475 const char *start=target;
1476 const char *end=target+target_len;
1477
1478 while ( (start=findchar(start, end-start, c)) != NULL ) {
1479 count++;
1480 if (count >= maxcount)
1481 break;
1482 start += 1;
1483 }
1484 return count;
1485}
1486
1487Py_LOCAL(Py_ssize_t)
1488findstring(const char *target, Py_ssize_t target_len,
1489 const char *pattern, Py_ssize_t pattern_len,
1490 Py_ssize_t start,
1491 Py_ssize_t end,
1492 int direction)
1493{
1494 if (start < 0) {
1495 start += target_len;
1496 if (start < 0)
1497 start = 0;
1498 }
1499 if (end > target_len) {
1500 end = target_len;
1501 } else if (end < 0) {
1502 end += target_len;
1503 if (end < 0)
1504 end = 0;
1505 }
1506
1507 /* zero-length substrings always match at the first attempt */
1508 if (pattern_len == 0)
1509 return (direction > 0) ? start : end;
1510
1511 end -= pattern_len;
1512
1513 if (direction < 0) {
1514 for (; end >= start; end--)
1515 if (Py_STRING_MATCH(target, end, pattern, pattern_len))
1516 return end;
1517 } else {
1518 for (; start <= end; start++)
1519 if (Py_STRING_MATCH(target, start, pattern, pattern_len))
1520 return start;
1521 }
1522 return -1;
1523}
1524
1525Py_LOCAL_INLINE(Py_ssize_t)
1526countstring(const char *target, Py_ssize_t target_len,
1527 const char *pattern, Py_ssize_t pattern_len,
1528 Py_ssize_t start,
1529 Py_ssize_t end,
1530 int direction, Py_ssize_t maxcount)
1531{
1532 Py_ssize_t count=0;
1533
1534 if (start < 0) {
1535 start += target_len;
1536 if (start < 0)
1537 start = 0;
1538 }
1539 if (end > target_len) {
1540 end = target_len;
1541 } else if (end < 0) {
1542 end += target_len;
1543 if (end < 0)
1544 end = 0;
1545 }
1546
1547 /* zero-length substrings match everywhere */
1548 if (pattern_len == 0 || maxcount == 0) {
1549 if (target_len+1 < maxcount)
1550 return target_len+1;
1551 return maxcount;
1552 }
1553
1554 end -= pattern_len;
1555 if (direction < 0) {
1556 for (; (end >= start); end--)
1557 if (Py_STRING_MATCH(target, end, pattern, pattern_len)) {
1558 count++;
1559 if (--maxcount <= 0) break;
1560 end -= pattern_len-1;
1561 }
1562 } else {
1563 for (; (start <= end); start++)
1564 if (Py_STRING_MATCH(target, start, pattern, pattern_len)) {
1565 count++;
1566 if (--maxcount <= 0)
1567 break;
1568 start += pattern_len-1;
1569 }
1570 }
1571 return count;
1572}
1573
1574
1575/* Algorithms for different cases of string replacement */
1576
1577/* len(self)>=1, from="", len(to)>=1, maxcount>=1 */
1578Py_LOCAL(PyBytesObject *)
1579replace_interleave(PyBytesObject *self,
1580 const char *to_s, Py_ssize_t to_len,
1581 Py_ssize_t maxcount)
1582{
1583 char *self_s, *result_s;
1584 Py_ssize_t self_len, result_len;
1585 Py_ssize_t count, i, product;
1586 PyBytesObject *result;
1587
1588 self_len = PyBytes_GET_SIZE(self);
1589
1590 /* 1 at the end plus 1 after every character */
1591 count = self_len+1;
Guido van Rossumb6f1fdc2007-04-12 22:49:52 +00001592 if (maxcount < count)
Neal Norwitz6968b052007-02-27 19:02:19 +00001593 count = maxcount;
1594
1595 /* Check for overflow */
1596 /* result_len = count * to_len + self_len; */
1597 product = count * to_len;
1598 if (product / to_len != count) {
1599 PyErr_SetString(PyExc_OverflowError,
1600 "replace string is too long");
1601 return NULL;
1602 }
1603 result_len = product + self_len;
1604 if (result_len < 0) {
1605 PyErr_SetString(PyExc_OverflowError,
1606 "replace string is too long");
1607 return NULL;
1608 }
1609
1610 if (! (result = (PyBytesObject *)
1611 PyBytes_FromStringAndSize(NULL, result_len)) )
1612 return NULL;
1613
1614 self_s = PyBytes_AS_STRING(self);
1615 result_s = PyBytes_AS_STRING(result);
1616
1617 /* TODO: special case single character, which doesn't need memcpy */
1618
1619 /* Lay the first one down (guaranteed this will occur) */
1620 Py_MEMCPY(result_s, to_s, to_len);
1621 result_s += to_len;
1622 count -= 1;
1623
1624 for (i=0; i<count; i++) {
1625 *result_s++ = *self_s++;
1626 Py_MEMCPY(result_s, to_s, to_len);
1627 result_s += to_len;
1628 }
1629
1630 /* Copy the rest of the original string */
1631 Py_MEMCPY(result_s, self_s, self_len-i);
1632
1633 return result;
1634}
1635
1636/* Special case for deleting a single character */
1637/* len(self)>=1, len(from)==1, to="", maxcount>=1 */
1638Py_LOCAL(PyBytesObject *)
1639replace_delete_single_character(PyBytesObject *self,
1640 char from_c, Py_ssize_t maxcount)
1641{
1642 char *self_s, *result_s;
1643 char *start, *next, *end;
1644 Py_ssize_t self_len, result_len;
1645 Py_ssize_t count;
1646 PyBytesObject *result;
1647
1648 self_len = PyBytes_GET_SIZE(self);
1649 self_s = PyBytes_AS_STRING(self);
1650
1651 count = countchar(self_s, self_len, from_c, maxcount);
1652 if (count == 0) {
1653 return return_self(self);
1654 }
1655
1656 result_len = self_len - count; /* from_len == 1 */
1657 assert(result_len>=0);
1658
1659 if ( (result = (PyBytesObject *)
1660 PyBytes_FromStringAndSize(NULL, result_len)) == NULL)
1661 return NULL;
1662 result_s = PyBytes_AS_STRING(result);
1663
1664 start = self_s;
1665 end = self_s + self_len;
1666 while (count-- > 0) {
1667 next = findchar(start, end-start, from_c);
1668 if (next == NULL)
1669 break;
1670 Py_MEMCPY(result_s, start, next-start);
1671 result_s += (next-start);
1672 start = next+1;
1673 }
1674 Py_MEMCPY(result_s, start, end-start);
1675
1676 return result;
1677}
1678
1679/* len(self)>=1, len(from)>=2, to="", maxcount>=1 */
1680
1681Py_LOCAL(PyBytesObject *)
1682replace_delete_substring(PyBytesObject *self,
1683 const char *from_s, Py_ssize_t from_len,
1684 Py_ssize_t maxcount)
1685{
1686 char *self_s, *result_s;
1687 char *start, *next, *end;
1688 Py_ssize_t self_len, result_len;
1689 Py_ssize_t count, offset;
1690 PyBytesObject *result;
1691
1692 self_len = PyBytes_GET_SIZE(self);
1693 self_s = PyBytes_AS_STRING(self);
1694
1695 count = countstring(self_s, self_len,
1696 from_s, from_len,
1697 0, self_len, 1,
1698 maxcount);
1699
1700 if (count == 0) {
1701 /* no matches */
1702 return return_self(self);
1703 }
1704
1705 result_len = self_len - (count * from_len);
1706 assert (result_len>=0);
1707
1708 if ( (result = (PyBytesObject *)
1709 PyBytes_FromStringAndSize(NULL, result_len)) == NULL )
1710 return NULL;
1711
1712 result_s = PyBytes_AS_STRING(result);
1713
1714 start = self_s;
1715 end = self_s + self_len;
1716 while (count-- > 0) {
1717 offset = findstring(start, end-start,
1718 from_s, from_len,
1719 0, end-start, FORWARD);
1720 if (offset == -1)
1721 break;
1722 next = start + offset;
1723
1724 Py_MEMCPY(result_s, start, next-start);
1725
1726 result_s += (next-start);
1727 start = next+from_len;
1728 }
1729 Py_MEMCPY(result_s, start, end-start);
1730 return result;
1731}
1732
1733/* len(self)>=1, len(from)==len(to)==1, maxcount>=1 */
1734Py_LOCAL(PyBytesObject *)
1735replace_single_character_in_place(PyBytesObject *self,
1736 char from_c, char to_c,
1737 Py_ssize_t maxcount)
1738{
1739 char *self_s, *result_s, *start, *end, *next;
1740 Py_ssize_t self_len;
1741 PyBytesObject *result;
1742
1743 /* The result string will be the same size */
1744 self_s = PyBytes_AS_STRING(self);
1745 self_len = PyBytes_GET_SIZE(self);
1746
1747 next = findchar(self_s, self_len, from_c);
1748
1749 if (next == NULL) {
1750 /* No matches; return the original bytes */
1751 return return_self(self);
1752 }
1753
1754 /* Need to make a new bytes */
1755 result = (PyBytesObject *) PyBytes_FromStringAndSize(NULL, self_len);
1756 if (result == NULL)
1757 return NULL;
1758 result_s = PyBytes_AS_STRING(result);
1759 Py_MEMCPY(result_s, self_s, self_len);
1760
1761 /* change everything in-place, starting with this one */
1762 start = result_s + (next-self_s);
1763 *start = to_c;
1764 start++;
1765 end = result_s + self_len;
1766
1767 while (--maxcount > 0) {
1768 next = findchar(start, end-start, from_c);
1769 if (next == NULL)
1770 break;
1771 *next = to_c;
1772 start = next+1;
1773 }
1774
1775 return result;
1776}
1777
1778/* len(self)>=1, len(from)==len(to)>=2, maxcount>=1 */
1779Py_LOCAL(PyBytesObject *)
1780replace_substring_in_place(PyBytesObject *self,
1781 const char *from_s, Py_ssize_t from_len,
1782 const char *to_s, Py_ssize_t to_len,
1783 Py_ssize_t maxcount)
1784{
1785 char *result_s, *start, *end;
1786 char *self_s;
1787 Py_ssize_t self_len, offset;
1788 PyBytesObject *result;
1789
1790 /* The result bytes will be the same size */
1791
1792 self_s = PyBytes_AS_STRING(self);
1793 self_len = PyBytes_GET_SIZE(self);
1794
1795 offset = findstring(self_s, self_len,
1796 from_s, from_len,
1797 0, self_len, FORWARD);
1798 if (offset == -1) {
1799 /* No matches; return the original bytes */
1800 return return_self(self);
1801 }
1802
1803 /* Need to make a new bytes */
1804 result = (PyBytesObject *) PyBytes_FromStringAndSize(NULL, self_len);
1805 if (result == NULL)
1806 return NULL;
1807 result_s = PyBytes_AS_STRING(result);
1808 Py_MEMCPY(result_s, self_s, self_len);
1809
1810 /* change everything in-place, starting with this one */
1811 start = result_s + offset;
1812 Py_MEMCPY(start, to_s, from_len);
1813 start += from_len;
1814 end = result_s + self_len;
1815
1816 while ( --maxcount > 0) {
1817 offset = findstring(start, end-start,
1818 from_s, from_len,
1819 0, end-start, FORWARD);
1820 if (offset==-1)
1821 break;
1822 Py_MEMCPY(start+offset, to_s, from_len);
1823 start += offset+from_len;
1824 }
1825
1826 return result;
1827}
1828
1829/* len(self)>=1, len(from)==1, len(to)>=2, maxcount>=1 */
1830Py_LOCAL(PyBytesObject *)
1831replace_single_character(PyBytesObject *self,
1832 char from_c,
1833 const char *to_s, Py_ssize_t to_len,
1834 Py_ssize_t maxcount)
1835{
1836 char *self_s, *result_s;
1837 char *start, *next, *end;
1838 Py_ssize_t self_len, result_len;
1839 Py_ssize_t count, product;
1840 PyBytesObject *result;
1841
1842 self_s = PyBytes_AS_STRING(self);
1843 self_len = PyBytes_GET_SIZE(self);
1844
1845 count = countchar(self_s, self_len, from_c, maxcount);
1846 if (count == 0) {
1847 /* no matches, return unchanged */
1848 return return_self(self);
1849 }
1850
1851 /* use the difference between current and new, hence the "-1" */
1852 /* result_len = self_len + count * (to_len-1) */
1853 product = count * (to_len-1);
1854 if (product / (to_len-1) != count) {
1855 PyErr_SetString(PyExc_OverflowError, "replace bytes is too long");
1856 return NULL;
1857 }
1858 result_len = self_len + product;
1859 if (result_len < 0) {
1860 PyErr_SetString(PyExc_OverflowError, "replace bytes is too long");
1861 return NULL;
1862 }
1863
1864 if ( (result = (PyBytesObject *)
1865 PyBytes_FromStringAndSize(NULL, result_len)) == NULL)
1866 return NULL;
1867 result_s = PyBytes_AS_STRING(result);
1868
1869 start = self_s;
1870 end = self_s + self_len;
1871 while (count-- > 0) {
1872 next = findchar(start, end-start, from_c);
Guido van Rossumb6f1fdc2007-04-12 22:49:52 +00001873 if (next == NULL)
Neal Norwitz6968b052007-02-27 19:02:19 +00001874 break;
1875
1876 if (next == start) {
1877 /* replace with the 'to' */
1878 Py_MEMCPY(result_s, to_s, to_len);
1879 result_s += to_len;
1880 start += 1;
1881 } else {
1882 /* copy the unchanged old then the 'to' */
1883 Py_MEMCPY(result_s, start, next-start);
1884 result_s += (next-start);
1885 Py_MEMCPY(result_s, to_s, to_len);
1886 result_s += to_len;
1887 start = next+1;
1888 }
1889 }
1890 /* Copy the remainder of the remaining bytes */
1891 Py_MEMCPY(result_s, start, end-start);
1892
1893 return result;
1894}
1895
1896/* len(self)>=1, len(from)>=2, len(to)>=2, maxcount>=1 */
1897Py_LOCAL(PyBytesObject *)
1898replace_substring(PyBytesObject *self,
1899 const char *from_s, Py_ssize_t from_len,
1900 const char *to_s, Py_ssize_t to_len,
1901 Py_ssize_t maxcount)
1902{
1903 char *self_s, *result_s;
1904 char *start, *next, *end;
1905 Py_ssize_t self_len, result_len;
1906 Py_ssize_t count, offset, product;
1907 PyBytesObject *result;
1908
1909 self_s = PyBytes_AS_STRING(self);
1910 self_len = PyBytes_GET_SIZE(self);
1911
1912 count = countstring(self_s, self_len,
1913 from_s, from_len,
1914 0, self_len, FORWARD, maxcount);
1915 if (count == 0) {
1916 /* no matches, return unchanged */
1917 return return_self(self);
1918 }
1919
1920 /* Check for overflow */
1921 /* result_len = self_len + count * (to_len-from_len) */
1922 product = count * (to_len-from_len);
1923 if (product / (to_len-from_len) != count) {
1924 PyErr_SetString(PyExc_OverflowError, "replace bytes is too long");
1925 return NULL;
1926 }
1927 result_len = self_len + product;
1928 if (result_len < 0) {
1929 PyErr_SetString(PyExc_OverflowError, "replace bytes is too long");
1930 return NULL;
1931 }
1932
1933 if ( (result = (PyBytesObject *)
1934 PyBytes_FromStringAndSize(NULL, result_len)) == NULL)
1935 return NULL;
1936 result_s = PyBytes_AS_STRING(result);
1937
1938 start = self_s;
1939 end = self_s + self_len;
1940 while (count-- > 0) {
1941 offset = findstring(start, end-start,
1942 from_s, from_len,
1943 0, end-start, FORWARD);
1944 if (offset == -1)
1945 break;
1946 next = start+offset;
1947 if (next == start) {
1948 /* replace with the 'to' */
1949 Py_MEMCPY(result_s, to_s, to_len);
1950 result_s += to_len;
1951 start += from_len;
1952 } else {
1953 /* copy the unchanged old then the 'to' */
1954 Py_MEMCPY(result_s, start, next-start);
1955 result_s += (next-start);
1956 Py_MEMCPY(result_s, to_s, to_len);
1957 result_s += to_len;
1958 start = next+from_len;
1959 }
1960 }
1961 /* Copy the remainder of the remaining bytes */
1962 Py_MEMCPY(result_s, start, end-start);
1963
1964 return result;
1965}
1966
1967
1968Py_LOCAL(PyBytesObject *)
1969replace(PyBytesObject *self,
1970 const char *from_s, Py_ssize_t from_len,
1971 const char *to_s, Py_ssize_t to_len,
1972 Py_ssize_t maxcount)
1973{
1974 if (maxcount < 0) {
1975 maxcount = PY_SSIZE_T_MAX;
1976 } else if (maxcount == 0 || PyBytes_GET_SIZE(self) == 0) {
1977 /* nothing to do; return the original bytes */
1978 return return_self(self);
1979 }
1980
1981 if (maxcount == 0 ||
1982 (from_len == 0 && to_len == 0)) {
1983 /* nothing to do; return the original bytes */
1984 return return_self(self);
1985 }
1986
1987 /* Handle zero-length special cases */
1988
1989 if (from_len == 0) {
1990 /* insert the 'to' bytes everywhere. */
1991 /* >>> "Python".replace("", ".") */
1992 /* '.P.y.t.h.o.n.' */
1993 return replace_interleave(self, to_s, to_len, maxcount);
1994 }
1995
1996 /* Except for "".replace("", "A") == "A" there is no way beyond this */
1997 /* point for an empty self bytes to generate a non-empty bytes */
1998 /* Special case so the remaining code always gets a non-empty bytes */
1999 if (PyBytes_GET_SIZE(self) == 0) {
2000 return return_self(self);
2001 }
2002
2003 if (to_len == 0) {
2004 /* delete all occurances of 'from' bytes */
2005 if (from_len == 1) {
2006 return replace_delete_single_character(
2007 self, from_s[0], maxcount);
2008 } else {
2009 return replace_delete_substring(self, from_s, from_len, maxcount);
2010 }
2011 }
2012
2013 /* Handle special case where both bytes have the same length */
2014
2015 if (from_len == to_len) {
2016 if (from_len == 1) {
2017 return replace_single_character_in_place(
2018 self,
2019 from_s[0],
2020 to_s[0],
2021 maxcount);
2022 } else {
2023 return replace_substring_in_place(
2024 self, from_s, from_len, to_s, to_len, maxcount);
2025 }
2026 }
2027
2028 /* Otherwise use the more generic algorithms */
2029 if (from_len == 1) {
2030 return replace_single_character(self, from_s[0],
2031 to_s, to_len, maxcount);
2032 } else {
2033 /* len('from')>=2, len('to')>=1 */
2034 return replace_substring(self, from_s, from_len, to_s, to_len, maxcount);
2035 }
2036}
2037
Gregory P. Smith60d241f2007-10-16 06:31:30 +00002038
Neal Norwitz6968b052007-02-27 19:02:19 +00002039PyDoc_STRVAR(replace__doc__,
Guido van Rossum98297ee2007-11-06 21:34:58 +00002040"B.replace(old, new[, count]) -> bytes\n\
Neal Norwitz6968b052007-02-27 19:02:19 +00002041\n\
Guido van Rossum98297ee2007-11-06 21:34:58 +00002042Return a copy of B with all occurrences of subsection\n\
Neal Norwitz6968b052007-02-27 19:02:19 +00002043old replaced by new. If the optional argument count is\n\
2044given, only the first count occurrences are replaced.");
2045
2046static PyObject *
2047bytes_replace(PyBytesObject *self, PyObject *args)
2048{
2049 Py_ssize_t count = -1;
Travis E. Oliphantb99f7622007-08-18 11:21:56 +00002050 PyObject *from, *to, *res;
Travis E. Oliphant8ae62b62007-09-23 02:00:13 +00002051 Py_buffer vfrom, vto;
Neal Norwitz6968b052007-02-27 19:02:19 +00002052
2053 if (!PyArg_ParseTuple(args, "OO|n:replace", &from, &to, &count))
2054 return NULL;
2055
Guido van Rossuma74184e2007-08-29 04:05:57 +00002056 if (_getbuffer(from, &vfrom) < 0)
2057 return NULL;
2058 if (_getbuffer(to, &vto) < 0) {
2059 PyObject_ReleaseBuffer(from, &vfrom);
2060 return NULL;
Travis E. Oliphantb99f7622007-08-18 11:21:56 +00002061 }
Neal Norwitz6968b052007-02-27 19:02:19 +00002062
Travis E. Oliphantb99f7622007-08-18 11:21:56 +00002063 res = (PyObject *)replace((PyBytesObject *) self,
Guido van Rossuma74184e2007-08-29 04:05:57 +00002064 vfrom.buf, vfrom.len,
2065 vto.buf, vto.len, count);
Travis E. Oliphantb99f7622007-08-18 11:21:56 +00002066
Guido van Rossuma74184e2007-08-29 04:05:57 +00002067 PyObject_ReleaseBuffer(from, &vfrom);
2068 PyObject_ReleaseBuffer(to, &vto);
Travis E. Oliphantb99f7622007-08-18 11:21:56 +00002069 return res;
Neal Norwitz6968b052007-02-27 19:02:19 +00002070}
2071
2072
2073/* Overallocate the initial list to reduce the number of reallocs for small
2074 split sizes. Eg, "A A A A A A A A A A".split() (10 elements) has three
2075 resizes, to sizes 4, 8, then 16. Most observed string splits are for human
2076 text (roughly 11 words per line) and field delimited data (usually 1-10
2077 fields). For large strings the split algorithms are bandwidth limited
2078 so increasing the preallocation likely will not improve things.*/
2079
2080#define MAX_PREALLOC 12
2081
2082/* 5 splits gives 6 elements */
2083#define PREALLOC_SIZE(maxsplit) \
2084 (maxsplit >= MAX_PREALLOC ? MAX_PREALLOC : maxsplit+1)
2085
2086#define SPLIT_APPEND(data, left, right) \
2087 str = PyBytes_FromStringAndSize((data) + (left), \
2088 (right) - (left)); \
2089 if (str == NULL) \
2090 goto onError; \
2091 if (PyList_Append(list, str)) { \
2092 Py_DECREF(str); \
2093 goto onError; \
2094 } \
2095 else \
2096 Py_DECREF(str);
2097
2098#define SPLIT_ADD(data, left, right) { \
2099 str = PyBytes_FromStringAndSize((data) + (left), \
2100 (right) - (left)); \
2101 if (str == NULL) \
2102 goto onError; \
2103 if (count < MAX_PREALLOC) { \
2104 PyList_SET_ITEM(list, count, str); \
2105 } else { \
2106 if (PyList_Append(list, str)) { \
2107 Py_DECREF(str); \
2108 goto onError; \
2109 } \
2110 else \
2111 Py_DECREF(str); \
2112 } \
2113 count++; }
2114
2115/* Always force the list to the expected size. */
Christian Heimes90aa7642007-12-19 02:45:37 +00002116#define FIX_PREALLOC_SIZE(list) Py_SIZE(list) = count
Neal Norwitz6968b052007-02-27 19:02:19 +00002117
2118
2119Py_LOCAL_INLINE(PyObject *)
2120split_char(const char *s, Py_ssize_t len, char ch, Py_ssize_t maxcount)
2121{
Guido van Rossum8f950672007-09-10 16:53:45 +00002122 register Py_ssize_t i, j, count = 0;
Neal Norwitz6968b052007-02-27 19:02:19 +00002123 PyObject *str;
2124 PyObject *list = PyList_New(PREALLOC_SIZE(maxcount));
2125
2126 if (list == NULL)
2127 return NULL;
2128
2129 i = j = 0;
2130 while ((j < len) && (maxcount-- > 0)) {
Guido van Rossum8f950672007-09-10 16:53:45 +00002131 for(; j < len; j++) {
Neal Norwitz6968b052007-02-27 19:02:19 +00002132 /* I found that using memchr makes no difference */
2133 if (s[j] == ch) {
2134 SPLIT_ADD(s, i, j);
2135 i = j = j + 1;
2136 break;
2137 }
2138 }
2139 }
2140 if (i <= len) {
2141 SPLIT_ADD(s, i, len);
2142 }
2143 FIX_PREALLOC_SIZE(list);
2144 return list;
2145
2146 onError:
2147 Py_DECREF(list);
2148 return NULL;
2149}
2150
Guido van Rossum8f950672007-09-10 16:53:45 +00002151
2152Py_LOCAL_INLINE(PyObject *)
2153split_whitespace(const char *s, Py_ssize_t len, Py_ssize_t maxcount)
2154{
2155 register Py_ssize_t i, j, count = 0;
2156 PyObject *str;
2157 PyObject *list = PyList_New(PREALLOC_SIZE(maxcount));
2158
2159 if (list == NULL)
2160 return NULL;
2161
2162 for (i = j = 0; i < len; ) {
Guido van Rossum98297ee2007-11-06 21:34:58 +00002163 /* find a token */
2164 while (i < len && ISSPACE(s[i]))
2165 i++;
2166 j = i;
2167 while (i < len && !ISSPACE(s[i]))
2168 i++;
2169 if (j < i) {
2170 if (maxcount-- <= 0)
2171 break;
2172 SPLIT_ADD(s, j, i);
2173 while (i < len && ISSPACE(s[i]))
2174 i++;
2175 j = i;
2176 }
Guido van Rossum8f950672007-09-10 16:53:45 +00002177 }
2178 if (j < len) {
Guido van Rossum98297ee2007-11-06 21:34:58 +00002179 SPLIT_ADD(s, j, len);
Guido van Rossum8f950672007-09-10 16:53:45 +00002180 }
2181 FIX_PREALLOC_SIZE(list);
2182 return list;
2183
2184 onError:
2185 Py_DECREF(list);
2186 return NULL;
2187}
2188
Neal Norwitz6968b052007-02-27 19:02:19 +00002189PyDoc_STRVAR(split__doc__,
Guido van Rossum254348e2007-11-21 19:29:53 +00002190"B.split([sep[, maxsplit]]) -> list of bytearray\n\
Neal Norwitz6968b052007-02-27 19:02:19 +00002191\n\
Guido van Rossum98297ee2007-11-06 21:34:58 +00002192Return a list of the sections in B, using sep as the delimiter.\n\
2193If sep is not given, B is split on ASCII whitespace characters\n\
Guido van Rossum8f950672007-09-10 16:53:45 +00002194(space, tab, return, newline, formfeed, vertical tab).\n\
2195If maxsplit is given, at most maxsplit splits are done.");
Neal Norwitz6968b052007-02-27 19:02:19 +00002196
2197static PyObject *
2198bytes_split(PyBytesObject *self, PyObject *args)
2199{
2200 Py_ssize_t len = PyBytes_GET_SIZE(self), n, i, j;
Guido van Rossum8f950672007-09-10 16:53:45 +00002201 Py_ssize_t maxsplit = -1, count = 0;
Neal Norwitz6968b052007-02-27 19:02:19 +00002202 const char *s = PyBytes_AS_STRING(self), *sub;
Guido van Rossum8f950672007-09-10 16:53:45 +00002203 PyObject *list, *str, *subobj = Py_None;
Travis E. Oliphant8ae62b62007-09-23 02:00:13 +00002204 Py_buffer vsub;
Neal Norwitz6968b052007-02-27 19:02:19 +00002205#ifdef USE_FAST
2206 Py_ssize_t pos;
2207#endif
2208
Guido van Rossum8f950672007-09-10 16:53:45 +00002209 if (!PyArg_ParseTuple(args, "|On:split", &subobj, &maxsplit))
Neal Norwitz6968b052007-02-27 19:02:19 +00002210 return NULL;
2211 if (maxsplit < 0)
2212 maxsplit = PY_SSIZE_T_MAX;
Guido van Rossum8f950672007-09-10 16:53:45 +00002213
2214 if (subobj == Py_None)
2215 return split_whitespace(s, len, maxsplit);
2216
2217 if (_getbuffer(subobj, &vsub) < 0)
Neal Norwitz6968b052007-02-27 19:02:19 +00002218 return NULL;
Guido van Rossum8f950672007-09-10 16:53:45 +00002219 sub = vsub.buf;
2220 n = vsub.len;
Neal Norwitz6968b052007-02-27 19:02:19 +00002221
2222 if (n == 0) {
2223 PyErr_SetString(PyExc_ValueError, "empty separator");
Guido van Rossum8f950672007-09-10 16:53:45 +00002224 PyObject_ReleaseBuffer(subobj, &vsub);
Neal Norwitz6968b052007-02-27 19:02:19 +00002225 return NULL;
2226 }
Guido van Rossum8f950672007-09-10 16:53:45 +00002227 if (n == 1)
Neal Norwitz6968b052007-02-27 19:02:19 +00002228 return split_char(s, len, sub[0], maxsplit);
2229
2230 list = PyList_New(PREALLOC_SIZE(maxsplit));
Guido van Rossum8f950672007-09-10 16:53:45 +00002231 if (list == NULL) {
2232 PyObject_ReleaseBuffer(subobj, &vsub);
Neal Norwitz6968b052007-02-27 19:02:19 +00002233 return NULL;
Guido van Rossum8f950672007-09-10 16:53:45 +00002234 }
Neal Norwitz6968b052007-02-27 19:02:19 +00002235
2236#ifdef USE_FAST
2237 i = j = 0;
2238 while (maxsplit-- > 0) {
2239 pos = fastsearch(s+i, len-i, sub, n, FAST_SEARCH);
2240 if (pos < 0)
2241 break;
2242 j = i+pos;
2243 SPLIT_ADD(s, i, j);
2244 i = j + n;
2245 }
2246#else
2247 i = j = 0;
2248 while ((j+n <= len) && (maxsplit-- > 0)) {
2249 for (; j+n <= len; j++) {
2250 if (Py_STRING_MATCH(s, j, sub, n)) {
2251 SPLIT_ADD(s, i, j);
2252 i = j = j + n;
2253 break;
2254 }
2255 }
2256 }
2257#endif
2258 SPLIT_ADD(s, i, len);
2259 FIX_PREALLOC_SIZE(list);
Guido van Rossum8f950672007-09-10 16:53:45 +00002260 PyObject_ReleaseBuffer(subobj, &vsub);
Neal Norwitz6968b052007-02-27 19:02:19 +00002261 return list;
2262
2263 onError:
2264 Py_DECREF(list);
Guido van Rossum8f950672007-09-10 16:53:45 +00002265 PyObject_ReleaseBuffer(subobj, &vsub);
Neal Norwitz6968b052007-02-27 19:02:19 +00002266 return NULL;
2267}
2268
Guido van Rossum98297ee2007-11-06 21:34:58 +00002269/* stringlib's partition shares nullbytes in some cases.
2270 undo this, we don't want the nullbytes to be shared. */
2271static PyObject *
2272make_nullbytes_unique(PyObject *result)
2273{
2274 if (result != NULL) {
2275 int i;
2276 assert(PyTuple_Check(result));
2277 assert(PyTuple_GET_SIZE(result) == 3);
2278 for (i = 0; i < 3; i++) {
2279 if (PyTuple_GET_ITEM(result, i) == (PyObject *)nullbytes) {
2280 PyObject *new = PyBytes_FromStringAndSize(NULL, 0);
2281 if (new == NULL) {
2282 Py_DECREF(result);
2283 result = NULL;
2284 break;
2285 }
2286 Py_DECREF(nullbytes);
2287 PyTuple_SET_ITEM(result, i, new);
2288 }
2289 }
2290 }
2291 return result;
2292}
2293
Neal Norwitz6968b052007-02-27 19:02:19 +00002294PyDoc_STRVAR(partition__doc__,
2295"B.partition(sep) -> (head, sep, tail)\n\
2296\n\
2297Searches for the separator sep in B, and returns the part before it,\n\
2298the separator itself, and the part after it. If the separator is not\n\
Guido van Rossum254348e2007-11-21 19:29:53 +00002299found, returns B and two empty bytearray objects.");
Neal Norwitz6968b052007-02-27 19:02:19 +00002300
2301static PyObject *
2302bytes_partition(PyBytesObject *self, PyObject *sep_obj)
2303{
2304 PyObject *bytesep, *result;
2305
2306 bytesep = PyBytes_FromObject(sep_obj);
2307 if (! bytesep)
2308 return NULL;
2309
2310 result = stringlib_partition(
2311 (PyObject*) self,
2312 PyBytes_AS_STRING(self), PyBytes_GET_SIZE(self),
Guido van Rossumb6f1fdc2007-04-12 22:49:52 +00002313 bytesep,
Neal Norwitz6968b052007-02-27 19:02:19 +00002314 PyBytes_AS_STRING(bytesep), PyBytes_GET_SIZE(bytesep)
2315 );
2316
2317 Py_DECREF(bytesep);
Guido van Rossum98297ee2007-11-06 21:34:58 +00002318 return make_nullbytes_unique(result);
Neal Norwitz6968b052007-02-27 19:02:19 +00002319}
2320
2321PyDoc_STRVAR(rpartition__doc__,
2322"B.rpartition(sep) -> (tail, sep, head)\n\
2323\n\
Guido van Rossum98297ee2007-11-06 21:34:58 +00002324Searches for the separator sep in B, starting at the end of B,\n\
2325and returns the part before it, the separator itself, and the\n\
2326part after it. If the separator is not found, returns two empty\n\
Guido van Rossum254348e2007-11-21 19:29:53 +00002327bytearray objects and B.");
Neal Norwitz6968b052007-02-27 19:02:19 +00002328
2329static PyObject *
2330bytes_rpartition(PyBytesObject *self, PyObject *sep_obj)
2331{
2332 PyObject *bytesep, *result;
2333
2334 bytesep = PyBytes_FromObject(sep_obj);
2335 if (! bytesep)
2336 return NULL;
2337
2338 result = stringlib_rpartition(
2339 (PyObject*) self,
2340 PyBytes_AS_STRING(self), PyBytes_GET_SIZE(self),
Guido van Rossumb6f1fdc2007-04-12 22:49:52 +00002341 bytesep,
Neal Norwitz6968b052007-02-27 19:02:19 +00002342 PyBytes_AS_STRING(bytesep), PyBytes_GET_SIZE(bytesep)
2343 );
2344
2345 Py_DECREF(bytesep);
Guido van Rossum98297ee2007-11-06 21:34:58 +00002346 return make_nullbytes_unique(result);
Neal Norwitz6968b052007-02-27 19:02:19 +00002347}
2348
2349Py_LOCAL_INLINE(PyObject *)
2350rsplit_char(const char *s, Py_ssize_t len, char ch, Py_ssize_t maxcount)
2351{
2352 register Py_ssize_t i, j, count=0;
2353 PyObject *str;
2354 PyObject *list = PyList_New(PREALLOC_SIZE(maxcount));
2355
2356 if (list == NULL)
2357 return NULL;
2358
2359 i = j = len - 1;
2360 while ((i >= 0) && (maxcount-- > 0)) {
2361 for (; i >= 0; i--) {
2362 if (s[i] == ch) {
2363 SPLIT_ADD(s, i + 1, j + 1);
2364 j = i = i - 1;
2365 break;
2366 }
2367 }
2368 }
2369 if (j >= -1) {
2370 SPLIT_ADD(s, 0, j + 1);
2371 }
2372 FIX_PREALLOC_SIZE(list);
2373 if (PyList_Reverse(list) < 0)
2374 goto onError;
2375
2376 return list;
2377
2378 onError:
2379 Py_DECREF(list);
2380 return NULL;
2381}
2382
Guido van Rossum8f950672007-09-10 16:53:45 +00002383Py_LOCAL_INLINE(PyObject *)
2384rsplit_whitespace(const char *s, Py_ssize_t len, Py_ssize_t maxcount)
2385{
2386 register Py_ssize_t i, j, count = 0;
2387 PyObject *str;
2388 PyObject *list = PyList_New(PREALLOC_SIZE(maxcount));
2389
2390 if (list == NULL)
2391 return NULL;
2392
2393 for (i = j = len - 1; i >= 0; ) {
Guido van Rossum98297ee2007-11-06 21:34:58 +00002394 /* find a token */
Christian Heimes7b876152008-01-30 09:51:48 +00002395 while (i >= 0 && ISSPACE(s[i]))
Guido van Rossum98297ee2007-11-06 21:34:58 +00002396 i--;
2397 j = i;
Christian Heimes7b876152008-01-30 09:51:48 +00002398 while (i >= 0 && !ISSPACE(s[i]))
Guido van Rossum98297ee2007-11-06 21:34:58 +00002399 i--;
2400 if (j > i) {
2401 if (maxcount-- <= 0)
2402 break;
2403 SPLIT_ADD(s, i + 1, j + 1);
Christian Heimes7b876152008-01-30 09:51:48 +00002404 while (i >= 0 && ISSPACE(s[i]))
Guido van Rossum98297ee2007-11-06 21:34:58 +00002405 i--;
2406 j = i;
2407 }
Guido van Rossum8f950672007-09-10 16:53:45 +00002408 }
2409 if (j >= 0) {
Guido van Rossum98297ee2007-11-06 21:34:58 +00002410 SPLIT_ADD(s, 0, j + 1);
Guido van Rossum8f950672007-09-10 16:53:45 +00002411 }
2412 FIX_PREALLOC_SIZE(list);
2413 if (PyList_Reverse(list) < 0)
2414 goto onError;
2415
2416 return list;
2417
2418 onError:
2419 Py_DECREF(list);
2420 return NULL;
2421}
2422
Neal Norwitz6968b052007-02-27 19:02:19 +00002423PyDoc_STRVAR(rsplit__doc__,
Guido van Rossum254348e2007-11-21 19:29:53 +00002424"B.rsplit(sep[, maxsplit]) -> list of bytearray\n\
Neal Norwitz6968b052007-02-27 19:02:19 +00002425\n\
Guido van Rossum98297ee2007-11-06 21:34:58 +00002426Return a list of the sections in B, using sep as the delimiter,\n\
2427starting at the end of B and working to the front.\n\
Guido van Rossum8f950672007-09-10 16:53:45 +00002428If sep is not given, B is split on ASCII whitespace characters\n\
2429(space, tab, return, newline, formfeed, vertical tab).\n\
2430If maxsplit is given, at most maxsplit splits are done.");
Neal Norwitz6968b052007-02-27 19:02:19 +00002431
2432static PyObject *
2433bytes_rsplit(PyBytesObject *self, PyObject *args)
2434{
2435 Py_ssize_t len = PyBytes_GET_SIZE(self), n, i, j;
Guido van Rossum8f950672007-09-10 16:53:45 +00002436 Py_ssize_t maxsplit = -1, count = 0;
Neal Norwitz6968b052007-02-27 19:02:19 +00002437 const char *s = PyBytes_AS_STRING(self), *sub;
Guido van Rossum8f950672007-09-10 16:53:45 +00002438 PyObject *list, *str, *subobj = Py_None;
Travis E. Oliphant8ae62b62007-09-23 02:00:13 +00002439 Py_buffer vsub;
Neal Norwitz6968b052007-02-27 19:02:19 +00002440
Guido van Rossum8f950672007-09-10 16:53:45 +00002441 if (!PyArg_ParseTuple(args, "|On:rsplit", &subobj, &maxsplit))
Neal Norwitz6968b052007-02-27 19:02:19 +00002442 return NULL;
2443 if (maxsplit < 0)
2444 maxsplit = PY_SSIZE_T_MAX;
Guido van Rossum8f950672007-09-10 16:53:45 +00002445
2446 if (subobj == Py_None)
2447 return rsplit_whitespace(s, len, maxsplit);
2448
2449 if (_getbuffer(subobj, &vsub) < 0)
Neal Norwitz6968b052007-02-27 19:02:19 +00002450 return NULL;
Guido van Rossum8f950672007-09-10 16:53:45 +00002451 sub = vsub.buf;
2452 n = vsub.len;
Neal Norwitz6968b052007-02-27 19:02:19 +00002453
2454 if (n == 0) {
2455 PyErr_SetString(PyExc_ValueError, "empty separator");
Guido van Rossum8f950672007-09-10 16:53:45 +00002456 PyObject_ReleaseBuffer(subobj, &vsub);
Neal Norwitz6968b052007-02-27 19:02:19 +00002457 return NULL;
2458 }
2459 else if (n == 1)
2460 return rsplit_char(s, len, sub[0], maxsplit);
2461
2462 list = PyList_New(PREALLOC_SIZE(maxsplit));
Guido van Rossum8f950672007-09-10 16:53:45 +00002463 if (list == NULL) {
2464 PyObject_ReleaseBuffer(subobj, &vsub);
Neal Norwitz6968b052007-02-27 19:02:19 +00002465 return NULL;
Guido van Rossum8f950672007-09-10 16:53:45 +00002466 }
Neal Norwitz6968b052007-02-27 19:02:19 +00002467
2468 j = len;
2469 i = j - n;
2470
2471 while ( (i >= 0) && (maxsplit-- > 0) ) {
2472 for (; i>=0; i--) {
2473 if (Py_STRING_MATCH(s, i, sub, n)) {
2474 SPLIT_ADD(s, i + n, j);
2475 j = i;
2476 i -= n;
2477 break;
2478 }
2479 }
2480 }
2481 SPLIT_ADD(s, 0, j);
2482 FIX_PREALLOC_SIZE(list);
2483 if (PyList_Reverse(list) < 0)
2484 goto onError;
Guido van Rossum8f950672007-09-10 16:53:45 +00002485 PyObject_ReleaseBuffer(subobj, &vsub);
Neal Norwitz6968b052007-02-27 19:02:19 +00002486 return list;
2487
2488onError:
2489 Py_DECREF(list);
Guido van Rossum8f950672007-09-10 16:53:45 +00002490 PyObject_ReleaseBuffer(subobj, &vsub);
Neal Norwitz6968b052007-02-27 19:02:19 +00002491 return NULL;
2492}
2493
Neal Norwitz6968b052007-02-27 19:02:19 +00002494PyDoc_STRVAR(reverse__doc__,
2495"B.reverse() -> None\n\
2496\n\
Guido van Rossum98297ee2007-11-06 21:34:58 +00002497Reverse the order of the values in B in place.");
Neal Norwitz6968b052007-02-27 19:02:19 +00002498static PyObject *
2499bytes_reverse(PyBytesObject *self, PyObject *unused)
2500{
2501 char swap, *head, *tail;
Christian Heimes90aa7642007-12-19 02:45:37 +00002502 Py_ssize_t i, j, n = Py_SIZE(self);
Neal Norwitz6968b052007-02-27 19:02:19 +00002503
2504 j = n / 2;
2505 head = self->ob_bytes;
2506 tail = head + n - 1;
2507 for (i = 0; i < j; i++) {
2508 swap = *head;
2509 *head++ = *tail;
2510 *tail-- = swap;
2511 }
2512
2513 Py_RETURN_NONE;
2514}
2515
2516PyDoc_STRVAR(insert__doc__,
2517"B.insert(index, int) -> None\n\
2518\n\
Guido van Rossum254348e2007-11-21 19:29:53 +00002519Insert a single item into the bytearray before the given index.");
Neal Norwitz6968b052007-02-27 19:02:19 +00002520static PyObject *
2521bytes_insert(PyBytesObject *self, PyObject *args)
2522{
2523 int value;
Christian Heimes90aa7642007-12-19 02:45:37 +00002524 Py_ssize_t where, n = Py_SIZE(self);
Neal Norwitz6968b052007-02-27 19:02:19 +00002525
2526 if (!PyArg_ParseTuple(args, "ni:insert", &where, &value))
2527 return NULL;
2528
2529 if (n == PY_SSIZE_T_MAX) {
2530 PyErr_SetString(PyExc_OverflowError,
2531 "cannot add more objects to bytes");
2532 return NULL;
2533 }
2534 if (value < 0 || value >= 256) {
2535 PyErr_SetString(PyExc_ValueError,
2536 "byte must be in range(0, 256)");
2537 return NULL;
2538 }
2539 if (PyBytes_Resize((PyObject *)self, n + 1) < 0)
2540 return NULL;
2541
2542 if (where < 0) {
2543 where += n;
2544 if (where < 0)
2545 where = 0;
2546 }
2547 if (where > n)
2548 where = n;
Guido van Rossum4fc8ae42007-02-27 20:57:45 +00002549 memmove(self->ob_bytes + where + 1, self->ob_bytes + where, n - where);
Neal Norwitz6968b052007-02-27 19:02:19 +00002550 self->ob_bytes[where] = value;
2551
2552 Py_RETURN_NONE;
2553}
2554
2555PyDoc_STRVAR(append__doc__,
2556"B.append(int) -> None\n\
2557\n\
Guido van Rossum98297ee2007-11-06 21:34:58 +00002558Append a single item to the end of B.");
Neal Norwitz6968b052007-02-27 19:02:19 +00002559static PyObject *
2560bytes_append(PyBytesObject *self, PyObject *arg)
2561{
2562 int value;
Christian Heimes90aa7642007-12-19 02:45:37 +00002563 Py_ssize_t n = Py_SIZE(self);
Neal Norwitz6968b052007-02-27 19:02:19 +00002564
2565 if (! _getbytevalue(arg, &value))
2566 return NULL;
2567 if (n == PY_SSIZE_T_MAX) {
2568 PyErr_SetString(PyExc_OverflowError,
2569 "cannot add more objects to bytes");
2570 return NULL;
2571 }
2572 if (PyBytes_Resize((PyObject *)self, n + 1) < 0)
2573 return NULL;
2574
2575 self->ob_bytes[n] = value;
2576
2577 Py_RETURN_NONE;
2578}
2579
Alexandre Vassalotti09121e82007-12-04 05:51:13 +00002580PyDoc_STRVAR(extend__doc__,
2581"B.extend(iterable int) -> None\n\
2582\n\
2583Append all the elements from the iterator or sequence to the\n\
2584end of B.");
2585static PyObject *
2586bytes_extend(PyBytesObject *self, PyObject *arg)
2587{
Alexandre Vassalotti8dcdb252008-04-14 20:51:05 +00002588 PyObject *it, *item, *bytes_obj;
Alexandre Vassalotti09121e82007-12-04 05:51:13 +00002589 Py_ssize_t buf_size = 0, len = 0;
2590 int value;
2591 char *buf;
2592
2593 /* bytes_setslice code only accepts something supporting PEP 3118. */
2594 if (PyObject_CheckBuffer(arg)) {
Christian Heimes90aa7642007-12-19 02:45:37 +00002595 if (bytes_setslice(self, Py_SIZE(self), Py_SIZE(self), arg) == -1)
Alexandre Vassalotti09121e82007-12-04 05:51:13 +00002596 return NULL;
2597
2598 Py_RETURN_NONE;
2599 }
2600
2601 it = PyObject_GetIter(arg);
2602 if (it == NULL)
2603 return NULL;
2604
Christian Heimes255f53b2007-12-08 15:33:56 +00002605 /* Try to determine the length of the argument. 32 is abitrary. */
2606 buf_size = _PyObject_LengthHint(arg, 32);
Alexandre Vassalotti09121e82007-12-04 05:51:13 +00002607
Alexandre Vassalotti8dcdb252008-04-14 20:51:05 +00002608 bytes_obj = PyBytes_FromStringAndSize(NULL, buf_size);
2609 if (bytes_obj == NULL)
2610 return NULL;
2611 buf = PyBytes_AS_STRING(bytes_obj);
Alexandre Vassalotti09121e82007-12-04 05:51:13 +00002612
2613 while ((item = PyIter_Next(it)) != NULL) {
2614 if (! _getbytevalue(item, &value)) {
2615 Py_DECREF(item);
2616 Py_DECREF(it);
Alexandre Vassalotti8dcdb252008-04-14 20:51:05 +00002617 Py_DECREF(bytes_obj);
Alexandre Vassalotti09121e82007-12-04 05:51:13 +00002618 return NULL;
2619 }
2620 buf[len++] = value;
2621 Py_DECREF(item);
Alexandre Vassalotti8dcdb252008-04-14 20:51:05 +00002622
Alexandre Vassalotti09121e82007-12-04 05:51:13 +00002623 if (len >= buf_size) {
2624 buf_size = len + (len >> 1) + 1;
Alexandre Vassalotti8dcdb252008-04-14 20:51:05 +00002625 if (PyBytes_Resize((PyObject *)bytes_obj, buf_size) < 0) {
Alexandre Vassalotti09121e82007-12-04 05:51:13 +00002626 Py_DECREF(it);
Alexandre Vassalotti8dcdb252008-04-14 20:51:05 +00002627 Py_DECREF(bytes_obj);
2628 return NULL;
Alexandre Vassalotti09121e82007-12-04 05:51:13 +00002629 }
Alexandre Vassalotti8dcdb252008-04-14 20:51:05 +00002630 /* Recompute the `buf' pointer, since the resizing operation may
2631 have invalidated it. */
2632 buf = PyBytes_AS_STRING(bytes_obj);
Alexandre Vassalotti09121e82007-12-04 05:51:13 +00002633 }
2634 }
2635 Py_DECREF(it);
2636
Alexandre Vassalotti8dcdb252008-04-14 20:51:05 +00002637 /* Resize down to exact size. */
2638 if (PyBytes_Resize((PyObject *)bytes_obj, len) < 0) {
2639 Py_DECREF(bytes_obj);
2640 return NULL;
2641 }
Alexandre Vassalotti09121e82007-12-04 05:51:13 +00002642
Alexandre Vassalotti8dcdb252008-04-14 20:51:05 +00002643 if (bytes_setslice(self, Py_SIZE(self), Py_SIZE(self), bytes_obj) == -1)
2644 return NULL;
2645 Py_DECREF(bytes_obj);
2646
2647 Py_RETURN_NONE;
Alexandre Vassalotti09121e82007-12-04 05:51:13 +00002648}
2649
Neal Norwitz6968b052007-02-27 19:02:19 +00002650PyDoc_STRVAR(pop__doc__,
2651"B.pop([index]) -> int\n\
2652\n\
Guido van Rossum98297ee2007-11-06 21:34:58 +00002653Remove and return a single item from B. If no index\n\
Neal Norwitz6968b052007-02-27 19:02:19 +00002654argument is give, will pop the last value.");
2655static PyObject *
2656bytes_pop(PyBytesObject *self, PyObject *args)
2657{
2658 int value;
Christian Heimes90aa7642007-12-19 02:45:37 +00002659 Py_ssize_t where = -1, n = Py_SIZE(self);
Neal Norwitz6968b052007-02-27 19:02:19 +00002660
2661 if (!PyArg_ParseTuple(args, "|n:pop", &where))
2662 return NULL;
2663
2664 if (n == 0) {
2665 PyErr_SetString(PyExc_OverflowError,
2666 "cannot pop an empty bytes");
2667 return NULL;
2668 }
2669 if (where < 0)
Christian Heimes90aa7642007-12-19 02:45:37 +00002670 where += Py_SIZE(self);
2671 if (where < 0 || where >= Py_SIZE(self)) {
Neal Norwitz6968b052007-02-27 19:02:19 +00002672 PyErr_SetString(PyExc_IndexError, "pop index out of range");
2673 return NULL;
2674 }
2675
2676 value = self->ob_bytes[where];
2677 memmove(self->ob_bytes + where, self->ob_bytes + where + 1, n - where);
2678 if (PyBytes_Resize((PyObject *)self, n - 1) < 0)
2679 return NULL;
2680
Christian Heimes217cfd12007-12-02 14:31:20 +00002681 return PyLong_FromLong(value);
Neal Norwitz6968b052007-02-27 19:02:19 +00002682}
2683
2684PyDoc_STRVAR(remove__doc__,
2685"B.remove(int) -> None\n\
2686\n\
Guido van Rossum98297ee2007-11-06 21:34:58 +00002687Remove the first occurance of a value in B.");
Neal Norwitz6968b052007-02-27 19:02:19 +00002688static PyObject *
2689bytes_remove(PyBytesObject *self, PyObject *arg)
2690{
2691 int value;
Christian Heimes90aa7642007-12-19 02:45:37 +00002692 Py_ssize_t where, n = Py_SIZE(self);
Neal Norwitz6968b052007-02-27 19:02:19 +00002693
2694 if (! _getbytevalue(arg, &value))
2695 return NULL;
2696
2697 for (where = 0; where < n; where++) {
2698 if (self->ob_bytes[where] == value)
2699 break;
2700 }
2701 if (where == n) {
2702 PyErr_SetString(PyExc_ValueError, "value not found in bytes");
2703 return NULL;
2704 }
2705
2706 memmove(self->ob_bytes + where, self->ob_bytes + where + 1, n - where);
2707 if (PyBytes_Resize((PyObject *)self, n - 1) < 0)
2708 return NULL;
2709
2710 Py_RETURN_NONE;
2711}
2712
Guido van Rossumad7d8d12007-04-13 01:39:34 +00002713/* XXX These two helpers could be optimized if argsize == 1 */
2714
Neal Norwitz2bad9702007-08-27 06:19:22 +00002715static Py_ssize_t
Guido van Rossumad7d8d12007-04-13 01:39:34 +00002716lstrip_helper(unsigned char *myptr, Py_ssize_t mysize,
2717 void *argptr, Py_ssize_t argsize)
2718{
2719 Py_ssize_t i = 0;
2720 while (i < mysize && memchr(argptr, myptr[i], argsize))
2721 i++;
2722 return i;
2723}
2724
Neal Norwitz2bad9702007-08-27 06:19:22 +00002725static Py_ssize_t
Guido van Rossumad7d8d12007-04-13 01:39:34 +00002726rstrip_helper(unsigned char *myptr, Py_ssize_t mysize,
2727 void *argptr, Py_ssize_t argsize)
2728{
2729 Py_ssize_t i = mysize - 1;
2730 while (i >= 0 && memchr(argptr, myptr[i], argsize))
2731 i--;
2732 return i + 1;
2733}
2734
2735PyDoc_STRVAR(strip__doc__,
Guido van Rossum254348e2007-11-21 19:29:53 +00002736"B.strip([bytes]) -> bytearray\n\
Guido van Rossumad7d8d12007-04-13 01:39:34 +00002737\n\
Guido van Rossum8f950672007-09-10 16:53:45 +00002738Strip leading and trailing bytes contained in the argument.\n\
2739If the argument is omitted, strip ASCII whitespace.");
Guido van Rossumad7d8d12007-04-13 01:39:34 +00002740static PyObject *
Guido van Rossum8f950672007-09-10 16:53:45 +00002741bytes_strip(PyBytesObject *self, PyObject *args)
Guido van Rossumad7d8d12007-04-13 01:39:34 +00002742{
2743 Py_ssize_t left, right, mysize, argsize;
2744 void *myptr, *argptr;
Guido van Rossum8f950672007-09-10 16:53:45 +00002745 PyObject *arg = Py_None;
Travis E. Oliphant8ae62b62007-09-23 02:00:13 +00002746 Py_buffer varg;
Guido van Rossum8f950672007-09-10 16:53:45 +00002747 if (!PyArg_ParseTuple(args, "|O:strip", &arg))
Guido van Rossumad7d8d12007-04-13 01:39:34 +00002748 return NULL;
Guido van Rossum8f950672007-09-10 16:53:45 +00002749 if (arg == Py_None) {
2750 argptr = "\t\n\r\f\v ";
2751 argsize = 6;
2752 }
2753 else {
Guido van Rossum98297ee2007-11-06 21:34:58 +00002754 if (_getbuffer(arg, &varg) < 0)
2755 return NULL;
2756 argptr = varg.buf;
2757 argsize = varg.len;
Guido van Rossumad7d8d12007-04-13 01:39:34 +00002758 }
2759 myptr = self->ob_bytes;
Christian Heimes90aa7642007-12-19 02:45:37 +00002760 mysize = Py_SIZE(self);
Guido van Rossumad7d8d12007-04-13 01:39:34 +00002761 left = lstrip_helper(myptr, mysize, argptr, argsize);
Guido van Rossumeb29e9a2007-08-08 21:55:33 +00002762 if (left == mysize)
2763 right = left;
2764 else
2765 right = rstrip_helper(myptr, mysize, argptr, argsize);
Guido van Rossum8f950672007-09-10 16:53:45 +00002766 if (arg != Py_None)
Guido van Rossum98297ee2007-11-06 21:34:58 +00002767 PyObject_ReleaseBuffer(arg, &varg);
Guido van Rossumad7d8d12007-04-13 01:39:34 +00002768 return PyBytes_FromStringAndSize(self->ob_bytes + left, right - left);
2769}
2770
2771PyDoc_STRVAR(lstrip__doc__,
Guido van Rossum254348e2007-11-21 19:29:53 +00002772"B.lstrip([bytes]) -> bytearray\n\
Guido van Rossumad7d8d12007-04-13 01:39:34 +00002773\n\
Guido van Rossum8f950672007-09-10 16:53:45 +00002774Strip leading bytes contained in the argument.\n\
2775If the argument is omitted, strip leading ASCII whitespace.");
Guido van Rossumad7d8d12007-04-13 01:39:34 +00002776static PyObject *
Guido van Rossum8f950672007-09-10 16:53:45 +00002777bytes_lstrip(PyBytesObject *self, PyObject *args)
Guido van Rossumad7d8d12007-04-13 01:39:34 +00002778{
2779 Py_ssize_t left, right, mysize, argsize;
2780 void *myptr, *argptr;
Guido van Rossum8f950672007-09-10 16:53:45 +00002781 PyObject *arg = Py_None;
Travis E. Oliphant8ae62b62007-09-23 02:00:13 +00002782 Py_buffer varg;
Guido van Rossum8f950672007-09-10 16:53:45 +00002783 if (!PyArg_ParseTuple(args, "|O:lstrip", &arg))
Guido van Rossumad7d8d12007-04-13 01:39:34 +00002784 return NULL;
Guido van Rossum8f950672007-09-10 16:53:45 +00002785 if (arg == Py_None) {
2786 argptr = "\t\n\r\f\v ";
2787 argsize = 6;
2788 }
2789 else {
Guido van Rossum98297ee2007-11-06 21:34:58 +00002790 if (_getbuffer(arg, &varg) < 0)
2791 return NULL;
2792 argptr = varg.buf;
2793 argsize = varg.len;
Guido van Rossumad7d8d12007-04-13 01:39:34 +00002794 }
2795 myptr = self->ob_bytes;
Christian Heimes90aa7642007-12-19 02:45:37 +00002796 mysize = Py_SIZE(self);
Guido van Rossumad7d8d12007-04-13 01:39:34 +00002797 left = lstrip_helper(myptr, mysize, argptr, argsize);
2798 right = mysize;
Guido van Rossum8f950672007-09-10 16:53:45 +00002799 if (arg != Py_None)
Guido van Rossum98297ee2007-11-06 21:34:58 +00002800 PyObject_ReleaseBuffer(arg, &varg);
Guido van Rossumad7d8d12007-04-13 01:39:34 +00002801 return PyBytes_FromStringAndSize(self->ob_bytes + left, right - left);
2802}
2803
2804PyDoc_STRVAR(rstrip__doc__,
Guido van Rossum254348e2007-11-21 19:29:53 +00002805"B.rstrip([bytes]) -> bytearray\n\
Guido van Rossumad7d8d12007-04-13 01:39:34 +00002806\n\
Guido van Rossum8f950672007-09-10 16:53:45 +00002807Strip trailing bytes contained in the argument.\n\
2808If the argument is omitted, strip trailing ASCII whitespace.");
Guido van Rossumad7d8d12007-04-13 01:39:34 +00002809static PyObject *
Guido van Rossum8f950672007-09-10 16:53:45 +00002810bytes_rstrip(PyBytesObject *self, PyObject *args)
Guido van Rossumad7d8d12007-04-13 01:39:34 +00002811{
2812 Py_ssize_t left, right, mysize, argsize;
2813 void *myptr, *argptr;
Guido van Rossum8f950672007-09-10 16:53:45 +00002814 PyObject *arg = Py_None;
Travis E. Oliphant8ae62b62007-09-23 02:00:13 +00002815 Py_buffer varg;
Guido van Rossum8f950672007-09-10 16:53:45 +00002816 if (!PyArg_ParseTuple(args, "|O:rstrip", &arg))
Guido van Rossumad7d8d12007-04-13 01:39:34 +00002817 return NULL;
Guido van Rossum8f950672007-09-10 16:53:45 +00002818 if (arg == Py_None) {
2819 argptr = "\t\n\r\f\v ";
2820 argsize = 6;
2821 }
2822 else {
Guido van Rossum98297ee2007-11-06 21:34:58 +00002823 if (_getbuffer(arg, &varg) < 0)
2824 return NULL;
2825 argptr = varg.buf;
2826 argsize = varg.len;
Guido van Rossumad7d8d12007-04-13 01:39:34 +00002827 }
2828 myptr = self->ob_bytes;
Christian Heimes90aa7642007-12-19 02:45:37 +00002829 mysize = Py_SIZE(self);
Guido van Rossumad7d8d12007-04-13 01:39:34 +00002830 left = 0;
2831 right = rstrip_helper(myptr, mysize, argptr, argsize);
Guido van Rossum8f950672007-09-10 16:53:45 +00002832 if (arg != Py_None)
Guido van Rossum98297ee2007-11-06 21:34:58 +00002833 PyObject_ReleaseBuffer(arg, &varg);
Guido van Rossumad7d8d12007-04-13 01:39:34 +00002834 return PyBytes_FromStringAndSize(self->ob_bytes + left, right - left);
2835}
Neal Norwitz6968b052007-02-27 19:02:19 +00002836
Guido van Rossumd624f182006-04-24 13:47:05 +00002837PyDoc_STRVAR(decode_doc,
Guido van Rossum98297ee2007-11-06 21:34:58 +00002838"B.decode([encoding[, errors]]) -> unicode object.\n\
Guido van Rossumd624f182006-04-24 13:47:05 +00002839\n\
2840Decodes B using the codec registered for encoding. encoding defaults\n\
2841to the default encoding. errors may be given to set a different error\n\
Guido van Rossum98297ee2007-11-06 21:34:58 +00002842handling scheme. Default is 'strict' meaning that encoding errors raise\n\
2843a UnicodeDecodeError. Other possible values are 'ignore' and 'replace'\n\
Skip Montanaro11019402007-12-09 23:05:36 +00002844as well as any other name registered with codecs.register_error that is\n\
Guido van Rossumd624f182006-04-24 13:47:05 +00002845able to handle UnicodeDecodeErrors.");
2846
2847static PyObject *
2848bytes_decode(PyObject *self, PyObject *args)
Guido van Rossumb6f1fdc2007-04-12 22:49:52 +00002849{
Guido van Rossumd624f182006-04-24 13:47:05 +00002850 const char *encoding = NULL;
2851 const char *errors = NULL;
2852
2853 if (!PyArg_ParseTuple(args, "|ss:decode", &encoding, &errors))
2854 return NULL;
2855 if (encoding == NULL)
2856 encoding = PyUnicode_GetDefaultEncoding();
2857 return PyCodec_Decode(self, encoding, errors);
2858}
2859
Guido van Rossuma0867f72006-05-05 04:34:18 +00002860PyDoc_STRVAR(alloc_doc,
2861"B.__alloc__() -> int\n\
2862\n\
2863Returns the number of bytes actually allocated.");
2864
2865static PyObject *
2866bytes_alloc(PyBytesObject *self)
2867{
Christian Heimes217cfd12007-12-02 14:31:20 +00002868 return PyLong_FromSsize_t(self->ob_alloc);
Guido van Rossuma0867f72006-05-05 04:34:18 +00002869}
2870
Guido van Rossum20188312006-05-05 15:15:40 +00002871PyDoc_STRVAR(join_doc,
Guido van Rossumcd6ae682007-05-09 19:52:16 +00002872"B.join(iterable_of_bytes) -> bytes\n\
Guido van Rossum20188312006-05-05 15:15:40 +00002873\n\
Guido van Rossum254348e2007-11-21 19:29:53 +00002874Concatenates any number of bytearray objects, with B in between each pair.");
Guido van Rossum20188312006-05-05 15:15:40 +00002875
2876static PyObject *
Guido van Rossumcd6ae682007-05-09 19:52:16 +00002877bytes_join(PyBytesObject *self, PyObject *it)
Guido van Rossum20188312006-05-05 15:15:40 +00002878{
2879 PyObject *seq;
Christian Heimes90aa7642007-12-19 02:45:37 +00002880 Py_ssize_t mysize = Py_SIZE(self);
Guido van Rossum20188312006-05-05 15:15:40 +00002881 Py_ssize_t i;
2882 Py_ssize_t n;
2883 PyObject **items;
2884 Py_ssize_t totalsize = 0;
2885 PyObject *result;
2886 char *dest;
2887
2888 seq = PySequence_Fast(it, "can only join an iterable");
2889 if (seq == NULL)
Georg Brandlb3f568f2007-02-27 08:49:18 +00002890 return NULL;
Guido van Rossum20188312006-05-05 15:15:40 +00002891 n = PySequence_Fast_GET_SIZE(seq);
2892 items = PySequence_Fast_ITEMS(seq);
2893
2894 /* Compute the total size, and check that they are all bytes */
Guido van Rossum98297ee2007-11-06 21:34:58 +00002895 /* XXX Shouldn't we use _getbuffer() on these items instead? */
Guido van Rossum20188312006-05-05 15:15:40 +00002896 for (i = 0; i < n; i++) {
Georg Brandlb3f568f2007-02-27 08:49:18 +00002897 PyObject *obj = items[i];
Guido van Rossum98297ee2007-11-06 21:34:58 +00002898 if (!PyBytes_Check(obj) && !PyString_Check(obj)) {
Georg Brandlb3f568f2007-02-27 08:49:18 +00002899 PyErr_Format(PyExc_TypeError,
2900 "can only join an iterable of bytes "
2901 "(item %ld has type '%.100s')",
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +00002902 /* XXX %ld isn't right on Win64 */
Christian Heimes90aa7642007-12-19 02:45:37 +00002903 (long)i, Py_TYPE(obj)->tp_name);
Georg Brandlb3f568f2007-02-27 08:49:18 +00002904 goto error;
2905 }
Guido van Rossumcd6ae682007-05-09 19:52:16 +00002906 if (i > 0)
2907 totalsize += mysize;
Christian Heimes90aa7642007-12-19 02:45:37 +00002908 totalsize += Py_SIZE(obj);
Georg Brandlb3f568f2007-02-27 08:49:18 +00002909 if (totalsize < 0) {
2910 PyErr_NoMemory();
2911 goto error;
2912 }
Guido van Rossum20188312006-05-05 15:15:40 +00002913 }
2914
2915 /* Allocate the result, and copy the bytes */
2916 result = PyBytes_FromStringAndSize(NULL, totalsize);
2917 if (result == NULL)
Georg Brandlb3f568f2007-02-27 08:49:18 +00002918 goto error;
Guido van Rossum20188312006-05-05 15:15:40 +00002919 dest = PyBytes_AS_STRING(result);
2920 for (i = 0; i < n; i++) {
Georg Brandlb3f568f2007-02-27 08:49:18 +00002921 PyObject *obj = items[i];
Christian Heimes90aa7642007-12-19 02:45:37 +00002922 Py_ssize_t size = Py_SIZE(obj);
Guido van Rossum98297ee2007-11-06 21:34:58 +00002923 char *buf;
2924 if (PyBytes_Check(obj))
2925 buf = PyBytes_AS_STRING(obj);
2926 else
2927 buf = PyString_AS_STRING(obj);
2928 if (i) {
Guido van Rossumcd6ae682007-05-09 19:52:16 +00002929 memcpy(dest, self->ob_bytes, mysize);
2930 dest += mysize;
2931 }
Guido van Rossum98297ee2007-11-06 21:34:58 +00002932 memcpy(dest, buf, size);
Georg Brandlb3f568f2007-02-27 08:49:18 +00002933 dest += size;
Guido van Rossum20188312006-05-05 15:15:40 +00002934 }
2935
2936 /* Done */
2937 Py_DECREF(seq);
2938 return result;
2939
2940 /* Error handling */
2941 error:
2942 Py_DECREF(seq);
2943 return NULL;
2944}
2945
Georg Brandl0b9b9e02007-02-27 08:40:54 +00002946PyDoc_STRVAR(fromhex_doc,
Guido van Rossum254348e2007-11-21 19:29:53 +00002947"bytearray.fromhex(string) -> bytearray\n\
Georg Brandl0b9b9e02007-02-27 08:40:54 +00002948\n\
Guido van Rossum254348e2007-11-21 19:29:53 +00002949Create a bytearray object from a string of hexadecimal numbers.\n\
Guido van Rossum98297ee2007-11-06 21:34:58 +00002950Spaces between two numbers are accepted.\n\
Guido van Rossum254348e2007-11-21 19:29:53 +00002951Example: bytearray.fromhex('B9 01EF') -> bytearray(b'\\xb9\\x01\\xef').");
Georg Brandl0b9b9e02007-02-27 08:40:54 +00002952
2953static int
Guido van Rossumae404e22007-10-26 21:46:44 +00002954hex_digit_to_int(Py_UNICODE c)
Georg Brandl0b9b9e02007-02-27 08:40:54 +00002955{
Guido van Rossumae404e22007-10-26 21:46:44 +00002956 if (c >= 128)
2957 return -1;
Gregory P. Smith60d241f2007-10-16 06:31:30 +00002958 if (ISDIGIT(c))
Georg Brandlb3f568f2007-02-27 08:49:18 +00002959 return c - '0';
2960 else {
Gregory P. Smith60d241f2007-10-16 06:31:30 +00002961 if (ISUPPER(c))
2962 c = TOLOWER(c);
Georg Brandlb3f568f2007-02-27 08:49:18 +00002963 if (c >= 'a' && c <= 'f')
2964 return c - 'a' + 10;
2965 }
2966 return -1;
Georg Brandl0b9b9e02007-02-27 08:40:54 +00002967}
2968
2969static PyObject *
2970bytes_fromhex(PyObject *cls, PyObject *args)
2971{
Gregory P. Smith60d241f2007-10-16 06:31:30 +00002972 PyObject *newbytes, *hexobj;
2973 char *buf;
Guido van Rossumae404e22007-10-26 21:46:44 +00002974 Py_UNICODE *hex;
2975 Py_ssize_t hexlen, byteslen, i, j;
Georg Brandl0b9b9e02007-02-27 08:40:54 +00002976 int top, bot;
2977
Guido van Rossumae404e22007-10-26 21:46:44 +00002978 if (!PyArg_ParseTuple(args, "U:fromhex", &hexobj))
Georg Brandl0b9b9e02007-02-27 08:40:54 +00002979 return NULL;
Guido van Rossumae404e22007-10-26 21:46:44 +00002980 assert(PyUnicode_Check(hexobj));
2981 hexlen = PyUnicode_GET_SIZE(hexobj);
2982 hex = PyUnicode_AS_UNICODE(hexobj);
2983 byteslen = hexlen/2; /* This overestimates if there are spaces */
Georg Brandl0b9b9e02007-02-27 08:40:54 +00002984 newbytes = PyBytes_FromStringAndSize(NULL, byteslen);
Guido van Rossumae404e22007-10-26 21:46:44 +00002985 if (!newbytes)
Georg Brandl0b9b9e02007-02-27 08:40:54 +00002986 return NULL;
2987 buf = PyBytes_AS_STRING(newbytes);
Guido van Rossumae404e22007-10-26 21:46:44 +00002988 for (i = j = 0; i < hexlen; i += 2) {
Georg Brandl0b9b9e02007-02-27 08:40:54 +00002989 /* skip over spaces in the input */
Guido van Rossumae404e22007-10-26 21:46:44 +00002990 while (hex[i] == ' ')
Georg Brandl0b9b9e02007-02-27 08:40:54 +00002991 i++;
Guido van Rossumae404e22007-10-26 21:46:44 +00002992 if (i >= hexlen)
Georg Brandl0b9b9e02007-02-27 08:40:54 +00002993 break;
Guido van Rossumae404e22007-10-26 21:46:44 +00002994 top = hex_digit_to_int(hex[i]);
2995 bot = hex_digit_to_int(hex[i+1]);
Georg Brandl0b9b9e02007-02-27 08:40:54 +00002996 if (top == -1 || bot == -1) {
2997 PyErr_Format(PyExc_ValueError,
Guido van Rossumae404e22007-10-26 21:46:44 +00002998 "non-hexadecimal number found in "
2999 "fromhex() arg at position %zd", i);
Georg Brandl0b9b9e02007-02-27 08:40:54 +00003000 goto error;
3001 }
3002 buf[j++] = (top << 4) + bot;
3003 }
3004 if (PyBytes_Resize(newbytes, j) < 0)
3005 goto error;
3006 return newbytes;
3007
3008 error:
3009 Py_DECREF(newbytes);
3010 return NULL;
3011}
3012
Guido van Rossum0dd32e22007-04-11 05:40:58 +00003013PyDoc_STRVAR(reduce_doc, "Return state information for pickling.");
3014
3015static PyObject *
3016bytes_reduce(PyBytesObject *self)
3017{
Guido van Rossuma6c04be2007-11-03 00:24:24 +00003018 PyObject *latin1, *dict;
Martin v. Löwis9c121062007-08-05 20:26:11 +00003019 if (self->ob_bytes)
Guido van Rossuma74184e2007-08-29 04:05:57 +00003020 latin1 = PyUnicode_DecodeLatin1(self->ob_bytes,
Christian Heimes90aa7642007-12-19 02:45:37 +00003021 Py_SIZE(self), NULL);
Martin v. Löwis9c121062007-08-05 20:26:11 +00003022 else
Guido van Rossuma74184e2007-08-29 04:05:57 +00003023 latin1 = PyUnicode_FromString("");
Guido van Rossuma6c04be2007-11-03 00:24:24 +00003024
3025 dict = PyObject_GetAttrString((PyObject *)self, "__dict__");
3026 if (dict == NULL) {
3027 PyErr_Clear();
3028 dict = Py_None;
3029 Py_INCREF(dict);
3030 }
3031
Christian Heimes90aa7642007-12-19 02:45:37 +00003032 return Py_BuildValue("(O(Ns)N)", Py_TYPE(self), latin1, "latin-1", dict);
Guido van Rossum0dd32e22007-04-11 05:40:58 +00003033}
3034
Guido van Rossum4dfe8a12006-04-22 23:28:04 +00003035static PySequenceMethods bytes_as_sequence = {
Georg Brandl0b9b9e02007-02-27 08:40:54 +00003036 (lenfunc)bytes_length, /* sq_length */
Guido van Rossum98297ee2007-11-06 21:34:58 +00003037 (binaryfunc)PyBytes_Concat, /* sq_concat */
Georg Brandl0b9b9e02007-02-27 08:40:54 +00003038 (ssizeargfunc)bytes_repeat, /* sq_repeat */
3039 (ssizeargfunc)bytes_getitem, /* sq_item */
3040 0, /* sq_slice */
3041 (ssizeobjargproc)bytes_setitem, /* sq_ass_item */
3042 0, /* sq_ass_slice */
Guido van Rossumd624f182006-04-24 13:47:05 +00003043 (objobjproc)bytes_contains, /* sq_contains */
Georg Brandl0b9b9e02007-02-27 08:40:54 +00003044 (binaryfunc)bytes_iconcat, /* sq_inplace_concat */
3045 (ssizeargfunc)bytes_irepeat, /* sq_inplace_repeat */
Guido van Rossum4dfe8a12006-04-22 23:28:04 +00003046};
3047
3048static PyMappingMethods bytes_as_mapping = {
Guido van Rossumd624f182006-04-24 13:47:05 +00003049 (lenfunc)bytes_length,
Thomas Wouters376446d2006-12-19 08:30:14 +00003050 (binaryfunc)bytes_subscript,
3051 (objobjargproc)bytes_ass_subscript,
Guido van Rossum4dfe8a12006-04-22 23:28:04 +00003052};
3053
3054static PyBufferProcs bytes_as_buffer = {
Travis E. Oliphantb99f7622007-08-18 11:21:56 +00003055 (getbufferproc)bytes_getbuffer,
3056 (releasebufferproc)bytes_releasebuffer,
Guido van Rossum4dfe8a12006-04-22 23:28:04 +00003057};
3058
3059static PyMethodDef
3060bytes_methods[] = {
Guido van Rossumae404e22007-10-26 21:46:44 +00003061 {"__alloc__", (PyCFunction)bytes_alloc, METH_NOARGS, alloc_doc},
3062 {"__reduce__", (PyCFunction)bytes_reduce, METH_NOARGS, reduce_doc},
3063 {"append", (PyCFunction)bytes_append, METH_O, append__doc__},
Gregory P. Smith60d241f2007-10-16 06:31:30 +00003064 {"capitalize", (PyCFunction)stringlib_capitalize, METH_NOARGS,
3065 _Py_capitalize__doc__},
Gregory P. Smith60d241f2007-10-16 06:31:30 +00003066 {"center", (PyCFunction)stringlib_center, METH_VARARGS, center__doc__},
Guido van Rossumae404e22007-10-26 21:46:44 +00003067 {"count", (PyCFunction)bytes_count, METH_VARARGS, count__doc__},
3068 {"decode", (PyCFunction)bytes_decode, METH_VARARGS, decode_doc},
3069 {"endswith", (PyCFunction)bytes_endswith, METH_VARARGS, endswith__doc__},
Gregory P. Smith60d241f2007-10-16 06:31:30 +00003070 {"expandtabs", (PyCFunction)stringlib_expandtabs, METH_VARARGS,
3071 expandtabs__doc__},
Guido van Rossumae404e22007-10-26 21:46:44 +00003072 {"extend", (PyCFunction)bytes_extend, METH_O, extend__doc__},
3073 {"find", (PyCFunction)bytes_find, METH_VARARGS, find__doc__},
3074 {"fromhex", (PyCFunction)bytes_fromhex, METH_VARARGS|METH_CLASS,
3075 fromhex_doc},
3076 {"index", (PyCFunction)bytes_index, METH_VARARGS, index__doc__},
3077 {"insert", (PyCFunction)bytes_insert, METH_VARARGS, insert__doc__},
3078 {"isalnum", (PyCFunction)stringlib_isalnum, METH_NOARGS,
3079 _Py_isalnum__doc__},
3080 {"isalpha", (PyCFunction)stringlib_isalpha, METH_NOARGS,
3081 _Py_isalpha__doc__},
3082 {"isdigit", (PyCFunction)stringlib_isdigit, METH_NOARGS,
3083 _Py_isdigit__doc__},
3084 {"islower", (PyCFunction)stringlib_islower, METH_NOARGS,
3085 _Py_islower__doc__},
3086 {"isspace", (PyCFunction)stringlib_isspace, METH_NOARGS,
3087 _Py_isspace__doc__},
3088 {"istitle", (PyCFunction)stringlib_istitle, METH_NOARGS,
3089 _Py_istitle__doc__},
3090 {"isupper", (PyCFunction)stringlib_isupper, METH_NOARGS,
3091 _Py_isupper__doc__},
3092 {"join", (PyCFunction)bytes_join, METH_O, join_doc},
3093 {"ljust", (PyCFunction)stringlib_ljust, METH_VARARGS, ljust__doc__},
3094 {"lower", (PyCFunction)stringlib_lower, METH_NOARGS, _Py_lower__doc__},
3095 {"lstrip", (PyCFunction)bytes_lstrip, METH_VARARGS, lstrip__doc__},
3096 {"partition", (PyCFunction)bytes_partition, METH_O, partition__doc__},
3097 {"pop", (PyCFunction)bytes_pop, METH_VARARGS, pop__doc__},
3098 {"remove", (PyCFunction)bytes_remove, METH_O, remove__doc__},
3099 {"replace", (PyCFunction)bytes_replace, METH_VARARGS, replace__doc__},
3100 {"reverse", (PyCFunction)bytes_reverse, METH_NOARGS, reverse__doc__},
3101 {"rfind", (PyCFunction)bytes_rfind, METH_VARARGS, rfind__doc__},
3102 {"rindex", (PyCFunction)bytes_rindex, METH_VARARGS, rindex__doc__},
3103 {"rjust", (PyCFunction)stringlib_rjust, METH_VARARGS, rjust__doc__},
3104 {"rpartition", (PyCFunction)bytes_rpartition, METH_O, rpartition__doc__},
3105 {"rsplit", (PyCFunction)bytes_rsplit, METH_VARARGS, rsplit__doc__},
3106 {"rstrip", (PyCFunction)bytes_rstrip, METH_VARARGS, rstrip__doc__},
3107 {"split", (PyCFunction)bytes_split, METH_VARARGS, split__doc__},
Gregory P. Smith60d241f2007-10-16 06:31:30 +00003108 {"splitlines", (PyCFunction)stringlib_splitlines, METH_VARARGS,
3109 splitlines__doc__},
Guido van Rossumae404e22007-10-26 21:46:44 +00003110 {"startswith", (PyCFunction)bytes_startswith, METH_VARARGS ,
3111 startswith__doc__},
3112 {"strip", (PyCFunction)bytes_strip, METH_VARARGS, strip__doc__},
3113 {"swapcase", (PyCFunction)stringlib_swapcase, METH_NOARGS,
3114 _Py_swapcase__doc__},
3115 {"title", (PyCFunction)stringlib_title, METH_NOARGS, _Py_title__doc__},
3116 {"translate", (PyCFunction)bytes_translate, METH_VARARGS,
3117 translate__doc__},
3118 {"upper", (PyCFunction)stringlib_upper, METH_NOARGS, _Py_upper__doc__},
3119 {"zfill", (PyCFunction)stringlib_zfill, METH_VARARGS, zfill__doc__},
Guido van Rossuma0867f72006-05-05 04:34:18 +00003120 {NULL}
Guido van Rossum4dfe8a12006-04-22 23:28:04 +00003121};
3122
3123PyDoc_STRVAR(bytes_doc,
Guido van Rossum254348e2007-11-21 19:29:53 +00003124"bytearray(iterable_of_ints) -> bytearray.\n\
3125bytearray(string, encoding[, errors]) -> bytearray.\n\
3126bytearray(bytes_or_bytearray) -> mutable copy of bytes_or_bytearray.\n\
3127bytearray(memory_view) -> bytearray.\n\
Guido van Rossum4dfe8a12006-04-22 23:28:04 +00003128\n\
Guido van Rossum254348e2007-11-21 19:29:53 +00003129Construct an mutable bytearray object from:\n\
Guido van Rossum98297ee2007-11-06 21:34:58 +00003130 - an iterable yielding integers in range(256)\n\
3131 - a text string encoded using the specified encoding\n\
Guido van Rossum254348e2007-11-21 19:29:53 +00003132 - a bytes or a bytearray object\n\
Guido van Rossum98297ee2007-11-06 21:34:58 +00003133 - any object implementing the buffer API.\n\
3134\n\
Guido van Rossum254348e2007-11-21 19:29:53 +00003135bytearray(int) -> bytearray.\n\
Guido van Rossum98297ee2007-11-06 21:34:58 +00003136\n\
Guido van Rossum254348e2007-11-21 19:29:53 +00003137Construct a zero-initialized bytearray of the given length.");
Guido van Rossum98297ee2007-11-06 21:34:58 +00003138
Guido van Rossum4dfe8a12006-04-22 23:28:04 +00003139
Guido van Rossuma5d2d552007-10-26 17:39:48 +00003140static PyObject *bytes_iter(PyObject *seq);
3141
Guido van Rossum4dfe8a12006-04-22 23:28:04 +00003142PyTypeObject PyBytes_Type = {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00003143 PyVarObject_HEAD_INIT(&PyType_Type, 0)
Guido van Rossum254348e2007-11-21 19:29:53 +00003144 "bytearray",
Guido van Rossum4dfe8a12006-04-22 23:28:04 +00003145 sizeof(PyBytesObject),
3146 0,
Guido van Rossumd624f182006-04-24 13:47:05 +00003147 (destructor)bytes_dealloc, /* tp_dealloc */
3148 0, /* tp_print */
3149 0, /* tp_getattr */
3150 0, /* tp_setattr */
3151 0, /* tp_compare */
3152 (reprfunc)bytes_repr, /* tp_repr */
3153 0, /* tp_as_number */
3154 &bytes_as_sequence, /* tp_as_sequence */
3155 &bytes_as_mapping, /* tp_as_mapping */
Georg Brandlb3f568f2007-02-27 08:49:18 +00003156 0, /* tp_hash */
Guido van Rossumd624f182006-04-24 13:47:05 +00003157 0, /* tp_call */
Guido van Rossum98297ee2007-11-06 21:34:58 +00003158 bytes_str, /* tp_str */
Guido van Rossumd624f182006-04-24 13:47:05 +00003159 PyObject_GenericGetAttr, /* tp_getattro */
3160 0, /* tp_setattro */
3161 &bytes_as_buffer, /* tp_as_buffer */
Guido van Rossuma6c04be2007-11-03 00:24:24 +00003162 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
Guido van Rossumd624f182006-04-24 13:47:05 +00003163 bytes_doc, /* tp_doc */
3164 0, /* tp_traverse */
3165 0, /* tp_clear */
3166 (richcmpfunc)bytes_richcompare, /* tp_richcompare */
3167 0, /* tp_weaklistoffset */
Guido van Rossuma5d2d552007-10-26 17:39:48 +00003168 bytes_iter, /* tp_iter */
Guido van Rossumd624f182006-04-24 13:47:05 +00003169 0, /* tp_iternext */
3170 bytes_methods, /* tp_methods */
3171 0, /* tp_members */
3172 0, /* tp_getset */
3173 0, /* tp_base */
3174 0, /* tp_dict */
3175 0, /* tp_descr_get */
3176 0, /* tp_descr_set */
3177 0, /* tp_dictoffset */
3178 (initproc)bytes_init, /* tp_init */
3179 PyType_GenericAlloc, /* tp_alloc */
3180 PyType_GenericNew, /* tp_new */
3181 PyObject_Del, /* tp_free */
Guido van Rossum4dfe8a12006-04-22 23:28:04 +00003182};
Guido van Rossuma5d2d552007-10-26 17:39:48 +00003183
3184/*********************** Bytes Iterator ****************************/
3185
3186typedef struct {
3187 PyObject_HEAD
3188 Py_ssize_t it_index;
3189 PyBytesObject *it_seq; /* Set to NULL when iterator is exhausted */
3190} bytesiterobject;
3191
3192static void
3193bytesiter_dealloc(bytesiterobject *it)
3194{
3195 _PyObject_GC_UNTRACK(it);
3196 Py_XDECREF(it->it_seq);
3197 PyObject_GC_Del(it);
3198}
3199
3200static int
3201bytesiter_traverse(bytesiterobject *it, visitproc visit, void *arg)
3202{
3203 Py_VISIT(it->it_seq);
3204 return 0;
3205}
3206
3207static PyObject *
3208bytesiter_next(bytesiterobject *it)
3209{
3210 PyBytesObject *seq;
3211 PyObject *item;
3212
3213 assert(it != NULL);
3214 seq = it->it_seq;
3215 if (seq == NULL)
3216 return NULL;
3217 assert(PyBytes_Check(seq));
3218
3219 if (it->it_index < PyBytes_GET_SIZE(seq)) {
Christian Heimes217cfd12007-12-02 14:31:20 +00003220 item = PyLong_FromLong(
Guido van Rossuma5d2d552007-10-26 17:39:48 +00003221 (unsigned char)seq->ob_bytes[it->it_index]);
3222 if (item != NULL)
3223 ++it->it_index;
3224 return item;
3225 }
3226
3227 Py_DECREF(seq);
3228 it->it_seq = NULL;
3229 return NULL;
3230}
3231
3232static PyObject *
3233bytesiter_length_hint(bytesiterobject *it)
3234{
3235 Py_ssize_t len = 0;
3236 if (it->it_seq)
3237 len = PyBytes_GET_SIZE(it->it_seq) - it->it_index;
Christian Heimes217cfd12007-12-02 14:31:20 +00003238 return PyLong_FromSsize_t(len);
Guido van Rossuma5d2d552007-10-26 17:39:48 +00003239}
3240
3241PyDoc_STRVAR(length_hint_doc,
3242 "Private method returning an estimate of len(list(it)).");
3243
3244static PyMethodDef bytesiter_methods[] = {
3245 {"__length_hint__", (PyCFunction)bytesiter_length_hint, METH_NOARGS,
3246 length_hint_doc},
3247 {NULL, NULL} /* sentinel */
3248};
3249
3250PyTypeObject PyBytesIter_Type = {
3251 PyVarObject_HEAD_INIT(&PyType_Type, 0)
Guido van Rossum254348e2007-11-21 19:29:53 +00003252 "bytearray_iterator", /* tp_name */
Guido van Rossuma5d2d552007-10-26 17:39:48 +00003253 sizeof(bytesiterobject), /* tp_basicsize */
3254 0, /* tp_itemsize */
3255 /* methods */
3256 (destructor)bytesiter_dealloc, /* tp_dealloc */
3257 0, /* tp_print */
3258 0, /* tp_getattr */
3259 0, /* tp_setattr */
3260 0, /* tp_compare */
3261 0, /* tp_repr */
3262 0, /* tp_as_number */
3263 0, /* tp_as_sequence */
3264 0, /* tp_as_mapping */
3265 0, /* tp_hash */
3266 0, /* tp_call */
3267 0, /* tp_str */
3268 PyObject_GenericGetAttr, /* tp_getattro */
3269 0, /* tp_setattro */
3270 0, /* tp_as_buffer */
3271 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC, /* tp_flags */
3272 0, /* tp_doc */
3273 (traverseproc)bytesiter_traverse, /* tp_traverse */
3274 0, /* tp_clear */
3275 0, /* tp_richcompare */
3276 0, /* tp_weaklistoffset */
3277 PyObject_SelfIter, /* tp_iter */
3278 (iternextfunc)bytesiter_next, /* tp_iternext */
3279 bytesiter_methods, /* tp_methods */
3280 0,
3281};
3282
3283static PyObject *
3284bytes_iter(PyObject *seq)
3285{
3286 bytesiterobject *it;
3287
3288 if (!PyBytes_Check(seq)) {
3289 PyErr_BadInternalCall();
3290 return NULL;
3291 }
3292 it = PyObject_GC_New(bytesiterobject, &PyBytesIter_Type);
3293 if (it == NULL)
3294 return NULL;
3295 it->it_index = 0;
3296 Py_INCREF(seq);
3297 it->it_seq = (PyBytesObject *)seq;
3298 _PyObject_GC_TRACK(it);
3299 return (PyObject *)it;
3300}