blob: 9ff44586f7305ddd7244fcde338391d2b200a7b0 [file] [log] [blame]
Christian Heimes44720832008-05-26 13:01:01 +00001/* PyBytes (bytearray) implementation */
2
3#define PY_SSIZE_T_CLEAN
4#include "Python.h"
5#include "structmember.h"
6#include "bytes_methods.h"
7
8static PyByteArrayObject *nullbytes = NULL;
9
10void
11PyByteArray_Fini(void)
12{
13 Py_CLEAR(nullbytes);
14}
15
16int
17PyByteArray_Init(void)
18{
19 nullbytes = PyObject_New(PyByteArrayObject, &PyByteArray_Type);
20 if (nullbytes == NULL)
21 return 0;
22 nullbytes->ob_bytes = NULL;
23 Py_SIZE(nullbytes) = nullbytes->ob_alloc = 0;
24 nullbytes->ob_exports = 0;
25 return 1;
26}
27
28/* end nullbytes support */
29
30/* Helpers */
31
32static int
33_getbytevalue(PyObject* arg, int *value)
34{
35 long face_value;
36
Georg Brandl3e483f62008-07-16 22:57:41 +000037 if (PyBytes_CheckExact(arg)) {
Christian Heimes44720832008-05-26 13:01:01 +000038 if (Py_SIZE(arg) != 1) {
39 PyErr_SetString(PyExc_ValueError, "string must be of size 1");
40 return 0;
41 }
Georg Brandl3e483f62008-07-16 22:57:41 +000042 *value = Py_CHARMASK(((PyBytesObject*)arg)->ob_sval[0]);
43 return 1;
44 }
45 else if (PyInt_Check(arg) || PyLong_Check(arg)) {
46 face_value = PyLong_AsLong(arg);
Christian Heimes44720832008-05-26 13:01:01 +000047 }
48 else {
Georg Brandl3e483f62008-07-16 22:57:41 +000049 PyObject *index = PyNumber_Index(arg);
50 if (index == NULL) {
51 PyErr_Format(PyExc_TypeError,
52 "an integer or string of size 1 is required");
53 return 0;
54 }
55 face_value = PyLong_AsLong(index);
56 Py_DECREF(index);
57 }
Georg Brandl3e483f62008-07-16 22:57:41 +000058
59 if (face_value < 0 || face_value >= 256) {
Georg Brandl3238a3e2008-07-16 23:17:46 +000060 /* this includes the OverflowError in case the long is too large */
Georg Brandl3e483f62008-07-16 22:57:41 +000061 PyErr_SetString(PyExc_ValueError, "byte must be in range(0, 256)");
Christian Heimes44720832008-05-26 13:01:01 +000062 return 0;
63 }
64
65 *value = face_value;
66 return 1;
67}
68
69static Py_ssize_t
70bytes_buffer_getreadbuf(PyByteArrayObject *self, Py_ssize_t index, const void **ptr)
71{
72 if ( index != 0 ) {
73 PyErr_SetString(PyExc_SystemError,
74 "accessing non-existent bytes segment");
75 return -1;
76 }
77 *ptr = (void *)self->ob_bytes;
78 return Py_SIZE(self);
79}
80
81static Py_ssize_t
82bytes_buffer_getwritebuf(PyByteArrayObject *self, Py_ssize_t index, const void **ptr)
83{
84 if ( index != 0 ) {
85 PyErr_SetString(PyExc_SystemError,
86 "accessing non-existent bytes segment");
87 return -1;
88 }
89 *ptr = (void *)self->ob_bytes;
90 return Py_SIZE(self);
91}
92
93static Py_ssize_t
94bytes_buffer_getsegcount(PyByteArrayObject *self, Py_ssize_t *lenp)
95{
96 if ( lenp )
97 *lenp = Py_SIZE(self);
98 return 1;
99}
100
101static Py_ssize_t
102bytes_buffer_getcharbuf(PyByteArrayObject *self, Py_ssize_t index, const char **ptr)
103{
104 if ( index != 0 ) {
105 PyErr_SetString(PyExc_SystemError,
106 "accessing non-existent bytes segment");
107 return -1;
108 }
109 *ptr = self->ob_bytes;
110 return Py_SIZE(self);
111}
112
113static int
114bytes_getbuffer(PyByteArrayObject *obj, Py_buffer *view, int flags)
115{
116 int ret;
117 void *ptr;
118 if (view == NULL) {
119 obj->ob_exports++;
120 return 0;
121 }
122 if (obj->ob_bytes == NULL)
123 ptr = "";
124 else
125 ptr = obj->ob_bytes;
Martin v. Löwisf91d46a2008-08-12 14:49:50 +0000126 ret = PyBuffer_FillInfo(view, (PyObject*)obj, ptr, Py_SIZE(obj), 0, flags);
Christian Heimes44720832008-05-26 13:01:01 +0000127 if (ret >= 0) {
128 obj->ob_exports++;
129 }
130 return ret;
131}
132
133static void
134bytes_releasebuffer(PyByteArrayObject *obj, Py_buffer *view)
135{
136 obj->ob_exports--;
137}
138
139static Py_ssize_t
140_getbuffer(PyObject *obj, Py_buffer *view)
141{
142 PyBufferProcs *buffer = Py_TYPE(obj)->tp_as_buffer;
143
144 if (buffer == NULL || buffer->bf_getbuffer == NULL)
145 {
146 PyErr_Format(PyExc_TypeError,
147 "Type %.100s doesn't support the buffer API",
148 Py_TYPE(obj)->tp_name);
149 return -1;
150 }
151
152 if (buffer->bf_getbuffer(obj, view, PyBUF_SIMPLE) < 0)
153 return -1;
154 return view->len;
155}
156
157/* Direct API functions */
158
159PyObject *
160PyByteArray_FromObject(PyObject *input)
161{
162 return PyObject_CallFunctionObjArgs((PyObject *)&PyByteArray_Type,
163 input, NULL);
164}
165
166PyObject *
167PyByteArray_FromStringAndSize(const char *bytes, Py_ssize_t size)
168{
169 PyByteArrayObject *new;
170 Py_ssize_t alloc;
171
172 if (size < 0) {
173 PyErr_SetString(PyExc_SystemError,
174 "Negative size passed to PyByteArray_FromStringAndSize");
175 return NULL;
176 }
177
178 new = PyObject_New(PyByteArrayObject, &PyByteArray_Type);
179 if (new == NULL)
180 return NULL;
181
182 if (size == 0) {
183 new->ob_bytes = NULL;
184 alloc = 0;
185 }
186 else {
187 alloc = size + 1;
188 new->ob_bytes = PyMem_Malloc(alloc);
189 if (new->ob_bytes == NULL) {
190 Py_DECREF(new);
191 return PyErr_NoMemory();
192 }
193 if (bytes != NULL)
194 memcpy(new->ob_bytes, bytes, size);
195 new->ob_bytes[size] = '\0'; /* Trailing null byte */
196 }
197 Py_SIZE(new) = size;
198 new->ob_alloc = alloc;
199 new->ob_exports = 0;
200
201 return (PyObject *)new;
202}
203
204Py_ssize_t
205PyByteArray_Size(PyObject *self)
206{
207 assert(self != NULL);
208 assert(PyByteArray_Check(self));
209
210 return PyByteArray_GET_SIZE(self);
211}
212
213char *
214PyByteArray_AsString(PyObject *self)
215{
216 assert(self != NULL);
217 assert(PyByteArray_Check(self));
218
219 return PyByteArray_AS_STRING(self);
220}
221
222int
223PyByteArray_Resize(PyObject *self, Py_ssize_t size)
224{
225 void *sval;
226 Py_ssize_t alloc = ((PyByteArrayObject *)self)->ob_alloc;
227
228 assert(self != NULL);
229 assert(PyByteArray_Check(self));
230 assert(size >= 0);
231
232 if (size < alloc / 2) {
233 /* Major downsize; resize down to exact size */
234 alloc = size + 1;
235 }
236 else if (size < alloc) {
237 /* Within allocated size; quick exit */
238 Py_SIZE(self) = size;
239 ((PyByteArrayObject *)self)->ob_bytes[size] = '\0'; /* Trailing null */
240 return 0;
241 }
242 else if (size <= alloc * 1.125) {
243 /* Moderate upsize; overallocate similar to list_resize() */
244 alloc = size + (size >> 3) + (size < 9 ? 3 : 6);
245 }
246 else {
247 /* Major upsize; resize up to exact size */
248 alloc = size + 1;
249 }
250
251 if (((PyByteArrayObject *)self)->ob_exports > 0) {
252 /*
253 fprintf(stderr, "%d: %s", ((PyByteArrayObject *)self)->ob_exports,
254 ((PyByteArrayObject *)self)->ob_bytes);
255 */
256 PyErr_SetString(PyExc_BufferError,
257 "Existing exports of data: object cannot be re-sized");
258 return -1;
259 }
260
261 sval = PyMem_Realloc(((PyByteArrayObject *)self)->ob_bytes, alloc);
262 if (sval == NULL) {
263 PyErr_NoMemory();
264 return -1;
265 }
266
267 ((PyByteArrayObject *)self)->ob_bytes = sval;
268 Py_SIZE(self) = size;
269 ((PyByteArrayObject *)self)->ob_alloc = alloc;
270 ((PyByteArrayObject *)self)->ob_bytes[size] = '\0'; /* Trailing null byte */
271
272 return 0;
273}
274
275PyObject *
276PyByteArray_Concat(PyObject *a, PyObject *b)
277{
278 Py_ssize_t size;
279 Py_buffer va, vb;
280 PyByteArrayObject *result = NULL;
281
282 va.len = -1;
283 vb.len = -1;
284 if (_getbuffer(a, &va) < 0 ||
285 _getbuffer(b, &vb) < 0) {
286 PyErr_Format(PyExc_TypeError, "can't concat %.100s to %.100s",
287 Py_TYPE(a)->tp_name, Py_TYPE(b)->tp_name);
288 goto done;
289 }
290
291 size = va.len + vb.len;
292 if (size < 0) {
293 return PyErr_NoMemory();
294 goto done;
295 }
296
297 result = (PyByteArrayObject *) PyByteArray_FromStringAndSize(NULL, size);
298 if (result != NULL) {
299 memcpy(result->ob_bytes, va.buf, va.len);
300 memcpy(result->ob_bytes + va.len, vb.buf, vb.len);
301 }
302
303 done:
304 if (va.len != -1)
Martin v. Löwisf91d46a2008-08-12 14:49:50 +0000305 PyBuffer_Release(&va);
Christian Heimes44720832008-05-26 13:01:01 +0000306 if (vb.len != -1)
Martin v. Löwisf91d46a2008-08-12 14:49:50 +0000307 PyBuffer_Release(&vb);
Christian Heimes44720832008-05-26 13:01:01 +0000308 return (PyObject *)result;
309}
310
311/* Functions stuffed into the type object */
312
313static Py_ssize_t
314bytes_length(PyByteArrayObject *self)
315{
316 return Py_SIZE(self);
317}
318
319static PyObject *
320bytes_iconcat(PyByteArrayObject *self, PyObject *other)
321{
322 Py_ssize_t mysize;
323 Py_ssize_t size;
324 Py_buffer vo;
325
326 if (_getbuffer(other, &vo) < 0) {
327 PyErr_Format(PyExc_TypeError, "can't concat %.100s to %.100s",
328 Py_TYPE(other)->tp_name, Py_TYPE(self)->tp_name);
329 return NULL;
330 }
331
332 mysize = Py_SIZE(self);
333 size = mysize + vo.len;
334 if (size < 0) {
Martin v. Löwisf91d46a2008-08-12 14:49:50 +0000335 PyBuffer_Release(&vo);
Christian Heimes44720832008-05-26 13:01:01 +0000336 return PyErr_NoMemory();
337 }
338 if (size < self->ob_alloc) {
339 Py_SIZE(self) = size;
340 self->ob_bytes[Py_SIZE(self)] = '\0'; /* Trailing null byte */
341 }
342 else if (PyByteArray_Resize((PyObject *)self, size) < 0) {
Martin v. Löwisf91d46a2008-08-12 14:49:50 +0000343 PyBuffer_Release(&vo);
Christian Heimes44720832008-05-26 13:01:01 +0000344 return NULL;
345 }
346 memcpy(self->ob_bytes + mysize, vo.buf, vo.len);
Martin v. Löwisf91d46a2008-08-12 14:49:50 +0000347 PyBuffer_Release(&vo);
Christian Heimes44720832008-05-26 13:01:01 +0000348 Py_INCREF(self);
349 return (PyObject *)self;
350}
351
352static PyObject *
353bytes_repeat(PyByteArrayObject *self, Py_ssize_t count)
354{
355 PyByteArrayObject *result;
356 Py_ssize_t mysize;
357 Py_ssize_t size;
358
359 if (count < 0)
360 count = 0;
361 mysize = Py_SIZE(self);
362 size = mysize * count;
363 if (count != 0 && size / count != mysize)
364 return PyErr_NoMemory();
365 result = (PyByteArrayObject *)PyByteArray_FromStringAndSize(NULL, size);
366 if (result != NULL && size != 0) {
367 if (mysize == 1)
368 memset(result->ob_bytes, self->ob_bytes[0], size);
369 else {
370 Py_ssize_t i;
371 for (i = 0; i < count; i++)
372 memcpy(result->ob_bytes + i*mysize, self->ob_bytes, mysize);
373 }
374 }
375 return (PyObject *)result;
376}
377
378static PyObject *
379bytes_irepeat(PyByteArrayObject *self, Py_ssize_t count)
380{
381 Py_ssize_t mysize;
382 Py_ssize_t size;
383
384 if (count < 0)
385 count = 0;
386 mysize = Py_SIZE(self);
387 size = mysize * count;
388 if (count != 0 && size / count != mysize)
389 return PyErr_NoMemory();
390 if (size < self->ob_alloc) {
391 Py_SIZE(self) = size;
392 self->ob_bytes[Py_SIZE(self)] = '\0'; /* Trailing null byte */
393 }
394 else if (PyByteArray_Resize((PyObject *)self, size) < 0)
395 return NULL;
396
397 if (mysize == 1)
398 memset(self->ob_bytes, self->ob_bytes[0], size);
399 else {
400 Py_ssize_t i;
401 for (i = 1; i < count; i++)
402 memcpy(self->ob_bytes + i*mysize, self->ob_bytes, mysize);
403 }
404
405 Py_INCREF(self);
406 return (PyObject *)self;
407}
408
409static PyObject *
410bytes_getitem(PyByteArrayObject *self, Py_ssize_t i)
411{
412 if (i < 0)
413 i += Py_SIZE(self);
414 if (i < 0 || i >= Py_SIZE(self)) {
415 PyErr_SetString(PyExc_IndexError, "bytearray index out of range");
416 return NULL;
417 }
418 return PyInt_FromLong((unsigned char)(self->ob_bytes[i]));
419}
420
421static PyObject *
Georg Brandl3e483f62008-07-16 22:57:41 +0000422bytes_subscript(PyByteArrayObject *self, PyObject *index)
Christian Heimes44720832008-05-26 13:01:01 +0000423{
Georg Brandl3e483f62008-07-16 22:57:41 +0000424 if (PyIndex_Check(index)) {
425 Py_ssize_t i = PyNumber_AsSsize_t(index, PyExc_IndexError);
Christian Heimes44720832008-05-26 13:01:01 +0000426
427 if (i == -1 && PyErr_Occurred())
428 return NULL;
429
430 if (i < 0)
431 i += PyByteArray_GET_SIZE(self);
432
433 if (i < 0 || i >= Py_SIZE(self)) {
434 PyErr_SetString(PyExc_IndexError, "bytearray index out of range");
435 return NULL;
436 }
437 return PyInt_FromLong((unsigned char)(self->ob_bytes[i]));
438 }
Georg Brandl3e483f62008-07-16 22:57:41 +0000439 else if (PySlice_Check(index)) {
Christian Heimes44720832008-05-26 13:01:01 +0000440 Py_ssize_t start, stop, step, slicelength, cur, i;
Georg Brandl3e483f62008-07-16 22:57:41 +0000441 if (PySlice_GetIndicesEx((PySliceObject *)index,
Christian Heimes44720832008-05-26 13:01:01 +0000442 PyByteArray_GET_SIZE(self),
443 &start, &stop, &step, &slicelength) < 0) {
444 return NULL;
445 }
446
447 if (slicelength <= 0)
448 return PyByteArray_FromStringAndSize("", 0);
449 else if (step == 1) {
450 return PyByteArray_FromStringAndSize(self->ob_bytes + start,
451 slicelength);
452 }
453 else {
454 char *source_buf = PyByteArray_AS_STRING(self);
455 char *result_buf = (char *)PyMem_Malloc(slicelength);
456 PyObject *result;
457
458 if (result_buf == NULL)
459 return PyErr_NoMemory();
460
461 for (cur = start, i = 0; i < slicelength;
462 cur += step, i++) {
463 result_buf[i] = source_buf[cur];
464 }
465 result = PyByteArray_FromStringAndSize(result_buf, slicelength);
466 PyMem_Free(result_buf);
467 return result;
468 }
469 }
470 else {
471 PyErr_SetString(PyExc_TypeError, "bytearray indices must be integers");
472 return NULL;
473 }
474}
475
476static int
477bytes_setslice(PyByteArrayObject *self, Py_ssize_t lo, Py_ssize_t hi,
478 PyObject *values)
479{
480 Py_ssize_t avail, needed;
481 void *bytes;
482 Py_buffer vbytes;
483 int res = 0;
484
485 vbytes.len = -1;
486 if (values == (PyObject *)self) {
487 /* Make a copy and call this function recursively */
488 int err;
489 values = PyByteArray_FromObject(values);
490 if (values == NULL)
491 return -1;
492 err = bytes_setslice(self, lo, hi, values);
493 Py_DECREF(values);
494 return err;
495 }
496 if (values == NULL) {
497 /* del b[lo:hi] */
498 bytes = NULL;
499 needed = 0;
500 }
501 else {
502 if (_getbuffer(values, &vbytes) < 0) {
503 PyErr_Format(PyExc_TypeError,
Neal Norwitzc86b54c2008-07-20 19:35:23 +0000504 "can't set bytearray slice from %.100s",
Christian Heimes44720832008-05-26 13:01:01 +0000505 Py_TYPE(values)->tp_name);
506 return -1;
507 }
508 needed = vbytes.len;
509 bytes = vbytes.buf;
510 }
511
512 if (lo < 0)
513 lo = 0;
514 if (hi < lo)
515 hi = lo;
516 if (hi > Py_SIZE(self))
517 hi = Py_SIZE(self);
518
519 avail = hi - lo;
520 if (avail < 0)
521 lo = hi = avail = 0;
522
523 if (avail != needed) {
524 if (avail > needed) {
525 /*
526 0 lo hi old_size
527 | |<----avail----->|<-----tomove------>|
528 | |<-needed->|<-----tomove------>|
529 0 lo new_hi new_size
530 */
531 memmove(self->ob_bytes + lo + needed, self->ob_bytes + hi,
532 Py_SIZE(self) - hi);
533 }
534 /* XXX(nnorwitz): need to verify this can't overflow! */
535 if (PyByteArray_Resize((PyObject *)self,
536 Py_SIZE(self) + needed - avail) < 0) {
537 res = -1;
538 goto finish;
539 }
540 if (avail < needed) {
541 /*
542 0 lo hi old_size
543 | |<-avail->|<-----tomove------>|
544 | |<----needed---->|<-----tomove------>|
545 0 lo new_hi new_size
546 */
547 memmove(self->ob_bytes + lo + needed, self->ob_bytes + hi,
548 Py_SIZE(self) - lo - needed);
549 }
550 }
551
552 if (needed > 0)
553 memcpy(self->ob_bytes + lo, bytes, needed);
554
555
556 finish:
557 if (vbytes.len != -1)
Martin v. Löwisf91d46a2008-08-12 14:49:50 +0000558 PyBuffer_Release(&vbytes);
Christian Heimes44720832008-05-26 13:01:01 +0000559 return res;
560}
561
562static int
563bytes_setitem(PyByteArrayObject *self, Py_ssize_t i, PyObject *value)
564{
565 int ival;
566
567 if (i < 0)
568 i += Py_SIZE(self);
569
570 if (i < 0 || i >= Py_SIZE(self)) {
571 PyErr_SetString(PyExc_IndexError, "bytearray index out of range");
572 return -1;
573 }
574
575 if (value == NULL)
576 return bytes_setslice(self, i, i+1, NULL);
577
578 if (!_getbytevalue(value, &ival))
579 return -1;
580
581 self->ob_bytes[i] = ival;
582 return 0;
583}
584
585static int
Georg Brandl3e483f62008-07-16 22:57:41 +0000586bytes_ass_subscript(PyByteArrayObject *self, PyObject *index, PyObject *values)
Christian Heimes44720832008-05-26 13:01:01 +0000587{
588 Py_ssize_t start, stop, step, slicelen, needed;
589 char *bytes;
590
Georg Brandl3e483f62008-07-16 22:57:41 +0000591 if (PyIndex_Check(index)) {
592 Py_ssize_t i = PyNumber_AsSsize_t(index, PyExc_IndexError);
Christian Heimes44720832008-05-26 13:01:01 +0000593
594 if (i == -1 && PyErr_Occurred())
595 return -1;
596
597 if (i < 0)
598 i += PyByteArray_GET_SIZE(self);
599
600 if (i < 0 || i >= Py_SIZE(self)) {
601 PyErr_SetString(PyExc_IndexError, "bytearray index out of range");
602 return -1;
603 }
604
605 if (values == NULL) {
606 /* Fall through to slice assignment */
607 start = i;
608 stop = i + 1;
609 step = 1;
610 slicelen = 1;
611 }
612 else {
Georg Brandl3e483f62008-07-16 22:57:41 +0000613 int ival;
614 if (!_getbytevalue(values, &ival))
Christian Heimes44720832008-05-26 13:01:01 +0000615 return -1;
Christian Heimes44720832008-05-26 13:01:01 +0000616 self->ob_bytes[i] = (char)ival;
617 return 0;
618 }
619 }
Georg Brandl3e483f62008-07-16 22:57:41 +0000620 else if (PySlice_Check(index)) {
621 if (PySlice_GetIndicesEx((PySliceObject *)index,
Christian Heimes44720832008-05-26 13:01:01 +0000622 PyByteArray_GET_SIZE(self),
623 &start, &stop, &step, &slicelen) < 0) {
624 return -1;
625 }
626 }
627 else {
628 PyErr_SetString(PyExc_TypeError, "bytearray indices must be integer");
629 return -1;
630 }
631
632 if (values == NULL) {
633 bytes = NULL;
634 needed = 0;
635 }
636 else if (values == (PyObject *)self || !PyByteArray_Check(values)) {
637 /* Make a copy an call this function recursively */
638 int err;
639 values = PyByteArray_FromObject(values);
640 if (values == NULL)
641 return -1;
Georg Brandl3e483f62008-07-16 22:57:41 +0000642 err = bytes_ass_subscript(self, index, values);
Christian Heimes44720832008-05-26 13:01:01 +0000643 Py_DECREF(values);
644 return err;
645 }
646 else {
647 assert(PyByteArray_Check(values));
648 bytes = ((PyByteArrayObject *)values)->ob_bytes;
649 needed = Py_SIZE(values);
650 }
651 /* Make sure b[5:2] = ... inserts before 5, not before 2. */
652 if ((step < 0 && start < stop) ||
653 (step > 0 && start > stop))
654 stop = start;
655 if (step == 1) {
656 if (slicelen != needed) {
657 if (slicelen > needed) {
658 /*
659 0 start stop old_size
660 | |<---slicelen--->|<-----tomove------>|
661 | |<-needed->|<-----tomove------>|
662 0 lo new_hi new_size
663 */
664 memmove(self->ob_bytes + start + needed, self->ob_bytes + stop,
665 Py_SIZE(self) - stop);
666 }
667 if (PyByteArray_Resize((PyObject *)self,
668 Py_SIZE(self) + needed - slicelen) < 0)
669 return -1;
670 if (slicelen < needed) {
671 /*
672 0 lo hi old_size
673 | |<-avail->|<-----tomove------>|
674 | |<----needed---->|<-----tomove------>|
675 0 lo new_hi new_size
676 */
677 memmove(self->ob_bytes + start + needed, self->ob_bytes + stop,
678 Py_SIZE(self) - start - needed);
679 }
680 }
681
682 if (needed > 0)
683 memcpy(self->ob_bytes + start, bytes, needed);
684
685 return 0;
686 }
687 else {
688 if (needed == 0) {
689 /* Delete slice */
690 Py_ssize_t cur, i;
691
692 if (step < 0) {
693 stop = start + 1;
694 start = stop + step * (slicelen - 1) - 1;
695 step = -step;
696 }
697 for (cur = start, i = 0;
698 i < slicelen; cur += step, i++) {
699 Py_ssize_t lim = step - 1;
700
701 if (cur + step >= PyByteArray_GET_SIZE(self))
702 lim = PyByteArray_GET_SIZE(self) - cur - 1;
703
704 memmove(self->ob_bytes + cur - i,
705 self->ob_bytes + cur + 1, lim);
706 }
707 /* Move the tail of the bytes, in one chunk */
708 cur = start + slicelen*step;
709 if (cur < PyByteArray_GET_SIZE(self)) {
710 memmove(self->ob_bytes + cur - slicelen,
711 self->ob_bytes + cur,
712 PyByteArray_GET_SIZE(self) - cur);
713 }
714 if (PyByteArray_Resize((PyObject *)self,
715 PyByteArray_GET_SIZE(self) - slicelen) < 0)
716 return -1;
717
718 return 0;
719 }
720 else {
721 /* Assign slice */
722 Py_ssize_t cur, i;
723
724 if (needed != slicelen) {
725 PyErr_Format(PyExc_ValueError,
726 "attempt to assign bytes of size %zd "
727 "to extended slice of size %zd",
728 needed, slicelen);
729 return -1;
730 }
731 for (cur = start, i = 0; i < slicelen; cur += step, i++)
732 self->ob_bytes[cur] = bytes[i];
733 return 0;
734 }
735 }
736}
737
738static int
739bytes_init(PyByteArrayObject *self, PyObject *args, PyObject *kwds)
740{
741 static char *kwlist[] = {"source", "encoding", "errors", 0};
742 PyObject *arg = NULL;
743 const char *encoding = NULL;
744 const char *errors = NULL;
745 Py_ssize_t count;
746 PyObject *it;
747 PyObject *(*iternext)(PyObject *);
748
749 if (Py_SIZE(self) != 0) {
750 /* Empty previous contents (yes, do this first of all!) */
751 if (PyByteArray_Resize((PyObject *)self, 0) < 0)
752 return -1;
753 }
754
755 /* Parse arguments */
Neal Norwitzc86b54c2008-07-20 19:35:23 +0000756 if (!PyArg_ParseTupleAndKeywords(args, kwds, "|Oss:bytearray", kwlist,
Christian Heimes44720832008-05-26 13:01:01 +0000757 &arg, &encoding, &errors))
758 return -1;
759
760 /* Make a quick exit if no first argument */
761 if (arg == NULL) {
762 if (encoding != NULL || errors != NULL) {
763 PyErr_SetString(PyExc_TypeError,
764 "encoding or errors without sequence argument");
765 return -1;
766 }
767 return 0;
768 }
769
770 if (PyBytes_Check(arg)) {
771 PyObject *new, *encoded;
772 if (encoding != NULL) {
773 encoded = PyCodec_Encode(arg, encoding, errors);
774 if (encoded == NULL)
775 return -1;
776 assert(PyBytes_Check(encoded));
777 }
778 else {
779 encoded = arg;
780 Py_INCREF(arg);
781 }
782 new = bytes_iconcat(self, arg);
783 Py_DECREF(encoded);
784 if (new == NULL)
785 return -1;
786 Py_DECREF(new);
787 return 0;
788 }
789
790 if (PyUnicode_Check(arg)) {
791 /* Encode via the codec registry */
792 PyObject *encoded, *new;
793 if (encoding == NULL) {
794 PyErr_SetString(PyExc_TypeError,
795 "unicode argument without an encoding");
796 return -1;
797 }
798 encoded = PyCodec_Encode(arg, encoding, errors);
799 if (encoded == NULL)
800 return -1;
801 assert(PyBytes_Check(encoded));
802 new = bytes_iconcat(self, encoded);
803 Py_DECREF(encoded);
804 if (new == NULL)
805 return -1;
806 Py_DECREF(new);
807 return 0;
808 }
809
810 /* If it's not unicode, there can't be encoding or errors */
811 if (encoding != NULL || errors != NULL) {
812 PyErr_SetString(PyExc_TypeError,
813 "encoding or errors without a string argument");
814 return -1;
815 }
816
817 /* Is it an int? */
818 count = PyNumber_AsSsize_t(arg, PyExc_ValueError);
819 if (count == -1 && PyErr_Occurred())
820 PyErr_Clear();
821 else {
822 if (count < 0) {
823 PyErr_SetString(PyExc_ValueError, "negative count");
824 return -1;
825 }
826 if (count > 0) {
827 if (PyByteArray_Resize((PyObject *)self, count))
828 return -1;
829 memset(self->ob_bytes, 0, count);
830 }
831 return 0;
832 }
833
834 /* Use the buffer API */
835 if (PyObject_CheckBuffer(arg)) {
836 Py_ssize_t size;
837 Py_buffer view;
838 if (PyObject_GetBuffer(arg, &view, PyBUF_FULL_RO) < 0)
839 return -1;
840 size = view.len;
841 if (PyByteArray_Resize((PyObject *)self, size) < 0) goto fail;
842 if (PyBuffer_ToContiguous(self->ob_bytes, &view, size, 'C') < 0)
843 goto fail;
Martin v. Löwisf91d46a2008-08-12 14:49:50 +0000844 PyBuffer_Release(&view);
Christian Heimes44720832008-05-26 13:01:01 +0000845 return 0;
846 fail:
Martin v. Löwisf91d46a2008-08-12 14:49:50 +0000847 PyBuffer_Release(&view);
Christian Heimes44720832008-05-26 13:01:01 +0000848 return -1;
849 }
850
851 /* XXX Optimize this if the arguments is a list, tuple */
852
853 /* Get the iterator */
854 it = PyObject_GetIter(arg);
855 if (it == NULL)
856 return -1;
857 iternext = *Py_TYPE(it)->tp_iternext;
858
859 /* Run the iterator to exhaustion */
860 for (;;) {
861 PyObject *item;
Georg Brandl3e758462008-07-16 23:10:05 +0000862 int rc, value;
Christian Heimes44720832008-05-26 13:01:01 +0000863
864 /* Get the next item */
865 item = iternext(it);
866 if (item == NULL) {
867 if (PyErr_Occurred()) {
868 if (!PyErr_ExceptionMatches(PyExc_StopIteration))
869 goto error;
870 PyErr_Clear();
871 }
872 break;
873 }
874
875 /* Interpret it as an int (__index__) */
Georg Brandl3e758462008-07-16 23:10:05 +0000876 rc = _getbytevalue(item, &value);
Christian Heimes44720832008-05-26 13:01:01 +0000877 Py_DECREF(item);
Georg Brandl3e758462008-07-16 23:10:05 +0000878 if (!rc)
Christian Heimes44720832008-05-26 13:01:01 +0000879 goto error;
880
Christian Heimes44720832008-05-26 13:01:01 +0000881 /* Append the byte */
882 if (Py_SIZE(self) < self->ob_alloc)
883 Py_SIZE(self)++;
884 else if (PyByteArray_Resize((PyObject *)self, Py_SIZE(self)+1) < 0)
885 goto error;
886 self->ob_bytes[Py_SIZE(self)-1] = value;
887 }
888
889 /* Clean up and return success */
890 Py_DECREF(it);
891 return 0;
892
893 error:
894 /* Error handling when it != NULL */
895 Py_DECREF(it);
896 return -1;
897}
898
899/* Mostly copied from string_repr, but without the
900 "smart quote" functionality. */
901static PyObject *
902bytes_repr(PyByteArrayObject *self)
903{
904 static const char *hexdigits = "0123456789abcdef";
905 const char *quote_prefix = "bytearray(b";
906 const char *quote_postfix = ")";
907 Py_ssize_t length = Py_SIZE(self);
908 /* 14 == strlen(quote_prefix) + 2 + strlen(quote_postfix) */
909 size_t newsize = 14 + 4 * length;
910 PyObject *v;
911 if (newsize > PY_SSIZE_T_MAX || newsize / 4 - 3 != length) {
912 PyErr_SetString(PyExc_OverflowError,
913 "bytearray object is too large to make repr");
914 return NULL;
915 }
916 v = PyUnicode_FromUnicode(NULL, newsize);
917 if (v == NULL) {
918 return NULL;
919 }
920 else {
921 register Py_ssize_t i;
922 register Py_UNICODE c;
923 register Py_UNICODE *p;
924 int quote;
925
926 /* Figure out which quote to use; single is preferred */
927 quote = '\'';
928 {
929 char *test, *start;
930 start = PyByteArray_AS_STRING(self);
931 for (test = start; test < start+length; ++test) {
932 if (*test == '"') {
933 quote = '\''; /* back to single */
934 goto decided;
935 }
936 else if (*test == '\'')
937 quote = '"';
938 }
939 decided:
940 ;
941 }
942
943 p = PyUnicode_AS_UNICODE(v);
944 while (*quote_prefix)
945 *p++ = *quote_prefix++;
946 *p++ = quote;
947
948 for (i = 0; i < length; i++) {
949 /* There's at least enough room for a hex escape
950 and a closing quote. */
951 assert(newsize - (p - PyUnicode_AS_UNICODE(v)) >= 5);
952 c = self->ob_bytes[i];
953 if (c == '\'' || c == '\\')
954 *p++ = '\\', *p++ = c;
955 else if (c == '\t')
956 *p++ = '\\', *p++ = 't';
957 else if (c == '\n')
958 *p++ = '\\', *p++ = 'n';
959 else if (c == '\r')
960 *p++ = '\\', *p++ = 'r';
961 else if (c == 0)
962 *p++ = '\\', *p++ = 'x', *p++ = '0', *p++ = '0';
963 else if (c < ' ' || c >= 0x7f) {
964 *p++ = '\\';
965 *p++ = 'x';
966 *p++ = hexdigits[(c & 0xf0) >> 4];
967 *p++ = hexdigits[c & 0xf];
968 }
969 else
970 *p++ = c;
971 }
972 assert(newsize - (p - PyUnicode_AS_UNICODE(v)) >= 1);
973 *p++ = quote;
974 while (*quote_postfix) {
975 *p++ = *quote_postfix++;
976 }
977 *p = '\0';
978 if (PyUnicode_Resize(&v, (p - PyUnicode_AS_UNICODE(v)))) {
979 Py_DECREF(v);
980 return NULL;
981 }
982 return v;
983 }
984}
985
986static PyObject *
987bytes_str(PyObject *op)
988{
989#if 0
990 if (Py_BytesWarningFlag) {
991 if (PyErr_WarnEx(PyExc_BytesWarning,
992 "str() on a bytearray instance", 1))
993 return NULL;
994 }
995 return bytes_repr((PyByteArrayObject*)op);
996#endif
997 return PyBytes_FromStringAndSize(((PyByteArrayObject*)op)->ob_bytes, Py_SIZE(op));
998}
999
1000static PyObject *
1001bytes_richcompare(PyObject *self, PyObject *other, int op)
1002{
1003 Py_ssize_t self_size, other_size;
1004 Py_buffer self_bytes, other_bytes;
1005 PyObject *res;
1006 Py_ssize_t minsize;
1007 int cmp;
1008
1009 /* Bytes can be compared to anything that supports the (binary)
1010 buffer API. Except that a comparison with Unicode is always an
1011 error, even if the comparison is for equality. */
1012 if (PyObject_IsInstance(self, (PyObject*)&PyUnicode_Type) ||
1013 PyObject_IsInstance(other, (PyObject*)&PyUnicode_Type)) {
1014 if (Py_BytesWarningFlag && op == Py_EQ) {
1015 if (PyErr_WarnEx(PyExc_BytesWarning,
1016 "Comparsion between bytearray and string", 1))
1017 return NULL;
1018 }
1019
1020 Py_INCREF(Py_NotImplemented);
1021 return Py_NotImplemented;
1022 }
1023
1024 self_size = _getbuffer(self, &self_bytes);
1025 if (self_size < 0) {
1026 PyErr_Clear();
1027 Py_INCREF(Py_NotImplemented);
1028 return Py_NotImplemented;
1029 }
1030
1031 other_size = _getbuffer(other, &other_bytes);
1032 if (other_size < 0) {
1033 PyErr_Clear();
Martin v. Löwisf91d46a2008-08-12 14:49:50 +00001034 PyBuffer_Release(&self_bytes);
Christian Heimes44720832008-05-26 13:01:01 +00001035 Py_INCREF(Py_NotImplemented);
1036 return Py_NotImplemented;
1037 }
1038
1039 if (self_size != other_size && (op == Py_EQ || op == Py_NE)) {
1040 /* Shortcut: if the lengths differ, the objects differ */
1041 cmp = (op == Py_NE);
1042 }
1043 else {
1044 minsize = self_size;
1045 if (other_size < minsize)
1046 minsize = other_size;
1047
1048 cmp = memcmp(self_bytes.buf, other_bytes.buf, minsize);
1049 /* In ISO C, memcmp() guarantees to use unsigned bytes! */
1050
1051 if (cmp == 0) {
1052 if (self_size < other_size)
1053 cmp = -1;
1054 else if (self_size > other_size)
1055 cmp = 1;
1056 }
1057
1058 switch (op) {
1059 case Py_LT: cmp = cmp < 0; break;
1060 case Py_LE: cmp = cmp <= 0; break;
1061 case Py_EQ: cmp = cmp == 0; break;
1062 case Py_NE: cmp = cmp != 0; break;
1063 case Py_GT: cmp = cmp > 0; break;
1064 case Py_GE: cmp = cmp >= 0; break;
1065 }
1066 }
1067
1068 res = cmp ? Py_True : Py_False;
Martin v. Löwisf91d46a2008-08-12 14:49:50 +00001069 PyBuffer_Release(&self_bytes);
1070 PyBuffer_Release(&other_bytes);
Christian Heimes44720832008-05-26 13:01:01 +00001071 Py_INCREF(res);
1072 return res;
1073}
1074
1075static void
1076bytes_dealloc(PyByteArrayObject *self)
1077{
Martin v. Löwisf91d46a2008-08-12 14:49:50 +00001078 if (self->ob_exports > 0) {
1079 PyErr_SetString(PyExc_SystemError,
1080 "deallocated bytearray object has exported buffers");
1081 PyErr_Print();
1082 }
Christian Heimes44720832008-05-26 13:01:01 +00001083 if (self->ob_bytes != 0) {
1084 PyMem_Free(self->ob_bytes);
1085 }
1086 Py_TYPE(self)->tp_free((PyObject *)self);
1087}
1088
1089
1090/* -------------------------------------------------------------------- */
1091/* Methods */
1092
1093#define STRINGLIB_CHAR char
1094#define STRINGLIB_CMP memcmp
1095#define STRINGLIB_LEN PyByteArray_GET_SIZE
1096#define STRINGLIB_STR PyByteArray_AS_STRING
1097#define STRINGLIB_NEW PyByteArray_FromStringAndSize
1098#define STRINGLIB_EMPTY nullbytes
1099#define STRINGLIB_CHECK_EXACT PyByteArray_CheckExact
1100#define STRINGLIB_MUTABLE 1
1101
1102#include "stringlib/fastsearch.h"
1103#include "stringlib/count.h"
1104#include "stringlib/find.h"
1105#include "stringlib/partition.h"
1106#include "stringlib/ctype.h"
1107#include "stringlib/transmogrify.h"
1108
1109
1110/* The following Py_LOCAL_INLINE and Py_LOCAL functions
1111were copied from the old char* style string object. */
1112
1113Py_LOCAL_INLINE(void)
1114_adjust_indices(Py_ssize_t *start, Py_ssize_t *end, Py_ssize_t len)
1115{
1116 if (*end > len)
1117 *end = len;
1118 else if (*end < 0)
1119 *end += len;
1120 if (*end < 0)
1121 *end = 0;
1122 if (*start < 0)
1123 *start += len;
1124 if (*start < 0)
1125 *start = 0;
1126}
1127
1128
1129Py_LOCAL_INLINE(Py_ssize_t)
1130bytes_find_internal(PyByteArrayObject *self, PyObject *args, int dir)
1131{
1132 PyObject *subobj;
1133 Py_buffer subbuf;
1134 Py_ssize_t start=0, end=PY_SSIZE_T_MAX;
1135 Py_ssize_t res;
1136
1137 if (!PyArg_ParseTuple(args, "O|O&O&:find/rfind/index/rindex", &subobj,
1138 _PyEval_SliceIndex, &start, _PyEval_SliceIndex, &end))
1139 return -2;
1140 if (_getbuffer(subobj, &subbuf) < 0)
1141 return -2;
1142 if (dir > 0)
1143 res = stringlib_find_slice(
1144 PyByteArray_AS_STRING(self), PyByteArray_GET_SIZE(self),
1145 subbuf.buf, subbuf.len, start, end);
1146 else
1147 res = stringlib_rfind_slice(
1148 PyByteArray_AS_STRING(self), PyByteArray_GET_SIZE(self),
1149 subbuf.buf, subbuf.len, start, end);
Martin v. Löwisf91d46a2008-08-12 14:49:50 +00001150 PyBuffer_Release(&subbuf);
Christian Heimes44720832008-05-26 13:01:01 +00001151 return res;
1152}
1153
1154PyDoc_STRVAR(find__doc__,
1155"B.find(sub [,start [,end]]) -> int\n\
1156\n\
1157Return the lowest 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_find(PyByteArrayObject *self, PyObject *args)
1165{
1166 Py_ssize_t result = bytes_find_internal(self, args, +1);
1167 if (result == -2)
1168 return NULL;
1169 return PyInt_FromSsize_t(result);
1170}
1171
1172PyDoc_STRVAR(count__doc__,
1173"B.count(sub [,start [,end]]) -> int\n\
1174\n\
1175Return the number of non-overlapping occurrences of subsection sub in\n\
1176bytes B[start:end]. Optional arguments start and end are interpreted\n\
1177as in slice notation.");
1178
1179static PyObject *
1180bytes_count(PyByteArrayObject *self, PyObject *args)
1181{
1182 PyObject *sub_obj;
1183 const char *str = PyByteArray_AS_STRING(self);
1184 Py_ssize_t start = 0, end = PY_SSIZE_T_MAX;
1185 Py_buffer vsub;
1186 PyObject *count_obj;
1187
1188 if (!PyArg_ParseTuple(args, "O|O&O&:count", &sub_obj,
1189 _PyEval_SliceIndex, &start, _PyEval_SliceIndex, &end))
1190 return NULL;
1191
1192 if (_getbuffer(sub_obj, &vsub) < 0)
1193 return NULL;
1194
1195 _adjust_indices(&start, &end, PyByteArray_GET_SIZE(self));
1196
1197 count_obj = PyInt_FromSsize_t(
1198 stringlib_count(str + start, end - start, vsub.buf, vsub.len)
1199 );
Martin v. Löwisf91d46a2008-08-12 14:49:50 +00001200 PyBuffer_Release(&vsub);
Christian Heimes44720832008-05-26 13:01:01 +00001201 return count_obj;
1202}
1203
1204
1205PyDoc_STRVAR(index__doc__,
1206"B.index(sub [,start [,end]]) -> int\n\
1207\n\
1208Like B.find() but raise ValueError when the subsection is not found.");
1209
1210static PyObject *
1211bytes_index(PyByteArrayObject *self, PyObject *args)
1212{
1213 Py_ssize_t result = bytes_find_internal(self, args, +1);
1214 if (result == -2)
1215 return NULL;
1216 if (result == -1) {
1217 PyErr_SetString(PyExc_ValueError,
1218 "subsection not found");
1219 return NULL;
1220 }
1221 return PyInt_FromSsize_t(result);
1222}
1223
1224
1225PyDoc_STRVAR(rfind__doc__,
1226"B.rfind(sub [,start [,end]]) -> int\n\
1227\n\
1228Return the highest index in B where subsection sub is found,\n\
1229such that sub is contained within s[start,end]. Optional\n\
1230arguments start and end are interpreted as in slice notation.\n\
1231\n\
1232Return -1 on failure.");
1233
1234static PyObject *
1235bytes_rfind(PyByteArrayObject *self, PyObject *args)
1236{
1237 Py_ssize_t result = bytes_find_internal(self, args, -1);
1238 if (result == -2)
1239 return NULL;
1240 return PyInt_FromSsize_t(result);
1241}
1242
1243
1244PyDoc_STRVAR(rindex__doc__,
1245"B.rindex(sub [,start [,end]]) -> int\n\
1246\n\
1247Like B.rfind() but raise ValueError when the subsection is not found.");
1248
1249static PyObject *
1250bytes_rindex(PyByteArrayObject *self, PyObject *args)
1251{
1252 Py_ssize_t result = bytes_find_internal(self, args, -1);
1253 if (result == -2)
1254 return NULL;
1255 if (result == -1) {
1256 PyErr_SetString(PyExc_ValueError,
1257 "subsection not found");
1258 return NULL;
1259 }
1260 return PyInt_FromSsize_t(result);
1261}
1262
1263
1264static int
1265bytes_contains(PyObject *self, PyObject *arg)
1266{
1267 Py_ssize_t ival = PyNumber_AsSsize_t(arg, PyExc_ValueError);
1268 if (ival == -1 && PyErr_Occurred()) {
1269 Py_buffer varg;
1270 int pos;
1271 PyErr_Clear();
1272 if (_getbuffer(arg, &varg) < 0)
1273 return -1;
1274 pos = stringlib_find(PyByteArray_AS_STRING(self), Py_SIZE(self),
1275 varg.buf, varg.len, 0);
Martin v. Löwisf91d46a2008-08-12 14:49:50 +00001276 PyBuffer_Release(&varg);
Christian Heimes44720832008-05-26 13:01:01 +00001277 return pos >= 0;
1278 }
1279 if (ival < 0 || ival >= 256) {
1280 PyErr_SetString(PyExc_ValueError, "byte must be in range(0, 256)");
1281 return -1;
1282 }
1283
1284 return memchr(PyByteArray_AS_STRING(self), ival, Py_SIZE(self)) != NULL;
1285}
1286
1287
1288/* Matches the end (direction >= 0) or start (direction < 0) of self
1289 * against substr, using the start and end arguments. Returns
1290 * -1 on error, 0 if not found and 1 if found.
1291 */
1292Py_LOCAL(int)
1293_bytes_tailmatch(PyByteArrayObject *self, PyObject *substr, Py_ssize_t start,
1294 Py_ssize_t end, int direction)
1295{
1296 Py_ssize_t len = PyByteArray_GET_SIZE(self);
1297 const char* str;
1298 Py_buffer vsubstr;
1299 int rv = 0;
1300
1301 str = PyByteArray_AS_STRING(self);
1302
1303 if (_getbuffer(substr, &vsubstr) < 0)
1304 return -1;
1305
1306 _adjust_indices(&start, &end, len);
1307
1308 if (direction < 0) {
1309 /* startswith */
1310 if (start+vsubstr.len > len) {
1311 goto done;
1312 }
1313 } else {
1314 /* endswith */
1315 if (end-start < vsubstr.len || start > len) {
1316 goto done;
1317 }
1318
1319 if (end-vsubstr.len > start)
1320 start = end - vsubstr.len;
1321 }
1322 if (end-start >= vsubstr.len)
1323 rv = ! memcmp(str+start, vsubstr.buf, vsubstr.len);
1324
1325done:
Martin v. Löwisf91d46a2008-08-12 14:49:50 +00001326 PyBuffer_Release(&vsubstr);
Christian Heimes44720832008-05-26 13:01:01 +00001327 return rv;
1328}
1329
1330
1331PyDoc_STRVAR(startswith__doc__,
1332"B.startswith(prefix [,start [,end]]) -> bool\n\
1333\n\
1334Return True if B starts with the specified prefix, False otherwise.\n\
1335With optional start, test B beginning at that position.\n\
1336With optional end, stop comparing B at that position.\n\
1337prefix can also be a tuple of strings to try.");
1338
1339static PyObject *
1340bytes_startswith(PyByteArrayObject *self, PyObject *args)
1341{
1342 Py_ssize_t start = 0;
1343 Py_ssize_t end = PY_SSIZE_T_MAX;
1344 PyObject *subobj;
1345 int result;
1346
1347 if (!PyArg_ParseTuple(args, "O|O&O&:startswith", &subobj,
1348 _PyEval_SliceIndex, &start, _PyEval_SliceIndex, &end))
1349 return NULL;
1350 if (PyTuple_Check(subobj)) {
1351 Py_ssize_t i;
1352 for (i = 0; i < PyTuple_GET_SIZE(subobj); i++) {
1353 result = _bytes_tailmatch(self,
1354 PyTuple_GET_ITEM(subobj, i),
1355 start, end, -1);
1356 if (result == -1)
1357 return NULL;
1358 else if (result) {
1359 Py_RETURN_TRUE;
1360 }
1361 }
1362 Py_RETURN_FALSE;
1363 }
1364 result = _bytes_tailmatch(self, subobj, start, end, -1);
1365 if (result == -1)
1366 return NULL;
1367 else
1368 return PyBool_FromLong(result);
1369}
1370
1371PyDoc_STRVAR(endswith__doc__,
1372"B.endswith(suffix [,start [,end]]) -> bool\n\
1373\n\
1374Return True if B ends with the specified suffix, False otherwise.\n\
1375With optional start, test B beginning at that position.\n\
1376With optional end, stop comparing B at that position.\n\
1377suffix can also be a tuple of strings to try.");
1378
1379static PyObject *
1380bytes_endswith(PyByteArrayObject *self, PyObject *args)
1381{
1382 Py_ssize_t start = 0;
1383 Py_ssize_t end = PY_SSIZE_T_MAX;
1384 PyObject *subobj;
1385 int result;
1386
1387 if (!PyArg_ParseTuple(args, "O|O&O&:endswith", &subobj,
1388 _PyEval_SliceIndex, &start, _PyEval_SliceIndex, &end))
1389 return NULL;
1390 if (PyTuple_Check(subobj)) {
1391 Py_ssize_t i;
1392 for (i = 0; i < PyTuple_GET_SIZE(subobj); i++) {
1393 result = _bytes_tailmatch(self,
1394 PyTuple_GET_ITEM(subobj, i),
1395 start, end, +1);
1396 if (result == -1)
1397 return NULL;
1398 else if (result) {
1399 Py_RETURN_TRUE;
1400 }
1401 }
1402 Py_RETURN_FALSE;
1403 }
1404 result = _bytes_tailmatch(self, subobj, start, end, +1);
1405 if (result == -1)
1406 return NULL;
1407 else
1408 return PyBool_FromLong(result);
1409}
1410
1411
1412PyDoc_STRVAR(translate__doc__,
1413"B.translate(table[, deletechars]) -> bytearray\n\
1414\n\
1415Return a copy of B, where all characters occurring in the\n\
1416optional argument deletechars are removed, and the remaining\n\
1417characters have been mapped through the given translation\n\
1418table, which must be a bytes object of length 256.");
1419
1420static PyObject *
1421bytes_translate(PyByteArrayObject *self, PyObject *args)
1422{
1423 register char *input, *output;
1424 register const char *table;
1425 register Py_ssize_t i, c, changed = 0;
1426 PyObject *input_obj = (PyObject*)self;
1427 const char *output_start;
1428 Py_ssize_t inlen;
1429 PyObject *result;
1430 int trans_table[256];
1431 PyObject *tableobj, *delobj = NULL;
1432 Py_buffer vtable, vdel;
1433
1434 if (!PyArg_UnpackTuple(args, "translate", 1, 2,
1435 &tableobj, &delobj))
1436 return NULL;
1437
1438 if (_getbuffer(tableobj, &vtable) < 0)
1439 return NULL;
1440
1441 if (vtable.len != 256) {
1442 PyErr_SetString(PyExc_ValueError,
1443 "translation table must be 256 characters long");
1444 result = NULL;
1445 goto done;
1446 }
1447
1448 if (delobj != NULL) {
1449 if (_getbuffer(delobj, &vdel) < 0) {
1450 result = NULL;
1451 goto done;
1452 }
1453 }
1454 else {
1455 vdel.buf = NULL;
1456 vdel.len = 0;
1457 }
1458
1459 table = (const char *)vtable.buf;
1460 inlen = PyByteArray_GET_SIZE(input_obj);
1461 result = PyByteArray_FromStringAndSize((char *)NULL, inlen);
1462 if (result == NULL)
1463 goto done;
1464 output_start = output = PyByteArray_AsString(result);
1465 input = PyByteArray_AS_STRING(input_obj);
1466
1467 if (vdel.len == 0) {
1468 /* If no deletions are required, use faster code */
1469 for (i = inlen; --i >= 0; ) {
1470 c = Py_CHARMASK(*input++);
1471 if (Py_CHARMASK((*output++ = table[c])) != c)
1472 changed = 1;
1473 }
1474 if (changed || !PyByteArray_CheckExact(input_obj))
1475 goto done;
1476 Py_DECREF(result);
1477 Py_INCREF(input_obj);
1478 result = input_obj;
1479 goto done;
1480 }
1481
1482 for (i = 0; i < 256; i++)
1483 trans_table[i] = Py_CHARMASK(table[i]);
1484
1485 for (i = 0; i < vdel.len; i++)
1486 trans_table[(int) Py_CHARMASK( ((unsigned char*)vdel.buf)[i] )] = -1;
1487
1488 for (i = inlen; --i >= 0; ) {
1489 c = Py_CHARMASK(*input++);
1490 if (trans_table[c] != -1)
1491 if (Py_CHARMASK(*output++ = (char)trans_table[c]) == c)
1492 continue;
1493 changed = 1;
1494 }
1495 if (!changed && PyByteArray_CheckExact(input_obj)) {
1496 Py_DECREF(result);
1497 Py_INCREF(input_obj);
1498 result = input_obj;
1499 goto done;
1500 }
1501 /* Fix the size of the resulting string */
1502 if (inlen > 0)
1503 PyByteArray_Resize(result, output - output_start);
1504
1505done:
Martin v. Löwisf91d46a2008-08-12 14:49:50 +00001506 PyBuffer_Release(&vtable);
Christian Heimes44720832008-05-26 13:01:01 +00001507 if (delobj != NULL)
Martin v. Löwisf91d46a2008-08-12 14:49:50 +00001508 PyBuffer_Release(&vdel);
Christian Heimes44720832008-05-26 13:01:01 +00001509 return result;
1510}
1511
1512
1513#define FORWARD 1
1514#define REVERSE -1
1515
1516/* find and count characters and substrings */
1517
1518#define findchar(target, target_len, c) \
1519 ((char *)memchr((const void *)(target), c, target_len))
1520
1521/* Don't call if length < 2 */
1522#define Py_STRING_MATCH(target, offset, pattern, length) \
1523 (target[offset] == pattern[0] && \
1524 target[offset+length-1] == pattern[length-1] && \
1525 !memcmp(target+offset+1, pattern+1, length-2) )
1526
1527
1528/* Bytes ops must return a string. */
1529/* If the object is subclass of bytes, create a copy */
1530Py_LOCAL(PyByteArrayObject *)
1531return_self(PyByteArrayObject *self)
1532{
1533 if (PyByteArray_CheckExact(self)) {
1534 Py_INCREF(self);
1535 return (PyByteArrayObject *)self;
1536 }
1537 return (PyByteArrayObject *)PyByteArray_FromStringAndSize(
1538 PyByteArray_AS_STRING(self),
1539 PyByteArray_GET_SIZE(self));
1540}
1541
1542Py_LOCAL_INLINE(Py_ssize_t)
1543countchar(const char *target, Py_ssize_t target_len, char c, Py_ssize_t maxcount)
1544{
1545 Py_ssize_t count=0;
1546 const char *start=target;
1547 const char *end=target+target_len;
1548
1549 while ( (start=findchar(start, end-start, c)) != NULL ) {
1550 count++;
1551 if (count >= maxcount)
1552 break;
1553 start += 1;
1554 }
1555 return count;
1556}
1557
1558Py_LOCAL(Py_ssize_t)
1559findstring(const char *target, Py_ssize_t target_len,
1560 const char *pattern, Py_ssize_t pattern_len,
1561 Py_ssize_t start,
1562 Py_ssize_t end,
1563 int direction)
1564{
1565 if (start < 0) {
1566 start += target_len;
1567 if (start < 0)
1568 start = 0;
1569 }
1570 if (end > target_len) {
1571 end = target_len;
1572 } else if (end < 0) {
1573 end += target_len;
1574 if (end < 0)
1575 end = 0;
1576 }
1577
1578 /* zero-length substrings always match at the first attempt */
1579 if (pattern_len == 0)
1580 return (direction > 0) ? start : end;
1581
1582 end -= pattern_len;
1583
1584 if (direction < 0) {
1585 for (; end >= start; end--)
1586 if (Py_STRING_MATCH(target, end, pattern, pattern_len))
1587 return end;
1588 } else {
1589 for (; start <= end; start++)
1590 if (Py_STRING_MATCH(target, start, pattern, pattern_len))
1591 return start;
1592 }
1593 return -1;
1594}
1595
1596Py_LOCAL_INLINE(Py_ssize_t)
1597countstring(const char *target, Py_ssize_t target_len,
1598 const char *pattern, Py_ssize_t pattern_len,
1599 Py_ssize_t start,
1600 Py_ssize_t end,
1601 int direction, Py_ssize_t maxcount)
1602{
1603 Py_ssize_t count=0;
1604
1605 if (start < 0) {
1606 start += target_len;
1607 if (start < 0)
1608 start = 0;
1609 }
1610 if (end > target_len) {
1611 end = target_len;
1612 } else if (end < 0) {
1613 end += target_len;
1614 if (end < 0)
1615 end = 0;
1616 }
1617
1618 /* zero-length substrings match everywhere */
1619 if (pattern_len == 0 || maxcount == 0) {
1620 if (target_len+1 < maxcount)
1621 return target_len+1;
1622 return maxcount;
1623 }
1624
1625 end -= pattern_len;
1626 if (direction < 0) {
1627 for (; (end >= start); end--)
1628 if (Py_STRING_MATCH(target, end, pattern, pattern_len)) {
1629 count++;
1630 if (--maxcount <= 0) break;
1631 end -= pattern_len-1;
1632 }
1633 } else {
1634 for (; (start <= end); start++)
1635 if (Py_STRING_MATCH(target, start, pattern, pattern_len)) {
1636 count++;
1637 if (--maxcount <= 0)
1638 break;
1639 start += pattern_len-1;
1640 }
1641 }
1642 return count;
1643}
1644
1645
1646/* Algorithms for different cases of string replacement */
1647
1648/* len(self)>=1, from="", len(to)>=1, maxcount>=1 */
1649Py_LOCAL(PyByteArrayObject *)
1650replace_interleave(PyByteArrayObject *self,
1651 const char *to_s, Py_ssize_t to_len,
1652 Py_ssize_t maxcount)
1653{
1654 char *self_s, *result_s;
1655 Py_ssize_t self_len, result_len;
1656 Py_ssize_t count, i, product;
1657 PyByteArrayObject *result;
1658
1659 self_len = PyByteArray_GET_SIZE(self);
1660
1661 /* 1 at the end plus 1 after every character */
1662 count = self_len+1;
1663 if (maxcount < count)
1664 count = maxcount;
1665
1666 /* Check for overflow */
1667 /* result_len = count * to_len + self_len; */
1668 product = count * to_len;
1669 if (product / to_len != count) {
1670 PyErr_SetString(PyExc_OverflowError,
1671 "replace string is too long");
1672 return NULL;
1673 }
1674 result_len = product + self_len;
1675 if (result_len < 0) {
1676 PyErr_SetString(PyExc_OverflowError,
1677 "replace string is too long");
1678 return NULL;
1679 }
1680
1681 if (! (result = (PyByteArrayObject *)
1682 PyByteArray_FromStringAndSize(NULL, result_len)) )
1683 return NULL;
1684
1685 self_s = PyByteArray_AS_STRING(self);
1686 result_s = PyByteArray_AS_STRING(result);
1687
1688 /* TODO: special case single character, which doesn't need memcpy */
1689
1690 /* Lay the first one down (guaranteed this will occur) */
1691 Py_MEMCPY(result_s, to_s, to_len);
1692 result_s += to_len;
1693 count -= 1;
1694
1695 for (i=0; i<count; i++) {
1696 *result_s++ = *self_s++;
1697 Py_MEMCPY(result_s, to_s, to_len);
1698 result_s += to_len;
1699 }
1700
1701 /* Copy the rest of the original string */
1702 Py_MEMCPY(result_s, self_s, self_len-i);
1703
1704 return result;
1705}
1706
1707/* Special case for deleting a single character */
1708/* len(self)>=1, len(from)==1, to="", maxcount>=1 */
1709Py_LOCAL(PyByteArrayObject *)
1710replace_delete_single_character(PyByteArrayObject *self,
1711 char from_c, Py_ssize_t maxcount)
1712{
1713 char *self_s, *result_s;
1714 char *start, *next, *end;
1715 Py_ssize_t self_len, result_len;
1716 Py_ssize_t count;
1717 PyByteArrayObject *result;
1718
1719 self_len = PyByteArray_GET_SIZE(self);
1720 self_s = PyByteArray_AS_STRING(self);
1721
1722 count = countchar(self_s, self_len, from_c, maxcount);
1723 if (count == 0) {
1724 return return_self(self);
1725 }
1726
1727 result_len = self_len - count; /* from_len == 1 */
1728 assert(result_len>=0);
1729
1730 if ( (result = (PyByteArrayObject *)
1731 PyByteArray_FromStringAndSize(NULL, result_len)) == NULL)
1732 return NULL;
1733 result_s = PyByteArray_AS_STRING(result);
1734
1735 start = self_s;
1736 end = self_s + self_len;
1737 while (count-- > 0) {
1738 next = findchar(start, end-start, from_c);
1739 if (next == NULL)
1740 break;
1741 Py_MEMCPY(result_s, start, next-start);
1742 result_s += (next-start);
1743 start = next+1;
1744 }
1745 Py_MEMCPY(result_s, start, end-start);
1746
1747 return result;
1748}
1749
1750/* len(self)>=1, len(from)>=2, to="", maxcount>=1 */
1751
1752Py_LOCAL(PyByteArrayObject *)
1753replace_delete_substring(PyByteArrayObject *self,
1754 const char *from_s, Py_ssize_t from_len,
1755 Py_ssize_t maxcount)
1756{
1757 char *self_s, *result_s;
1758 char *start, *next, *end;
1759 Py_ssize_t self_len, result_len;
1760 Py_ssize_t count, offset;
1761 PyByteArrayObject *result;
1762
1763 self_len = PyByteArray_GET_SIZE(self);
1764 self_s = PyByteArray_AS_STRING(self);
1765
1766 count = countstring(self_s, self_len,
1767 from_s, from_len,
1768 0, self_len, 1,
1769 maxcount);
1770
1771 if (count == 0) {
1772 /* no matches */
1773 return return_self(self);
1774 }
1775
1776 result_len = self_len - (count * from_len);
1777 assert (result_len>=0);
1778
1779 if ( (result = (PyByteArrayObject *)
1780 PyByteArray_FromStringAndSize(NULL, result_len)) == NULL )
1781 return NULL;
1782
1783 result_s = PyByteArray_AS_STRING(result);
1784
1785 start = self_s;
1786 end = self_s + self_len;
1787 while (count-- > 0) {
1788 offset = findstring(start, end-start,
1789 from_s, from_len,
1790 0, end-start, FORWARD);
1791 if (offset == -1)
1792 break;
1793 next = start + offset;
1794
1795 Py_MEMCPY(result_s, start, next-start);
1796
1797 result_s += (next-start);
1798 start = next+from_len;
1799 }
1800 Py_MEMCPY(result_s, start, end-start);
1801 return result;
1802}
1803
1804/* len(self)>=1, len(from)==len(to)==1, maxcount>=1 */
1805Py_LOCAL(PyByteArrayObject *)
1806replace_single_character_in_place(PyByteArrayObject *self,
1807 char from_c, char to_c,
1808 Py_ssize_t maxcount)
1809{
1810 char *self_s, *result_s, *start, *end, *next;
1811 Py_ssize_t self_len;
1812 PyByteArrayObject *result;
1813
1814 /* The result string will be the same size */
1815 self_s = PyByteArray_AS_STRING(self);
1816 self_len = PyByteArray_GET_SIZE(self);
1817
1818 next = findchar(self_s, self_len, from_c);
1819
1820 if (next == NULL) {
1821 /* No matches; return the original bytes */
1822 return return_self(self);
1823 }
1824
1825 /* Need to make a new bytes */
1826 result = (PyByteArrayObject *) PyByteArray_FromStringAndSize(NULL, self_len);
1827 if (result == NULL)
1828 return NULL;
1829 result_s = PyByteArray_AS_STRING(result);
1830 Py_MEMCPY(result_s, self_s, self_len);
1831
1832 /* change everything in-place, starting with this one */
1833 start = result_s + (next-self_s);
1834 *start = to_c;
1835 start++;
1836 end = result_s + self_len;
1837
1838 while (--maxcount > 0) {
1839 next = findchar(start, end-start, from_c);
1840 if (next == NULL)
1841 break;
1842 *next = to_c;
1843 start = next+1;
1844 }
1845
1846 return result;
1847}
1848
1849/* len(self)>=1, len(from)==len(to)>=2, maxcount>=1 */
1850Py_LOCAL(PyByteArrayObject *)
1851replace_substring_in_place(PyByteArrayObject *self,
1852 const char *from_s, Py_ssize_t from_len,
1853 const char *to_s, Py_ssize_t to_len,
1854 Py_ssize_t maxcount)
1855{
1856 char *result_s, *start, *end;
1857 char *self_s;
1858 Py_ssize_t self_len, offset;
1859 PyByteArrayObject *result;
1860
1861 /* The result bytes will be the same size */
1862
1863 self_s = PyByteArray_AS_STRING(self);
1864 self_len = PyByteArray_GET_SIZE(self);
1865
1866 offset = findstring(self_s, self_len,
1867 from_s, from_len,
1868 0, self_len, FORWARD);
1869 if (offset == -1) {
1870 /* No matches; return the original bytes */
1871 return return_self(self);
1872 }
1873
1874 /* Need to make a new bytes */
1875 result = (PyByteArrayObject *) PyByteArray_FromStringAndSize(NULL, self_len);
1876 if (result == NULL)
1877 return NULL;
1878 result_s = PyByteArray_AS_STRING(result);
1879 Py_MEMCPY(result_s, self_s, self_len);
1880
1881 /* change everything in-place, starting with this one */
1882 start = result_s + offset;
1883 Py_MEMCPY(start, to_s, from_len);
1884 start += from_len;
1885 end = result_s + self_len;
1886
1887 while ( --maxcount > 0) {
1888 offset = findstring(start, end-start,
1889 from_s, from_len,
1890 0, end-start, FORWARD);
1891 if (offset==-1)
1892 break;
1893 Py_MEMCPY(start+offset, to_s, from_len);
1894 start += offset+from_len;
1895 }
1896
1897 return result;
1898}
1899
1900/* len(self)>=1, len(from)==1, len(to)>=2, maxcount>=1 */
1901Py_LOCAL(PyByteArrayObject *)
1902replace_single_character(PyByteArrayObject *self,
1903 char from_c,
1904 const char *to_s, Py_ssize_t to_len,
1905 Py_ssize_t maxcount)
1906{
1907 char *self_s, *result_s;
1908 char *start, *next, *end;
1909 Py_ssize_t self_len, result_len;
1910 Py_ssize_t count, product;
1911 PyByteArrayObject *result;
1912
1913 self_s = PyByteArray_AS_STRING(self);
1914 self_len = PyByteArray_GET_SIZE(self);
1915
1916 count = countchar(self_s, self_len, from_c, maxcount);
1917 if (count == 0) {
1918 /* no matches, return unchanged */
1919 return return_self(self);
1920 }
1921
1922 /* use the difference between current and new, hence the "-1" */
1923 /* result_len = self_len + count * (to_len-1) */
1924 product = count * (to_len-1);
1925 if (product / (to_len-1) != count) {
1926 PyErr_SetString(PyExc_OverflowError, "replace bytes is too long");
1927 return NULL;
1928 }
1929 result_len = self_len + product;
1930 if (result_len < 0) {
1931 PyErr_SetString(PyExc_OverflowError, "replace bytes is too long");
1932 return NULL;
1933 }
1934
1935 if ( (result = (PyByteArrayObject *)
1936 PyByteArray_FromStringAndSize(NULL, result_len)) == NULL)
1937 return NULL;
1938 result_s = PyByteArray_AS_STRING(result);
1939
1940 start = self_s;
1941 end = self_s + self_len;
1942 while (count-- > 0) {
1943 next = findchar(start, end-start, from_c);
1944 if (next == NULL)
1945 break;
1946
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 += 1;
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+1;
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/* len(self)>=1, len(from)>=2, len(to)>=2, maxcount>=1 */
1968Py_LOCAL(PyByteArrayObject *)
1969replace_substring(PyByteArrayObject *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 char *self_s, *result_s;
1975 char *start, *next, *end;
1976 Py_ssize_t self_len, result_len;
1977 Py_ssize_t count, offset, product;
1978 PyByteArrayObject *result;
1979
1980 self_s = PyByteArray_AS_STRING(self);
1981 self_len = PyByteArray_GET_SIZE(self);
1982
1983 count = countstring(self_s, self_len,
1984 from_s, from_len,
1985 0, self_len, FORWARD, maxcount);
1986 if (count == 0) {
1987 /* no matches, return unchanged */
1988 return return_self(self);
1989 }
1990
1991 /* Check for overflow */
1992 /* result_len = self_len + count * (to_len-from_len) */
1993 product = count * (to_len-from_len);
1994 if (product / (to_len-from_len) != count) {
1995 PyErr_SetString(PyExc_OverflowError, "replace bytes is too long");
1996 return NULL;
1997 }
1998 result_len = self_len + product;
1999 if (result_len < 0) {
2000 PyErr_SetString(PyExc_OverflowError, "replace bytes is too long");
2001 return NULL;
2002 }
2003
2004 if ( (result = (PyByteArrayObject *)
2005 PyByteArray_FromStringAndSize(NULL, result_len)) == NULL)
2006 return NULL;
2007 result_s = PyByteArray_AS_STRING(result);
2008
2009 start = self_s;
2010 end = self_s + self_len;
2011 while (count-- > 0) {
2012 offset = findstring(start, end-start,
2013 from_s, from_len,
2014 0, end-start, FORWARD);
2015 if (offset == -1)
2016 break;
2017 next = start+offset;
2018 if (next == start) {
2019 /* replace with the 'to' */
2020 Py_MEMCPY(result_s, to_s, to_len);
2021 result_s += to_len;
2022 start += from_len;
2023 } else {
2024 /* copy the unchanged old then the 'to' */
2025 Py_MEMCPY(result_s, start, next-start);
2026 result_s += (next-start);
2027 Py_MEMCPY(result_s, to_s, to_len);
2028 result_s += to_len;
2029 start = next+from_len;
2030 }
2031 }
2032 /* Copy the remainder of the remaining bytes */
2033 Py_MEMCPY(result_s, start, end-start);
2034
2035 return result;
2036}
2037
2038
2039Py_LOCAL(PyByteArrayObject *)
2040replace(PyByteArrayObject *self,
2041 const char *from_s, Py_ssize_t from_len,
2042 const char *to_s, Py_ssize_t to_len,
2043 Py_ssize_t maxcount)
2044{
2045 if (maxcount < 0) {
2046 maxcount = PY_SSIZE_T_MAX;
2047 } else if (maxcount == 0 || PyByteArray_GET_SIZE(self) == 0) {
2048 /* nothing to do; return the original bytes */
2049 return return_self(self);
2050 }
2051
2052 if (maxcount == 0 ||
2053 (from_len == 0 && to_len == 0)) {
2054 /* nothing to do; return the original bytes */
2055 return return_self(self);
2056 }
2057
2058 /* Handle zero-length special cases */
2059
2060 if (from_len == 0) {
2061 /* insert the 'to' bytes everywhere. */
2062 /* >>> "Python".replace("", ".") */
2063 /* '.P.y.t.h.o.n.' */
2064 return replace_interleave(self, to_s, to_len, maxcount);
2065 }
2066
2067 /* Except for "".replace("", "A") == "A" there is no way beyond this */
2068 /* point for an empty self bytes to generate a non-empty bytes */
2069 /* Special case so the remaining code always gets a non-empty bytes */
2070 if (PyByteArray_GET_SIZE(self) == 0) {
2071 return return_self(self);
2072 }
2073
2074 if (to_len == 0) {
2075 /* delete all occurances of 'from' bytes */
2076 if (from_len == 1) {
2077 return replace_delete_single_character(
2078 self, from_s[0], maxcount);
2079 } else {
2080 return replace_delete_substring(self, from_s, from_len, maxcount);
2081 }
2082 }
2083
2084 /* Handle special case where both bytes have the same length */
2085
2086 if (from_len == to_len) {
2087 if (from_len == 1) {
2088 return replace_single_character_in_place(
2089 self,
2090 from_s[0],
2091 to_s[0],
2092 maxcount);
2093 } else {
2094 return replace_substring_in_place(
2095 self, from_s, from_len, to_s, to_len, maxcount);
2096 }
2097 }
2098
2099 /* Otherwise use the more generic algorithms */
2100 if (from_len == 1) {
2101 return replace_single_character(self, from_s[0],
2102 to_s, to_len, maxcount);
2103 } else {
2104 /* len('from')>=2, len('to')>=1 */
2105 return replace_substring(self, from_s, from_len, to_s, to_len, maxcount);
2106 }
2107}
2108
2109
2110PyDoc_STRVAR(replace__doc__,
2111"B.replace(old, new[, count]) -> bytes\n\
2112\n\
2113Return a copy of B with all occurrences of subsection\n\
2114old replaced by new. If the optional argument count is\n\
2115given, only the first count occurrences are replaced.");
2116
2117static PyObject *
2118bytes_replace(PyByteArrayObject *self, PyObject *args)
2119{
2120 Py_ssize_t count = -1;
2121 PyObject *from, *to, *res;
2122 Py_buffer vfrom, vto;
2123
2124 if (!PyArg_ParseTuple(args, "OO|n:replace", &from, &to, &count))
2125 return NULL;
2126
2127 if (_getbuffer(from, &vfrom) < 0)
2128 return NULL;
2129 if (_getbuffer(to, &vto) < 0) {
Martin v. Löwisf91d46a2008-08-12 14:49:50 +00002130 PyBuffer_Release(&vfrom);
Christian Heimes44720832008-05-26 13:01:01 +00002131 return NULL;
2132 }
2133
2134 res = (PyObject *)replace((PyByteArrayObject *) self,
2135 vfrom.buf, vfrom.len,
2136 vto.buf, vto.len, count);
2137
Martin v. Löwisf91d46a2008-08-12 14:49:50 +00002138 PyBuffer_Release(&vfrom);
2139 PyBuffer_Release(&vto);
Christian Heimes44720832008-05-26 13:01:01 +00002140 return res;
2141}
2142
2143
2144/* Overallocate the initial list to reduce the number of reallocs for small
2145 split sizes. Eg, "A A A A A A A A A A".split() (10 elements) has three
2146 resizes, to sizes 4, 8, then 16. Most observed string splits are for human
2147 text (roughly 11 words per line) and field delimited data (usually 1-10
2148 fields). For large strings the split algorithms are bandwidth limited
2149 so increasing the preallocation likely will not improve things.*/
2150
2151#define MAX_PREALLOC 12
2152
2153/* 5 splits gives 6 elements */
2154#define PREALLOC_SIZE(maxsplit) \
2155 (maxsplit >= MAX_PREALLOC ? MAX_PREALLOC : maxsplit+1)
2156
2157#define SPLIT_APPEND(data, left, right) \
2158 str = PyByteArray_FromStringAndSize((data) + (left), \
2159 (right) - (left)); \
2160 if (str == NULL) \
2161 goto onError; \
2162 if (PyList_Append(list, str)) { \
2163 Py_DECREF(str); \
2164 goto onError; \
2165 } \
2166 else \
2167 Py_DECREF(str);
2168
2169#define SPLIT_ADD(data, left, right) { \
2170 str = PyByteArray_FromStringAndSize((data) + (left), \
2171 (right) - (left)); \
2172 if (str == NULL) \
2173 goto onError; \
2174 if (count < MAX_PREALLOC) { \
2175 PyList_SET_ITEM(list, count, str); \
2176 } else { \
2177 if (PyList_Append(list, str)) { \
2178 Py_DECREF(str); \
2179 goto onError; \
2180 } \
2181 else \
2182 Py_DECREF(str); \
2183 } \
2184 count++; }
2185
2186/* Always force the list to the expected size. */
2187#define FIX_PREALLOC_SIZE(list) Py_SIZE(list) = count
2188
2189
2190Py_LOCAL_INLINE(PyObject *)
2191split_char(const char *s, Py_ssize_t len, char ch, Py_ssize_t maxcount)
2192{
2193 register Py_ssize_t i, j, count = 0;
2194 PyObject *str;
2195 PyObject *list = PyList_New(PREALLOC_SIZE(maxcount));
2196
2197 if (list == NULL)
2198 return NULL;
2199
2200 i = j = 0;
2201 while ((j < len) && (maxcount-- > 0)) {
2202 for(; j < len; j++) {
2203 /* I found that using memchr makes no difference */
2204 if (s[j] == ch) {
2205 SPLIT_ADD(s, i, j);
2206 i = j = j + 1;
2207 break;
2208 }
2209 }
2210 }
2211 if (i <= len) {
2212 SPLIT_ADD(s, i, len);
2213 }
2214 FIX_PREALLOC_SIZE(list);
2215 return list;
2216
2217 onError:
2218 Py_DECREF(list);
2219 return NULL;
2220}
2221
2222
2223Py_LOCAL_INLINE(PyObject *)
2224split_whitespace(const char *s, Py_ssize_t len, Py_ssize_t maxcount)
2225{
2226 register Py_ssize_t i, j, count = 0;
2227 PyObject *str;
2228 PyObject *list = PyList_New(PREALLOC_SIZE(maxcount));
2229
2230 if (list == NULL)
2231 return NULL;
2232
2233 for (i = j = 0; i < len; ) {
2234 /* find a token */
2235 while (i < len && ISSPACE(s[i]))
2236 i++;
2237 j = i;
2238 while (i < len && !ISSPACE(s[i]))
2239 i++;
2240 if (j < i) {
2241 if (maxcount-- <= 0)
2242 break;
2243 SPLIT_ADD(s, j, i);
2244 while (i < len && ISSPACE(s[i]))
2245 i++;
2246 j = i;
2247 }
2248 }
2249 if (j < len) {
2250 SPLIT_ADD(s, j, len);
2251 }
2252 FIX_PREALLOC_SIZE(list);
2253 return list;
2254
2255 onError:
2256 Py_DECREF(list);
2257 return NULL;
2258}
2259
2260PyDoc_STRVAR(split__doc__,
2261"B.split([sep[, maxsplit]]) -> list of bytearray\n\
2262\n\
2263Return a list of the sections in B, using sep as the delimiter.\n\
2264If sep is not given, B is split on ASCII whitespace characters\n\
2265(space, tab, return, newline, formfeed, vertical tab).\n\
2266If maxsplit is given, at most maxsplit splits are done.");
2267
2268static PyObject *
2269bytes_split(PyByteArrayObject *self, PyObject *args)
2270{
2271 Py_ssize_t len = PyByteArray_GET_SIZE(self), n, i, j;
2272 Py_ssize_t maxsplit = -1, count = 0;
2273 const char *s = PyByteArray_AS_STRING(self), *sub;
2274 PyObject *list, *str, *subobj = Py_None;
2275 Py_buffer vsub;
2276#ifdef USE_FAST
2277 Py_ssize_t pos;
2278#endif
2279
2280 if (!PyArg_ParseTuple(args, "|On:split", &subobj, &maxsplit))
2281 return NULL;
2282 if (maxsplit < 0)
2283 maxsplit = PY_SSIZE_T_MAX;
2284
2285 if (subobj == Py_None)
2286 return split_whitespace(s, len, maxsplit);
2287
2288 if (_getbuffer(subobj, &vsub) < 0)
2289 return NULL;
2290 sub = vsub.buf;
2291 n = vsub.len;
2292
2293 if (n == 0) {
2294 PyErr_SetString(PyExc_ValueError, "empty separator");
Martin v. Löwisf91d46a2008-08-12 14:49:50 +00002295 PyBuffer_Release(&vsub);
Christian Heimes44720832008-05-26 13:01:01 +00002296 return NULL;
2297 }
2298 if (n == 1)
2299 return split_char(s, len, sub[0], maxsplit);
2300
2301 list = PyList_New(PREALLOC_SIZE(maxsplit));
2302 if (list == NULL) {
Martin v. Löwisf91d46a2008-08-12 14:49:50 +00002303 PyBuffer_Release(&vsub);
Christian Heimes44720832008-05-26 13:01:01 +00002304 return NULL;
2305 }
2306
2307#ifdef USE_FAST
2308 i = j = 0;
2309 while (maxsplit-- > 0) {
2310 pos = fastsearch(s+i, len-i, sub, n, FAST_SEARCH);
2311 if (pos < 0)
2312 break;
2313 j = i+pos;
2314 SPLIT_ADD(s, i, j);
2315 i = j + n;
2316 }
2317#else
2318 i = j = 0;
2319 while ((j+n <= len) && (maxsplit-- > 0)) {
2320 for (; j+n <= len; j++) {
2321 if (Py_STRING_MATCH(s, j, sub, n)) {
2322 SPLIT_ADD(s, i, j);
2323 i = j = j + n;
2324 break;
2325 }
2326 }
2327 }
2328#endif
2329 SPLIT_ADD(s, i, len);
2330 FIX_PREALLOC_SIZE(list);
Martin v. Löwisf91d46a2008-08-12 14:49:50 +00002331 PyBuffer_Release(&vsub);
Christian Heimes44720832008-05-26 13:01:01 +00002332 return list;
2333
2334 onError:
2335 Py_DECREF(list);
Martin v. Löwisf91d46a2008-08-12 14:49:50 +00002336 PyBuffer_Release(&vsub);
Christian Heimes44720832008-05-26 13:01:01 +00002337 return NULL;
2338}
2339
2340/* stringlib's partition shares nullbytes in some cases.
2341 undo this, we don't want the nullbytes to be shared. */
2342static PyObject *
2343make_nullbytes_unique(PyObject *result)
2344{
2345 if (result != NULL) {
2346 int i;
2347 assert(PyTuple_Check(result));
2348 assert(PyTuple_GET_SIZE(result) == 3);
2349 for (i = 0; i < 3; i++) {
2350 if (PyTuple_GET_ITEM(result, i) == (PyObject *)nullbytes) {
2351 PyObject *new = PyByteArray_FromStringAndSize(NULL, 0);
2352 if (new == NULL) {
2353 Py_DECREF(result);
2354 result = NULL;
2355 break;
2356 }
2357 Py_DECREF(nullbytes);
2358 PyTuple_SET_ITEM(result, i, new);
2359 }
2360 }
2361 }
2362 return result;
2363}
2364
2365PyDoc_STRVAR(partition__doc__,
2366"B.partition(sep) -> (head, sep, tail)\n\
2367\n\
2368Searches for the separator sep in B, and returns the part before it,\n\
2369the separator itself, and the part after it. If the separator is not\n\
2370found, returns B and two empty bytearray objects.");
2371
2372static PyObject *
2373bytes_partition(PyByteArrayObject *self, PyObject *sep_obj)
2374{
2375 PyObject *bytesep, *result;
2376
2377 bytesep = PyByteArray_FromObject(sep_obj);
2378 if (! bytesep)
2379 return NULL;
2380
2381 result = stringlib_partition(
2382 (PyObject*) self,
2383 PyByteArray_AS_STRING(self), PyByteArray_GET_SIZE(self),
2384 bytesep,
2385 PyByteArray_AS_STRING(bytesep), PyByteArray_GET_SIZE(bytesep)
2386 );
2387
2388 Py_DECREF(bytesep);
2389 return make_nullbytes_unique(result);
2390}
2391
2392PyDoc_STRVAR(rpartition__doc__,
2393"B.rpartition(sep) -> (tail, sep, head)\n\
2394\n\
2395Searches for the separator sep in B, starting at the end of B,\n\
2396and returns the part before it, the separator itself, and the\n\
2397part after it. If the separator is not found, returns two empty\n\
2398bytearray objects and B.");
2399
2400static PyObject *
2401bytes_rpartition(PyByteArrayObject *self, PyObject *sep_obj)
2402{
2403 PyObject *bytesep, *result;
2404
2405 bytesep = PyByteArray_FromObject(sep_obj);
2406 if (! bytesep)
2407 return NULL;
2408
2409 result = stringlib_rpartition(
2410 (PyObject*) self,
2411 PyByteArray_AS_STRING(self), PyByteArray_GET_SIZE(self),
2412 bytesep,
2413 PyByteArray_AS_STRING(bytesep), PyByteArray_GET_SIZE(bytesep)
2414 );
2415
2416 Py_DECREF(bytesep);
2417 return make_nullbytes_unique(result);
2418}
2419
2420Py_LOCAL_INLINE(PyObject *)
2421rsplit_char(const char *s, Py_ssize_t len, char ch, Py_ssize_t maxcount)
2422{
2423 register Py_ssize_t i, j, count=0;
2424 PyObject *str;
2425 PyObject *list = PyList_New(PREALLOC_SIZE(maxcount));
2426
2427 if (list == NULL)
2428 return NULL;
2429
2430 i = j = len - 1;
2431 while ((i >= 0) && (maxcount-- > 0)) {
2432 for (; i >= 0; i--) {
2433 if (s[i] == ch) {
2434 SPLIT_ADD(s, i + 1, j + 1);
2435 j = i = i - 1;
2436 break;
2437 }
2438 }
2439 }
2440 if (j >= -1) {
2441 SPLIT_ADD(s, 0, j + 1);
2442 }
2443 FIX_PREALLOC_SIZE(list);
2444 if (PyList_Reverse(list) < 0)
2445 goto onError;
2446
2447 return list;
2448
2449 onError:
2450 Py_DECREF(list);
2451 return NULL;
2452}
2453
2454Py_LOCAL_INLINE(PyObject *)
2455rsplit_whitespace(const char *s, Py_ssize_t len, Py_ssize_t maxcount)
2456{
2457 register Py_ssize_t i, j, count = 0;
2458 PyObject *str;
2459 PyObject *list = PyList_New(PREALLOC_SIZE(maxcount));
2460
2461 if (list == NULL)
2462 return NULL;
2463
2464 for (i = j = len - 1; i >= 0; ) {
2465 /* find a token */
2466 while (i >= 0 && ISSPACE(s[i]))
2467 i--;
2468 j = i;
2469 while (i >= 0 && !ISSPACE(s[i]))
2470 i--;
2471 if (j > i) {
2472 if (maxcount-- <= 0)
2473 break;
2474 SPLIT_ADD(s, i + 1, j + 1);
2475 while (i >= 0 && ISSPACE(s[i]))
2476 i--;
2477 j = i;
2478 }
2479 }
2480 if (j >= 0) {
2481 SPLIT_ADD(s, 0, j + 1);
2482 }
2483 FIX_PREALLOC_SIZE(list);
2484 if (PyList_Reverse(list) < 0)
2485 goto onError;
2486
2487 return list;
2488
2489 onError:
2490 Py_DECREF(list);
2491 return NULL;
2492}
2493
2494PyDoc_STRVAR(rsplit__doc__,
2495"B.rsplit(sep[, maxsplit]) -> list of bytearray\n\
2496\n\
2497Return a list of the sections in B, using sep as the delimiter,\n\
2498starting at the end of B and working to the front.\n\
2499If sep is not given, B is split on ASCII whitespace characters\n\
2500(space, tab, return, newline, formfeed, vertical tab).\n\
2501If maxsplit is given, at most maxsplit splits are done.");
2502
2503static PyObject *
2504bytes_rsplit(PyByteArrayObject *self, PyObject *args)
2505{
2506 Py_ssize_t len = PyByteArray_GET_SIZE(self), n, i, j;
2507 Py_ssize_t maxsplit = -1, count = 0;
2508 const char *s = PyByteArray_AS_STRING(self), *sub;
2509 PyObject *list, *str, *subobj = Py_None;
2510 Py_buffer vsub;
2511
2512 if (!PyArg_ParseTuple(args, "|On:rsplit", &subobj, &maxsplit))
2513 return NULL;
2514 if (maxsplit < 0)
2515 maxsplit = PY_SSIZE_T_MAX;
2516
2517 if (subobj == Py_None)
2518 return rsplit_whitespace(s, len, maxsplit);
2519
2520 if (_getbuffer(subobj, &vsub) < 0)
2521 return NULL;
2522 sub = vsub.buf;
2523 n = vsub.len;
2524
2525 if (n == 0) {
2526 PyErr_SetString(PyExc_ValueError, "empty separator");
Martin v. Löwisf91d46a2008-08-12 14:49:50 +00002527 PyBuffer_Release(&vsub);
Christian Heimes44720832008-05-26 13:01:01 +00002528 return NULL;
2529 }
2530 else if (n == 1)
2531 return rsplit_char(s, len, sub[0], maxsplit);
2532
2533 list = PyList_New(PREALLOC_SIZE(maxsplit));
2534 if (list == NULL) {
Martin v. Löwisf91d46a2008-08-12 14:49:50 +00002535 PyBuffer_Release(&vsub);
Christian Heimes44720832008-05-26 13:01:01 +00002536 return NULL;
2537 }
2538
2539 j = len;
2540 i = j - n;
2541
2542 while ( (i >= 0) && (maxsplit-- > 0) ) {
2543 for (; i>=0; i--) {
2544 if (Py_STRING_MATCH(s, i, sub, n)) {
2545 SPLIT_ADD(s, i + n, j);
2546 j = i;
2547 i -= n;
2548 break;
2549 }
2550 }
2551 }
2552 SPLIT_ADD(s, 0, j);
2553 FIX_PREALLOC_SIZE(list);
2554 if (PyList_Reverse(list) < 0)
2555 goto onError;
Martin v. Löwisf91d46a2008-08-12 14:49:50 +00002556 PyBuffer_Release(&vsub);
Christian Heimes44720832008-05-26 13:01:01 +00002557 return list;
2558
2559onError:
2560 Py_DECREF(list);
Martin v. Löwisf91d46a2008-08-12 14:49:50 +00002561 PyBuffer_Release(&vsub);
Christian Heimes44720832008-05-26 13:01:01 +00002562 return NULL;
2563}
2564
2565PyDoc_STRVAR(reverse__doc__,
2566"B.reverse() -> None\n\
2567\n\
2568Reverse the order of the values in B in place.");
2569static PyObject *
2570bytes_reverse(PyByteArrayObject *self, PyObject *unused)
2571{
2572 char swap, *head, *tail;
2573 Py_ssize_t i, j, n = Py_SIZE(self);
2574
2575 j = n / 2;
2576 head = self->ob_bytes;
2577 tail = head + n - 1;
2578 for (i = 0; i < j; i++) {
2579 swap = *head;
2580 *head++ = *tail;
2581 *tail-- = swap;
2582 }
2583
2584 Py_RETURN_NONE;
2585}
2586
2587PyDoc_STRVAR(insert__doc__,
2588"B.insert(index, int) -> None\n\
2589\n\
2590Insert a single item into the bytearray before the given index.");
2591static PyObject *
2592bytes_insert(PyByteArrayObject *self, PyObject *args)
2593{
Georg Brandl3e483f62008-07-16 22:57:41 +00002594 PyObject *value;
2595 int ival;
Christian Heimes44720832008-05-26 13:01:01 +00002596 Py_ssize_t where, n = Py_SIZE(self);
2597
Georg Brandl3e483f62008-07-16 22:57:41 +00002598 if (!PyArg_ParseTuple(args, "nO:insert", &where, &value))
Christian Heimes44720832008-05-26 13:01:01 +00002599 return NULL;
2600
2601 if (n == PY_SSIZE_T_MAX) {
2602 PyErr_SetString(PyExc_OverflowError,
2603 "cannot add more objects to bytes");
2604 return NULL;
2605 }
Georg Brandl3e483f62008-07-16 22:57:41 +00002606 if (!_getbytevalue(value, &ival))
Christian Heimes44720832008-05-26 13:01:01 +00002607 return NULL;
Christian Heimes44720832008-05-26 13:01:01 +00002608 if (PyByteArray_Resize((PyObject *)self, n + 1) < 0)
2609 return NULL;
2610
2611 if (where < 0) {
2612 where += n;
2613 if (where < 0)
2614 where = 0;
2615 }
2616 if (where > n)
2617 where = n;
2618 memmove(self->ob_bytes + where + 1, self->ob_bytes + where, n - where);
Georg Brandl3e483f62008-07-16 22:57:41 +00002619 self->ob_bytes[where] = ival;
Christian Heimes44720832008-05-26 13:01:01 +00002620
2621 Py_RETURN_NONE;
2622}
2623
2624PyDoc_STRVAR(append__doc__,
2625"B.append(int) -> None\n\
2626\n\
2627Append a single item to the end of B.");
2628static PyObject *
2629bytes_append(PyByteArrayObject *self, PyObject *arg)
2630{
2631 int value;
2632 Py_ssize_t n = Py_SIZE(self);
2633
2634 if (! _getbytevalue(arg, &value))
2635 return NULL;
2636 if (n == PY_SSIZE_T_MAX) {
2637 PyErr_SetString(PyExc_OverflowError,
2638 "cannot add more objects to bytes");
2639 return NULL;
2640 }
2641 if (PyByteArray_Resize((PyObject *)self, n + 1) < 0)
2642 return NULL;
2643
2644 self->ob_bytes[n] = value;
2645
2646 Py_RETURN_NONE;
2647}
2648
2649PyDoc_STRVAR(extend__doc__,
2650"B.extend(iterable int) -> None\n\
2651\n\
2652Append all the elements from the iterator or sequence to the\n\
2653end of B.");
2654static PyObject *
2655bytes_extend(PyByteArrayObject *self, PyObject *arg)
2656{
2657 PyObject *it, *item, *bytes_obj;
2658 Py_ssize_t buf_size = 0, len = 0;
2659 int value;
2660 char *buf;
2661
2662 /* bytes_setslice code only accepts something supporting PEP 3118. */
2663 if (PyObject_CheckBuffer(arg)) {
2664 if (bytes_setslice(self, Py_SIZE(self), Py_SIZE(self), arg) == -1)
2665 return NULL;
2666
2667 Py_RETURN_NONE;
2668 }
2669
2670 it = PyObject_GetIter(arg);
2671 if (it == NULL)
2672 return NULL;
2673
2674 /* Try to determine the length of the argument. 32 is abitrary. */
2675 buf_size = _PyObject_LengthHint(arg, 32);
2676
2677 bytes_obj = PyByteArray_FromStringAndSize(NULL, buf_size);
2678 if (bytes_obj == NULL)
2679 return NULL;
2680 buf = PyByteArray_AS_STRING(bytes_obj);
2681
2682 while ((item = PyIter_Next(it)) != NULL) {
2683 if (! _getbytevalue(item, &value)) {
2684 Py_DECREF(item);
2685 Py_DECREF(it);
2686 Py_DECREF(bytes_obj);
2687 return NULL;
2688 }
2689 buf[len++] = value;
2690 Py_DECREF(item);
2691
2692 if (len >= buf_size) {
2693 buf_size = len + (len >> 1) + 1;
2694 if (PyByteArray_Resize((PyObject *)bytes_obj, buf_size) < 0) {
2695 Py_DECREF(it);
2696 Py_DECREF(bytes_obj);
2697 return NULL;
2698 }
2699 /* Recompute the `buf' pointer, since the resizing operation may
2700 have invalidated it. */
2701 buf = PyByteArray_AS_STRING(bytes_obj);
2702 }
2703 }
2704 Py_DECREF(it);
2705
2706 /* Resize down to exact size. */
2707 if (PyByteArray_Resize((PyObject *)bytes_obj, len) < 0) {
2708 Py_DECREF(bytes_obj);
2709 return NULL;
2710 }
2711
2712 if (bytes_setslice(self, Py_SIZE(self), Py_SIZE(self), bytes_obj) == -1)
2713 return NULL;
2714 Py_DECREF(bytes_obj);
2715
2716 Py_RETURN_NONE;
2717}
2718
2719PyDoc_STRVAR(pop__doc__,
2720"B.pop([index]) -> int\n\
2721\n\
2722Remove and return a single item from B. If no index\n\
Andrew M. Kuchlingd8972642008-06-21 13:29:12 +00002723argument is given, will pop the last value.");
Christian Heimes44720832008-05-26 13:01:01 +00002724static PyObject *
2725bytes_pop(PyByteArrayObject *self, PyObject *args)
2726{
2727 int value;
2728 Py_ssize_t where = -1, n = Py_SIZE(self);
2729
2730 if (!PyArg_ParseTuple(args, "|n:pop", &where))
2731 return NULL;
2732
2733 if (n == 0) {
2734 PyErr_SetString(PyExc_OverflowError,
2735 "cannot pop an empty bytes");
2736 return NULL;
2737 }
2738 if (where < 0)
2739 where += Py_SIZE(self);
2740 if (where < 0 || where >= Py_SIZE(self)) {
2741 PyErr_SetString(PyExc_IndexError, "pop index out of range");
2742 return NULL;
2743 }
2744
2745 value = self->ob_bytes[where];
2746 memmove(self->ob_bytes + where, self->ob_bytes + where + 1, n - where);
2747 if (PyByteArray_Resize((PyObject *)self, n - 1) < 0)
2748 return NULL;
2749
2750 return PyInt_FromLong(value);
2751}
2752
2753PyDoc_STRVAR(remove__doc__,
2754"B.remove(int) -> None\n\
2755\n\
2756Remove the first occurance of a value in B.");
2757static PyObject *
2758bytes_remove(PyByteArrayObject *self, PyObject *arg)
2759{
2760 int value;
2761 Py_ssize_t where, n = Py_SIZE(self);
2762
2763 if (! _getbytevalue(arg, &value))
2764 return NULL;
2765
2766 for (where = 0; where < n; where++) {
2767 if (self->ob_bytes[where] == value)
2768 break;
2769 }
2770 if (where == n) {
2771 PyErr_SetString(PyExc_ValueError, "value not found in bytes");
2772 return NULL;
2773 }
2774
2775 memmove(self->ob_bytes + where, self->ob_bytes + where + 1, n - where);
2776 if (PyByteArray_Resize((PyObject *)self, n - 1) < 0)
2777 return NULL;
2778
2779 Py_RETURN_NONE;
2780}
2781
2782/* XXX These two helpers could be optimized if argsize == 1 */
2783
2784static Py_ssize_t
2785lstrip_helper(unsigned char *myptr, Py_ssize_t mysize,
2786 void *argptr, Py_ssize_t argsize)
2787{
2788 Py_ssize_t i = 0;
2789 while (i < mysize && memchr(argptr, myptr[i], argsize))
2790 i++;
2791 return i;
2792}
2793
2794static Py_ssize_t
2795rstrip_helper(unsigned char *myptr, Py_ssize_t mysize,
2796 void *argptr, Py_ssize_t argsize)
2797{
2798 Py_ssize_t i = mysize - 1;
2799 while (i >= 0 && memchr(argptr, myptr[i], argsize))
2800 i--;
2801 return i + 1;
2802}
2803
2804PyDoc_STRVAR(strip__doc__,
2805"B.strip([bytes]) -> bytearray\n\
2806\n\
2807Strip leading and trailing bytes contained in the argument.\n\
2808If the argument is omitted, strip ASCII whitespace.");
2809static PyObject *
2810bytes_strip(PyByteArrayObject *self, PyObject *args)
2811{
2812 Py_ssize_t left, right, mysize, argsize;
2813 void *myptr, *argptr;
2814 PyObject *arg = Py_None;
2815 Py_buffer varg;
2816 if (!PyArg_ParseTuple(args, "|O:strip", &arg))
2817 return NULL;
2818 if (arg == Py_None) {
2819 argptr = "\t\n\r\f\v ";
2820 argsize = 6;
2821 }
2822 else {
2823 if (_getbuffer(arg, &varg) < 0)
2824 return NULL;
2825 argptr = varg.buf;
2826 argsize = varg.len;
2827 }
2828 myptr = self->ob_bytes;
2829 mysize = Py_SIZE(self);
2830 left = lstrip_helper(myptr, mysize, argptr, argsize);
2831 if (left == mysize)
2832 right = left;
2833 else
2834 right = rstrip_helper(myptr, mysize, argptr, argsize);
2835 if (arg != Py_None)
Martin v. Löwisf91d46a2008-08-12 14:49:50 +00002836 PyBuffer_Release(&varg);
Christian Heimes44720832008-05-26 13:01:01 +00002837 return PyByteArray_FromStringAndSize(self->ob_bytes + left, right - left);
2838}
2839
2840PyDoc_STRVAR(lstrip__doc__,
2841"B.lstrip([bytes]) -> bytearray\n\
2842\n\
2843Strip leading bytes contained in the argument.\n\
2844If the argument is omitted, strip leading ASCII whitespace.");
2845static PyObject *
2846bytes_lstrip(PyByteArrayObject *self, PyObject *args)
2847{
2848 Py_ssize_t left, right, mysize, argsize;
2849 void *myptr, *argptr;
2850 PyObject *arg = Py_None;
2851 Py_buffer varg;
2852 if (!PyArg_ParseTuple(args, "|O:lstrip", &arg))
2853 return NULL;
2854 if (arg == Py_None) {
2855 argptr = "\t\n\r\f\v ";
2856 argsize = 6;
2857 }
2858 else {
2859 if (_getbuffer(arg, &varg) < 0)
2860 return NULL;
2861 argptr = varg.buf;
2862 argsize = varg.len;
2863 }
2864 myptr = self->ob_bytes;
2865 mysize = Py_SIZE(self);
2866 left = lstrip_helper(myptr, mysize, argptr, argsize);
2867 right = mysize;
2868 if (arg != Py_None)
Martin v. Löwisf91d46a2008-08-12 14:49:50 +00002869 PyBuffer_Release(&varg);
Christian Heimes44720832008-05-26 13:01:01 +00002870 return PyByteArray_FromStringAndSize(self->ob_bytes + left, right - left);
2871}
2872
2873PyDoc_STRVAR(rstrip__doc__,
2874"B.rstrip([bytes]) -> bytearray\n\
2875\n\
2876Strip trailing bytes contained in the argument.\n\
2877If the argument is omitted, strip trailing ASCII whitespace.");
2878static PyObject *
2879bytes_rstrip(PyByteArrayObject *self, PyObject *args)
2880{
2881 Py_ssize_t left, right, mysize, argsize;
2882 void *myptr, *argptr;
2883 PyObject *arg = Py_None;
2884 Py_buffer varg;
2885 if (!PyArg_ParseTuple(args, "|O:rstrip", &arg))
2886 return NULL;
2887 if (arg == Py_None) {
2888 argptr = "\t\n\r\f\v ";
2889 argsize = 6;
2890 }
2891 else {
2892 if (_getbuffer(arg, &varg) < 0)
2893 return NULL;
2894 argptr = varg.buf;
2895 argsize = varg.len;
2896 }
2897 myptr = self->ob_bytes;
2898 mysize = Py_SIZE(self);
2899 left = 0;
2900 right = rstrip_helper(myptr, mysize, argptr, argsize);
2901 if (arg != Py_None)
Martin v. Löwisf91d46a2008-08-12 14:49:50 +00002902 PyBuffer_Release(&varg);
Christian Heimes44720832008-05-26 13:01:01 +00002903 return PyByteArray_FromStringAndSize(self->ob_bytes + left, right - left);
2904}
2905
2906PyDoc_STRVAR(decode_doc,
2907"B.decode([encoding[, errors]]) -> unicode object.\n\
2908\n\
2909Decodes B using the codec registered for encoding. encoding defaults\n\
2910to the default encoding. errors may be given to set a different error\n\
2911handling scheme. Default is 'strict' meaning that encoding errors raise\n\
2912a UnicodeDecodeError. Other possible values are 'ignore' and 'replace'\n\
2913as well as any other name registered with codecs.register_error that is\n\
2914able to handle UnicodeDecodeErrors.");
2915
2916static PyObject *
2917bytes_decode(PyObject *self, PyObject *args)
2918{
2919 const char *encoding = NULL;
2920 const char *errors = NULL;
2921
2922 if (!PyArg_ParseTuple(args, "|ss:decode", &encoding, &errors))
2923 return NULL;
2924 if (encoding == NULL)
2925 encoding = PyUnicode_GetDefaultEncoding();
2926 return PyCodec_Decode(self, encoding, errors);
2927}
2928
2929PyDoc_STRVAR(alloc_doc,
2930"B.__alloc__() -> int\n\
2931\n\
2932Returns the number of bytes actually allocated.");
2933
2934static PyObject *
2935bytes_alloc(PyByteArrayObject *self)
2936{
2937 return PyInt_FromSsize_t(self->ob_alloc);
2938}
2939
2940PyDoc_STRVAR(join_doc,
2941"B.join(iterable_of_bytes) -> bytes\n\
2942\n\
2943Concatenates any number of bytearray objects, with B in between each pair.");
2944
2945static PyObject *
2946bytes_join(PyByteArrayObject *self, PyObject *it)
2947{
2948 PyObject *seq;
2949 Py_ssize_t mysize = Py_SIZE(self);
2950 Py_ssize_t i;
2951 Py_ssize_t n;
2952 PyObject **items;
2953 Py_ssize_t totalsize = 0;
2954 PyObject *result;
2955 char *dest;
2956
2957 seq = PySequence_Fast(it, "can only join an iterable");
2958 if (seq == NULL)
2959 return NULL;
2960 n = PySequence_Fast_GET_SIZE(seq);
2961 items = PySequence_Fast_ITEMS(seq);
2962
2963 /* Compute the total size, and check that they are all bytes */
2964 /* XXX Shouldn't we use _getbuffer() on these items instead? */
2965 for (i = 0; i < n; i++) {
2966 PyObject *obj = items[i];
2967 if (!PyByteArray_Check(obj) && !PyBytes_Check(obj)) {
2968 PyErr_Format(PyExc_TypeError,
2969 "can only join an iterable of bytes "
2970 "(item %ld has type '%.100s')",
2971 /* XXX %ld isn't right on Win64 */
2972 (long)i, Py_TYPE(obj)->tp_name);
2973 goto error;
2974 }
2975 if (i > 0)
2976 totalsize += mysize;
2977 totalsize += Py_SIZE(obj);
2978 if (totalsize < 0) {
2979 PyErr_NoMemory();
2980 goto error;
2981 }
2982 }
2983
2984 /* Allocate the result, and copy the bytes */
2985 result = PyByteArray_FromStringAndSize(NULL, totalsize);
2986 if (result == NULL)
2987 goto error;
2988 dest = PyByteArray_AS_STRING(result);
2989 for (i = 0; i < n; i++) {
2990 PyObject *obj = items[i];
2991 Py_ssize_t size = Py_SIZE(obj);
2992 char *buf;
2993 if (PyByteArray_Check(obj))
2994 buf = PyByteArray_AS_STRING(obj);
2995 else
2996 buf = PyBytes_AS_STRING(obj);
2997 if (i) {
2998 memcpy(dest, self->ob_bytes, mysize);
2999 dest += mysize;
3000 }
3001 memcpy(dest, buf, size);
3002 dest += size;
3003 }
3004
3005 /* Done */
3006 Py_DECREF(seq);
3007 return result;
3008
3009 /* Error handling */
3010 error:
3011 Py_DECREF(seq);
3012 return NULL;
3013}
3014
3015PyDoc_STRVAR(fromhex_doc,
3016"bytearray.fromhex(string) -> bytearray\n\
3017\n\
3018Create a bytearray object from a string of hexadecimal numbers.\n\
3019Spaces between two numbers are accepted.\n\
3020Example: bytearray.fromhex('B9 01EF') -> bytearray(b'\\xb9\\x01\\xef').");
3021
3022static int
3023hex_digit_to_int(Py_UNICODE c)
3024{
3025 if (c >= 128)
3026 return -1;
3027 if (ISDIGIT(c))
3028 return c - '0';
3029 else {
3030 if (ISUPPER(c))
3031 c = TOLOWER(c);
3032 if (c >= 'a' && c <= 'f')
3033 return c - 'a' + 10;
3034 }
3035 return -1;
3036}
3037
3038static PyObject *
3039bytes_fromhex(PyObject *cls, PyObject *args)
3040{
3041 PyObject *newbytes, *hexobj;
3042 char *buf;
3043 Py_UNICODE *hex;
3044 Py_ssize_t hexlen, byteslen, i, j;
3045 int top, bot;
3046
3047 if (!PyArg_ParseTuple(args, "U:fromhex", &hexobj))
3048 return NULL;
3049 assert(PyUnicode_Check(hexobj));
3050 hexlen = PyUnicode_GET_SIZE(hexobj);
3051 hex = PyUnicode_AS_UNICODE(hexobj);
3052 byteslen = hexlen/2; /* This overestimates if there are spaces */
3053 newbytes = PyByteArray_FromStringAndSize(NULL, byteslen);
3054 if (!newbytes)
3055 return NULL;
3056 buf = PyByteArray_AS_STRING(newbytes);
3057 for (i = j = 0; i < hexlen; i += 2) {
3058 /* skip over spaces in the input */
3059 while (hex[i] == ' ')
3060 i++;
3061 if (i >= hexlen)
3062 break;
3063 top = hex_digit_to_int(hex[i]);
3064 bot = hex_digit_to_int(hex[i+1]);
3065 if (top == -1 || bot == -1) {
3066 PyErr_Format(PyExc_ValueError,
3067 "non-hexadecimal number found in "
3068 "fromhex() arg at position %zd", i);
3069 goto error;
3070 }
3071 buf[j++] = (top << 4) + bot;
3072 }
3073 if (PyByteArray_Resize(newbytes, j) < 0)
3074 goto error;
3075 return newbytes;
3076
3077 error:
3078 Py_DECREF(newbytes);
3079 return NULL;
3080}
3081
3082PyDoc_STRVAR(reduce_doc, "Return state information for pickling.");
3083
3084static PyObject *
3085bytes_reduce(PyByteArrayObject *self)
3086{
3087 PyObject *latin1, *dict;
3088 if (self->ob_bytes)
3089 latin1 = PyUnicode_DecodeLatin1(self->ob_bytes,
3090 Py_SIZE(self), NULL);
3091 else
3092 latin1 = PyUnicode_FromString("");
3093
3094 dict = PyObject_GetAttrString((PyObject *)self, "__dict__");
3095 if (dict == NULL) {
3096 PyErr_Clear();
3097 dict = Py_None;
3098 Py_INCREF(dict);
3099 }
3100
3101 return Py_BuildValue("(O(Ns)N)", Py_TYPE(self), latin1, "latin-1", dict);
3102}
3103
Robert Schuppenies9be2ec12008-07-10 15:24:04 +00003104PyDoc_STRVAR(sizeof_doc,
3105"B.__sizeof__() -> int\n\
3106 \n\
3107Returns the size of B in memory, in bytes");
3108static PyObject *
3109bytes_sizeof(PyByteArrayObject *self)
3110{
3111 Py_ssize_t res;
3112
3113 res = sizeof(PyByteArrayObject) + self->ob_alloc * sizeof(char);
3114 return PyInt_FromSsize_t(res);
3115}
3116
Christian Heimes44720832008-05-26 13:01:01 +00003117static PySequenceMethods bytes_as_sequence = {
3118 (lenfunc)bytes_length, /* sq_length */
3119 (binaryfunc)PyByteArray_Concat, /* sq_concat */
3120 (ssizeargfunc)bytes_repeat, /* sq_repeat */
3121 (ssizeargfunc)bytes_getitem, /* sq_item */
3122 0, /* sq_slice */
3123 (ssizeobjargproc)bytes_setitem, /* sq_ass_item */
3124 0, /* sq_ass_slice */
3125 (objobjproc)bytes_contains, /* sq_contains */
3126 (binaryfunc)bytes_iconcat, /* sq_inplace_concat */
3127 (ssizeargfunc)bytes_irepeat, /* sq_inplace_repeat */
3128};
3129
3130static PyMappingMethods bytes_as_mapping = {
3131 (lenfunc)bytes_length,
3132 (binaryfunc)bytes_subscript,
3133 (objobjargproc)bytes_ass_subscript,
3134};
3135
3136static PyBufferProcs bytes_as_buffer = {
3137 (readbufferproc)bytes_buffer_getreadbuf,
3138 (writebufferproc)bytes_buffer_getwritebuf,
3139 (segcountproc)bytes_buffer_getsegcount,
3140 (charbufferproc)bytes_buffer_getcharbuf,
3141 (getbufferproc)bytes_getbuffer,
3142 (releasebufferproc)bytes_releasebuffer,
3143};
3144
3145static PyMethodDef
3146bytes_methods[] = {
3147 {"__alloc__", (PyCFunction)bytes_alloc, METH_NOARGS, alloc_doc},
3148 {"__reduce__", (PyCFunction)bytes_reduce, METH_NOARGS, reduce_doc},
Robert Schuppenies9be2ec12008-07-10 15:24:04 +00003149 {"__sizeof__", (PyCFunction)bytes_sizeof, METH_NOARGS, sizeof_doc},
Christian Heimes44720832008-05-26 13:01:01 +00003150 {"append", (PyCFunction)bytes_append, METH_O, append__doc__},
3151 {"capitalize", (PyCFunction)stringlib_capitalize, METH_NOARGS,
3152 _Py_capitalize__doc__},
3153 {"center", (PyCFunction)stringlib_center, METH_VARARGS, center__doc__},
3154 {"count", (PyCFunction)bytes_count, METH_VARARGS, count__doc__},
3155 {"decode", (PyCFunction)bytes_decode, METH_VARARGS, decode_doc},
3156 {"endswith", (PyCFunction)bytes_endswith, METH_VARARGS, endswith__doc__},
3157 {"expandtabs", (PyCFunction)stringlib_expandtabs, METH_VARARGS,
3158 expandtabs__doc__},
3159 {"extend", (PyCFunction)bytes_extend, METH_O, extend__doc__},
3160 {"find", (PyCFunction)bytes_find, METH_VARARGS, find__doc__},
3161 {"fromhex", (PyCFunction)bytes_fromhex, METH_VARARGS|METH_CLASS,
3162 fromhex_doc},
3163 {"index", (PyCFunction)bytes_index, METH_VARARGS, index__doc__},
3164 {"insert", (PyCFunction)bytes_insert, METH_VARARGS, insert__doc__},
3165 {"isalnum", (PyCFunction)stringlib_isalnum, METH_NOARGS,
3166 _Py_isalnum__doc__},
3167 {"isalpha", (PyCFunction)stringlib_isalpha, METH_NOARGS,
3168 _Py_isalpha__doc__},
3169 {"isdigit", (PyCFunction)stringlib_isdigit, METH_NOARGS,
3170 _Py_isdigit__doc__},
3171 {"islower", (PyCFunction)stringlib_islower, METH_NOARGS,
3172 _Py_islower__doc__},
3173 {"isspace", (PyCFunction)stringlib_isspace, METH_NOARGS,
3174 _Py_isspace__doc__},
3175 {"istitle", (PyCFunction)stringlib_istitle, METH_NOARGS,
3176 _Py_istitle__doc__},
3177 {"isupper", (PyCFunction)stringlib_isupper, METH_NOARGS,
3178 _Py_isupper__doc__},
3179 {"join", (PyCFunction)bytes_join, METH_O, join_doc},
3180 {"ljust", (PyCFunction)stringlib_ljust, METH_VARARGS, ljust__doc__},
3181 {"lower", (PyCFunction)stringlib_lower, METH_NOARGS, _Py_lower__doc__},
3182 {"lstrip", (PyCFunction)bytes_lstrip, METH_VARARGS, lstrip__doc__},
3183 {"partition", (PyCFunction)bytes_partition, METH_O, partition__doc__},
3184 {"pop", (PyCFunction)bytes_pop, METH_VARARGS, pop__doc__},
3185 {"remove", (PyCFunction)bytes_remove, METH_O, remove__doc__},
3186 {"replace", (PyCFunction)bytes_replace, METH_VARARGS, replace__doc__},
3187 {"reverse", (PyCFunction)bytes_reverse, METH_NOARGS, reverse__doc__},
3188 {"rfind", (PyCFunction)bytes_rfind, METH_VARARGS, rfind__doc__},
3189 {"rindex", (PyCFunction)bytes_rindex, METH_VARARGS, rindex__doc__},
3190 {"rjust", (PyCFunction)stringlib_rjust, METH_VARARGS, rjust__doc__},
3191 {"rpartition", (PyCFunction)bytes_rpartition, METH_O, rpartition__doc__},
3192 {"rsplit", (PyCFunction)bytes_rsplit, METH_VARARGS, rsplit__doc__},
3193 {"rstrip", (PyCFunction)bytes_rstrip, METH_VARARGS, rstrip__doc__},
3194 {"split", (PyCFunction)bytes_split, METH_VARARGS, split__doc__},
3195 {"splitlines", (PyCFunction)stringlib_splitlines, METH_VARARGS,
3196 splitlines__doc__},
3197 {"startswith", (PyCFunction)bytes_startswith, METH_VARARGS ,
3198 startswith__doc__},
3199 {"strip", (PyCFunction)bytes_strip, METH_VARARGS, strip__doc__},
3200 {"swapcase", (PyCFunction)stringlib_swapcase, METH_NOARGS,
3201 _Py_swapcase__doc__},
3202 {"title", (PyCFunction)stringlib_title, METH_NOARGS, _Py_title__doc__},
3203 {"translate", (PyCFunction)bytes_translate, METH_VARARGS,
3204 translate__doc__},
3205 {"upper", (PyCFunction)stringlib_upper, METH_NOARGS, _Py_upper__doc__},
3206 {"zfill", (PyCFunction)stringlib_zfill, METH_VARARGS, zfill__doc__},
3207 {NULL}
3208};
3209
3210PyDoc_STRVAR(bytes_doc,
3211"bytearray(iterable_of_ints) -> bytearray.\n\
3212bytearray(string, encoding[, errors]) -> bytearray.\n\
3213bytearray(bytes_or_bytearray) -> mutable copy of bytes_or_bytearray.\n\
3214bytearray(memory_view) -> bytearray.\n\
3215\n\
3216Construct an mutable bytearray object from:\n\
3217 - an iterable yielding integers in range(256)\n\
3218 - a text string encoded using the specified encoding\n\
3219 - a bytes or a bytearray object\n\
3220 - any object implementing the buffer API.\n\
3221\n\
3222bytearray(int) -> bytearray.\n\
3223\n\
3224Construct a zero-initialized bytearray of the given length.");
3225
3226
3227static PyObject *bytes_iter(PyObject *seq);
3228
3229PyTypeObject PyByteArray_Type = {
3230 PyVarObject_HEAD_INIT(&PyType_Type, 0)
3231 "bytearray",
3232 sizeof(PyByteArrayObject),
3233 0,
3234 (destructor)bytes_dealloc, /* tp_dealloc */
3235 0, /* tp_print */
3236 0, /* tp_getattr */
3237 0, /* tp_setattr */
3238 0, /* tp_compare */
3239 (reprfunc)bytes_repr, /* tp_repr */
3240 0, /* tp_as_number */
3241 &bytes_as_sequence, /* tp_as_sequence */
3242 &bytes_as_mapping, /* tp_as_mapping */
3243 0, /* tp_hash */
3244 0, /* tp_call */
3245 bytes_str, /* tp_str */
3246 PyObject_GenericGetAttr, /* tp_getattro */
3247 0, /* tp_setattro */
3248 &bytes_as_buffer, /* tp_as_buffer */
3249 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE |
3250 Py_TPFLAGS_HAVE_NEWBUFFER, /* tp_flags */
3251 bytes_doc, /* tp_doc */
3252 0, /* tp_traverse */
3253 0, /* tp_clear */
3254 (richcmpfunc)bytes_richcompare, /* tp_richcompare */
3255 0, /* tp_weaklistoffset */
3256 bytes_iter, /* tp_iter */
3257 0, /* tp_iternext */
3258 bytes_methods, /* tp_methods */
3259 0, /* tp_members */
3260 0, /* tp_getset */
3261 0, /* tp_base */
3262 0, /* tp_dict */
3263 0, /* tp_descr_get */
3264 0, /* tp_descr_set */
3265 0, /* tp_dictoffset */
3266 (initproc)bytes_init, /* tp_init */
3267 PyType_GenericAlloc, /* tp_alloc */
3268 PyType_GenericNew, /* tp_new */
3269 PyObject_Del, /* tp_free */
3270};
3271
3272/*********************** Bytes Iterator ****************************/
3273
3274typedef struct {
3275 PyObject_HEAD
3276 Py_ssize_t it_index;
3277 PyByteArrayObject *it_seq; /* Set to NULL when iterator is exhausted */
3278} bytesiterobject;
3279
3280static void
3281bytesiter_dealloc(bytesiterobject *it)
3282{
3283 _PyObject_GC_UNTRACK(it);
3284 Py_XDECREF(it->it_seq);
3285 PyObject_GC_Del(it);
3286}
3287
3288static int
3289bytesiter_traverse(bytesiterobject *it, visitproc visit, void *arg)
3290{
3291 Py_VISIT(it->it_seq);
3292 return 0;
3293}
3294
3295static PyObject *
3296bytesiter_next(bytesiterobject *it)
3297{
3298 PyByteArrayObject *seq;
3299 PyObject *item;
3300
3301 assert(it != NULL);
3302 seq = it->it_seq;
3303 if (seq == NULL)
3304 return NULL;
3305 assert(PyByteArray_Check(seq));
3306
3307 if (it->it_index < PyByteArray_GET_SIZE(seq)) {
3308 item = PyInt_FromLong(
3309 (unsigned char)seq->ob_bytes[it->it_index]);
3310 if (item != NULL)
3311 ++it->it_index;
3312 return item;
3313 }
3314
3315 Py_DECREF(seq);
3316 it->it_seq = NULL;
3317 return NULL;
3318}
3319
3320static PyObject *
3321bytesiter_length_hint(bytesiterobject *it)
3322{
3323 Py_ssize_t len = 0;
3324 if (it->it_seq)
3325 len = PyByteArray_GET_SIZE(it->it_seq) - it->it_index;
3326 return PyInt_FromSsize_t(len);
3327}
3328
3329PyDoc_STRVAR(length_hint_doc,
3330 "Private method returning an estimate of len(list(it)).");
3331
3332static PyMethodDef bytesiter_methods[] = {
3333 {"__length_hint__", (PyCFunction)bytesiter_length_hint, METH_NOARGS,
3334 length_hint_doc},
3335 {NULL, NULL} /* sentinel */
3336};
3337
3338PyTypeObject PyByteArrayIter_Type = {
3339 PyVarObject_HEAD_INIT(&PyType_Type, 0)
3340 "bytearray_iterator", /* tp_name */
3341 sizeof(bytesiterobject), /* tp_basicsize */
3342 0, /* tp_itemsize */
3343 /* methods */
3344 (destructor)bytesiter_dealloc, /* tp_dealloc */
3345 0, /* tp_print */
3346 0, /* tp_getattr */
3347 0, /* tp_setattr */
3348 0, /* tp_compare */
3349 0, /* tp_repr */
3350 0, /* tp_as_number */
3351 0, /* tp_as_sequence */
3352 0, /* tp_as_mapping */
3353 0, /* tp_hash */
3354 0, /* tp_call */
3355 0, /* tp_str */
3356 PyObject_GenericGetAttr, /* tp_getattro */
3357 0, /* tp_setattro */
3358 0, /* tp_as_buffer */
3359 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC, /* tp_flags */
3360 0, /* tp_doc */
3361 (traverseproc)bytesiter_traverse, /* tp_traverse */
3362 0, /* tp_clear */
3363 0, /* tp_richcompare */
3364 0, /* tp_weaklistoffset */
3365 PyObject_SelfIter, /* tp_iter */
3366 (iternextfunc)bytesiter_next, /* tp_iternext */
3367 bytesiter_methods, /* tp_methods */
3368 0,
3369};
3370
3371static PyObject *
3372bytes_iter(PyObject *seq)
3373{
3374 bytesiterobject *it;
3375
3376 if (!PyByteArray_Check(seq)) {
3377 PyErr_BadInternalCall();
3378 return NULL;
3379 }
3380 it = PyObject_GC_New(bytesiterobject, &PyByteArrayIter_Type);
3381 if (it == NULL)
3382 return NULL;
3383 it->it_index = 0;
3384 Py_INCREF(seq);
3385 it->it_seq = (PyByteArrayObject *)seq;
3386 _PyObject_GC_TRACK(it);
3387 return (PyObject *)it;
3388}