blob: 3127c9d169598ca484e55ac5d6bf65964292d65d [file] [log] [blame]
Guido van Rossum4dfe8a12006-04-22 23:28:04 +00001/* Bytes object implementation */
2
3/* XXX TO DO: optimizations */
4
5#define PY_SSIZE_T_CLEAN
6#include "Python.h"
Guido van Rossuma0867f72006-05-05 04:34:18 +00007#include "structmember.h"
Guido van Rossum4dfe8a12006-04-22 23:28:04 +00008
9/* Direct API functions */
10
11PyObject *
Guido van Rossumd624f182006-04-24 13:47:05 +000012PyBytes_FromObject(PyObject *input)
13{
14 return PyObject_CallFunctionObjArgs((PyObject *)&PyBytes_Type,
15 input, NULL);
16}
17
18PyObject *
19PyBytes_FromStringAndSize(const char *bytes, Py_ssize_t size)
Guido van Rossum4dfe8a12006-04-22 23:28:04 +000020{
21 PyBytesObject *new;
22
Guido van Rossumd624f182006-04-24 13:47:05 +000023 assert(size >= 0);
Guido van Rossum4dfe8a12006-04-22 23:28:04 +000024
25 new = PyObject_New(PyBytesObject, &PyBytes_Type);
26 if (new == NULL)
Guido van Rossumd624f182006-04-24 13:47:05 +000027 return NULL;
Guido van Rossum4dfe8a12006-04-22 23:28:04 +000028
Guido van Rossumd624f182006-04-24 13:47:05 +000029 if (size == 0)
30 new->ob_bytes = NULL;
31 else {
32 new->ob_bytes = PyMem_Malloc(size);
33 if (new->ob_bytes == NULL) {
34 Py_DECREF(new);
35 return NULL;
36 }
37 if (bytes != NULL)
38 memcpy(new->ob_bytes, bytes, size);
Guido van Rossum4dfe8a12006-04-22 23:28:04 +000039 }
Guido van Rossuma0867f72006-05-05 04:34:18 +000040 new->ob_size = new->ob_alloc = size;
Guido van Rossum4dfe8a12006-04-22 23:28:04 +000041
42 return (PyObject *)new;
43}
44
45Py_ssize_t
46PyBytes_Size(PyObject *self)
47{
48 assert(self != NULL);
49 assert(PyBytes_Check(self));
50
Guido van Rossum20188312006-05-05 15:15:40 +000051 return PyBytes_GET_SIZE(self);
Guido van Rossum4dfe8a12006-04-22 23:28:04 +000052}
53
54char *
55PyBytes_AsString(PyObject *self)
56{
57 assert(self != NULL);
58 assert(PyBytes_Check(self));
59
Guido van Rossum20188312006-05-05 15:15:40 +000060 return PyBytes_AS_STRING(self);
Guido van Rossum4dfe8a12006-04-22 23:28:04 +000061}
62
63int
64PyBytes_Resize(PyObject *self, Py_ssize_t size)
65{
66 void *sval;
Guido van Rossuma0867f72006-05-05 04:34:18 +000067 Py_ssize_t alloc = ((PyBytesObject *)self)->ob_alloc;
Guido van Rossum4dfe8a12006-04-22 23:28:04 +000068
69 assert(self != NULL);
70 assert(PyBytes_Check(self));
71 assert(size >= 0);
72
Guido van Rossuma0867f72006-05-05 04:34:18 +000073 if (size < alloc / 2) {
74 /* Major downsize; resize down to exact size */
75 alloc = size;
76 }
77 else if (size <= alloc) {
78 /* Within allocated size; quick exit */
79 ((PyBytesObject *)self)->ob_size = size;
80 return 0;
81 }
82 else if (size <= alloc * 1.125) {
83 /* Moderate upsize; overallocate similar to list_resize() */
84 alloc = size + (size >> 3) + (size < 9 ? 3 : 6);
85 }
86 else {
87 /* Major upsize; resize up to exact size */
88 alloc = size;
89 }
90
91 sval = PyMem_Realloc(((PyBytesObject *)self)->ob_bytes, alloc);
Guido van Rossum4dfe8a12006-04-22 23:28:04 +000092 if (sval == NULL) {
Guido van Rossumd624f182006-04-24 13:47:05 +000093 PyErr_NoMemory();
94 return -1;
Guido van Rossum4dfe8a12006-04-22 23:28:04 +000095 }
96
Guido van Rossumd624f182006-04-24 13:47:05 +000097 ((PyBytesObject *)self)->ob_bytes = sval;
Guido van Rossum4dfe8a12006-04-22 23:28:04 +000098 ((PyBytesObject *)self)->ob_size = size;
Guido van Rossuma0867f72006-05-05 04:34:18 +000099 ((PyBytesObject *)self)->ob_alloc = alloc;
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000100
101 return 0;
102}
103
104/* Functions stuffed into the type object */
105
106static Py_ssize_t
107bytes_length(PyBytesObject *self)
108{
109 return self->ob_size;
110}
111
112static PyObject *
Guido van Rossumd624f182006-04-24 13:47:05 +0000113bytes_concat(PyBytesObject *self, PyObject *other)
114{
115 PyBytesObject *result;
116 Py_ssize_t mysize;
117 Py_ssize_t size;
118
119 if (!PyBytes_Check(other)) {
120 PyErr_Format(PyExc_TypeError,
121 "can't concat bytes to %.100s", other->ob_type->tp_name);
122 return NULL;
123 }
124
125 mysize = self->ob_size;
126 size = mysize + ((PyBytesObject *)other)->ob_size;
127 if (size < 0)
128 return PyErr_NoMemory();
129 result = (PyBytesObject *) PyBytes_FromStringAndSize(NULL, size);
130 if (result != NULL) {
131 memcpy(result->ob_bytes, self->ob_bytes, self->ob_size);
132 memcpy(result->ob_bytes + self->ob_size,
133 ((PyBytesObject *)other)->ob_bytes,
134 ((PyBytesObject *)other)->ob_size);
135 }
136 return (PyObject *)result;
137}
138
139static PyObject *
Guido van Rossum13e57212006-04-27 22:54:26 +0000140bytes_iconcat(PyBytesObject *self, PyObject *other)
141{
142 Py_ssize_t mysize;
143 Py_ssize_t osize;
144 Py_ssize_t size;
145
146 if (!PyBytes_Check(other)) {
147 PyErr_Format(PyExc_TypeError,
148 "can't concat bytes to %.100s", other->ob_type->tp_name);
149 return NULL;
150 }
151
152 mysize = self->ob_size;
153 osize = ((PyBytesObject *)other)->ob_size;
154 size = mysize + osize;
155 if (size < 0)
156 return PyErr_NoMemory();
Guido van Rossuma0867f72006-05-05 04:34:18 +0000157 if (size <= self->ob_alloc)
158 self->ob_size = size;
159 else if (PyBytes_Resize((PyObject *)self, size) < 0)
Guido van Rossum13e57212006-04-27 22:54:26 +0000160 return NULL;
161 memcpy(self->ob_bytes + mysize, ((PyBytesObject *)other)->ob_bytes, osize);
162 Py_INCREF(self);
163 return (PyObject *)self;
164}
165
166static PyObject *
Guido van Rossumd624f182006-04-24 13:47:05 +0000167bytes_repeat(PyBytesObject *self, Py_ssize_t count)
168{
169 PyBytesObject *result;
170 Py_ssize_t mysize;
171 Py_ssize_t size;
172
173 if (count < 0)
174 count = 0;
175 mysize = self->ob_size;
176 size = mysize * count;
177 if (count != 0 && size / count != mysize)
178 return PyErr_NoMemory();
179 result = (PyBytesObject *)PyBytes_FromStringAndSize(NULL, size);
180 if (result != NULL && size != 0) {
181 if (mysize == 1)
182 memset(result->ob_bytes, self->ob_bytes[0], size);
183 else {
Guido van Rossum13e57212006-04-27 22:54:26 +0000184 Py_ssize_t i;
Guido van Rossumd624f182006-04-24 13:47:05 +0000185 for (i = 0; i < count; i++)
186 memcpy(result->ob_bytes + i*mysize, self->ob_bytes, mysize);
187 }
188 }
189 return (PyObject *)result;
190}
191
192static PyObject *
Guido van Rossum13e57212006-04-27 22:54:26 +0000193bytes_irepeat(PyBytesObject *self, Py_ssize_t count)
194{
195 Py_ssize_t mysize;
196 Py_ssize_t size;
197
198 if (count < 0)
199 count = 0;
200 mysize = self->ob_size;
201 size = mysize * count;
202 if (count != 0 && size / count != mysize)
203 return PyErr_NoMemory();
Guido van Rossuma0867f72006-05-05 04:34:18 +0000204 if (size <= self->ob_alloc)
205 self->ob_size = size;
206 else if (PyBytes_Resize((PyObject *)self, size) < 0)
Guido van Rossum13e57212006-04-27 22:54:26 +0000207 return NULL;
208
209 if (mysize == 1)
210 memset(self->ob_bytes, self->ob_bytes[0], size);
211 else {
212 Py_ssize_t i;
213 for (i = 1; i < count; i++)
214 memcpy(self->ob_bytes + i*mysize, self->ob_bytes, mysize);
215 }
216
217 Py_INCREF(self);
218 return (PyObject *)self;
219}
220
221static int
222bytes_substring(PyBytesObject *self, PyBytesObject *other)
223{
224 Py_ssize_t i;
225
226 if (other->ob_size == 1) {
227 return memchr(self->ob_bytes, other->ob_bytes[0],
228 self->ob_size) != NULL;
229 }
230 if (other->ob_size == 0)
231 return 1; /* Edge case */
232 for (i = 0; i + other->ob_size <= self->ob_size; i++) {
233 /* XXX Yeah, yeah, lots of optimizations possible... */
234 if (memcmp(self->ob_bytes + i, other->ob_bytes, other->ob_size) == 0)
235 return 1;
236 }
237 return 0;
238}
239
240static int
241bytes_contains(PyBytesObject *self, PyObject *value)
242{
243 Py_ssize_t ival;
244
245 if (PyBytes_Check(value))
246 return bytes_substring(self, (PyBytesObject *)value);
247
Thomas Woutersd204a712006-08-22 13:41:17 +0000248 ival = PyNumber_AsSsize_t(value, PyExc_ValueError);
Guido van Rossum13e57212006-04-27 22:54:26 +0000249 if (ival == -1 && PyErr_Occurred())
250 return -1;
Guido van Rossum13e57212006-04-27 22:54:26 +0000251 if (ival < 0 || ival >= 256) {
252 PyErr_SetString(PyExc_ValueError, "byte must be in range(0, 256)");
253 return -1;
254 }
255
256 return memchr(self->ob_bytes, ival, self->ob_size) != NULL;
257}
258
259static PyObject *
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000260bytes_getitem(PyBytesObject *self, Py_ssize_t i)
261{
262 if (i < 0)
Guido van Rossumd624f182006-04-24 13:47:05 +0000263 i += self->ob_size;
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000264 if (i < 0 || i >= self->ob_size) {
Guido van Rossumd624f182006-04-24 13:47:05 +0000265 PyErr_SetString(PyExc_IndexError, "bytes index out of range");
266 return NULL;
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000267 }
Guido van Rossumd624f182006-04-24 13:47:05 +0000268 return PyInt_FromLong((unsigned char)(self->ob_bytes[i]));
269}
270
271static PyObject *
272bytes_getslice(PyBytesObject *self, Py_ssize_t lo, Py_ssize_t hi)
273{
274 if (lo < 0)
275 lo = 0;
276 if (hi > self->ob_size)
277 hi = self->ob_size;
278 if (lo >= hi)
279 lo = hi = 0;
280 return PyBytes_FromStringAndSize(self->ob_bytes + lo, hi - lo);
281}
282
283static int
284bytes_setslice(PyBytesObject *self, Py_ssize_t lo, Py_ssize_t hi,
285 PyObject *values)
286{
287 int avail;
288 int needed;
289 char *bytes;
290
291 if (values == NULL) {
292 bytes = NULL;
293 needed = 0;
294 }
295 else if (values == (PyObject *)self || !PyBytes_Check(values)) {
296 /* Make a copy an call this function recursively */
297 int err;
298 values = PyBytes_FromObject(values);
299 if (values == NULL)
300 return -1;
301 err = bytes_setslice(self, lo, hi, values);
302 Py_DECREF(values);
303 return err;
304 }
305 else {
306 assert(PyBytes_Check(values));
307 bytes = ((PyBytesObject *)values)->ob_bytes;
308 needed = ((PyBytesObject *)values)->ob_size;
309 }
310
311 if (lo < 0)
312 lo = 0;
Thomas Wouters9a6e62b2006-08-23 23:20:29 +0000313 if (hi < lo)
314 hi = lo;
Guido van Rossumd624f182006-04-24 13:47:05 +0000315 if (hi > self->ob_size)
316 hi = self->ob_size;
317
318 avail = hi - lo;
319 if (avail < 0)
320 lo = hi = avail = 0;
321
322 if (avail != needed) {
323 if (avail > needed) {
324 /*
325 0 lo hi old_size
326 | |<----avail----->|<-----tomove------>|
327 | |<-needed->|<-----tomove------>|
328 0 lo new_hi new_size
329 */
330 memmove(self->ob_bytes + lo + needed, self->ob_bytes + hi,
331 self->ob_size - hi);
332 }
333 if (PyBytes_Resize((PyObject *)self,
334 self->ob_size + needed - avail) < 0)
335 return -1;
336 if (avail < needed) {
337 /*
338 0 lo hi old_size
339 | |<-avail->|<-----tomove------>|
340 | |<----needed---->|<-----tomove------>|
341 0 lo new_hi new_size
342 */
343 memmove(self->ob_bytes + lo + needed, self->ob_bytes + hi,
344 self->ob_size - lo - needed);
345 }
346 }
347
348 if (needed > 0)
349 memcpy(self->ob_bytes + lo, bytes, needed);
350
351 return 0;
352}
353
354static int
355bytes_setitem(PyBytesObject *self, Py_ssize_t i, PyObject *value)
356{
357 Py_ssize_t ival;
358
359 if (i < 0)
360 i += self->ob_size;
361
362 if (i < 0 || i >= self->ob_size) {
363 PyErr_SetString(PyExc_IndexError, "bytes index out of range");
364 return -1;
365 }
366
367 if (value == NULL)
368 return bytes_setslice(self, i, i+1, NULL);
369
Thomas Woutersd204a712006-08-22 13:41:17 +0000370 ival = PyNumber_AsSsize_t(value, PyExc_ValueError);
Guido van Rossumd624f182006-04-24 13:47:05 +0000371 if (ival == -1 && PyErr_Occurred())
372 return -1;
373
374 if (ival < 0 || ival >= 256) {
375 PyErr_SetString(PyExc_ValueError, "byte must be in range(0, 256)");
376 return -1;
377 }
378
379 self->ob_bytes[i] = ival;
380 return 0;
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000381}
382
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000383static int
384bytes_init(PyBytesObject *self, PyObject *args, PyObject *kwds)
385{
Guido van Rossumd624f182006-04-24 13:47:05 +0000386 static char *kwlist[] = {"source", "encoding", "errors", 0};
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000387 PyObject *arg = NULL;
Guido van Rossumd624f182006-04-24 13:47:05 +0000388 const char *encoding = NULL;
389 const char *errors = NULL;
390 Py_ssize_t count;
391 PyObject *it;
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000392 PyObject *(*iternext)(PyObject *);
393
Guido van Rossuma0867f72006-05-05 04:34:18 +0000394 if (self->ob_size != 0) {
395 /* Empty previous contents (yes, do this first of all!) */
396 if (PyBytes_Resize((PyObject *)self, 0) < 0)
397 return -1;
398 }
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000399
Guido van Rossumd624f182006-04-24 13:47:05 +0000400 /* Parse arguments */
401 if (!PyArg_ParseTupleAndKeywords(args, kwds, "|Oss:bytes", kwlist,
402 &arg, &encoding, &errors))
403 return -1;
404
405 /* Make a quick exit if no first argument */
406 if (arg == NULL) {
407 if (encoding != NULL || errors != NULL) {
408 PyErr_SetString(PyExc_TypeError,
409 "encoding or errors without sequence argument");
410 return -1;
411 }
412 return 0;
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000413 }
414
Guido van Rossumd624f182006-04-24 13:47:05 +0000415 if (PyUnicode_Check(arg)) {
416 /* Encode via the codec registry */
417 PyObject *encoded;
418 char *bytes;
419 Py_ssize_t size;
420 if (encoding == NULL)
421 encoding = PyUnicode_GetDefaultEncoding();
422 encoded = PyCodec_Encode(arg, encoding, errors);
423 if (encoded == NULL)
424 return -1;
425 if (!PyString_Check(encoded)) {
426 PyErr_Format(PyExc_TypeError,
427 "encoder did not return a string object (type=%.400s)",
428 encoded->ob_type->tp_name);
429 Py_DECREF(encoded);
430 return -1;
431 }
432 bytes = PyString_AS_STRING(encoded);
433 size = PyString_GET_SIZE(encoded);
Guido van Rossuma0867f72006-05-05 04:34:18 +0000434 if (size <= self->ob_alloc)
435 self->ob_size = size;
436 else if (PyBytes_Resize((PyObject *)self, size) < 0) {
Guido van Rossumd624f182006-04-24 13:47:05 +0000437 Py_DECREF(encoded);
438 return -1;
439 }
440 memcpy(self->ob_bytes, bytes, size);
441 Py_DECREF(encoded);
442 return 0;
443 }
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000444
Guido van Rossumd624f182006-04-24 13:47:05 +0000445 /* If it's not unicode, there can't be encoding or errors */
446 if (encoding != NULL || errors != NULL) {
447 PyErr_SetString(PyExc_TypeError,
448 "encoding or errors without a string argument");
449 return -1;
450 }
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000451
Guido van Rossumd624f182006-04-24 13:47:05 +0000452 /* Is it an int? */
Thomas Woutersd204a712006-08-22 13:41:17 +0000453 count = PyNumber_AsSsize_t(arg, PyExc_ValueError);
Guido van Rossumd624f182006-04-24 13:47:05 +0000454 if (count == -1 && PyErr_Occurred())
455 PyErr_Clear();
456 else {
457 if (count < 0) {
458 PyErr_SetString(PyExc_ValueError, "negative count");
459 return -1;
460 }
461 if (count > 0) {
462 if (PyBytes_Resize((PyObject *)self, count))
463 return -1;
464 memset(self->ob_bytes, 0, count);
465 }
466 return 0;
467 }
468
469 if (PyObject_CheckReadBuffer(arg)) {
470 const void *bytes;
471 Py_ssize_t size;
472 if (PyObject_AsReadBuffer(arg, &bytes, &size) < 0)
473 return -1;
474 if (PyBytes_Resize((PyObject *)self, size) < 0)
475 return -1;
476 memcpy(self->ob_bytes, bytes, size);
477 return 0;
478 }
479
480 /* XXX Optimize this if the arguments is a list, tuple */
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000481
482 /* Get the iterator */
483 it = PyObject_GetIter(arg);
484 if (it == NULL)
Guido van Rossumd624f182006-04-24 13:47:05 +0000485 return -1;
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000486 iternext = *it->ob_type->tp_iternext;
487
488 /* Run the iterator to exhaustion */
489 for (;;) {
Guido van Rossumd624f182006-04-24 13:47:05 +0000490 PyObject *item;
491 Py_ssize_t value;
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000492
Guido van Rossumd624f182006-04-24 13:47:05 +0000493 /* Get the next item */
494 item = iternext(it);
495 if (item == NULL) {
496 if (PyErr_Occurred()) {
497 if (!PyErr_ExceptionMatches(PyExc_StopIteration))
498 goto error;
499 PyErr_Clear();
500 }
501 break;
502 }
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000503
Guido van Rossumd624f182006-04-24 13:47:05 +0000504 /* Interpret it as an int (__index__) */
Thomas Woutersd204a712006-08-22 13:41:17 +0000505 value = PyNumber_AsSsize_t(item, PyExc_ValueError);
Guido van Rossumd624f182006-04-24 13:47:05 +0000506 Py_DECREF(item);
507 if (value == -1 && PyErr_Occurred())
508 goto error;
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000509
Guido van Rossumd624f182006-04-24 13:47:05 +0000510 /* Range check */
511 if (value < 0 || value >= 256) {
512 PyErr_SetString(PyExc_ValueError,
513 "bytes must be in range(0, 256)");
514 goto error;
515 }
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000516
Guido van Rossumd624f182006-04-24 13:47:05 +0000517 /* Append the byte */
Guido van Rossuma0867f72006-05-05 04:34:18 +0000518 if (self->ob_size < self->ob_alloc)
519 self->ob_size++;
520 else if (PyBytes_Resize((PyObject *)self, self->ob_size+1) < 0)
Guido van Rossumd624f182006-04-24 13:47:05 +0000521 goto error;
522 self->ob_bytes[self->ob_size-1] = value;
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000523 }
524
525 /* Clean up and return success */
526 Py_DECREF(it);
527 return 0;
528
529 error:
530 /* Error handling when it != NULL */
531 Py_DECREF(it);
532 return -1;
533}
534
535static PyObject *
536bytes_repr(PyBytesObject *self)
537{
538 PyObject *list;
539 PyObject *str;
540 PyObject *result;
541 int err;
542 int i;
543
544 if (self->ob_size == 0)
Guido van Rossumd624f182006-04-24 13:47:05 +0000545 return PyString_FromString("bytes()");
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000546
547 list = PyList_New(0);
548 if (list == NULL)
Guido van Rossumd624f182006-04-24 13:47:05 +0000549 return NULL;
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000550
551 str = PyString_FromString("bytes([");
552 if (str == NULL)
Guido van Rossumd624f182006-04-24 13:47:05 +0000553 goto error;
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000554
555 err = PyList_Append(list, str);
556 Py_DECREF(str);
557 if (err < 0)
Guido van Rossumd624f182006-04-24 13:47:05 +0000558 goto error;
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000559
560 for (i = 0; i < self->ob_size; i++) {
Guido van Rossumd624f182006-04-24 13:47:05 +0000561 char buffer[20];
562 sprintf(buffer, ", 0x%02x", (unsigned char) (self->ob_bytes[i]));
563 str = PyString_FromString((i == 0) ? buffer+2 : buffer);
564 if (str == NULL)
565 goto error;
566 err = PyList_Append(list, str);
567 Py_DECREF(str);
568 if (err < 0)
569 goto error;
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000570 }
571
572 str = PyString_FromString("])");
573 if (str == NULL)
Guido van Rossumd624f182006-04-24 13:47:05 +0000574 goto error;
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000575
576 err = PyList_Append(list, str);
577 Py_DECREF(str);
578 if (err < 0)
Guido van Rossumd624f182006-04-24 13:47:05 +0000579 goto error;
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000580
581 str = PyString_FromString("");
582 if (str == NULL)
Guido van Rossumd624f182006-04-24 13:47:05 +0000583 goto error;
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000584
585 result = _PyString_Join(str, list);
586 Py_DECREF(str);
587 Py_DECREF(list);
588 return result;
589
590 error:
591 /* Error handling when list != NULL */
592 Py_DECREF(list);
593 return NULL;
594}
595
596static PyObject *
Guido van Rossumd624f182006-04-24 13:47:05 +0000597bytes_str(PyBytesObject *self)
598{
599 return PyString_FromStringAndSize(self->ob_bytes, self->ob_size);
600}
601
602static PyObject *
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000603bytes_richcompare(PyBytesObject *self, PyBytesObject *other, int op)
604{
605 PyObject *res;
606 int minsize;
607 int cmp;
608
609 if (!PyBytes_Check(self) || !PyBytes_Check(other)) {
Guido van Rossumd624f182006-04-24 13:47:05 +0000610 Py_INCREF(Py_NotImplemented);
611 return Py_NotImplemented;
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000612 }
613
614 if (self->ob_size != other->ob_size && (op == Py_EQ || op == Py_NE)) {
Guido van Rossumd624f182006-04-24 13:47:05 +0000615 /* Shortcut: if the lengths differ, the objects differ */
616 cmp = (op == Py_NE);
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000617 }
618 else {
Guido van Rossumd624f182006-04-24 13:47:05 +0000619 minsize = self->ob_size;
620 if (other->ob_size < minsize)
621 minsize = other->ob_size;
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000622
Guido van Rossumd624f182006-04-24 13:47:05 +0000623 cmp = memcmp(self->ob_bytes, other->ob_bytes, minsize);
624 /* In ISO C, memcmp() guarantees to use unsigned bytes! */
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000625
Guido van Rossumd624f182006-04-24 13:47:05 +0000626 if (cmp == 0) {
627 if (self->ob_size < other->ob_size)
628 cmp = -1;
629 else if (self->ob_size > other->ob_size)
630 cmp = 1;
631 }
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000632
Guido van Rossumd624f182006-04-24 13:47:05 +0000633 switch (op) {
634 case Py_LT: cmp = cmp < 0; break;
635 case Py_LE: cmp = cmp <= 0; break;
636 case Py_EQ: cmp = cmp == 0; break;
637 case Py_NE: cmp = cmp != 0; break;
638 case Py_GT: cmp = cmp > 0; break;
639 case Py_GE: cmp = cmp >= 0; break;
640 }
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000641 }
642
643 res = cmp ? Py_True : Py_False;
644 Py_INCREF(res);
645 return res;
646}
647
648static void
649bytes_dealloc(PyBytesObject *self)
650{
Guido van Rossumd624f182006-04-24 13:47:05 +0000651 if (self->ob_bytes != 0) {
652 PyMem_Free(self->ob_bytes);
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000653 }
654 self->ob_type->tp_free((PyObject *)self);
655}
656
Guido van Rossumd624f182006-04-24 13:47:05 +0000657static Py_ssize_t
658bytes_getbuffer(PyBytesObject *self, Py_ssize_t index, const void **ptr)
659{
660 if (index != 0) {
661 PyErr_SetString(PyExc_SystemError,
662 "accessing non-existent string segment");
663 return -1;
664 }
665 *ptr = (void *)self->ob_bytes;
666 return self->ob_size;
667}
668
669static Py_ssize_t
670bytes_getsegcount(PyStringObject *self, Py_ssize_t *lenp)
671{
672 if (lenp)
673 *lenp = self->ob_size;
674 return 1;
675}
676
677PyDoc_STRVAR(decode_doc,
678"B.decode([encoding[,errors]]) -> unicode obect.\n\
679\n\
680Decodes B using the codec registered for encoding. encoding defaults\n\
681to the default encoding. errors may be given to set a different error\n\
682handling scheme. Default is 'strict' meaning that encoding errors raise\n\
683a UnicodeDecodeError. Other possible values are 'ignore' and 'replace'\n\
684as well as any other name registerd with codecs.register_error that is\n\
685able to handle UnicodeDecodeErrors.");
686
687static PyObject *
688bytes_decode(PyObject *self, PyObject *args)
689{
690 const char *encoding = NULL;
691 const char *errors = NULL;
692
693 if (!PyArg_ParseTuple(args, "|ss:decode", &encoding, &errors))
694 return NULL;
695 if (encoding == NULL)
696 encoding = PyUnicode_GetDefaultEncoding();
697 return PyCodec_Decode(self, encoding, errors);
698}
699
Guido van Rossuma0867f72006-05-05 04:34:18 +0000700PyDoc_STRVAR(alloc_doc,
701"B.__alloc__() -> int\n\
702\n\
703Returns the number of bytes actually allocated.");
704
705static PyObject *
706bytes_alloc(PyBytesObject *self)
707{
708 return PyInt_FromSsize_t(self->ob_alloc);
709}
710
Guido van Rossum20188312006-05-05 15:15:40 +0000711PyDoc_STRVAR(join_doc,
712"bytes.join(iterable_of_bytes) -> bytes\n\
713\n\
714Concatenates any number of bytes objects. Example:\n\
715bytes.join([bytes('ab'), bytes('pq'), bytes('rs')]) -> bytes('abpqrs').");
716
717static PyObject *
718bytes_join(PyObject *cls, PyObject *it)
719{
720 PyObject *seq;
721 Py_ssize_t i;
722 Py_ssize_t n;
723 PyObject **items;
724 Py_ssize_t totalsize = 0;
725 PyObject *result;
726 char *dest;
727
728 seq = PySequence_Fast(it, "can only join an iterable");
729 if (seq == NULL)
730 return NULL;
731 n = PySequence_Fast_GET_SIZE(seq);
732 items = PySequence_Fast_ITEMS(seq);
733
734 /* Compute the total size, and check that they are all bytes */
735 for (i = 0; i < n; i++) {
736 PyObject *obj = items[i];
737 if (!PyBytes_Check(obj)) {
738 PyErr_Format(PyExc_TypeError,
739 "can only join an iterable of bytes "
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000740 "(item %ld has type '%.100s')",
741 /* XXX %ld isn't right on Win64 */
742 (long)i, obj->ob_type->tp_name);
Guido van Rossum20188312006-05-05 15:15:40 +0000743 goto error;
744 }
745 totalsize += PyBytes_GET_SIZE(obj);
746 if (totalsize < 0) {
747 PyErr_NoMemory();
748 goto error;
749 }
750 }
751
752 /* Allocate the result, and copy the bytes */
753 result = PyBytes_FromStringAndSize(NULL, totalsize);
754 if (result == NULL)
755 goto error;
756 dest = PyBytes_AS_STRING(result);
757 for (i = 0; i < n; i++) {
758 PyObject *obj = items[i];
759 Py_ssize_t size = PyBytes_GET_SIZE(obj);
760 memcpy(dest, PyBytes_AS_STRING(obj), size);
761 dest += size;
762 }
763
764 /* Done */
765 Py_DECREF(seq);
766 return result;
767
768 /* Error handling */
769 error:
770 Py_DECREF(seq);
771 return NULL;
772}
773
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000774static PySequenceMethods bytes_as_sequence = {
Guido van Rossumd624f182006-04-24 13:47:05 +0000775 (lenfunc)bytes_length, /*sq_length*/
776 (binaryfunc)bytes_concat, /*sq_concat*/
777 (ssizeargfunc)bytes_repeat, /*sq_repeat*/
778 (ssizeargfunc)bytes_getitem, /*sq_item*/
779 (ssizessizeargfunc)bytes_getslice, /*sq_slice*/
780 (ssizeobjargproc)bytes_setitem, /*sq_ass_item*/
781 (ssizessizeobjargproc)bytes_setslice, /* sq_ass_slice */
Guido van Rossumd624f182006-04-24 13:47:05 +0000782 (objobjproc)bytes_contains, /* sq_contains */
Guido van Rossum13e57212006-04-27 22:54:26 +0000783 (binaryfunc)bytes_iconcat, /* sq_inplace_concat */
784 (ssizeargfunc)bytes_irepeat, /* sq_inplace_repeat */
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000785};
786
787static PyMappingMethods bytes_as_mapping = {
Guido van Rossumd624f182006-04-24 13:47:05 +0000788 (lenfunc)bytes_length,
789 (binaryfunc)0,
790 0,
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000791};
792
793static PyBufferProcs bytes_as_buffer = {
Guido van Rossumd624f182006-04-24 13:47:05 +0000794 (readbufferproc)bytes_getbuffer,
795 (writebufferproc)bytes_getbuffer,
796 (segcountproc)bytes_getsegcount,
797 /* XXX Bytes are not characters! But we need to implement
798 bf_getcharbuffer() so we can be used as 't#' argument to codecs. */
799 (charbufferproc)bytes_getbuffer,
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000800};
801
802static PyMethodDef
803bytes_methods[] = {
Guido van Rossumd624f182006-04-24 13:47:05 +0000804 {"decode", (PyCFunction)bytes_decode, METH_VARARGS, decode_doc},
Guido van Rossuma0867f72006-05-05 04:34:18 +0000805 {"__alloc__", (PyCFunction)bytes_alloc, METH_NOARGS, alloc_doc},
Guido van Rossum20188312006-05-05 15:15:40 +0000806 {"join", (PyCFunction)bytes_join, METH_O|METH_CLASS, join_doc},
Guido van Rossuma0867f72006-05-05 04:34:18 +0000807 {NULL}
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000808};
809
810PyDoc_STRVAR(bytes_doc,
811"bytes([iterable]) -> new array of bytes.\n\
812\n\
813If an argument is given it must be an iterable yielding ints in range(256).");
814
815PyTypeObject PyBytes_Type = {
816 PyObject_HEAD_INIT(&PyType_Type)
817 0,
818 "bytes",
819 sizeof(PyBytesObject),
820 0,
Guido van Rossumd624f182006-04-24 13:47:05 +0000821 (destructor)bytes_dealloc, /* tp_dealloc */
822 0, /* tp_print */
823 0, /* tp_getattr */
824 0, /* tp_setattr */
825 0, /* tp_compare */
826 (reprfunc)bytes_repr, /* tp_repr */
827 0, /* tp_as_number */
828 &bytes_as_sequence, /* tp_as_sequence */
829 &bytes_as_mapping, /* tp_as_mapping */
Guido van Rossum50e9fb92006-08-17 05:42:55 +0000830 0, /* tp_hash */
Guido van Rossumd624f182006-04-24 13:47:05 +0000831 0, /* tp_call */
832 (reprfunc)bytes_str, /* tp_str */
833 PyObject_GenericGetAttr, /* tp_getattro */
834 0, /* tp_setattro */
835 &bytes_as_buffer, /* tp_as_buffer */
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000836 Py_TPFLAGS_DEFAULT, /* tp_flags */
Guido van Rossumd624f182006-04-24 13:47:05 +0000837 /* bytes is 'final' or 'sealed' */
838 bytes_doc, /* tp_doc */
839 0, /* tp_traverse */
840 0, /* tp_clear */
841 (richcmpfunc)bytes_richcompare, /* tp_richcompare */
842 0, /* tp_weaklistoffset */
843 0, /* tp_iter */
844 0, /* tp_iternext */
845 bytes_methods, /* tp_methods */
846 0, /* tp_members */
847 0, /* tp_getset */
848 0, /* tp_base */
849 0, /* tp_dict */
850 0, /* tp_descr_get */
851 0, /* tp_descr_set */
852 0, /* tp_dictoffset */
853 (initproc)bytes_init, /* tp_init */
854 PyType_GenericAlloc, /* tp_alloc */
855 PyType_GenericNew, /* tp_new */
856 PyObject_Del, /* tp_free */
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000857};