annotate Objects/bytesobject.c @ 41597:cb3c92062ec4

Add trailing null bytes to a few more places.
author Guido van Rossum <guido@python.org>
date Fri, 04 May 2007 04:27:16 +0000
parents 2c54763c4504
children ca448c607b14
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
37927
a7f3765ea464 Here is a bytes type. It's very minimal but it's a start.
Guido van Rossum <guido@python.org>
parents:
diff changeset
1 /* Bytes object implementation */
a7f3765ea464 Here is a bytes type. It's very minimal but it's a start.
Guido van Rossum <guido@python.org>
parents:
diff changeset
2
a7f3765ea464 Here is a bytes type. It's very minimal but it's a start.
Guido van Rossum <guido@python.org>
parents:
diff changeset
3 /* XXX TO DO: optimizations */
a7f3765ea464 Here is a bytes type. It's very minimal but it's a start.
Guido van Rossum <guido@python.org>
parents:
diff changeset
4
a7f3765ea464 Here is a bytes type. It's very minimal but it's a start.
Guido van Rossum <guido@python.org>
parents:
diff changeset
5 #define PY_SSIZE_T_CLEAN
a7f3765ea464 Here is a bytes type. It's very minimal but it's a start.
Guido van Rossum <guido@python.org>
parents:
diff changeset
6 #include "Python.h"
38115
a6a1359aab84 Optimizations for bytes reallocation.
Guido van Rossum <guido@python.org>
parents: 38017
diff changeset
7 #include "structmember.h"
37927
a7f3765ea464 Here is a bytes type. It's very minimal but it's a start.
Guido van Rossum <guido@python.org>
parents:
diff changeset
8
40978
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
9 /* The nullbytes are used by the stringlib during partition.
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
10 * If partition is removed from bytes, nullbytes and its helper
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
11 * Init/Fini should also be removed.
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
12 */
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
13 static PyBytesObject *nullbytes = NULL;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
14
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
15 void
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
16 PyBytes_Fini(void)
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
17 {
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
18 Py_CLEAR(nullbytes);
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
19 }
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
20
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
21 int
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
22 PyBytes_Init(void)
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
23 {
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
24 nullbytes = PyObject_New(PyBytesObject, &PyBytes_Type);
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
25 if (nullbytes == NULL)
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
26 return 0;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
27 nullbytes->ob_bytes = NULL;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
28 nullbytes->ob_size = nullbytes->ob_alloc = 0;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
29 return 1;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
30 }
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
31
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
32 /* end nullbytes support */
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
33
41450
d1c3dd184e38 Rough and dirty job -- allow concatenation of bytes and arbitrary
Guido van Rossum <guido@python.org>
parents: 41448
diff changeset
34 /* Helpers */
d1c3dd184e38 Rough and dirty job -- allow concatenation of bytes and arbitrary
Guido van Rossum <guido@python.org>
parents: 41448
diff changeset
35
d1c3dd184e38 Rough and dirty job -- allow concatenation of bytes and arbitrary
Guido van Rossum <guido@python.org>
parents: 41448
diff changeset
36 static int
d1c3dd184e38 Rough and dirty job -- allow concatenation of bytes and arbitrary
Guido van Rossum <guido@python.org>
parents: 41448
diff changeset
37 _getbytevalue(PyObject* arg, int *value)
40978
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
38 {
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
39 PyObject *intarg = PyNumber_Int(arg);
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
40 if (! intarg)
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
41 return 0;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
42 *value = PyInt_AsLong(intarg);
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
43 Py_DECREF(intarg);
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
44 if (*value < 0 || *value >= 256) {
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
45 PyErr_SetString(PyExc_ValueError, "byte must be in range(0, 256)");
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
46 return 0;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
47 }
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
48 return 1;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
49 }
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
50
41450
d1c3dd184e38 Rough and dirty job -- allow concatenation of bytes and arbitrary
Guido van Rossum <guido@python.org>
parents: 41448
diff changeset
51 Py_ssize_t
d1c3dd184e38 Rough and dirty job -- allow concatenation of bytes and arbitrary
Guido van Rossum <guido@python.org>
parents: 41448
diff changeset
52 _getbuffer(PyObject *obj, void **ptr)
d1c3dd184e38 Rough and dirty job -- allow concatenation of bytes and arbitrary
Guido van Rossum <guido@python.org>
parents: 41448
diff changeset
53 {
d1c3dd184e38 Rough and dirty job -- allow concatenation of bytes and arbitrary
Guido van Rossum <guido@python.org>
parents: 41448
diff changeset
54 PyBufferProcs *buffer = obj->ob_type->tp_as_buffer;
d1c3dd184e38 Rough and dirty job -- allow concatenation of bytes and arbitrary
Guido van Rossum <guido@python.org>
parents: 41448
diff changeset
55
d1c3dd184e38 Rough and dirty job -- allow concatenation of bytes and arbitrary
Guido van Rossum <guido@python.org>
parents: 41448
diff changeset
56 if (buffer == NULL ||
d1c3dd184e38 Rough and dirty job -- allow concatenation of bytes and arbitrary
Guido van Rossum <guido@python.org>
parents: 41448
diff changeset
57 PyUnicode_Check(obj) ||
d1c3dd184e38 Rough and dirty job -- allow concatenation of bytes and arbitrary
Guido van Rossum <guido@python.org>
parents: 41448
diff changeset
58 buffer->bf_getreadbuffer == NULL ||
d1c3dd184e38 Rough and dirty job -- allow concatenation of bytes and arbitrary
Guido van Rossum <guido@python.org>
parents: 41448
diff changeset
59 buffer->bf_getsegcount == NULL ||
d1c3dd184e38 Rough and dirty job -- allow concatenation of bytes and arbitrary
Guido van Rossum <guido@python.org>
parents: 41448
diff changeset
60 buffer->bf_getsegcount(obj, NULL) != 1)
d1c3dd184e38 Rough and dirty job -- allow concatenation of bytes and arbitrary
Guido van Rossum <guido@python.org>
parents: 41448
diff changeset
61 {
d1c3dd184e38 Rough and dirty job -- allow concatenation of bytes and arbitrary
Guido van Rossum <guido@python.org>
parents: 41448
diff changeset
62 *ptr = NULL;
d1c3dd184e38 Rough and dirty job -- allow concatenation of bytes and arbitrary
Guido van Rossum <guido@python.org>
parents: 41448
diff changeset
63 return -1;
d1c3dd184e38 Rough and dirty job -- allow concatenation of bytes and arbitrary
Guido van Rossum <guido@python.org>
parents: 41448
diff changeset
64 }
d1c3dd184e38 Rough and dirty job -- allow concatenation of bytes and arbitrary
Guido van Rossum <guido@python.org>
parents: 41448
diff changeset
65
d1c3dd184e38 Rough and dirty job -- allow concatenation of bytes and arbitrary
Guido van Rossum <guido@python.org>
parents: 41448
diff changeset
66 return buffer->bf_getreadbuffer(obj, 0, ptr);
d1c3dd184e38 Rough and dirty job -- allow concatenation of bytes and arbitrary
Guido van Rossum <guido@python.org>
parents: 41448
diff changeset
67 }
d1c3dd184e38 Rough and dirty job -- allow concatenation of bytes and arbitrary
Guido van Rossum <guido@python.org>
parents: 41448
diff changeset
68
37927
a7f3765ea464 Here is a bytes type. It's very minimal but it's a start.
Guido van Rossum <guido@python.org>
parents:
diff changeset
69 /* Direct API functions */
a7f3765ea464 Here is a bytes type. It's very minimal but it's a start.
Guido van Rossum <guido@python.org>
parents:
diff changeset
70
a7f3765ea464 Here is a bytes type. It's very minimal but it's a start.
Guido van Rossum <guido@python.org>
parents:
diff changeset
71 PyObject *
37960
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
72 PyBytes_FromObject(PyObject *input)
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
73 {
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
74 return PyObject_CallFunctionObjArgs((PyObject *)&PyBytes_Type,
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
75 input, NULL);
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
76 }
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
77
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
78 PyObject *
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
79 PyBytes_FromStringAndSize(const char *bytes, Py_ssize_t size)
37927
a7f3765ea464 Here is a bytes type. It's very minimal but it's a start.
Guido van Rossum <guido@python.org>
parents:
diff changeset
80 {
a7f3765ea464 Here is a bytes type. It's very minimal but it's a start.
Guido van Rossum <guido@python.org>
parents:
diff changeset
81 PyBytesObject *new;
41595
2c54763c4504 More coding by random modification.
Guido van Rossum <guido@python.org>
parents: 41450
diff changeset
82 int alloc;
37927
a7f3765ea464 Here is a bytes type. It's very minimal but it's a start.
Guido van Rossum <guido@python.org>
parents:
diff changeset
83
37960
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
84 assert(size >= 0);
37927
a7f3765ea464 Here is a bytes type. It's very minimal but it's a start.
Guido van Rossum <guido@python.org>
parents:
diff changeset
85
a7f3765ea464 Here is a bytes type. It's very minimal but it's a start.
Guido van Rossum <guido@python.org>
parents:
diff changeset
86 new = PyObject_New(PyBytesObject, &PyBytes_Type);
a7f3765ea464 Here is a bytes type. It's very minimal but it's a start.
Guido van Rossum <guido@python.org>
parents:
diff changeset
87 if (new == NULL)
37960
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
88 return NULL;
37927
a7f3765ea464 Here is a bytes type. It's very minimal but it's a start.
Guido van Rossum <guido@python.org>
parents:
diff changeset
89
41595
2c54763c4504 More coding by random modification.
Guido van Rossum <guido@python.org>
parents: 41450
diff changeset
90 if (size == 0) {
37960
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
91 new->ob_bytes = NULL;
41595
2c54763c4504 More coding by random modification.
Guido van Rossum <guido@python.org>
parents: 41450
diff changeset
92 alloc = 0;
2c54763c4504 More coding by random modification.
Guido van Rossum <guido@python.org>
parents: 41450
diff changeset
93 }
37960
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
94 else {
41595
2c54763c4504 More coding by random modification.
Guido van Rossum <guido@python.org>
parents: 41450
diff changeset
95 alloc = size + 1;
2c54763c4504 More coding by random modification.
Guido van Rossum <guido@python.org>
parents: 41450
diff changeset
96 new->ob_bytes = PyMem_Malloc(alloc);
37960
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
97 if (new->ob_bytes == NULL) {
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
98 Py_DECREF(new);
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
99 return NULL;
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
100 }
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
101 if (bytes != NULL)
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
102 memcpy(new->ob_bytes, bytes, size);
41595
2c54763c4504 More coding by random modification.
Guido van Rossum <guido@python.org>
parents: 41450
diff changeset
103 new->ob_bytes[size] = '\0'; /* Trailing null byte */
37927
a7f3765ea464 Here is a bytes type. It's very minimal but it's a start.
Guido van Rossum <guido@python.org>
parents:
diff changeset
104 }
41595
2c54763c4504 More coding by random modification.
Guido van Rossum <guido@python.org>
parents: 41450
diff changeset
105 new->ob_size = size;
2c54763c4504 More coding by random modification.
Guido van Rossum <guido@python.org>
parents: 41450
diff changeset
106 new->ob_alloc = alloc;
41448
458c8db2e946 Clean up trailing whitespace.
Guido van Rossum <guido@python.org>
parents: 41426
diff changeset
107
37927
a7f3765ea464 Here is a bytes type. It's very minimal but it's a start.
Guido van Rossum <guido@python.org>
parents:
diff changeset
108 return (PyObject *)new;
a7f3765ea464 Here is a bytes type. It's very minimal but it's a start.
Guido van Rossum <guido@python.org>
parents:
diff changeset
109 }
a7f3765ea464 Here is a bytes type. It's very minimal but it's a start.
Guido van Rossum <guido@python.org>
parents:
diff changeset
110
a7f3765ea464 Here is a bytes type. It's very minimal but it's a start.
Guido van Rossum <guido@python.org>
parents:
diff changeset
111 Py_ssize_t
a7f3765ea464 Here is a bytes type. It's very minimal but it's a start.
Guido van Rossum <guido@python.org>
parents:
diff changeset
112 PyBytes_Size(PyObject *self)
a7f3765ea464 Here is a bytes type. It's very minimal but it's a start.
Guido van Rossum <guido@python.org>
parents:
diff changeset
113 {
a7f3765ea464 Here is a bytes type. It's very minimal but it's a start.
Guido van Rossum <guido@python.org>
parents:
diff changeset
114 assert(self != NULL);
a7f3765ea464 Here is a bytes type. It's very minimal but it's a start.
Guido van Rossum <guido@python.org>
parents:
diff changeset
115 assert(PyBytes_Check(self));
a7f3765ea464 Here is a bytes type. It's very minimal but it's a start.
Guido van Rossum <guido@python.org>
parents:
diff changeset
116
38117
57bd7c7d91e3 Adding bytes.join() -- a class methods that concatenates an iterable of bytes.
Guido van Rossum <guido@python.org>
parents: 38115
diff changeset
117 return PyBytes_GET_SIZE(self);
37927
a7f3765ea464 Here is a bytes type. It's very minimal but it's a start.
Guido van Rossum <guido@python.org>
parents:
diff changeset
118 }
a7f3765ea464 Here is a bytes type. It's very minimal but it's a start.
Guido van Rossum <guido@python.org>
parents:
diff changeset
119
a7f3765ea464 Here is a bytes type. It's very minimal but it's a start.
Guido van Rossum <guido@python.org>
parents:
diff changeset
120 char *
a7f3765ea464 Here is a bytes type. It's very minimal but it's a start.
Guido van Rossum <guido@python.org>
parents:
diff changeset
121 PyBytes_AsString(PyObject *self)
a7f3765ea464 Here is a bytes type. It's very minimal but it's a start.
Guido van Rossum <guido@python.org>
parents:
diff changeset
122 {
a7f3765ea464 Here is a bytes type. It's very minimal but it's a start.
Guido van Rossum <guido@python.org>
parents:
diff changeset
123 assert(self != NULL);
a7f3765ea464 Here is a bytes type. It's very minimal but it's a start.
Guido van Rossum <guido@python.org>
parents:
diff changeset
124 assert(PyBytes_Check(self));
a7f3765ea464 Here is a bytes type. It's very minimal but it's a start.
Guido van Rossum <guido@python.org>
parents:
diff changeset
125
38117
57bd7c7d91e3 Adding bytes.join() -- a class methods that concatenates an iterable of bytes.
Guido van Rossum <guido@python.org>
parents: 38115
diff changeset
126 return PyBytes_AS_STRING(self);
37927
a7f3765ea464 Here is a bytes type. It's very minimal but it's a start.
Guido van Rossum <guido@python.org>
parents:
diff changeset
127 }
a7f3765ea464 Here is a bytes type. It's very minimal but it's a start.
Guido van Rossum <guido@python.org>
parents:
diff changeset
128
a7f3765ea464 Here is a bytes type. It's very minimal but it's a start.
Guido van Rossum <guido@python.org>
parents:
diff changeset
129 int
a7f3765ea464 Here is a bytes type. It's very minimal but it's a start.
Guido van Rossum <guido@python.org>
parents:
diff changeset
130 PyBytes_Resize(PyObject *self, Py_ssize_t size)
a7f3765ea464 Here is a bytes type. It's very minimal but it's a start.
Guido van Rossum <guido@python.org>
parents:
diff changeset
131 {
a7f3765ea464 Here is a bytes type. It's very minimal but it's a start.
Guido van Rossum <guido@python.org>
parents:
diff changeset
132 void *sval;
38115
a6a1359aab84 Optimizations for bytes reallocation.
Guido van Rossum <guido@python.org>
parents: 38017
diff changeset
133 Py_ssize_t alloc = ((PyBytesObject *)self)->ob_alloc;
37927
a7f3765ea464 Here is a bytes type. It's very minimal but it's a start.
Guido van Rossum <guido@python.org>
parents:
diff changeset
134
a7f3765ea464 Here is a bytes type. It's very minimal but it's a start.
Guido van Rossum <guido@python.org>
parents:
diff changeset
135 assert(self != NULL);
a7f3765ea464 Here is a bytes type. It's very minimal but it's a start.
Guido van Rossum <guido@python.org>
parents:
diff changeset
136 assert(PyBytes_Check(self));
a7f3765ea464 Here is a bytes type. It's very minimal but it's a start.
Guido van Rossum <guido@python.org>
parents:
diff changeset
137 assert(size >= 0);
a7f3765ea464 Here is a bytes type. It's very minimal but it's a start.
Guido van Rossum <guido@python.org>
parents:
diff changeset
138
38115
a6a1359aab84 Optimizations for bytes reallocation.
Guido van Rossum <guido@python.org>
parents: 38017
diff changeset
139 if (size < alloc / 2) {
a6a1359aab84 Optimizations for bytes reallocation.
Guido van Rossum <guido@python.org>
parents: 38017
diff changeset
140 /* Major downsize; resize down to exact size */
41597
cb3c92062ec4 Add trailing null bytes to a few more places.
Guido van Rossum <guido@python.org>
parents: 41595
diff changeset
141 alloc = size + 1;
38115
a6a1359aab84 Optimizations for bytes reallocation.
Guido van Rossum <guido@python.org>
parents: 38017
diff changeset
142 }
41595
2c54763c4504 More coding by random modification.
Guido van Rossum <guido@python.org>
parents: 41450
diff changeset
143 else if (size < alloc) {
38115
a6a1359aab84 Optimizations for bytes reallocation.
Guido van Rossum <guido@python.org>
parents: 38017
diff changeset
144 /* Within allocated size; quick exit */
a6a1359aab84 Optimizations for bytes reallocation.
Guido van Rossum <guido@python.org>
parents: 38017
diff changeset
145 ((PyBytesObject *)self)->ob_size = size;
41597
cb3c92062ec4 Add trailing null bytes to a few more places.
Guido van Rossum <guido@python.org>
parents: 41595
diff changeset
146 ((PyBytesObject *)self)->ob_bytes[size] = '\0'; /* Trailing null byte */
38115
a6a1359aab84 Optimizations for bytes reallocation.
Guido van Rossum <guido@python.org>
parents: 38017
diff changeset
147 return 0;
a6a1359aab84 Optimizations for bytes reallocation.
Guido van Rossum <guido@python.org>
parents: 38017
diff changeset
148 }
a6a1359aab84 Optimizations for bytes reallocation.
Guido van Rossum <guido@python.org>
parents: 38017
diff changeset
149 else if (size <= alloc * 1.125) {
a6a1359aab84 Optimizations for bytes reallocation.
Guido van Rossum <guido@python.org>
parents: 38017
diff changeset
150 /* Moderate upsize; overallocate similar to list_resize() */
a6a1359aab84 Optimizations for bytes reallocation.
Guido van Rossum <guido@python.org>
parents: 38017
diff changeset
151 alloc = size + (size >> 3) + (size < 9 ? 3 : 6);
a6a1359aab84 Optimizations for bytes reallocation.
Guido van Rossum <guido@python.org>
parents: 38017
diff changeset
152 }
a6a1359aab84 Optimizations for bytes reallocation.
Guido van Rossum <guido@python.org>
parents: 38017
diff changeset
153 else {
a6a1359aab84 Optimizations for bytes reallocation.
Guido van Rossum <guido@python.org>
parents: 38017
diff changeset
154 /* Major upsize; resize up to exact size */
41597
cb3c92062ec4 Add trailing null bytes to a few more places.
Guido van Rossum <guido@python.org>
parents: 41595
diff changeset
155 alloc = size + 1;
38115
a6a1359aab84 Optimizations for bytes reallocation.
Guido van Rossum <guido@python.org>
parents: 38017
diff changeset
156 }
a6a1359aab84 Optimizations for bytes reallocation.
Guido van Rossum <guido@python.org>
parents: 38017
diff changeset
157
a6a1359aab84 Optimizations for bytes reallocation.
Guido van Rossum <guido@python.org>
parents: 38017
diff changeset
158 sval = PyMem_Realloc(((PyBytesObject *)self)->ob_bytes, alloc);
37927
a7f3765ea464 Here is a bytes type. It's very minimal but it's a start.
Guido van Rossum <guido@python.org>
parents:
diff changeset
159 if (sval == NULL) {
37960
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
160 PyErr_NoMemory();
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
161 return -1;
37927
a7f3765ea464 Here is a bytes type. It's very minimal but it's a start.
Guido van Rossum <guido@python.org>
parents:
diff changeset
162 }
a7f3765ea464 Here is a bytes type. It's very minimal but it's a start.
Guido van Rossum <guido@python.org>
parents:
diff changeset
163
37960
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
164 ((PyBytesObject *)self)->ob_bytes = sval;
37927
a7f3765ea464 Here is a bytes type. It's very minimal but it's a start.
Guido van Rossum <guido@python.org>
parents:
diff changeset
165 ((PyBytesObject *)self)->ob_size = size;
38115
a6a1359aab84 Optimizations for bytes reallocation.
Guido van Rossum <guido@python.org>
parents: 38017
diff changeset
166 ((PyBytesObject *)self)->ob_alloc = alloc;
41595
2c54763c4504 More coding by random modification.
Guido van Rossum <guido@python.org>
parents: 41450
diff changeset
167 ((PyBytesObject *)self)->ob_bytes[size] = '\0'; /* Trailing null byte */
2c54763c4504 More coding by random modification.
Guido van Rossum <guido@python.org>
parents: 41450
diff changeset
168
37927
a7f3765ea464 Here is a bytes type. It's very minimal but it's a start.
Guido van Rossum <guido@python.org>
parents:
diff changeset
169 return 0;
a7f3765ea464 Here is a bytes type. It's very minimal but it's a start.
Guido van Rossum <guido@python.org>
parents:
diff changeset
170 }
a7f3765ea464 Here is a bytes type. It's very minimal but it's a start.
Guido van Rossum <guido@python.org>
parents:
diff changeset
171
41450
d1c3dd184e38 Rough and dirty job -- allow concatenation of bytes and arbitrary
Guido van Rossum <guido@python.org>
parents: 41448
diff changeset
172 PyObject *
d1c3dd184e38 Rough and dirty job -- allow concatenation of bytes and arbitrary
Guido van Rossum <guido@python.org>
parents: 41448
diff changeset
173 PyBytes_Concat(PyObject *a, PyObject *b)
d1c3dd184e38 Rough and dirty job -- allow concatenation of bytes and arbitrary
Guido van Rossum <guido@python.org>
parents: 41448
diff changeset
174 {
d1c3dd184e38 Rough and dirty job -- allow concatenation of bytes and arbitrary
Guido van Rossum <guido@python.org>
parents: 41448
diff changeset
175 Py_ssize_t asize, bsize, size;
d1c3dd184e38 Rough and dirty job -- allow concatenation of bytes and arbitrary
Guido van Rossum <guido@python.org>
parents: 41448
diff changeset
176 void *aptr, *bptr;
d1c3dd184e38 Rough and dirty job -- allow concatenation of bytes and arbitrary
Guido van Rossum <guido@python.org>
parents: 41448
diff changeset
177 PyBytesObject *result;
d1c3dd184e38 Rough and dirty job -- allow concatenation of bytes and arbitrary
Guido van Rossum <guido@python.org>
parents: 41448
diff changeset
178
d1c3dd184e38 Rough and dirty job -- allow concatenation of bytes and arbitrary
Guido van Rossum <guido@python.org>
parents: 41448
diff changeset
179 asize = _getbuffer(a, &aptr);
d1c3dd184e38 Rough and dirty job -- allow concatenation of bytes and arbitrary
Guido van Rossum <guido@python.org>
parents: 41448
diff changeset
180 bsize = _getbuffer(b, &bptr);
d1c3dd184e38 Rough and dirty job -- allow concatenation of bytes and arbitrary
Guido van Rossum <guido@python.org>
parents: 41448
diff changeset
181 if (asize < 0 || bsize < 0) {
d1c3dd184e38 Rough and dirty job -- allow concatenation of bytes and arbitrary
Guido van Rossum <guido@python.org>
parents: 41448
diff changeset
182 PyErr_Format(PyExc_TypeError, "can't concat %.100s to %.100s",
d1c3dd184e38 Rough and dirty job -- allow concatenation of bytes and arbitrary
Guido van Rossum <guido@python.org>
parents: 41448
diff changeset
183 a->ob_type->tp_name, b->ob_type->tp_name);
d1c3dd184e38 Rough and dirty job -- allow concatenation of bytes and arbitrary
Guido van Rossum <guido@python.org>
parents: 41448
diff changeset
184 return NULL;
d1c3dd184e38 Rough and dirty job -- allow concatenation of bytes and arbitrary
Guido van Rossum <guido@python.org>
parents: 41448
diff changeset
185 }
d1c3dd184e38 Rough and dirty job -- allow concatenation of bytes and arbitrary
Guido van Rossum <guido@python.org>
parents: 41448
diff changeset
186
d1c3dd184e38 Rough and dirty job -- allow concatenation of bytes and arbitrary
Guido van Rossum <guido@python.org>
parents: 41448
diff changeset
187 size = asize + bsize;
d1c3dd184e38 Rough and dirty job -- allow concatenation of bytes and arbitrary
Guido van Rossum <guido@python.org>
parents: 41448
diff changeset
188 if (size < 0)
d1c3dd184e38 Rough and dirty job -- allow concatenation of bytes and arbitrary
Guido van Rossum <guido@python.org>
parents: 41448
diff changeset
189 return PyErr_NoMemory();
d1c3dd184e38 Rough and dirty job -- allow concatenation of bytes and arbitrary
Guido van Rossum <guido@python.org>
parents: 41448
diff changeset
190
d1c3dd184e38 Rough and dirty job -- allow concatenation of bytes and arbitrary
Guido van Rossum <guido@python.org>
parents: 41448
diff changeset
191 result = (PyBytesObject *) PyBytes_FromStringAndSize(NULL, size);
d1c3dd184e38 Rough and dirty job -- allow concatenation of bytes and arbitrary
Guido van Rossum <guido@python.org>
parents: 41448
diff changeset
192 if (result != NULL) {
d1c3dd184e38 Rough and dirty job -- allow concatenation of bytes and arbitrary
Guido van Rossum <guido@python.org>
parents: 41448
diff changeset
193 memcpy(result->ob_bytes, aptr, asize);
d1c3dd184e38 Rough and dirty job -- allow concatenation of bytes and arbitrary
Guido van Rossum <guido@python.org>
parents: 41448
diff changeset
194 memcpy(result->ob_bytes + asize, bptr, bsize);
d1c3dd184e38 Rough and dirty job -- allow concatenation of bytes and arbitrary
Guido van Rossum <guido@python.org>
parents: 41448
diff changeset
195 }
d1c3dd184e38 Rough and dirty job -- allow concatenation of bytes and arbitrary
Guido van Rossum <guido@python.org>
parents: 41448
diff changeset
196 return (PyObject *)result;
d1c3dd184e38 Rough and dirty job -- allow concatenation of bytes and arbitrary
Guido van Rossum <guido@python.org>
parents: 41448
diff changeset
197 }
d1c3dd184e38 Rough and dirty job -- allow concatenation of bytes and arbitrary
Guido van Rossum <guido@python.org>
parents: 41448
diff changeset
198
37927
a7f3765ea464 Here is a bytes type. It's very minimal but it's a start.
Guido van Rossum <guido@python.org>
parents:
diff changeset
199 /* Functions stuffed into the type object */
a7f3765ea464 Here is a bytes type. It's very minimal but it's a start.
Guido van Rossum <guido@python.org>
parents:
diff changeset
200
a7f3765ea464 Here is a bytes type. It's very minimal but it's a start.
Guido van Rossum <guido@python.org>
parents:
diff changeset
201 static Py_ssize_t
a7f3765ea464 Here is a bytes type. It's very minimal but it's a start.
Guido van Rossum <guido@python.org>
parents:
diff changeset
202 bytes_length(PyBytesObject *self)
a7f3765ea464 Here is a bytes type. It's very minimal but it's a start.
Guido van Rossum <guido@python.org>
parents:
diff changeset
203 {
a7f3765ea464 Here is a bytes type. It's very minimal but it's a start.
Guido van Rossum <guido@python.org>
parents:
diff changeset
204 return self->ob_size;
a7f3765ea464 Here is a bytes type. It's very minimal but it's a start.
Guido van Rossum <guido@python.org>
parents:
diff changeset
205 }
a7f3765ea464 Here is a bytes type. It's very minimal but it's a start.
Guido van Rossum <guido@python.org>
parents:
diff changeset
206
a7f3765ea464 Here is a bytes type. It's very minimal but it's a start.
Guido van Rossum <guido@python.org>
parents:
diff changeset
207 static PyObject *
37960
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
208 bytes_concat(PyBytesObject *self, PyObject *other)
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
209 {
41450
d1c3dd184e38 Rough and dirty job -- allow concatenation of bytes and arbitrary
Guido van Rossum <guido@python.org>
parents: 41448
diff changeset
210 return PyBytes_Concat((PyObject *)self, other);
d1c3dd184e38 Rough and dirty job -- allow concatenation of bytes and arbitrary
Guido van Rossum <guido@python.org>
parents: 41448
diff changeset
211 }
d1c3dd184e38 Rough and dirty job -- allow concatenation of bytes and arbitrary
Guido van Rossum <guido@python.org>
parents: 41448
diff changeset
212
d1c3dd184e38 Rough and dirty job -- allow concatenation of bytes and arbitrary
Guido van Rossum <guido@python.org>
parents: 41448
diff changeset
213 static PyObject *
d1c3dd184e38 Rough and dirty job -- allow concatenation of bytes and arbitrary
Guido van Rossum <guido@python.org>
parents: 41448
diff changeset
214 bytes_iconcat(PyBytesObject *self, PyObject *other)
d1c3dd184e38 Rough and dirty job -- allow concatenation of bytes and arbitrary
Guido van Rossum <guido@python.org>
parents: 41448
diff changeset
215 {
d1c3dd184e38 Rough and dirty job -- allow concatenation of bytes and arbitrary
Guido van Rossum <guido@python.org>
parents: 41448
diff changeset
216 void *optr;
d1c3dd184e38 Rough and dirty job -- allow concatenation of bytes and arbitrary
Guido van Rossum <guido@python.org>
parents: 41448
diff changeset
217 Py_ssize_t osize;
37960
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
218 Py_ssize_t mysize;
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
219 Py_ssize_t size;
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
220
41450
d1c3dd184e38 Rough and dirty job -- allow concatenation of bytes and arbitrary
Guido van Rossum <guido@python.org>
parents: 41448
diff changeset
221 osize = _getbuffer(other, &optr);
d1c3dd184e38 Rough and dirty job -- allow concatenation of bytes and arbitrary
Guido van Rossum <guido@python.org>
parents: 41448
diff changeset
222 if (osize < 0) {
37960
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
223 PyErr_Format(PyExc_TypeError,
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
224 "can't concat bytes to %.100s", other->ob_type->tp_name);
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
225 return NULL;
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
226 }
41448
458c8db2e946 Clean up trailing whitespace.
Guido van Rossum <guido@python.org>
parents: 41426
diff changeset
227
37960
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
228 mysize = self->ob_size;
38017
0b8e782b8484 Implement bytes += bytes, bytes *= int, int in bytes, bytes in bytes.
Guido van Rossum <guido@python.org>
parents: 37960
diff changeset
229 size = mysize + osize;
0b8e782b8484 Implement bytes += bytes, bytes *= int, int in bytes, bytes in bytes.
Guido van Rossum <guido@python.org>
parents: 37960
diff changeset
230 if (size < 0)
0b8e782b8484 Implement bytes += bytes, bytes *= int, int in bytes, bytes in bytes.
Guido van Rossum <guido@python.org>
parents: 37960
diff changeset
231 return PyErr_NoMemory();
41597
cb3c92062ec4 Add trailing null bytes to a few more places.
Guido van Rossum <guido@python.org>
parents: 41595
diff changeset
232 if (size < self->ob_alloc) {
38115
a6a1359aab84 Optimizations for bytes reallocation.
Guido van Rossum <guido@python.org>
parents: 38017
diff changeset
233 self->ob_size = size;
41597
cb3c92062ec4 Add trailing null bytes to a few more places.
Guido van Rossum <guido@python.org>
parents: 41595
diff changeset
234 self->ob_bytes[self->ob_size] = '\0'; /* Trailing null byte */
cb3c92062ec4 Add trailing null bytes to a few more places.
Guido van Rossum <guido@python.org>
parents: 41595
diff changeset
235 }
38115
a6a1359aab84 Optimizations for bytes reallocation.
Guido van Rossum <guido@python.org>
parents: 38017
diff changeset
236 else if (PyBytes_Resize((PyObject *)self, size) < 0)
38017
0b8e782b8484 Implement bytes += bytes, bytes *= int, int in bytes, bytes in bytes.
Guido van Rossum <guido@python.org>
parents: 37960
diff changeset
237 return NULL;
41450
d1c3dd184e38 Rough and dirty job -- allow concatenation of bytes and arbitrary
Guido van Rossum <guido@python.org>
parents: 41448
diff changeset
238 memcpy(self->ob_bytes + mysize, optr, osize);
38017
0b8e782b8484 Implement bytes += bytes, bytes *= int, int in bytes, bytes in bytes.
Guido van Rossum <guido@python.org>
parents: 37960
diff changeset
239 Py_INCREF(self);
0b8e782b8484 Implement bytes += bytes, bytes *= int, int in bytes, bytes in bytes.
Guido van Rossum <guido@python.org>
parents: 37960
diff changeset
240 return (PyObject *)self;
0b8e782b8484 Implement bytes += bytes, bytes *= int, int in bytes, bytes in bytes.
Guido van Rossum <guido@python.org>
parents: 37960
diff changeset
241 }
0b8e782b8484 Implement bytes += bytes, bytes *= int, int in bytes, bytes in bytes.
Guido van Rossum <guido@python.org>
parents: 37960
diff changeset
242
0b8e782b8484 Implement bytes += bytes, bytes *= int, int in bytes, bytes in bytes.
Guido van Rossum <guido@python.org>
parents: 37960
diff changeset
243 static PyObject *
37960
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
244 bytes_repeat(PyBytesObject *self, Py_ssize_t count)
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
245 {
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
246 PyBytesObject *result;
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
247 Py_ssize_t mysize;
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
248 Py_ssize_t size;
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
249
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
250 if (count < 0)
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
251 count = 0;
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
252 mysize = self->ob_size;
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
253 size = mysize * count;
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
254 if (count != 0 && size / count != mysize)
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
255 return PyErr_NoMemory();
41595
2c54763c4504 More coding by random modification.
Guido van Rossum <guido@python.org>
parents: 41450
diff changeset
256 result = (PyBytesObject *)PyBytes_FromStringAndSize(NULL, size);
37960
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
257 if (result != NULL && size != 0) {
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
258 if (mysize == 1)
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
259 memset(result->ob_bytes, self->ob_bytes[0], size);
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
260 else {
38017
0b8e782b8484 Implement bytes += bytes, bytes *= int, int in bytes, bytes in bytes.
Guido van Rossum <guido@python.org>
parents: 37960
diff changeset
261 Py_ssize_t i;
37960
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
262 for (i = 0; i < count; i++)
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
263 memcpy(result->ob_bytes + i*mysize, self->ob_bytes, mysize);
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
264 }
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
265 }
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
266 return (PyObject *)result;
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
267 }
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
268
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
269 static PyObject *
38017
0b8e782b8484 Implement bytes += bytes, bytes *= int, int in bytes, bytes in bytes.
Guido van Rossum <guido@python.org>
parents: 37960
diff changeset
270 bytes_irepeat(PyBytesObject *self, Py_ssize_t count)
0b8e782b8484 Implement bytes += bytes, bytes *= int, int in bytes, bytes in bytes.
Guido van Rossum <guido@python.org>
parents: 37960
diff changeset
271 {
0b8e782b8484 Implement bytes += bytes, bytes *= int, int in bytes, bytes in bytes.
Guido van Rossum <guido@python.org>
parents: 37960
diff changeset
272 Py_ssize_t mysize;
0b8e782b8484 Implement bytes += bytes, bytes *= int, int in bytes, bytes in bytes.
Guido van Rossum <guido@python.org>
parents: 37960
diff changeset
273 Py_ssize_t size;
0b8e782b8484 Implement bytes += bytes, bytes *= int, int in bytes, bytes in bytes.
Guido van Rossum <guido@python.org>
parents: 37960
diff changeset
274
0b8e782b8484 Implement bytes += bytes, bytes *= int, int in bytes, bytes in bytes.
Guido van Rossum <guido@python.org>
parents: 37960
diff changeset
275 if (count < 0)
0b8e782b8484 Implement bytes += bytes, bytes *= int, int in bytes, bytes in bytes.
Guido van Rossum <guido@python.org>
parents: 37960
diff changeset
276 count = 0;
0b8e782b8484 Implement bytes += bytes, bytes *= int, int in bytes, bytes in bytes.
Guido van Rossum <guido@python.org>
parents: 37960
diff changeset
277 mysize = self->ob_size;
0b8e782b8484 Implement bytes += bytes, bytes *= int, int in bytes, bytes in bytes.
Guido van Rossum <guido@python.org>
parents: 37960
diff changeset
278 size = mysize * count;
0b8e782b8484 Implement bytes += bytes, bytes *= int, int in bytes, bytes in bytes.
Guido van Rossum <guido@python.org>
parents: 37960
diff changeset
279 if (count != 0 && size / count != mysize)
0b8e782b8484 Implement bytes += bytes, bytes *= int, int in bytes, bytes in bytes.
Guido van Rossum <guido@python.org>
parents: 37960
diff changeset
280 return PyErr_NoMemory();
41597
cb3c92062ec4 Add trailing null bytes to a few more places.
Guido van Rossum <guido@python.org>
parents: 41595
diff changeset
281 if (size < self->ob_alloc) {
38115
a6a1359aab84 Optimizations for bytes reallocation.
Guido van Rossum <guido@python.org>
parents: 38017
diff changeset
282 self->ob_size = size;
41597
cb3c92062ec4 Add trailing null bytes to a few more places.
Guido van Rossum <guido@python.org>
parents: 41595
diff changeset
283 self->ob_bytes[self->ob_size] = '\0'; /* Trailing null byte */
cb3c92062ec4 Add trailing null bytes to a few more places.
Guido van Rossum <guido@python.org>
parents: 41595
diff changeset
284 }
38115
a6a1359aab84 Optimizations for bytes reallocation.
Guido van Rossum <guido@python.org>
parents: 38017
diff changeset
285 else if (PyBytes_Resize((PyObject *)self, size) < 0)
38017
0b8e782b8484 Implement bytes += bytes, bytes *= int, int in bytes, bytes in bytes.
Guido van Rossum <guido@python.org>
parents: 37960
diff changeset
286 return NULL;
41448
458c8db2e946 Clean up trailing whitespace.
Guido van Rossum <guido@python.org>
parents: 41426
diff changeset
287
38017
0b8e782b8484 Implement bytes += bytes, bytes *= int, int in bytes, bytes in bytes.
Guido van Rossum <guido@python.org>
parents: 37960
diff changeset
288 if (mysize == 1)
0b8e782b8484 Implement bytes += bytes, bytes *= int, int in bytes, bytes in bytes.
Guido van Rossum <guido@python.org>
parents: 37960
diff changeset
289 memset(self->ob_bytes, self->ob_bytes[0], size);
0b8e782b8484 Implement bytes += bytes, bytes *= int, int in bytes, bytes in bytes.
Guido van Rossum <guido@python.org>
parents: 37960
diff changeset
290 else {
0b8e782b8484 Implement bytes += bytes, bytes *= int, int in bytes, bytes in bytes.
Guido van Rossum <guido@python.org>
parents: 37960
diff changeset
291 Py_ssize_t i;
0b8e782b8484 Implement bytes += bytes, bytes *= int, int in bytes, bytes in bytes.
Guido van Rossum <guido@python.org>
parents: 37960
diff changeset
292 for (i = 1; i < count; i++)
0b8e782b8484 Implement bytes += bytes, bytes *= int, int in bytes, bytes in bytes.
Guido van Rossum <guido@python.org>
parents: 37960
diff changeset
293 memcpy(self->ob_bytes + i*mysize, self->ob_bytes, mysize);
0b8e782b8484 Implement bytes += bytes, bytes *= int, int in bytes, bytes in bytes.
Guido van Rossum <guido@python.org>
parents: 37960
diff changeset
294 }
0b8e782b8484 Implement bytes += bytes, bytes *= int, int in bytes, bytes in bytes.
Guido van Rossum <guido@python.org>
parents: 37960
diff changeset
295
0b8e782b8484 Implement bytes += bytes, bytes *= int, int in bytes, bytes in bytes.
Guido van Rossum <guido@python.org>
parents: 37960
diff changeset
296 Py_INCREF(self);
0b8e782b8484 Implement bytes += bytes, bytes *= int, int in bytes, bytes in bytes.
Guido van Rossum <guido@python.org>
parents: 37960
diff changeset
297 return (PyObject *)self;
0b8e782b8484 Implement bytes += bytes, bytes *= int, int in bytes, bytes in bytes.
Guido van Rossum <guido@python.org>
parents: 37960
diff changeset
298 }
0b8e782b8484 Implement bytes += bytes, bytes *= int, int in bytes, bytes in bytes.
Guido van Rossum <guido@python.org>
parents: 37960
diff changeset
299
0b8e782b8484 Implement bytes += bytes, bytes *= int, int in bytes, bytes in bytes.
Guido van Rossum <guido@python.org>
parents: 37960
diff changeset
300 static int
0b8e782b8484 Implement bytes += bytes, bytes *= int, int in bytes, bytes in bytes.
Guido van Rossum <guido@python.org>
parents: 37960
diff changeset
301 bytes_substring(PyBytesObject *self, PyBytesObject *other)
0b8e782b8484 Implement bytes += bytes, bytes *= int, int in bytes, bytes in bytes.
Guido van Rossum <guido@python.org>
parents: 37960
diff changeset
302 {
0b8e782b8484 Implement bytes += bytes, bytes *= int, int in bytes, bytes in bytes.
Guido van Rossum <guido@python.org>
parents: 37960
diff changeset
303 Py_ssize_t i;
0b8e782b8484 Implement bytes += bytes, bytes *= int, int in bytes, bytes in bytes.
Guido van Rossum <guido@python.org>
parents: 37960
diff changeset
304
0b8e782b8484 Implement bytes += bytes, bytes *= int, int in bytes, bytes in bytes.
Guido van Rossum <guido@python.org>
parents: 37960
diff changeset
305 if (other->ob_size == 1) {
41448
458c8db2e946 Clean up trailing whitespace.
Guido van Rossum <guido@python.org>
parents: 41426
diff changeset
306 return memchr(self->ob_bytes, other->ob_bytes[0],
38017
0b8e782b8484 Implement bytes += bytes, bytes *= int, int in bytes, bytes in bytes.
Guido van Rossum <guido@python.org>
parents: 37960
diff changeset
307 self->ob_size) != NULL;
0b8e782b8484 Implement bytes += bytes, bytes *= int, int in bytes, bytes in bytes.
Guido van Rossum <guido@python.org>
parents: 37960
diff changeset
308 }
0b8e782b8484 Implement bytes += bytes, bytes *= int, int in bytes, bytes in bytes.
Guido van Rossum <guido@python.org>
parents: 37960
diff changeset
309 if (other->ob_size == 0)
0b8e782b8484 Implement bytes += bytes, bytes *= int, int in bytes, bytes in bytes.
Guido van Rossum <guido@python.org>
parents: 37960
diff changeset
310 return 1; /* Edge case */
0b8e782b8484 Implement bytes += bytes, bytes *= int, int in bytes, bytes in bytes.
Guido van Rossum <guido@python.org>
parents: 37960
diff changeset
311 for (i = 0; i + other->ob_size <= self->ob_size; i++) {
0b8e782b8484 Implement bytes += bytes, bytes *= int, int in bytes, bytes in bytes.
Guido van Rossum <guido@python.org>
parents: 37960
diff changeset
312 /* XXX Yeah, yeah, lots of optimizations possible... */
0b8e782b8484 Implement bytes += bytes, bytes *= int, int in bytes, bytes in bytes.
Guido van Rossum <guido@python.org>
parents: 37960
diff changeset
313 if (memcmp(self->ob_bytes + i, other->ob_bytes, other->ob_size) == 0)
0b8e782b8484 Implement bytes += bytes, bytes *= int, int in bytes, bytes in bytes.
Guido van Rossum <guido@python.org>
parents: 37960
diff changeset
314 return 1;
0b8e782b8484 Implement bytes += bytes, bytes *= int, int in bytes, bytes in bytes.
Guido van Rossum <guido@python.org>
parents: 37960
diff changeset
315 }
0b8e782b8484 Implement bytes += bytes, bytes *= int, int in bytes, bytes in bytes.
Guido van Rossum <guido@python.org>
parents: 37960
diff changeset
316 return 0;
0b8e782b8484 Implement bytes += bytes, bytes *= int, int in bytes, bytes in bytes.
Guido van Rossum <guido@python.org>
parents: 37960
diff changeset
317 }
0b8e782b8484 Implement bytes += bytes, bytes *= int, int in bytes, bytes in bytes.
Guido van Rossum <guido@python.org>
parents: 37960
diff changeset
318
0b8e782b8484 Implement bytes += bytes, bytes *= int, int in bytes, bytes in bytes.
Guido van Rossum <guido@python.org>
parents: 37960
diff changeset
319 static int
0b8e782b8484 Implement bytes += bytes, bytes *= int, int in bytes, bytes in bytes.
Guido van Rossum <guido@python.org>
parents: 37960
diff changeset
320 bytes_contains(PyBytesObject *self, PyObject *value)
0b8e782b8484 Implement bytes += bytes, bytes *= int, int in bytes, bytes in bytes.
Guido van Rossum <guido@python.org>
parents: 37960
diff changeset
321 {
0b8e782b8484 Implement bytes += bytes, bytes *= int, int in bytes, bytes in bytes.
Guido van Rossum <guido@python.org>
parents: 37960
diff changeset
322 Py_ssize_t ival;
0b8e782b8484 Implement bytes += bytes, bytes *= int, int in bytes, bytes in bytes.
Guido van Rossum <guido@python.org>
parents: 37960
diff changeset
323
0b8e782b8484 Implement bytes += bytes, bytes *= int, int in bytes, bytes in bytes.
Guido van Rossum <guido@python.org>
parents: 37960
diff changeset
324 if (PyBytes_Check(value))
0b8e782b8484 Implement bytes += bytes, bytes *= int, int in bytes, bytes in bytes.
Guido van Rossum <guido@python.org>
parents: 37960
diff changeset
325 return bytes_substring(self, (PyBytesObject *)value);
0b8e782b8484 Implement bytes += bytes, bytes *= int, int in bytes, bytes in bytes.
Guido van Rossum <guido@python.org>
parents: 37960
diff changeset
326
39631
8d71f9a6c1c3 Make bytesobject raise ValueError instead of TypeError again (thanks, Nick)
Thomas Wouters <thomas@python.org>
parents: 39610
diff changeset
327 ival = PyNumber_AsSsize_t(value, PyExc_ValueError);
38017
0b8e782b8484 Implement bytes += bytes, bytes *= int, int in bytes, bytes in bytes.
Guido van Rossum <guido@python.org>
parents: 37960
diff changeset
328 if (ival == -1 && PyErr_Occurred())
0b8e782b8484 Implement bytes += bytes, bytes *= int, int in bytes, bytes in bytes.
Guido van Rossum <guido@python.org>
parents: 37960
diff changeset
329 return -1;
0b8e782b8484 Implement bytes += bytes, bytes *= int, int in bytes, bytes in bytes.
Guido van Rossum <guido@python.org>
parents: 37960
diff changeset
330 if (ival < 0 || ival >= 256) {
0b8e782b8484 Implement bytes += bytes, bytes *= int, int in bytes, bytes in bytes.
Guido van Rossum <guido@python.org>
parents: 37960
diff changeset
331 PyErr_SetString(PyExc_ValueError, "byte must be in range(0, 256)");
0b8e782b8484 Implement bytes += bytes, bytes *= int, int in bytes, bytes in bytes.
Guido van Rossum <guido@python.org>
parents: 37960
diff changeset
332 return -1;
0b8e782b8484 Implement bytes += bytes, bytes *= int, int in bytes, bytes in bytes.
Guido van Rossum <guido@python.org>
parents: 37960
diff changeset
333 }
0b8e782b8484 Implement bytes += bytes, bytes *= int, int in bytes, bytes in bytes.
Guido van Rossum <guido@python.org>
parents: 37960
diff changeset
334
0b8e782b8484 Implement bytes += bytes, bytes *= int, int in bytes, bytes in bytes.
Guido van Rossum <guido@python.org>
parents: 37960
diff changeset
335 return memchr(self->ob_bytes, ival, self->ob_size) != NULL;
0b8e782b8484 Implement bytes += bytes, bytes *= int, int in bytes, bytes in bytes.
Guido van Rossum <guido@python.org>
parents: 37960
diff changeset
336 }
0b8e782b8484 Implement bytes += bytes, bytes *= int, int in bytes, bytes in bytes.
Guido van Rossum <guido@python.org>
parents: 37960
diff changeset
337
0b8e782b8484 Implement bytes += bytes, bytes *= int, int in bytes, bytes in bytes.
Guido van Rossum <guido@python.org>
parents: 37960
diff changeset
338 static PyObject *
37927
a7f3765ea464 Here is a bytes type. It's very minimal but it's a start.
Guido van Rossum <guido@python.org>
parents:
diff changeset
339 bytes_getitem(PyBytesObject *self, Py_ssize_t i)
a7f3765ea464 Here is a bytes type. It's very minimal but it's a start.
Guido van Rossum <guido@python.org>
parents:
diff changeset
340 {
a7f3765ea464 Here is a bytes type. It's very minimal but it's a start.
Guido van Rossum <guido@python.org>
parents:
diff changeset
341 if (i < 0)
37960
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
342 i += self->ob_size;
37927
a7f3765ea464 Here is a bytes type. It's very minimal but it's a start.
Guido van Rossum <guido@python.org>
parents:
diff changeset
343 if (i < 0 || i >= self->ob_size) {
37960
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
344 PyErr_SetString(PyExc_IndexError, "bytes index out of range");
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
345 return NULL;
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
346 }
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
347 return PyInt_FromLong((unsigned char)(self->ob_bytes[i]));
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
348 }
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
349
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
350 static PyObject *
40472
9548ca0e6560 Implement extended slicing in bytes objects.
Thomas Wouters <thomas@python.org>
parents: 39643
diff changeset
351 bytes_subscript(PyBytesObject *self, PyObject *item)
37960
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
352 {
40472
9548ca0e6560 Implement extended slicing in bytes objects.
Thomas Wouters <thomas@python.org>
parents: 39643
diff changeset
353 if (PyIndex_Check(item)) {
9548ca0e6560 Implement extended slicing in bytes objects.
Thomas Wouters <thomas@python.org>
parents: 39643
diff changeset
354 Py_ssize_t i = PyNumber_AsSsize_t(item, PyExc_IndexError);
9548ca0e6560 Implement extended slicing in bytes objects.
Thomas Wouters <thomas@python.org>
parents: 39643
diff changeset
355
9548ca0e6560 Implement extended slicing in bytes objects.
Thomas Wouters <thomas@python.org>
parents: 39643
diff changeset
356 if (i == -1 && PyErr_Occurred())
9548ca0e6560 Implement extended slicing in bytes objects.
Thomas Wouters <thomas@python.org>
parents: 39643
diff changeset
357 return NULL;
9548ca0e6560 Implement extended slicing in bytes objects.
Thomas Wouters <thomas@python.org>
parents: 39643
diff changeset
358
9548ca0e6560 Implement extended slicing in bytes objects.
Thomas Wouters <thomas@python.org>
parents: 39643
diff changeset
359 if (i < 0)
9548ca0e6560 Implement extended slicing in bytes objects.
Thomas Wouters <thomas@python.org>
parents: 39643
diff changeset
360 i += PyBytes_GET_SIZE(self);
9548ca0e6560 Implement extended slicing in bytes objects.
Thomas Wouters <thomas@python.org>
parents: 39643
diff changeset
361
9548ca0e6560 Implement extended slicing in bytes objects.
Thomas Wouters <thomas@python.org>
parents: 39643
diff changeset
362 if (i < 0 || i >= self->ob_size) {
9548ca0e6560 Implement extended slicing in bytes objects.
Thomas Wouters <thomas@python.org>
parents: 39643
diff changeset
363 PyErr_SetString(PyExc_IndexError, "bytes index out of range");
9548ca0e6560 Implement extended slicing in bytes objects.
Thomas Wouters <thomas@python.org>
parents: 39643
diff changeset
364 return NULL;
9548ca0e6560 Implement extended slicing in bytes objects.
Thomas Wouters <thomas@python.org>
parents: 39643
diff changeset
365 }
9548ca0e6560 Implement extended slicing in bytes objects.
Thomas Wouters <thomas@python.org>
parents: 39643
diff changeset
366 return PyInt_FromLong((unsigned char)(self->ob_bytes[i]));
9548ca0e6560 Implement extended slicing in bytes objects.
Thomas Wouters <thomas@python.org>
parents: 39643
diff changeset
367 }
9548ca0e6560 Implement extended slicing in bytes objects.
Thomas Wouters <thomas@python.org>
parents: 39643
diff changeset
368 else if (PySlice_Check(item)) {
9548ca0e6560 Implement extended slicing in bytes objects.
Thomas Wouters <thomas@python.org>
parents: 39643
diff changeset
369 Py_ssize_t start, stop, step, slicelength, cur, i;
9548ca0e6560 Implement extended slicing in bytes objects.
Thomas Wouters <thomas@python.org>
parents: 39643
diff changeset
370 if (PySlice_GetIndicesEx((PySliceObject *)item,
9548ca0e6560 Implement extended slicing in bytes objects.
Thomas Wouters <thomas@python.org>
parents: 39643
diff changeset
371 PyBytes_GET_SIZE(self),
9548ca0e6560 Implement extended slicing in bytes objects.
Thomas Wouters <thomas@python.org>
parents: 39643
diff changeset
372 &start, &stop, &step, &slicelength) < 0) {
9548ca0e6560 Implement extended slicing in bytes objects.
Thomas Wouters <thomas@python.org>
parents: 39643
diff changeset
373 return NULL;
9548ca0e6560 Implement extended slicing in bytes objects.
Thomas Wouters <thomas@python.org>
parents: 39643
diff changeset
374 }
41448
458c8db2e946 Clean up trailing whitespace.
Guido van Rossum <guido@python.org>
parents: 41426
diff changeset
375
40472
9548ca0e6560 Implement extended slicing in bytes objects.
Thomas Wouters <thomas@python.org>
parents: 39643
diff changeset
376 if (slicelength <= 0)
9548ca0e6560 Implement extended slicing in bytes objects.
Thomas Wouters <thomas@python.org>
parents: 39643
diff changeset
377 return PyBytes_FromStringAndSize("", 0);
9548ca0e6560 Implement extended slicing in bytes objects.
Thomas Wouters <thomas@python.org>
parents: 39643
diff changeset
378 else if (step == 1) {
9548ca0e6560 Implement extended slicing in bytes objects.
Thomas Wouters <thomas@python.org>
parents: 39643
diff changeset
379 return PyBytes_FromStringAndSize(self->ob_bytes + start,
9548ca0e6560 Implement extended slicing in bytes objects.
Thomas Wouters <thomas@python.org>
parents: 39643
diff changeset
380 slicelength);
9548ca0e6560 Implement extended slicing in bytes objects.
Thomas Wouters <thomas@python.org>
parents: 39643
diff changeset
381 }
9548ca0e6560 Implement extended slicing in bytes objects.
Thomas Wouters <thomas@python.org>
parents: 39643
diff changeset
382 else {
9548ca0e6560 Implement extended slicing in bytes objects.
Thomas Wouters <thomas@python.org>
parents: 39643
diff changeset
383 char *source_buf = PyBytes_AS_STRING(self);
9548ca0e6560 Implement extended slicing in bytes objects.
Thomas Wouters <thomas@python.org>
parents: 39643
diff changeset
384 char *result_buf = (char *)PyMem_Malloc(slicelength);
9548ca0e6560 Implement extended slicing in bytes objects.
Thomas Wouters <thomas@python.org>
parents: 39643
diff changeset
385 PyObject *result;
41448
458c8db2e946 Clean up trailing whitespace.
Guido van Rossum <guido@python.org>
parents: 41426
diff changeset
386
40472
9548ca0e6560 Implement extended slicing in bytes objects.
Thomas Wouters <thomas@python.org>
parents: 39643
diff changeset
387 if (result_buf == NULL)
9548ca0e6560 Implement extended slicing in bytes objects.
Thomas Wouters <thomas@python.org>
parents: 39643
diff changeset
388 return PyErr_NoMemory();
41448
458c8db2e946 Clean up trailing whitespace.
Guido van Rossum <guido@python.org>
parents: 41426
diff changeset
389
40472
9548ca0e6560 Implement extended slicing in bytes objects.
Thomas Wouters <thomas@python.org>
parents: 39643
diff changeset
390 for (cur = start, i = 0; i < slicelength;
9548ca0e6560 Implement extended slicing in bytes objects.
Thomas Wouters <thomas@python.org>
parents: 39643
diff changeset
391 cur += step, i++) {
9548ca0e6560 Implement extended slicing in bytes objects.
Thomas Wouters <thomas@python.org>
parents: 39643
diff changeset
392 result_buf[i] = source_buf[cur];
9548ca0e6560 Implement extended slicing in bytes objects.
Thomas Wouters <thomas@python.org>
parents: 39643
diff changeset
393 }
9548ca0e6560 Implement extended slicing in bytes objects.
Thomas Wouters <thomas@python.org>
parents: 39643
diff changeset
394 result = PyBytes_FromStringAndSize(result_buf, slicelength);
9548ca0e6560 Implement extended slicing in bytes objects.
Thomas Wouters <thomas@python.org>
parents: 39643
diff changeset
395 PyMem_Free(result_buf);
9548ca0e6560 Implement extended slicing in bytes objects.
Thomas Wouters <thomas@python.org>
parents: 39643
diff changeset
396 return result;
9548ca0e6560 Implement extended slicing in bytes objects.
Thomas Wouters <thomas@python.org>
parents: 39643
diff changeset
397 }
9548ca0e6560 Implement extended slicing in bytes objects.
Thomas Wouters <thomas@python.org>
parents: 39643
diff changeset
398 }
9548ca0e6560 Implement extended slicing in bytes objects.
Thomas Wouters <thomas@python.org>
parents: 39643
diff changeset
399 else {
9548ca0e6560 Implement extended slicing in bytes objects.
Thomas Wouters <thomas@python.org>
parents: 39643
diff changeset
400 PyErr_SetString(PyExc_TypeError, "bytes indices must be integers");
9548ca0e6560 Implement extended slicing in bytes objects.
Thomas Wouters <thomas@python.org>
parents: 39643
diff changeset
401 return NULL;
9548ca0e6560 Implement extended slicing in bytes objects.
Thomas Wouters <thomas@python.org>
parents: 39643
diff changeset
402 }
37960
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
403 }
41448
458c8db2e946 Clean up trailing whitespace.
Guido van Rossum <guido@python.org>
parents: 41426
diff changeset
404
37960
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
405 static int
40472
9548ca0e6560 Implement extended slicing in bytes objects.
Thomas Wouters <thomas@python.org>
parents: 39643
diff changeset
406 bytes_setslice(PyBytesObject *self, Py_ssize_t lo, Py_ssize_t hi,
37960
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
407 PyObject *values)
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
408 {
41450
d1c3dd184e38 Rough and dirty job -- allow concatenation of bytes and arbitrary
Guido van Rossum <guido@python.org>
parents: 41448
diff changeset
409 Py_ssize_t avail, needed;
d1c3dd184e38 Rough and dirty job -- allow concatenation of bytes and arbitrary
Guido van Rossum <guido@python.org>
parents: 41448
diff changeset
410 void *bytes;
d1c3dd184e38 Rough and dirty job -- allow concatenation of bytes and arbitrary
Guido van Rossum <guido@python.org>
parents: 41448
diff changeset
411
d1c3dd184e38 Rough and dirty job -- allow concatenation of bytes and arbitrary
Guido van Rossum <guido@python.org>
parents: 41448
diff changeset
412 if (values == (PyObject *)self) {
37960
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
413 /* Make a copy an call this function recursively */
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
414 int err;
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
415 values = PyBytes_FromObject(values);
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
416 if (values == NULL)
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
417 return -1;
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
418 err = bytes_setslice(self, lo, hi, values);
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
419 Py_DECREF(values);
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
420 return err;
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
421 }
41450
d1c3dd184e38 Rough and dirty job -- allow concatenation of bytes and arbitrary
Guido van Rossum <guido@python.org>
parents: 41448
diff changeset
422 if (values == NULL) {
d1c3dd184e38 Rough and dirty job -- allow concatenation of bytes and arbitrary
Guido van Rossum <guido@python.org>
parents: 41448
diff changeset
423 /* del b[lo:hi] */
d1c3dd184e38 Rough and dirty job -- allow concatenation of bytes and arbitrary
Guido van Rossum <guido@python.org>
parents: 41448
diff changeset
424 bytes = NULL;
d1c3dd184e38 Rough and dirty job -- allow concatenation of bytes and arbitrary
Guido van Rossum <guido@python.org>
parents: 41448
diff changeset
425 needed = 0;
d1c3dd184e38 Rough and dirty job -- allow concatenation of bytes and arbitrary
Guido van Rossum <guido@python.org>
parents: 41448
diff changeset
426 }
37960
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
427 else {
41450
d1c3dd184e38 Rough and dirty job -- allow concatenation of bytes and arbitrary
Guido van Rossum <guido@python.org>
parents: 41448
diff changeset
428 needed = _getbuffer(values, &bytes);
d1c3dd184e38 Rough and dirty job -- allow concatenation of bytes and arbitrary
Guido van Rossum <guido@python.org>
parents: 41448
diff changeset
429 if (needed < 0) {
d1c3dd184e38 Rough and dirty job -- allow concatenation of bytes and arbitrary
Guido van Rossum <guido@python.org>
parents: 41448
diff changeset
430 PyErr_Format(PyExc_TypeError,
d1c3dd184e38 Rough and dirty job -- allow concatenation of bytes and arbitrary
Guido van Rossum <guido@python.org>
parents: 41448
diff changeset
431 "can't set bytes slice from %.100s",
d1c3dd184e38 Rough and dirty job -- allow concatenation of bytes and arbitrary
Guido van Rossum <guido@python.org>
parents: 41448
diff changeset
432 values->ob_type->tp_name);
d1c3dd184e38 Rough and dirty job -- allow concatenation of bytes and arbitrary
Guido van Rossum <guido@python.org>
parents: 41448
diff changeset
433 return -1;
d1c3dd184e38 Rough and dirty job -- allow concatenation of bytes and arbitrary
Guido van Rossum <guido@python.org>
parents: 41448
diff changeset
434 }
37927
a7f3765ea464 Here is a bytes type. It's very minimal but it's a start.
Guido van Rossum <guido@python.org>
parents:
diff changeset
435 }
37960
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
436
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
437 if (lo < 0)
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
438 lo = 0;
39643
3dd61ffd049e Fix buglet in slice assignment of bytesobjects: assigning to b[3:0] ('stop'
Thomas Wouters <thomas@python.org>
parents: 39631
diff changeset
439 if (hi < lo)
3dd61ffd049e Fix buglet in slice assignment of bytesobjects: assigning to b[3:0] ('stop'
Thomas Wouters <thomas@python.org>
parents: 39631
diff changeset
440 hi = lo;
37960
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
441 if (hi > self->ob_size)
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
442 hi = self->ob_size;
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
443
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
444 avail = hi - lo;
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
445 if (avail < 0)
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
446 lo = hi = avail = 0;
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
447
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
448 if (avail != needed) {
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
449 if (avail > needed) {
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
450 /*
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
451 0 lo hi old_size
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
452 | |<----avail----->|<-----tomove------>|
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
453 | |<-needed->|<-----tomove------>|
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
454 0 lo new_hi new_size
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
455 */
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
456 memmove(self->ob_bytes + lo + needed, self->ob_bytes + hi,
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
457 self->ob_size - hi);
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
458 }
40472
9548ca0e6560 Implement extended slicing in bytes objects.
Thomas Wouters <thomas@python.org>
parents: 39643
diff changeset
459 if (PyBytes_Resize((PyObject *)self,
37960
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
460 self->ob_size + needed - avail) < 0)
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
461 return -1;
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
462 if (avail < needed) {
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
463 /*
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
464 0 lo hi old_size
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
465 | |<-avail->|<-----tomove------>|
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
466 | |<----needed---->|<-----tomove------>|
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
467 0 lo new_hi new_size
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
468 */
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
469 memmove(self->ob_bytes + lo + needed, self->ob_bytes + hi,
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
470 self->ob_size - lo - needed);
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
471 }
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
472 }
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
473
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
474 if (needed > 0)
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
475 memcpy(self->ob_bytes + lo, bytes, needed);
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
476
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
477 return 0;
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
478 }
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
479
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
480 static int
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
481 bytes_setitem(PyBytesObject *self, Py_ssize_t i, PyObject *value)
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
482 {
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
483 Py_ssize_t ival;
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
484
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
485 if (i < 0)
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
486 i += self->ob_size;
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
487
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
488 if (i < 0 || i >= self->ob_size) {
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
489 PyErr_SetString(PyExc_IndexError, "bytes index out of range");
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
490 return -1;
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
491 }
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
492
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
493 if (value == NULL)
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
494 return bytes_setslice(self, i, i+1, NULL);
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
495
39631
8d71f9a6c1c3 Make bytesobject raise ValueError instead of TypeError again (thanks, Nick)
Thomas Wouters <thomas@python.org>
parents: 39610
diff changeset
496 ival = PyNumber_AsSsize_t(value, PyExc_ValueError);
37960
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
497 if (ival == -1 && PyErr_Occurred())
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
498 return -1;
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
499
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
500 if (ival < 0 || ival >= 256) {
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
501 PyErr_SetString(PyExc_ValueError, "byte must be in range(0, 256)");
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
502 return -1;
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
503 }
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
504
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
505 self->ob_bytes[i] = ival;
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
506 return 0;
37927
a7f3765ea464 Here is a bytes type. It's very minimal but it's a start.
Guido van Rossum <guido@python.org>
parents:
diff changeset
507 }
a7f3765ea464 Here is a bytes type. It's very minimal but it's a start.
Guido van Rossum <guido@python.org>
parents:
diff changeset
508
a7f3765ea464 Here is a bytes type. It's very minimal but it's a start.
Guido van Rossum <guido@python.org>
parents:
diff changeset
509 static int
40472
9548ca0e6560 Implement extended slicing in bytes objects.
Thomas Wouters <thomas@python.org>
parents: 39643
diff changeset
510 bytes_ass_subscript(PyBytesObject *self, PyObject *item, PyObject *values)
9548ca0e6560 Implement extended slicing in bytes objects.
Thomas Wouters <thomas@python.org>
parents: 39643
diff changeset
511 {
9548ca0e6560 Implement extended slicing in bytes objects.
Thomas Wouters <thomas@python.org>
parents: 39643
diff changeset
512 Py_ssize_t start, stop, step, slicelen, needed;
9548ca0e6560 Implement extended slicing in bytes objects.
Thomas Wouters <thomas@python.org>
parents: 39643
diff changeset
513 char *bytes;
41448
458c8db2e946 Clean up trailing whitespace.
Guido van Rossum <guido@python.org>
parents: 41426
diff changeset
514
40472
9548ca0e6560 Implement extended slicing in bytes objects.
Thomas Wouters <thomas@python.org>
parents: 39643
diff changeset
515 if (PyIndex_Check(item)) {
9548ca0e6560 Implement extended slicing in bytes objects.
Thomas Wouters <thomas@python.org>
parents: 39643
diff changeset
516 Py_ssize_t i = PyNumber_AsSsize_t(item, PyExc_IndexError);
9548ca0e6560 Implement extended slicing in bytes objects.
Thomas Wouters <thomas@python.org>
parents: 39643
diff changeset
517
9548ca0e6560 Implement extended slicing in bytes objects.
Thomas Wouters <thomas@python.org>
parents: 39643
diff changeset
518 if (i == -1 && PyErr_Occurred())
9548ca0e6560 Implement extended slicing in bytes objects.
Thomas Wouters <thomas@python.org>
parents: 39643
diff changeset
519 return -1;
9548ca0e6560 Implement extended slicing in bytes objects.
Thomas Wouters <thomas@python.org>
parents: 39643
diff changeset
520
9548ca0e6560 Implement extended slicing in bytes objects.
Thomas Wouters <thomas@python.org>
parents: 39643
diff changeset
521 if (i < 0)
9548ca0e6560 Implement extended slicing in bytes objects.
Thomas Wouters <thomas@python.org>
parents: 39643
diff changeset
522 i += PyBytes_GET_SIZE(self);
9548ca0e6560 Implement extended slicing in bytes objects.
Thomas Wouters <thomas@python.org>
parents: 39643
diff changeset
523
9548ca0e6560 Implement extended slicing in bytes objects.
Thomas Wouters <thomas@python.org>
parents: 39643
diff changeset
524 if (i < 0 || i >= self->ob_size) {
9548ca0e6560 Implement extended slicing in bytes objects.
Thomas Wouters <thomas@python.org>
parents: 39643
diff changeset
525 PyErr_SetString(PyExc_IndexError, "bytes index out of range");
9548ca0e6560 Implement extended slicing in bytes objects.
Thomas Wouters <thomas@python.org>
parents: 39643
diff changeset
526 return -1;
9548ca0e6560 Implement extended slicing in bytes objects.
Thomas Wouters <thomas@python.org>
parents: 39643
diff changeset
527 }
41448
458c8db2e946 Clean up trailing whitespace.
Guido van Rossum <guido@python.org>
parents: 41426
diff changeset
528
40472
9548ca0e6560 Implement extended slicing in bytes objects.
Thomas Wouters <thomas@python.org>
parents: 39643
diff changeset
529 if (values == NULL) {
9548ca0e6560 Implement extended slicing in bytes objects.
Thomas Wouters <thomas@python.org>
parents: 39643
diff changeset
530 /* Fall through to slice assignment */
9548ca0e6560 Implement extended slicing in bytes objects.
Thomas Wouters <thomas@python.org>
parents: 39643
diff changeset
531 start = i;
9548ca0e6560 Implement extended slicing in bytes objects.
Thomas Wouters <thomas@python.org>
parents: 39643
diff changeset
532 stop = i + 1;
9548ca0e6560 Implement extended slicing in bytes objects.
Thomas Wouters <thomas@python.org>
parents: 39643
diff changeset
533 step = 1;
9548ca0e6560 Implement extended slicing in bytes objects.
Thomas Wouters <thomas@python.org>
parents: 39643
diff changeset
534 slicelen = 1;
9548ca0e6560 Implement extended slicing in bytes objects.
Thomas Wouters <thomas@python.org>
parents: 39643
diff changeset
535 }
9548ca0e6560 Implement extended slicing in bytes objects.
Thomas Wouters <thomas@python.org>
parents: 39643
diff changeset
536 else {
9548ca0e6560 Implement extended slicing in bytes objects.
Thomas Wouters <thomas@python.org>
parents: 39643
diff changeset
537 Py_ssize_t ival = PyNumber_AsSsize_t(values, PyExc_ValueError);
9548ca0e6560 Implement extended slicing in bytes objects.
Thomas Wouters <thomas@python.org>
parents: 39643
diff changeset
538 if (ival == -1 && PyErr_Occurred())
9548ca0e6560 Implement extended slicing in bytes objects.
Thomas Wouters <thomas@python.org>
parents: 39643
diff changeset
539 return -1;
9548ca0e6560 Implement extended slicing in bytes objects.
Thomas Wouters <thomas@python.org>
parents: 39643
diff changeset
540 if (ival < 0 || ival >= 256) {
9548ca0e6560 Implement extended slicing in bytes objects.
Thomas Wouters <thomas@python.org>
parents: 39643
diff changeset
541 PyErr_SetString(PyExc_ValueError,
9548ca0e6560 Implement extended slicing in bytes objects.
Thomas Wouters <thomas@python.org>
parents: 39643
diff changeset
542 "byte must be in range(0, 256)");
9548ca0e6560 Implement extended slicing in bytes objects.
Thomas Wouters <thomas@python.org>
parents: 39643
diff changeset
543 return -1;
9548ca0e6560 Implement extended slicing in bytes objects.
Thomas Wouters <thomas@python.org>
parents: 39643
diff changeset
544 }
9548ca0e6560 Implement extended slicing in bytes objects.
Thomas Wouters <thomas@python.org>
parents: 39643
diff changeset
545 self->ob_bytes[i] = (char)ival;
9548ca0e6560 Implement extended slicing in bytes objects.
Thomas Wouters <thomas@python.org>
parents: 39643
diff changeset
546 return 0;
9548ca0e6560 Implement extended slicing in bytes objects.
Thomas Wouters <thomas@python.org>
parents: 39643
diff changeset
547 }
9548ca0e6560 Implement extended slicing in bytes objects.
Thomas Wouters <thomas@python.org>
parents: 39643
diff changeset
548 }
9548ca0e6560 Implement extended slicing in bytes objects.
Thomas Wouters <thomas@python.org>
parents: 39643
diff changeset
549 else if (PySlice_Check(item)) {
9548ca0e6560 Implement extended slicing in bytes objects.
Thomas Wouters <thomas@python.org>
parents: 39643
diff changeset
550 if (PySlice_GetIndicesEx((PySliceObject *)item,
9548ca0e6560 Implement extended slicing in bytes objects.
Thomas Wouters <thomas@python.org>
parents: 39643
diff changeset
551 PyBytes_GET_SIZE(self),
9548ca0e6560 Implement extended slicing in bytes objects.
Thomas Wouters <thomas@python.org>
parents: 39643
diff changeset
552 &start, &stop, &step, &slicelen) < 0) {
9548ca0e6560 Implement extended slicing in bytes objects.
Thomas Wouters <thomas@python.org>
parents: 39643
diff changeset
553 return -1;
9548ca0e6560 Implement extended slicing in bytes objects.
Thomas Wouters <thomas@python.org>
parents: 39643
diff changeset
554 }
9548ca0e6560 Implement extended slicing in bytes objects.
Thomas Wouters <thomas@python.org>
parents: 39643
diff changeset
555 }
9548ca0e6560 Implement extended slicing in bytes objects.
Thomas Wouters <thomas@python.org>
parents: 39643
diff changeset
556 else {
9548ca0e6560 Implement extended slicing in bytes objects.
Thomas Wouters <thomas@python.org>
parents: 39643
diff changeset
557 PyErr_SetString(PyExc_TypeError, "bytes indices must be integer");
9548ca0e6560 Implement extended slicing in bytes objects.
Thomas Wouters <thomas@python.org>
parents: 39643
diff changeset
558 return -1;
9548ca0e6560 Implement extended slicing in bytes objects.
Thomas Wouters <thomas@python.org>
parents: 39643
diff changeset
559 }
9548ca0e6560 Implement extended slicing in bytes objects.
Thomas Wouters <thomas@python.org>
parents: 39643
diff changeset
560
9548ca0e6560 Implement extended slicing in bytes objects.
Thomas Wouters <thomas@python.org>
parents: 39643
diff changeset
561 if (values == NULL) {
9548ca0e6560 Implement extended slicing in bytes objects.
Thomas Wouters <thomas@python.org>
parents: 39643
diff changeset
562 bytes = NULL;
9548ca0e6560 Implement extended slicing in bytes objects.
Thomas Wouters <thomas@python.org>
parents: 39643
diff changeset
563 needed = 0;
9548ca0e6560 Implement extended slicing in bytes objects.
Thomas Wouters <thomas@python.org>
parents: 39643
diff changeset
564 }
9548ca0e6560 Implement extended slicing in bytes objects.
Thomas Wouters <thomas@python.org>
parents: 39643
diff changeset
565 else if (values == (PyObject *)self || !PyBytes_Check(values)) {
9548ca0e6560 Implement extended slicing in bytes objects.
Thomas Wouters <thomas@python.org>
parents: 39643
diff changeset
566 /* Make a copy an call this function recursively */
9548ca0e6560 Implement extended slicing in bytes objects.
Thomas Wouters <thomas@python.org>
parents: 39643
diff changeset
567 int err;
9548ca0e6560 Implement extended slicing in bytes objects.
Thomas Wouters <thomas@python.org>
parents: 39643
diff changeset
568 values = PyBytes_FromObject(values);
9548ca0e6560 Implement extended slicing in bytes objects.
Thomas Wouters <thomas@python.org>
parents: 39643
diff changeset
569 if (values == NULL)
9548ca0e6560 Implement extended slicing in bytes objects.
Thomas Wouters <thomas@python.org>
parents: 39643
diff changeset
570 return -1;
9548ca0e6560 Implement extended slicing in bytes objects.
Thomas Wouters <thomas@python.org>
parents: 39643
diff changeset
571 err = bytes_ass_subscript(self, item, values);
9548ca0e6560 Implement extended slicing in bytes objects.
Thomas Wouters <thomas@python.org>
parents: 39643
diff changeset
572 Py_DECREF(values);
9548ca0e6560 Implement extended slicing in bytes objects.
Thomas Wouters <thomas@python.org>
parents: 39643
diff changeset
573 return err;
9548ca0e6560 Implement extended slicing in bytes objects.
Thomas Wouters <thomas@python.org>
parents: 39643
diff changeset
574 }
9548ca0e6560 Implement extended slicing in bytes objects.
Thomas Wouters <thomas@python.org>
parents: 39643
diff changeset
575 else {
9548ca0e6560 Implement extended slicing in bytes objects.
Thomas Wouters <thomas@python.org>
parents: 39643
diff changeset
576 assert(PyBytes_Check(values));
9548ca0e6560 Implement extended slicing in bytes objects.
Thomas Wouters <thomas@python.org>
parents: 39643
diff changeset
577 bytes = ((PyBytesObject *)values)->ob_bytes;
9548ca0e6560 Implement extended slicing in bytes objects.
Thomas Wouters <thomas@python.org>
parents: 39643
diff changeset
578 needed = ((PyBytesObject *)values)->ob_size;
9548ca0e6560 Implement extended slicing in bytes objects.
Thomas Wouters <thomas@python.org>
parents: 39643
diff changeset
579 }
9548ca0e6560 Implement extended slicing in bytes objects.
Thomas Wouters <thomas@python.org>
parents: 39643
diff changeset
580 /* Make sure b[5:2] = ... inserts before 5, not before 2. */
9548ca0e6560 Implement extended slicing in bytes objects.
Thomas Wouters <thomas@python.org>
parents: 39643
diff changeset
581 if ((step < 0 && start < stop) ||
9548ca0e6560 Implement extended slicing in bytes objects.
Thomas Wouters <thomas@python.org>
parents: 39643
diff changeset
582 (step > 0 && start > stop))
9548ca0e6560 Implement extended slicing in bytes objects.
Thomas Wouters <thomas@python.org>
parents: 39643
diff changeset
583 stop = start;
9548ca0e6560 Implement extended slicing in bytes objects.
Thomas Wouters <thomas@python.org>
parents: 39643
diff changeset
584 if (step == 1) {
9548ca0e6560 Implement extended slicing in bytes objects.
Thomas Wouters <thomas@python.org>
parents: 39643
diff changeset
585 if (slicelen != needed) {
9548ca0e6560 Implement extended slicing in bytes objects.
Thomas Wouters <thomas@python.org>
parents: 39643
diff changeset
586 if (slicelen > needed) {
9548ca0e6560 Implement extended slicing in bytes objects.
Thomas Wouters <thomas@python.org>
parents: 39643
diff changeset
587 /*
9548ca0e6560 Implement extended slicing in bytes objects.
Thomas Wouters <thomas@python.org>
parents: 39643
diff changeset
588 0 start stop old_size
9548ca0e6560 Implement extended slicing in bytes objects.
Thomas Wouters <thomas@python.org>
parents: 39643
diff changeset
589 | |<---slicelen--->|<-----tomove------>|
9548ca0e6560 Implement extended slicing in bytes objects.
Thomas Wouters <thomas@python.org>
parents: 39643
diff changeset
590 | |<-needed->|<-----tomove------>|
9548ca0e6560 Implement extended slicing in bytes objects.
Thomas Wouters <thomas@python.org>
parents: 39643
diff changeset
591 0 lo new_hi new_size
9548ca0e6560 Implement extended slicing in bytes objects.
Thomas Wouters <thomas@python.org>
parents: 39643
diff changeset
592 */
9548ca0e6560 Implement extended slicing in bytes objects.
Thomas Wouters <thomas@python.org>
parents: 39643
diff changeset
593 memmove(self->ob_bytes + start + needed, self->ob_bytes + stop,
9548ca0e6560 Implement extended slicing in bytes objects.
Thomas Wouters <thomas@python.org>
parents: 39643
diff changeset
594 self->ob_size - stop);
9548ca0e6560 Implement extended slicing in bytes objects.
Thomas Wouters <thomas@python.org>
parents: 39643
diff changeset
595 }
9548ca0e6560 Implement extended slicing in bytes objects.
Thomas Wouters <thomas@python.org>
parents: 39643
diff changeset
596 if (PyBytes_Resize((PyObject *)self,
9548ca0e6560 Implement extended slicing in bytes objects.
Thomas Wouters <thomas@python.org>
parents: 39643
diff changeset
597 self->ob_size + needed - slicelen) < 0)
9548ca0e6560 Implement extended slicing in bytes objects.
Thomas Wouters <thomas@python.org>
parents: 39643
diff changeset
598 return -1;
9548ca0e6560 Implement extended slicing in bytes objects.
Thomas Wouters <thomas@python.org>
parents: 39643
diff changeset
599 if (slicelen < needed) {
9548ca0e6560 Implement extended slicing in bytes objects.
Thomas Wouters <thomas@python.org>
parents: 39643
diff changeset
600 /*
9548ca0e6560 Implement extended slicing in bytes objects.
Thomas Wouters <thomas@python.org>
parents: 39643
diff changeset
601 0 lo hi old_size
9548ca0e6560 Implement extended slicing in bytes objects.
Thomas Wouters <thomas@python.org>
parents: 39643
diff changeset
602 | |<-avail->|<-----tomove------>|
9548ca0e6560 Implement extended slicing in bytes objects.
Thomas Wouters <thomas@python.org>
parents: 39643
diff changeset
603 | |<----needed---->|<-----tomove------>|
9548ca0e6560 Implement extended slicing in bytes objects.
Thomas Wouters <thomas@python.org>
parents: 39643
diff changeset
604 0 lo new_hi new_size
9548ca0e6560 Implement extended slicing in bytes objects.
Thomas Wouters <thomas@python.org>
parents: 39643
diff changeset
605 */
9548ca0e6560 Implement extended slicing in bytes objects.
Thomas Wouters <thomas@python.org>
parents: 39643
diff changeset
606 memmove(self->ob_bytes + start + needed, self->ob_bytes + stop,
9548ca0e6560 Implement extended slicing in bytes objects.
Thomas Wouters <thomas@python.org>
parents: 39643
diff changeset
607 self->ob_size - start - needed);
9548ca0e6560 Implement extended slicing in bytes objects.
Thomas Wouters <thomas@python.org>
parents: 39643
diff changeset
608 }
9548ca0e6560 Implement extended slicing in bytes objects.
Thomas Wouters <thomas@python.org>
parents: 39643
diff changeset
609 }
9548ca0e6560 Implement extended slicing in bytes objects.
Thomas Wouters <thomas@python.org>
parents: 39643
diff changeset
610
9548ca0e6560 Implement extended slicing in bytes objects.
Thomas Wouters <thomas@python.org>
parents: 39643
diff changeset
611 if (needed > 0)
9548ca0e6560 Implement extended slicing in bytes objects.
Thomas Wouters <thomas@python.org>
parents: 39643
diff changeset
612 memcpy(self->ob_bytes + start, bytes, needed);
9548ca0e6560 Implement extended slicing in bytes objects.
Thomas Wouters <thomas@python.org>
parents: 39643
diff changeset
613
9548ca0e6560 Implement extended slicing in bytes objects.
Thomas Wouters <thomas@python.org>
parents: 39643
diff changeset
614 return 0;
9548ca0e6560 Implement extended slicing in bytes objects.
Thomas Wouters <thomas@python.org>
parents: 39643
diff changeset
615 }
9548ca0e6560 Implement extended slicing in bytes objects.
Thomas Wouters <thomas@python.org>
parents: 39643
diff changeset
616 else {
9548ca0e6560 Implement extended slicing in bytes objects.
Thomas Wouters <thomas@python.org>
parents: 39643
diff changeset
617 if (needed == 0) {
9548ca0e6560 Implement extended slicing in bytes objects.
Thomas Wouters <thomas@python.org>
parents: 39643
diff changeset
618 /* Delete slice */
9548ca0e6560 Implement extended slicing in bytes objects.
Thomas Wouters <thomas@python.org>
parents: 39643
diff changeset
619 Py_ssize_t cur, i;
41448
458c8db2e946 Clean up trailing whitespace.
Guido van Rossum <guido@python.org>
parents: 41426
diff changeset
620
40472
9548ca0e6560 Implement extended slicing in bytes objects.
Thomas Wouters <thomas@python.org>
parents: 39643
diff changeset
621 if (step < 0) {
9548ca0e6560 Implement extended slicing in bytes objects.
Thomas Wouters <thomas@python.org>
parents: 39643
diff changeset
622 stop = start + 1;
9548ca0e6560 Implement extended slicing in bytes objects.
Thomas Wouters <thomas@python.org>
parents: 39643
diff changeset
623 start = stop + step * (slicelen - 1) - 1;
9548ca0e6560 Implement extended slicing in bytes objects.
Thomas Wouters <thomas@python.org>
parents: 39643
diff changeset
624 step = -step;
9548ca0e6560 Implement extended slicing in bytes objects.
Thomas Wouters <thomas@python.org>
parents: 39643
diff changeset
625 }
9548ca0e6560 Implement extended slicing in bytes objects.
Thomas Wouters <thomas@python.org>
parents: 39643
diff changeset
626 for (cur = start, i = 0;
9548ca0e6560 Implement extended slicing in bytes objects.
Thomas Wouters <thomas@python.org>
parents: 39643
diff changeset
627 i < slicelen; cur += step, i++) {
9548ca0e6560 Implement extended slicing in bytes objects.
Thomas Wouters <thomas@python.org>
parents: 39643
diff changeset
628 Py_ssize_t lim = step - 1;
9548ca0e6560 Implement extended slicing in bytes objects.
Thomas Wouters <thomas@python.org>
parents: 39643
diff changeset
629
9548ca0e6560 Implement extended slicing in bytes objects.
Thomas Wouters <thomas@python.org>
parents: 39643
diff changeset
630 if (cur + step >= PyBytes_GET_SIZE(self))
9548ca0e6560 Implement extended slicing in bytes objects.
Thomas Wouters <thomas@python.org>
parents: 39643
diff changeset
631 lim = PyBytes_GET_SIZE(self) - cur - 1;
41448
458c8db2e946 Clean up trailing whitespace.
Guido van Rossum <guido@python.org>
parents: 41426
diff changeset
632
40472
9548ca0e6560 Implement extended slicing in bytes objects.
Thomas Wouters <thomas@python.org>
parents: 39643
diff changeset
633 memmove(self->ob_bytes + cur - i,
9548ca0e6560 Implement extended slicing in bytes objects.
Thomas Wouters <thomas@python.org>
parents: 39643
diff changeset
634 self->ob_bytes + cur + 1, lim);
9548ca0e6560 Implement extended slicing in bytes objects.
Thomas Wouters <thomas@python.org>
parents: 39643
diff changeset
635 }
9548ca0e6560 Implement extended slicing in bytes objects.
Thomas Wouters <thomas@python.org>
parents: 39643
diff changeset
636 /* Move the tail of the bytes, in one chunk */
9548ca0e6560 Implement extended slicing in bytes objects.
Thomas Wouters <thomas@python.org>
parents: 39643
diff changeset
637 cur = start + slicelen*step;
9548ca0e6560 Implement extended slicing in bytes objects.
Thomas Wouters <thomas@python.org>
parents: 39643
diff changeset
638 if (cur < PyBytes_GET_SIZE(self)) {
9548ca0e6560 Implement extended slicing in bytes objects.
Thomas Wouters <thomas@python.org>
parents: 39643
diff changeset
639 memmove(self->ob_bytes + cur - slicelen,
9548ca0e6560 Implement extended slicing in bytes objects.
Thomas Wouters <thomas@python.org>
parents: 39643
diff changeset
640 self->ob_bytes + cur,
9548ca0e6560 Implement extended slicing in bytes objects.
Thomas Wouters <thomas@python.org>
parents: 39643
diff changeset
641 PyBytes_GET_SIZE(self) - cur);
9548ca0e6560 Implement extended slicing in bytes objects.
Thomas Wouters <thomas@python.org>
parents: 39643
diff changeset
642 }
9548ca0e6560 Implement extended slicing in bytes objects.
Thomas Wouters <thomas@python.org>
parents: 39643
diff changeset
643 if (PyBytes_Resize((PyObject *)self,
9548ca0e6560 Implement extended slicing in bytes objects.
Thomas Wouters <thomas@python.org>
parents: 39643
diff changeset
644 PyBytes_GET_SIZE(self) - slicelen) < 0)
9548ca0e6560 Implement extended slicing in bytes objects.
Thomas Wouters <thomas@python.org>
parents: 39643
diff changeset
645 return -1;
9548ca0e6560 Implement extended slicing in bytes objects.
Thomas Wouters <thomas@python.org>
parents: 39643
diff changeset
646
9548ca0e6560 Implement extended slicing in bytes objects.
Thomas Wouters <thomas@python.org>
parents: 39643
diff changeset
647 return 0;
9548ca0e6560 Implement extended slicing in bytes objects.
Thomas Wouters <thomas@python.org>
parents: 39643
diff changeset
648 }
9548ca0e6560 Implement extended slicing in bytes objects.
Thomas Wouters <thomas@python.org>
parents: 39643
diff changeset
649 else {
9548ca0e6560 Implement extended slicing in bytes objects.
Thomas Wouters <thomas@python.org>
parents: 39643
diff changeset
650 /* Assign slice */
9548ca0e6560 Implement extended slicing in bytes objects.
Thomas Wouters <thomas@python.org>
parents: 39643
diff changeset
651 Py_ssize_t cur, i;
41448
458c8db2e946 Clean up trailing whitespace.
Guido van Rossum <guido@python.org>
parents: 41426
diff changeset
652
40472
9548ca0e6560 Implement extended slicing in bytes objects.
Thomas Wouters <thomas@python.org>
parents: 39643
diff changeset
653 if (needed != slicelen) {
9548ca0e6560 Implement extended slicing in bytes objects.
Thomas Wouters <thomas@python.org>
parents: 39643
diff changeset
654 PyErr_Format(PyExc_ValueError,
9548ca0e6560 Implement extended slicing in bytes objects.
Thomas Wouters <thomas@python.org>
parents: 39643
diff changeset
655 "attempt to assign bytes of size %zd "
9548ca0e6560 Implement extended slicing in bytes objects.
Thomas Wouters <thomas@python.org>
parents: 39643
diff changeset
656 "to extended slice of size %zd",
9548ca0e6560 Implement extended slicing in bytes objects.
Thomas Wouters <thomas@python.org>
parents: 39643
diff changeset
657 needed, slicelen);
9548ca0e6560 Implement extended slicing in bytes objects.
Thomas Wouters <thomas@python.org>
parents: 39643
diff changeset
658 return -1;
9548ca0e6560 Implement extended slicing in bytes objects.
Thomas Wouters <thomas@python.org>
parents: 39643
diff changeset
659 }
9548ca0e6560 Implement extended slicing in bytes objects.
Thomas Wouters <thomas@python.org>
parents: 39643
diff changeset
660 for (cur = start, i = 0; i < slicelen; cur += step, i++)
9548ca0e6560 Implement extended slicing in bytes objects.
Thomas Wouters <thomas@python.org>
parents: 39643
diff changeset
661 self->ob_bytes[cur] = bytes[i];
9548ca0e6560 Implement extended slicing in bytes objects.
Thomas Wouters <thomas@python.org>
parents: 39643
diff changeset
662 return 0;
9548ca0e6560 Implement extended slicing in bytes objects.
Thomas Wouters <thomas@python.org>
parents: 39643
diff changeset
663 }
9548ca0e6560 Implement extended slicing in bytes objects.
Thomas Wouters <thomas@python.org>
parents: 39643
diff changeset
664 }
9548ca0e6560 Implement extended slicing in bytes objects.
Thomas Wouters <thomas@python.org>
parents: 39643
diff changeset
665 }
9548ca0e6560 Implement extended slicing in bytes objects.
Thomas Wouters <thomas@python.org>
parents: 39643
diff changeset
666
9548ca0e6560 Implement extended slicing in bytes objects.
Thomas Wouters <thomas@python.org>
parents: 39643
diff changeset
667 static int
37927
a7f3765ea464 Here is a bytes type. It's very minimal but it's a start.
Guido van Rossum <guido@python.org>
parents:
diff changeset
668 bytes_init(PyBytesObject *self, PyObject *args, PyObject *kwds)
a7f3765ea464 Here is a bytes type. It's very minimal but it's a start.
Guido van Rossum <guido@python.org>
parents:
diff changeset
669 {
37960
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
670 static char *kwlist[] = {"source", "encoding", "errors", 0};
37927
a7f3765ea464 Here is a bytes type. It's very minimal but it's a start.
Guido van Rossum <guido@python.org>
parents:
diff changeset
671 PyObject *arg = NULL;
37960
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
672 const char *encoding = NULL;
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
673 const char *errors = NULL;
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
674 Py_ssize_t count;
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
675 PyObject *it;
37927
a7f3765ea464 Here is a bytes type. It's very minimal but it's a start.
Guido van Rossum <guido@python.org>
parents:
diff changeset
676 PyObject *(*iternext)(PyObject *);
a7f3765ea464 Here is a bytes type. It's very minimal but it's a start.
Guido van Rossum <guido@python.org>
parents:
diff changeset
677
38115
a6a1359aab84 Optimizations for bytes reallocation.
Guido van Rossum <guido@python.org>
parents: 38017
diff changeset
678 if (self->ob_size != 0) {
a6a1359aab84 Optimizations for bytes reallocation.
Guido van Rossum <guido@python.org>
parents: 38017
diff changeset
679 /* Empty previous contents (yes, do this first of all!) */
a6a1359aab84 Optimizations for bytes reallocation.
Guido van Rossum <guido@python.org>
parents: 38017
diff changeset
680 if (PyBytes_Resize((PyObject *)self, 0) < 0)
a6a1359aab84 Optimizations for bytes reallocation.
Guido van Rossum <guido@python.org>
parents: 38017
diff changeset
681 return -1;
a6a1359aab84 Optimizations for bytes reallocation.
Guido van Rossum <guido@python.org>
parents: 38017
diff changeset
682 }
37960
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
683
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
684 /* Parse arguments */
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
685 if (!PyArg_ParseTupleAndKeywords(args, kwds, "|Oss:bytes", kwlist,
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
686 &arg, &encoding, &errors))
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
687 return -1;
37927
a7f3765ea464 Here is a bytes type. It's very minimal but it's a start.
Guido van Rossum <guido@python.org>
parents:
diff changeset
688
37960
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
689 /* Make a quick exit if no first argument */
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
690 if (arg == NULL) {
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
691 if (encoding != NULL || errors != NULL) {
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
692 PyErr_SetString(PyExc_TypeError,
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
693 "encoding or errors without sequence argument");
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
694 return -1;
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
695 }
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
696 return 0;
37927
a7f3765ea464 Here is a bytes type. It's very minimal but it's a start.
Guido van Rossum <guido@python.org>
parents:
diff changeset
697 }
a7f3765ea464 Here is a bytes type. It's very minimal but it's a start.
Guido van Rossum <guido@python.org>
parents:
diff changeset
698
37960
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
699 if (PyUnicode_Check(arg)) {
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
700 /* Encode via the codec registry */
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
701 PyObject *encoded;
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
702 char *bytes;
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
703 Py_ssize_t size;
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
704 if (encoding == NULL)
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
705 encoding = PyUnicode_GetDefaultEncoding();
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
706 encoded = PyCodec_Encode(arg, encoding, errors);
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
707 if (encoded == NULL)
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
708 return -1;
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
709 if (!PyString_Check(encoded)) {
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
710 PyErr_Format(PyExc_TypeError,
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
711 "encoder did not return a string object (type=%.400s)",
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
712 encoded->ob_type->tp_name);
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
713 Py_DECREF(encoded);
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
714 return -1;
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
715 }
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
716 bytes = PyString_AS_STRING(encoded);
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
717 size = PyString_GET_SIZE(encoded);
41597
cb3c92062ec4 Add trailing null bytes to a few more places.
Guido van Rossum <guido@python.org>
parents: 41595
diff changeset
718 if (size < self->ob_alloc) {
38115
a6a1359aab84 Optimizations for bytes reallocation.
Guido van Rossum <guido@python.org>
parents: 38017
diff changeset
719 self->ob_size = size;
41597
cb3c92062ec4 Add trailing null bytes to a few more places.
Guido van Rossum <guido@python.org>
parents: 41595
diff changeset
720 self->ob_bytes[self->ob_size] = '\0'; /* Trailing null byte */
cb3c92062ec4 Add trailing null bytes to a few more places.
Guido van Rossum <guido@python.org>
parents: 41595
diff changeset
721 }
38115
a6a1359aab84 Optimizations for bytes reallocation.
Guido van Rossum <guido@python.org>
parents: 38017
diff changeset
722 else if (PyBytes_Resize((PyObject *)self, size) < 0) {
37960
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
723 Py_DECREF(encoded);
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
724 return -1;
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
725 }
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
726 memcpy(self->ob_bytes, bytes, size);
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
727 Py_DECREF(encoded);
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
728 return 0;
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
729 }
37927
a7f3765ea464 Here is a bytes type. It's very minimal but it's a start.
Guido van Rossum <guido@python.org>
parents:
diff changeset
730
37960
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
731 /* If it's not unicode, there can't be encoding or errors */
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
732 if (encoding != NULL || errors != NULL) {
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
733 PyErr_SetString(PyExc_TypeError,
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
734 "encoding or errors without a string argument");
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
735 return -1;
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
736 }
37927
a7f3765ea464 Here is a bytes type. It's very minimal but it's a start.
Guido van Rossum <guido@python.org>
parents:
diff changeset
737
37960
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
738 /* Is it an int? */
39631
8d71f9a6c1c3 Make bytesobject raise ValueError instead of TypeError again (thanks, Nick)
Thomas Wouters <thomas@python.org>
parents: 39610
diff changeset
739 count = PyNumber_AsSsize_t(arg, PyExc_ValueError);
37960
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
740 if (count == -1 && PyErr_Occurred())
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
741 PyErr_Clear();
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
742 else {
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
743 if (count < 0) {
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
744 PyErr_SetString(PyExc_ValueError, "negative count");
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
745 return -1;
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
746 }
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
747 if (count > 0) {
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
748 if (PyBytes_Resize((PyObject *)self, count))
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
749 return -1;
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
750 memset(self->ob_bytes, 0, count);
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
751 }
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
752 return 0;
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
753 }
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
754
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
755 if (PyObject_CheckReadBuffer(arg)) {
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
756 const void *bytes;
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
757 Py_ssize_t size;
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
758 if (PyObject_AsReadBuffer(arg, &bytes, &size) < 0)
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
759 return -1;
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
760 if (PyBytes_Resize((PyObject *)self, size) < 0)
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
761 return -1;
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
762 memcpy(self->ob_bytes, bytes, size);
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
763 return 0;
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
764 }
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
765
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
766 /* XXX Optimize this if the arguments is a list, tuple */
37927
a7f3765ea464 Here is a bytes type. It's very minimal but it's a start.
Guido van Rossum <guido@python.org>
parents:
diff changeset
767
a7f3765ea464 Here is a bytes type. It's very minimal but it's a start.
Guido van Rossum <guido@python.org>
parents:
diff changeset
768 /* Get the iterator */
a7f3765ea464 Here is a bytes type. It's very minimal but it's a start.
Guido van Rossum <guido@python.org>
parents:
diff changeset
769 it = PyObject_GetIter(arg);
a7f3765ea464 Here is a bytes type. It's very minimal but it's a start.
Guido van Rossum <guido@python.org>
parents:
diff changeset
770 if (it == NULL)
37960
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
771 return -1;
37927
a7f3765ea464 Here is a bytes type. It's very minimal but it's a start.
Guido van Rossum <guido@python.org>
parents:
diff changeset
772 iternext = *it->ob_type->tp_iternext;
a7f3765ea464 Here is a bytes type. It's very minimal but it's a start.
Guido van Rossum <guido@python.org>
parents:
diff changeset
773
a7f3765ea464 Here is a bytes type. It's very minimal but it's a start.
Guido van Rossum <guido@python.org>
parents:
diff changeset
774 /* Run the iterator to exhaustion */
a7f3765ea464 Here is a bytes type. It's very minimal but it's a start.
Guido van Rossum <guido@python.org>
parents:
diff changeset
775 for (;;) {
37960
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
776 PyObject *item;
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
777 Py_ssize_t value;
37927
a7f3765ea464 Here is a bytes type. It's very minimal but it's a start.
Guido van Rossum <guido@python.org>
parents:
diff changeset
778
37960
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
779 /* Get the next item */
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
780 item = iternext(it);
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
781 if (item == NULL) {
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
782 if (PyErr_Occurred()) {
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
783 if (!PyErr_ExceptionMatches(PyExc_StopIteration))
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
784 goto error;
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
785 PyErr_Clear();
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
786 }
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
787 break;
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
788 }
37927
a7f3765ea464 Here is a bytes type. It's very minimal but it's a start.
Guido van Rossum <guido@python.org>
parents:
diff changeset
789
37960
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
790 /* Interpret it as an int (__index__) */
39631
8d71f9a6c1c3 Make bytesobject raise ValueError instead of TypeError again (thanks, Nick)
Thomas Wouters <thomas@python.org>
parents: 39610
diff changeset
791 value = PyNumber_AsSsize_t(item, PyExc_ValueError);
37960
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
792 Py_DECREF(item);
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
793 if (value == -1 && PyErr_Occurred())
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
794 goto error;
37927
a7f3765ea464 Here is a bytes type. It's very minimal but it's a start.
Guido van Rossum <guido@python.org>
parents:
diff changeset
795
37960
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
796 /* Range check */
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
797 if (value < 0 || value >= 256) {
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
798 PyErr_SetString(PyExc_ValueError,
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
799 "bytes must be in range(0, 256)");
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
800 goto error;
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
801 }
37927
a7f3765ea464 Here is a bytes type. It's very minimal but it's a start.
Guido van Rossum <guido@python.org>
parents:
diff changeset
802
37960
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
803 /* Append the byte */
38115
a6a1359aab84 Optimizations for bytes reallocation.
Guido van Rossum <guido@python.org>
parents: 38017
diff changeset
804 if (self->ob_size < self->ob_alloc)
a6a1359aab84 Optimizations for bytes reallocation.
Guido van Rossum <guido@python.org>
parents: 38017
diff changeset
805 self->ob_size++;
a6a1359aab84 Optimizations for bytes reallocation.
Guido van Rossum <guido@python.org>
parents: 38017
diff changeset
806 else if (PyBytes_Resize((PyObject *)self, self->ob_size+1) < 0)
37960
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
807 goto error;
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
808 self->ob_bytes[self->ob_size-1] = value;
37927
a7f3765ea464 Here is a bytes type. It's very minimal but it's a start.
Guido van Rossum <guido@python.org>
parents:
diff changeset
809 }
a7f3765ea464 Here is a bytes type. It's very minimal but it's a start.
Guido van Rossum <guido@python.org>
parents:
diff changeset
810
a7f3765ea464 Here is a bytes type. It's very minimal but it's a start.
Guido van Rossum <guido@python.org>
parents:
diff changeset
811 /* Clean up and return success */
a7f3765ea464 Here is a bytes type. It's very minimal but it's a start.
Guido van Rossum <guido@python.org>
parents:
diff changeset
812 Py_DECREF(it);
a7f3765ea464 Here is a bytes type. It's very minimal but it's a start.
Guido van Rossum <guido@python.org>
parents:
diff changeset
813 return 0;
a7f3765ea464 Here is a bytes type. It's very minimal but it's a start.
Guido van Rossum <guido@python.org>
parents:
diff changeset
814
a7f3765ea464 Here is a bytes type. It's very minimal but it's a start.
Guido van Rossum <guido@python.org>
parents:
diff changeset
815 error:
a7f3765ea464 Here is a bytes type. It's very minimal but it's a start.
Guido van Rossum <guido@python.org>
parents:
diff changeset
816 /* Error handling when it != NULL */
a7f3765ea464 Here is a bytes type. It's very minimal but it's a start.
Guido van Rossum <guido@python.org>
parents:
diff changeset
817 Py_DECREF(it);
a7f3765ea464 Here is a bytes type. It's very minimal but it's a start.
Guido van Rossum <guido@python.org>
parents:
diff changeset
818 return -1;
a7f3765ea464 Here is a bytes type. It's very minimal but it's a start.
Guido van Rossum <guido@python.org>
parents:
diff changeset
819 }
a7f3765ea464 Here is a bytes type. It's very minimal but it's a start.
Guido van Rossum <guido@python.org>
parents:
diff changeset
820
40898
b58a4374ac21 Make bytes_repr return a string containing a b"" literal.
Georg Brandl <georg@python.org>
parents: 40472
diff changeset
821 /* Mostly copied from string_repr, but without the
b58a4374ac21 Make bytes_repr return a string containing a b"" literal.
Georg Brandl <georg@python.org>
parents: 40472
diff changeset
822 "smart quote" functionality. */
37927
a7f3765ea464 Here is a bytes type. It's very minimal but it's a start.
Guido van Rossum <guido@python.org>
parents:
diff changeset
823 static PyObject *
a7f3765ea464 Here is a bytes type. It's very minimal but it's a start.
Guido van Rossum <guido@python.org>
parents:
diff changeset
824 bytes_repr(PyBytesObject *self)
a7f3765ea464 Here is a bytes type. It's very minimal but it's a start.
Guido van Rossum <guido@python.org>
parents:
diff changeset
825 {
40898
b58a4374ac21 Make bytes_repr return a string containing a b"" literal.
Georg Brandl <georg@python.org>
parents: 40472
diff changeset
826 size_t newsize = 3 + 4 * self->ob_size;
b58a4374ac21 Make bytes_repr return a string containing a b"" literal.
Georg Brandl <georg@python.org>
parents: 40472
diff changeset
827 PyObject *v;
b58a4374ac21 Make bytes_repr return a string containing a b"" literal.
Georg Brandl <georg@python.org>
parents: 40472
diff changeset
828 if (newsize > PY_SSIZE_T_MAX || newsize / 4 != self->ob_size) {
b58a4374ac21 Make bytes_repr return a string containing a b"" literal.
Georg Brandl <georg@python.org>
parents: 40472
diff changeset
829 PyErr_SetString(PyExc_OverflowError,
b58a4374ac21 Make bytes_repr return a string containing a b"" literal.
Georg Brandl <georg@python.org>
parents: 40472
diff changeset
830 "bytes object is too large to make repr");
37960
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
831 return NULL;
40898
b58a4374ac21 Make bytes_repr return a string containing a b"" literal.
Georg Brandl <georg@python.org>
parents: 40472
diff changeset
832 }
b58a4374ac21 Make bytes_repr return a string containing a b"" literal.
Georg Brandl <georg@python.org>
parents: 40472
diff changeset
833 v = PyString_FromStringAndSize((char *)NULL, newsize);
b58a4374ac21 Make bytes_repr return a string containing a b"" literal.
Georg Brandl <georg@python.org>
parents: 40472
diff changeset
834 if (v == NULL) {
b58a4374ac21 Make bytes_repr return a string containing a b"" literal.
Georg Brandl <georg@python.org>
parents: 40472
diff changeset
835 return NULL;
b58a4374ac21 Make bytes_repr return a string containing a b"" literal.
Georg Brandl <georg@python.org>
parents: 40472
diff changeset
836 }
b58a4374ac21 Make bytes_repr return a string containing a b"" literal.
Georg Brandl <georg@python.org>
parents: 40472
diff changeset
837 else {
b58a4374ac21 Make bytes_repr return a string containing a b"" literal.
Georg Brandl <georg@python.org>
parents: 40472
diff changeset
838 register Py_ssize_t i;
b58a4374ac21 Make bytes_repr return a string containing a b"" literal.
Georg Brandl <georg@python.org>
parents: 40472
diff changeset
839 register char c;
b58a4374ac21 Make bytes_repr return a string containing a b"" literal.
Georg Brandl <georg@python.org>
parents: 40472
diff changeset
840 register char *p;
b58a4374ac21 Make bytes_repr return a string containing a b"" literal.
Georg Brandl <georg@python.org>
parents: 40472
diff changeset
841 int quote = '\'';
37927
a7f3765ea464 Here is a bytes type. It's very minimal but it's a start.
Guido van Rossum <guido@python.org>
parents:
diff changeset
842
40898
b58a4374ac21 Make bytes_repr return a string containing a b"" literal.
Georg Brandl <georg@python.org>
parents: 40472
diff changeset
843 p = PyString_AS_STRING(v);
b58a4374ac21 Make bytes_repr return a string containing a b"" literal.
Georg Brandl <georg@python.org>
parents: 40472
diff changeset
844 *p++ = 'b';
b58a4374ac21 Make bytes_repr return a string containing a b"" literal.
Georg Brandl <georg@python.org>
parents: 40472
diff changeset
845 *p++ = quote;
b58a4374ac21 Make bytes_repr return a string containing a b"" literal.
Georg Brandl <georg@python.org>
parents: 40472
diff changeset
846 for (i = 0; i < self->ob_size; i++) {
b58a4374ac21 Make bytes_repr return a string containing a b"" literal.
Georg Brandl <georg@python.org>
parents: 40472
diff changeset
847 /* There's at least enough room for a hex escape
b58a4374ac21 Make bytes_repr return a string containing a b"" literal.
Georg Brandl <georg@python.org>
parents: 40472
diff changeset
848 and a closing quote. */
b58a4374ac21 Make bytes_repr return a string containing a b"" literal.
Georg Brandl <georg@python.org>
parents: 40472
diff changeset
849 assert(newsize - (p - PyString_AS_STRING(v)) >= 5);
b58a4374ac21 Make bytes_repr return a string containing a b"" literal.
Georg Brandl <georg@python.org>
parents: 40472
diff changeset
850 c = self->ob_bytes[i];
b58a4374ac21 Make bytes_repr return a string containing a b"" literal.
Georg Brandl <georg@python.org>
parents: 40472
diff changeset
851 if (c == quote || c == '\\')
b58a4374ac21 Make bytes_repr return a string containing a b"" literal.
Georg Brandl <georg@python.org>
parents: 40472
diff changeset
852 *p++ = '\\', *p++ = c;
b58a4374ac21 Make bytes_repr return a string containing a b"" literal.
Georg Brandl <georg@python.org>
parents: 40472
diff changeset
853 else if (c == '\t')
b58a4374ac21 Make bytes_repr return a string containing a b"" literal.
Georg Brandl <georg@python.org>
parents: 40472
diff changeset
854 *p++ = '\\', *p++ = 't';
b58a4374ac21 Make bytes_repr return a string containing a b"" literal.
Georg Brandl <georg@python.org>
parents: 40472
diff changeset
855 else if (c == '\n')
b58a4374ac21 Make bytes_repr return a string containing a b"" literal.
Georg Brandl <georg@python.org>
parents: 40472
diff changeset
856 *p++ = '\\', *p++ = 'n';
b58a4374ac21 Make bytes_repr return a string containing a b"" literal.
Georg Brandl <georg@python.org>
parents: 40472
diff changeset
857 else if (c == '\r')
b58a4374ac21 Make bytes_repr return a string containing a b"" literal.
Georg Brandl <georg@python.org>
parents: 40472
diff changeset
858 *p++ = '\\', *p++ = 'r';
b58a4374ac21 Make bytes_repr return a string containing a b"" literal.
Georg Brandl <georg@python.org>
parents: 40472
diff changeset
859 else if (c == 0)
b58a4374ac21 Make bytes_repr return a string containing a b"" literal.
Georg Brandl <georg@python.org>
parents: 40472
diff changeset
860 *p++ = '\\', *p++ = '0';
b58a4374ac21 Make bytes_repr return a string containing a b"" literal.
Georg Brandl <georg@python.org>
parents: 40472
diff changeset
861 else if (c < ' ' || c >= 0x7f) {
b58a4374ac21 Make bytes_repr return a string containing a b"" literal.
Georg Brandl <georg@python.org>
parents: 40472
diff changeset
862 /* For performance, we don't want to call
b58a4374ac21 Make bytes_repr return a string containing a b"" literal.
Georg Brandl <georg@python.org>
parents: 40472
diff changeset
863 PyOS_snprintf here (extra layers of
b58a4374ac21 Make bytes_repr return a string containing a b"" literal.
Georg Brandl <georg@python.org>
parents: 40472
diff changeset
864 function call). */
b58a4374ac21 Make bytes_repr return a string containing a b"" literal.
Georg Brandl <georg@python.org>
parents: 40472
diff changeset
865 sprintf(p, "\\x%02x", c & 0xff);
b58a4374ac21 Make bytes_repr return a string containing a b"" literal.
Georg Brandl <georg@python.org>
parents: 40472
diff changeset
866 p += 4;
b58a4374ac21 Make bytes_repr return a string containing a b"" literal.
Georg Brandl <georg@python.org>
parents: 40472
diff changeset
867 }
b58a4374ac21 Make bytes_repr return a string containing a b"" literal.
Georg Brandl <georg@python.org>
parents: 40472
diff changeset
868 else
b58a4374ac21 Make bytes_repr return a string containing a b"" literal.
Georg Brandl <georg@python.org>
parents: 40472
diff changeset
869 *p++ = c;
b58a4374ac21 Make bytes_repr return a string containing a b"" literal.
Georg Brandl <georg@python.org>
parents: 40472
diff changeset
870 }
b58a4374ac21 Make bytes_repr return a string containing a b"" literal.
Georg Brandl <georg@python.org>
parents: 40472
diff changeset
871 assert(newsize - (p - PyString_AS_STRING(v)) >= 1);
b58a4374ac21 Make bytes_repr return a string containing a b"" literal.
Georg Brandl <georg@python.org>
parents: 40472
diff changeset
872 *p++ = quote;
b58a4374ac21 Make bytes_repr return a string containing a b"" literal.
Georg Brandl <georg@python.org>
parents: 40472
diff changeset
873 *p = '\0';
b58a4374ac21 Make bytes_repr return a string containing a b"" literal.
Georg Brandl <georg@python.org>
parents: 40472
diff changeset
874 _PyString_Resize(
b58a4374ac21 Make bytes_repr return a string containing a b"" literal.
Georg Brandl <georg@python.org>
parents: 40472
diff changeset
875 &v, (p - PyString_AS_STRING(v)));
b58a4374ac21 Make bytes_repr return a string containing a b"" literal.
Georg Brandl <georg@python.org>
parents: 40472
diff changeset
876 return v;
37927
a7f3765ea464 Here is a bytes type. It's very minimal but it's a start.
Guido van Rossum <guido@python.org>
parents:
diff changeset
877 }
a7f3765ea464 Here is a bytes type. It's very minimal but it's a start.
Guido van Rossum <guido@python.org>
parents:
diff changeset
878 }
a7f3765ea464 Here is a bytes type. It's very minimal but it's a start.
Guido van Rossum <guido@python.org>
parents:
diff changeset
879
a7f3765ea464 Here is a bytes type. It's very minimal but it's a start.
Guido van Rossum <guido@python.org>
parents:
diff changeset
880 static PyObject *
37960
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
881 bytes_str(PyBytesObject *self)
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
882 {
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
883 return PyString_FromStringAndSize(self->ob_bytes, self->ob_size);
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
884 }
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
885
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
886 static PyObject *
41411
339015d98b78 For Make Benefit Glorious Nation of Backwards Compatibility,
Guido van Rossum <guido@python.org>
parents: 40982
diff changeset
887 bytes_richcompare(PyObject *self, PyObject *other, int op)
37927
a7f3765ea464 Here is a bytes type. It's very minimal but it's a start.
Guido van Rossum <guido@python.org>
parents:
diff changeset
888 {
41411
339015d98b78 For Make Benefit Glorious Nation of Backwards Compatibility,
Guido van Rossum <guido@python.org>
parents: 40982
diff changeset
889 Py_ssize_t self_size, other_size;
339015d98b78 For Make Benefit Glorious Nation of Backwards Compatibility,
Guido van Rossum <guido@python.org>
parents: 40982
diff changeset
890 void *self_bytes, *other_bytes;
37927
a7f3765ea464 Here is a bytes type. It's very minimal but it's a start.
Guido van Rossum <guido@python.org>
parents:
diff changeset
891 PyObject *res;
41411
339015d98b78 For Make Benefit Glorious Nation of Backwards Compatibility,
Guido van Rossum <guido@python.org>
parents: 40982
diff changeset
892 Py_ssize_t minsize;
37927
a7f3765ea464 Here is a bytes type. It's very minimal but it's a start.
Guido van Rossum <guido@python.org>
parents:
diff changeset
893 int cmp;
a7f3765ea464 Here is a bytes type. It's very minimal but it's a start.
Guido van Rossum <guido@python.org>
parents:
diff changeset
894
41450
d1c3dd184e38 Rough and dirty job -- allow concatenation of bytes and arbitrary
Guido van Rossum <guido@python.org>
parents: 41448
diff changeset
895 /* Bytes can be compared to anything that supports the (binary) buffer
d1c3dd184e38 Rough and dirty job -- allow concatenation of bytes and arbitrary
Guido van Rossum <guido@python.org>
parents: 41448
diff changeset
896 API. Except Unicode. */
d1c3dd184e38 Rough and dirty job -- allow concatenation of bytes and arbitrary
Guido van Rossum <guido@python.org>
parents: 41448
diff changeset
897
d1c3dd184e38 Rough and dirty job -- allow concatenation of bytes and arbitrary
Guido van Rossum <guido@python.org>
parents: 41448
diff changeset
898 self_size = _getbuffer(self, &self_bytes);
d1c3dd184e38 Rough and dirty job -- allow concatenation of bytes and arbitrary
Guido van Rossum <guido@python.org>
parents: 41448
diff changeset
899 if (self_size < 0) {
41412
522b3f35d0eb Bytes should never equal unicode.
Guido van Rossum <guido@python.org>
parents: 41411
diff changeset
900 Py_INCREF(Py_NotImplemented);
522b3f35d0eb Bytes should never equal unicode.
Guido van Rossum <guido@python.org>
parents: 41411
diff changeset
901 return Py_NotImplemented;
522b3f35d0eb Bytes should never equal unicode.
Guido van Rossum <guido@python.org>
parents: 41411
diff changeset
902 }
41411
339015d98b78 For Make Benefit Glorious Nation of Backwards Compatibility,
Guido van Rossum <guido@python.org>
parents: 40982
diff changeset
903
41450
d1c3dd184e38 Rough and dirty job -- allow concatenation of bytes and arbitrary
Guido van Rossum <guido@python.org>
parents: 41448
diff changeset
904 other_size = _getbuffer(other, &other_bytes);
d1c3dd184e38 Rough and dirty job -- allow concatenation of bytes and arbitrary
Guido van Rossum <guido@python.org>
parents: 41448
diff changeset
905 if (other_size < 0) {
37960
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
906 Py_INCREF(Py_NotImplemented);
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
907 return Py_NotImplemented;
37927
a7f3765ea464 Here is a bytes type. It's very minimal but it's a start.
Guido van Rossum <guido@python.org>
parents:
diff changeset
908 }
41411
339015d98b78 For Make Benefit Glorious Nation of Backwards Compatibility,
Guido van Rossum <guido@python.org>
parents: 40982
diff changeset
909
339015d98b78 For Make Benefit Glorious Nation of Backwards Compatibility,
Guido van Rossum <guido@python.org>
parents: 40982
diff changeset
910 if (self_size != other_size && (op == Py_EQ || op == Py_NE)) {
37960
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
911 /* Shortcut: if the lengths differ, the objects differ */
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
912 cmp = (op == Py_NE);
37927
a7f3765ea464 Here is a bytes type. It's very minimal but it's a start.
Guido van Rossum <guido@python.org>
parents:
diff changeset
913 }
a7f3765ea464 Here is a bytes type. It's very minimal but it's a start.
Guido van Rossum <guido@python.org>
parents:
diff changeset
914 else {
41411
339015d98b78 For Make Benefit Glorious Nation of Backwards Compatibility,
Guido van Rossum <guido@python.org>
parents: 40982
diff changeset
915 minsize = self_size;
339015d98b78 For Make Benefit Glorious Nation of Backwards Compatibility,
Guido van Rossum <guido@python.org>
parents: 40982
diff changeset
916 if (other_size < minsize)
339015d98b78 For Make Benefit Glorious Nation of Backwards Compatibility,
Guido van Rossum <guido@python.org>
parents: 40982
diff changeset
917 minsize = other_size;
37927
a7f3765ea464 Here is a bytes type. It's very minimal but it's a start.
Guido van Rossum <guido@python.org>
parents:
diff changeset
918
41411
339015d98b78 For Make Benefit Glorious Nation of Backwards Compatibility,
Guido van Rossum <guido@python.org>
parents: 40982
diff changeset
919 cmp = memcmp(self_bytes, other_bytes, minsize);
37960
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
920 /* In ISO C, memcmp() guarantees to use unsigned bytes! */
37927
a7f3765ea464 Here is a bytes type. It's very minimal but it's a start.
Guido van Rossum <guido@python.org>
parents:
diff changeset
921
37960
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
922 if (cmp == 0) {
41411
339015d98b78 For Make Benefit Glorious Nation of Backwards Compatibility,
Guido van Rossum <guido@python.org>
parents: 40982
diff changeset
923 if (self_size < other_size)
37960
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
924 cmp = -1;
41411
339015d98b78 For Make Benefit Glorious Nation of Backwards Compatibility,
Guido van Rossum <guido@python.org>
parents: 40982
diff changeset
925 else if (self_size > other_size)
37960
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
926 cmp = 1;
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
927 }
37927
a7f3765ea464 Here is a bytes type. It's very minimal but it's a start.
Guido van Rossum <guido@python.org>
parents:
diff changeset
928
37960
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
929 switch (op) {
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
930 case Py_LT: cmp = cmp < 0; break;
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
931 case Py_LE: cmp = cmp <= 0; break;
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
932 case Py_EQ: cmp = cmp == 0; break;
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
933 case Py_NE: cmp = cmp != 0; break;
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
934 case Py_GT: cmp = cmp > 0; break;
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
935 case Py_GE: cmp = cmp >= 0; break;
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
936 }
37927
a7f3765ea464 Here is a bytes type. It's very minimal but it's a start.
Guido van Rossum <guido@python.org>
parents:
diff changeset
937 }
a7f3765ea464 Here is a bytes type. It's very minimal but it's a start.
Guido van Rossum <guido@python.org>
parents:
diff changeset
938
a7f3765ea464 Here is a bytes type. It's very minimal but it's a start.
Guido van Rossum <guido@python.org>
parents:
diff changeset
939 res = cmp ? Py_True : Py_False;
a7f3765ea464 Here is a bytes type. It's very minimal but it's a start.
Guido van Rossum <guido@python.org>
parents:
diff changeset
940 Py_INCREF(res);
a7f3765ea464 Here is a bytes type. It's very minimal but it's a start.
Guido van Rossum <guido@python.org>
parents:
diff changeset
941 return res;
a7f3765ea464 Here is a bytes type. It's very minimal but it's a start.
Guido van Rossum <guido@python.org>
parents:
diff changeset
942 }
a7f3765ea464 Here is a bytes type. It's very minimal but it's a start.
Guido van Rossum <guido@python.org>
parents:
diff changeset
943
a7f3765ea464 Here is a bytes type. It's very minimal but it's a start.
Guido van Rossum <guido@python.org>
parents:
diff changeset
944 static void
a7f3765ea464 Here is a bytes type. It's very minimal but it's a start.
Guido van Rossum <guido@python.org>
parents:
diff changeset
945 bytes_dealloc(PyBytesObject *self)
a7f3765ea464 Here is a bytes type. It's very minimal but it's a start.
Guido van Rossum <guido@python.org>
parents:
diff changeset
946 {
37960
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
947 if (self->ob_bytes != 0) {
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
948 PyMem_Free(self->ob_bytes);
37927
a7f3765ea464 Here is a bytes type. It's very minimal but it's a start.
Guido van Rossum <guido@python.org>
parents:
diff changeset
949 }
a7f3765ea464 Here is a bytes type. It's very minimal but it's a start.
Guido van Rossum <guido@python.org>
parents:
diff changeset
950 self->ob_type->tp_free((PyObject *)self);
a7f3765ea464 Here is a bytes type. It's very minimal but it's a start.
Guido van Rossum <guido@python.org>
parents:
diff changeset
951 }
a7f3765ea464 Here is a bytes type. It's very minimal but it's a start.
Guido van Rossum <guido@python.org>
parents:
diff changeset
952
37960
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
953 static Py_ssize_t
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
954 bytes_getbuffer(PyBytesObject *self, Py_ssize_t index, const void **ptr)
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
955 {
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
956 if (index != 0) {
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
957 PyErr_SetString(PyExc_SystemError,
40978
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
958 "accessing non-existent bytes segment");
37960
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
959 return -1;
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
960 }
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
961 *ptr = (void *)self->ob_bytes;
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
962 return self->ob_size;
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
963 }
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
964
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
965 static Py_ssize_t
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
966 bytes_getsegcount(PyStringObject *self, Py_ssize_t *lenp)
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
967 {
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
968 if (lenp)
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
969 *lenp = self->ob_size;
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
970 return 1;
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
971 }
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
972
40978
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
973
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
974
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
975 /* -------------------------------------------------------------------- */
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
976 /* Methods */
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
977
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
978 #define STRINGLIB_CHAR char
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
979 #define STRINGLIB_CMP memcmp
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
980 #define STRINGLIB_LEN PyBytes_GET_SIZE
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
981 #define STRINGLIB_NEW PyBytes_FromStringAndSize
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
982 #define STRINGLIB_EMPTY nullbytes
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
983
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
984 #include "stringlib/fastsearch.h"
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
985 #include "stringlib/count.h"
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
986 #include "stringlib/find.h"
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
987 #include "stringlib/partition.h"
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
988
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
989
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
990 /* The following Py_LOCAL_INLINE and Py_LOCAL functions
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
991 were copied from the old char* style string object. */
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
992
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
993 Py_LOCAL_INLINE(void)
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
994 _adjust_indices(Py_ssize_t *start, Py_ssize_t *end, Py_ssize_t len)
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
995 {
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
996 if (*end > len)
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
997 *end = len;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
998 else if (*end < 0)
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
999 *end += len;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1000 if (*end < 0)
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1001 *end = 0;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1002 if (*start < 0)
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1003 *start += len;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1004 if (*start < 0)
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1005 *start = 0;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1006 }
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1007
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1008
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1009 Py_LOCAL_INLINE(Py_ssize_t)
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1010 bytes_find_internal(PyBytesObject *self, PyObject *args, int dir)
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1011 {
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1012 PyObject *subobj;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1013 const char *sub;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1014 Py_ssize_t sub_len;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1015 Py_ssize_t start=0, end=PY_SSIZE_T_MAX;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1016
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1017 if (!PyArg_ParseTuple(args, "O|O&O&:find/rfind/index/rindex", &subobj,
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1018 _PyEval_SliceIndex, &start, _PyEval_SliceIndex, &end))
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1019 return -2;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1020 if (PyBytes_Check(subobj)) {
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1021 sub = PyBytes_AS_STRING(subobj);
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1022 sub_len = PyBytes_GET_SIZE(subobj);
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1023 }
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1024 else if (PyObject_AsCharBuffer(subobj, &sub, &sub_len))
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1025 /* XXX - the "expected a character buffer object" is pretty
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1026 confusing for a non-expert. remap to something else ? */
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1027 return -2;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1028
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1029 if (dir > 0)
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1030 return stringlib_find_slice(
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1031 PyBytes_AS_STRING(self), PyBytes_GET_SIZE(self),
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1032 sub, sub_len, start, end);
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1033 else
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1034 return stringlib_rfind_slice(
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1035 PyBytes_AS_STRING(self), PyBytes_GET_SIZE(self),
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1036 sub, sub_len, start, end);
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1037 }
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1038
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1039
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1040 PyDoc_STRVAR(find__doc__,
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1041 "B.find(sub [,start [,end]]) -> int\n\
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1042 \n\
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1043 Return the lowest index in B where subsection sub is found,\n\
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1044 such that sub is contained within s[start,end]. Optional\n\
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1045 arguments start and end are interpreted as in slice notation.\n\
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1046 \n\
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1047 Return -1 on failure.");
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1048
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1049 static PyObject *
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1050 bytes_find(PyBytesObject *self, PyObject *args)
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1051 {
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1052 Py_ssize_t result = bytes_find_internal(self, args, +1);
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1053 if (result == -2)
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1054 return NULL;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1055 return PyInt_FromSsize_t(result);
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1056 }
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1057
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1058 PyDoc_STRVAR(count__doc__,
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1059 "B.count(sub[, start[, end]]) -> int\n\
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1060 \n\
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1061 Return the number of non-overlapping occurrences of subsection sub in\n\
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1062 bytes B[start:end]. Optional arguments start and end are interpreted\n\
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1063 as in slice notation.");
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1064
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1065 static PyObject *
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1066 bytes_count(PyBytesObject *self, PyObject *args)
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1067 {
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1068 PyObject *sub_obj;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1069 const char *str = PyBytes_AS_STRING(self), *sub;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1070 Py_ssize_t sub_len;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1071 Py_ssize_t start = 0, end = PY_SSIZE_T_MAX;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1072
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1073 if (!PyArg_ParseTuple(args, "O|O&O&:count", &sub_obj,
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1074 _PyEval_SliceIndex, &start, _PyEval_SliceIndex, &end))
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1075 return NULL;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1076
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1077 if (PyBytes_Check(sub_obj)) {
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1078 sub = PyBytes_AS_STRING(sub_obj);
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1079 sub_len = PyBytes_GET_SIZE(sub_obj);
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1080 }
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1081 else if (PyObject_AsCharBuffer(sub_obj, &sub, &sub_len))
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1082 return NULL;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1083
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1084 _adjust_indices(&start, &end, PyString_GET_SIZE(self));
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1085
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1086 return PyInt_FromSsize_t(
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1087 stringlib_count(str + start, end - start, sub, sub_len)
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1088 );
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1089 }
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1090
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1091
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1092 PyDoc_STRVAR(index__doc__,
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1093 "B.index(sub [,start [,end]]) -> int\n\
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1094 \n\
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1095 Like B.find() but raise ValueError when the subsection is not found.");
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1096
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1097 static PyObject *
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1098 bytes_index(PyBytesObject *self, PyObject *args)
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1099 {
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1100 Py_ssize_t result = bytes_find_internal(self, args, +1);
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1101 if (result == -2)
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1102 return NULL;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1103 if (result == -1) {
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1104 PyErr_SetString(PyExc_ValueError,
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1105 "subsection not found");
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1106 return NULL;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1107 }
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1108 return PyInt_FromSsize_t(result);
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1109 }
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1110
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1111
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1112 PyDoc_STRVAR(rfind__doc__,
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1113 "B.rfind(sub [,start [,end]]) -> int\n\
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1114 \n\
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1115 Return the highest index in B where subsection sub is found,\n\
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1116 such that sub is contained within s[start,end]. Optional\n\
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1117 arguments start and end are interpreted as in slice notation.\n\
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1118 \n\
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1119 Return -1 on failure.");
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1120
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1121 static PyObject *
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1122 bytes_rfind(PyBytesObject *self, PyObject *args)
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1123 {
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1124 Py_ssize_t result = bytes_find_internal(self, args, -1);
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1125 if (result == -2)
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1126 return NULL;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1127 return PyInt_FromSsize_t(result);
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1128 }
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1129
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1130
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1131 PyDoc_STRVAR(rindex__doc__,
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1132 "B.rindex(sub [,start [,end]]) -> int\n\
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1133 \n\
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1134 Like B.rfind() but raise ValueError when the subsection is not found.");
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1135
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1136 static PyObject *
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1137 bytes_rindex(PyBytesObject *self, PyObject *args)
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1138 {
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1139 Py_ssize_t result = bytes_find_internal(self, args, -1);
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1140 if (result == -2)
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1141 return NULL;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1142 if (result == -1) {
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1143 PyErr_SetString(PyExc_ValueError,
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1144 "subsection not found");
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1145 return NULL;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1146 }
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1147 return PyInt_FromSsize_t(result);
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1148 }
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1149
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1150
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1151 /* Matches the end (direction >= 0) or start (direction < 0) of self
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1152 * against substr, using the start and end arguments. Returns
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1153 * -1 on error, 0 if not found and 1 if found.
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1154 */
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1155 Py_LOCAL(int)
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1156 _bytes_tailmatch(PyBytesObject *self, PyObject *substr, Py_ssize_t start,
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1157 Py_ssize_t end, int direction)
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1158 {
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1159 Py_ssize_t len = PyBytes_GET_SIZE(self);
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1160 Py_ssize_t slen;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1161 const char* sub;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1162 const char* str;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1163
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1164 if (PyBytes_Check(substr)) {
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1165 sub = PyBytes_AS_STRING(substr);
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1166 slen = PyBytes_GET_SIZE(substr);
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1167 }
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1168 else if (PyObject_AsCharBuffer(substr, &sub, &slen))
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1169 return -1;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1170 str = PyBytes_AS_STRING(self);
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1171
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1172 _adjust_indices(&start, &end, len);
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1173
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1174 if (direction < 0) {
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1175 /* startswith */
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1176 if (start+slen > len)
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1177 return 0;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1178 } else {
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1179 /* endswith */
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1180 if (end-start < slen || start > len)
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1181 return 0;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1182
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1183 if (end-slen > start)
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1184 start = end - slen;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1185 }
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1186 if (end-start >= slen)
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1187 return ! memcmp(str+start, sub, slen);
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1188 return 0;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1189 }
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1190
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1191
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1192 PyDoc_STRVAR(startswith__doc__,
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1193 "B.startswith(prefix[, start[, end]]) -> bool\n\
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1194 \n\
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1195 Return True if B starts with the specified prefix, False otherwise.\n\
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1196 With optional start, test B beginning at that position.\n\
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1197 With optional end, stop comparing B at that position.\n\
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1198 prefix can also be a tuple of strings to try.");
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1199
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1200 static PyObject *
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1201 bytes_startswith(PyBytesObject *self, PyObject *args)
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1202 {
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1203 Py_ssize_t start = 0;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1204 Py_ssize_t end = PY_SSIZE_T_MAX;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1205 PyObject *subobj;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1206 int result;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1207
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1208 if (!PyArg_ParseTuple(args, "O|O&O&:startswith", &subobj,
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1209 _PyEval_SliceIndex, &start, _PyEval_SliceIndex, &end))
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1210 return NULL;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1211 if (PyTuple_Check(subobj)) {
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1212 Py_ssize_t i;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1213 for (i = 0; i < PyTuple_GET_SIZE(subobj); i++) {
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1214 result = _bytes_tailmatch(self,
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1215 PyTuple_GET_ITEM(subobj, i),
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1216 start, end, -1);
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1217 if (result == -1)
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1218 return NULL;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1219 else if (result) {
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1220 Py_RETURN_TRUE;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1221 }
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1222 }
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1223 Py_RETURN_FALSE;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1224 }
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1225 result = _bytes_tailmatch(self, subobj, start, end, -1);
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1226 if (result == -1)
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1227 return NULL;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1228 else
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1229 return PyBool_FromLong(result);
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1230 }
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1231
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1232 PyDoc_STRVAR(endswith__doc__,
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1233 "B.endswith(suffix[, start[, end]]) -> bool\n\
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1234 \n\
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1235 Return True if B ends with the specified suffix, False otherwise.\n\
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1236 With optional start, test B beginning at that position.\n\
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1237 With optional end, stop comparing B at that position.\n\
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1238 suffix can also be a tuple of strings to try.");
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1239
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1240 static PyObject *
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1241 bytes_endswith(PyBytesObject *self, PyObject *args)
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1242 {
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1243 Py_ssize_t start = 0;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1244 Py_ssize_t end = PY_SSIZE_T_MAX;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1245 PyObject *subobj;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1246 int result;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1247
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1248 if (!PyArg_ParseTuple(args, "O|O&O&:endswith", &subobj,
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1249 _PyEval_SliceIndex, &start, _PyEval_SliceIndex, &end))
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1250 return NULL;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1251 if (PyTuple_Check(subobj)) {
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1252 Py_ssize_t i;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1253 for (i = 0; i < PyTuple_GET_SIZE(subobj); i++) {
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1254 result = _bytes_tailmatch(self,
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1255 PyTuple_GET_ITEM(subobj, i),
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1256 start, end, +1);
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1257 if (result == -1)
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1258 return NULL;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1259 else if (result) {
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1260 Py_RETURN_TRUE;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1261 }
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1262 }
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1263 Py_RETURN_FALSE;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1264 }
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1265 result = _bytes_tailmatch(self, subobj, start, end, +1);
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1266 if (result == -1)
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1267 return NULL;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1268 else
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1269 return PyBool_FromLong(result);
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1270 }
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1271
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1272
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1273
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1274 PyDoc_STRVAR(translate__doc__,
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1275 "B.translate(table [,deletechars]) -> bytes\n\
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1276 \n\
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1277 Return a copy of the bytes B, where all characters occurring\n\
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1278 in the optional argument deletechars are removed, and the\n\
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1279 remaining characters have been mapped through the given\n\
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1280 translation table, which must be a bytes of length 256.");
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1281
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1282 static PyObject *
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1283 bytes_translate(PyBytesObject *self, PyObject *args)
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1284 {
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1285 register char *input, *output;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1286 register const char *table;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1287 register Py_ssize_t i, c, changed = 0;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1288 PyObject *input_obj = (PyObject*)self;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1289 const char *table1, *output_start, *del_table=NULL;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1290 Py_ssize_t inlen, tablen, dellen = 0;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1291 PyObject *result;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1292 int trans_table[256];
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1293 PyObject *tableobj, *delobj = NULL;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1294
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1295 if (!PyArg_UnpackTuple(args, "translate", 1, 2,
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1296 &tableobj, &delobj))
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1297 return NULL;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1298
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1299 if (PyBytes_Check(tableobj)) {
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1300 table1 = PyBytes_AS_STRING(tableobj);
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1301 tablen = PyBytes_GET_SIZE(tableobj);
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1302 }
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1303 else if (PyObject_AsCharBuffer(tableobj, &table1, &tablen))
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1304 return NULL;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1305
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1306 if (tablen != 256) {
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1307 PyErr_SetString(PyExc_ValueError,
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1308 "translation table must be 256 characters long");
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1309 return NULL;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1310 }
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1311
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1312 if (delobj != NULL) {
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1313 if (PyBytes_Check(delobj)) {
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1314 del_table = PyBytes_AS_STRING(delobj);
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1315 dellen = PyBytes_GET_SIZE(delobj);
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1316 }
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1317 else if (PyObject_AsCharBuffer(delobj, &del_table, &dellen))
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1318 return NULL;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1319 }
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1320 else {
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1321 del_table = NULL;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1322 dellen = 0;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1323 }
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1324
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1325 table = table1;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1326 inlen = PyBytes_GET_SIZE(input_obj);
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1327 result = PyBytes_FromStringAndSize((char *)NULL, inlen);
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1328 if (result == NULL)
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1329 return NULL;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1330 output_start = output = PyBytes_AsString(result);
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1331 input = PyBytes_AS_STRING(input_obj);
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1332
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1333 if (dellen == 0) {
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1334 /* If no deletions are required, use faster code */
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1335 for (i = inlen; --i >= 0; ) {
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1336 c = Py_CHARMASK(*input++);
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1337 if (Py_CHARMASK((*output++ = table[c])) != c)
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1338 changed = 1;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1339 }
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1340 if (changed || !PyBytes_CheckExact(input_obj))
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1341 return result;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1342 Py_DECREF(result);
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1343 Py_INCREF(input_obj);
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1344 return input_obj;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1345 }
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1346
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1347 for (i = 0; i < 256; i++)
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1348 trans_table[i] = Py_CHARMASK(table[i]);
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1349
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1350 for (i = 0; i < dellen; i++)
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1351 trans_table[(int) Py_CHARMASK(del_table[i])] = -1;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1352
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1353 for (i = inlen; --i >= 0; ) {
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1354 c = Py_CHARMASK(*input++);
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1355 if (trans_table[c] != -1)
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1356 if (Py_CHARMASK(*output++ = (char)trans_table[c]) == c)
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1357 continue;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1358 changed = 1;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1359 }
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1360 if (!changed && PyBytes_CheckExact(input_obj)) {
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1361 Py_DECREF(result);
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1362 Py_INCREF(input_obj);
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1363 return input_obj;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1364 }
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1365 /* Fix the size of the resulting string */
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1366 if (inlen > 0)
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1367 PyBytes_Resize(result, output - output_start);
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1368 return result;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1369 }
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1370
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1371
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1372 #define FORWARD 1
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1373 #define REVERSE -1
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1374
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1375 /* find and count characters and substrings */
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1376
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1377 #define findchar(target, target_len, c) \
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1378 ((char *)memchr((const void *)(target), c, target_len))
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1379
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1380 /* Don't call if length < 2 */
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1381 #define Py_STRING_MATCH(target, offset, pattern, length) \
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1382 (target[offset] == pattern[0] && \
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1383 target[offset+length-1] == pattern[length-1] && \
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1384 !memcmp(target+offset+1, pattern+1, length-2) )
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1385
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1386
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1387 /* Bytes ops must return a string. */
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1388 /* If the object is subclass of bytes, create a copy */
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1389 Py_LOCAL(PyBytesObject *)
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1390 return_self(PyBytesObject *self)
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1391 {
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1392 if (PyBytes_CheckExact(self)) {
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1393 Py_INCREF(self);
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1394 return (PyBytesObject *)self;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1395 }
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1396 return (PyBytesObject *)PyBytes_FromStringAndSize(
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1397 PyBytes_AS_STRING(self),
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1398 PyBytes_GET_SIZE(self));
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1399 }
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1400
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1401 Py_LOCAL_INLINE(Py_ssize_t)
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1402 countchar(const char *target, int target_len, char c, Py_ssize_t maxcount)
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1403 {
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1404 Py_ssize_t count=0;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1405 const char *start=target;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1406 const char *end=target+target_len;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1407
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1408 while ( (start=findchar(start, end-start, c)) != NULL ) {
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1409 count++;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1410 if (count >= maxcount)
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1411 break;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1412 start += 1;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1413 }
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1414 return count;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1415 }
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1416
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1417 Py_LOCAL(Py_ssize_t)
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1418 findstring(const char *target, Py_ssize_t target_len,
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1419 const char *pattern, Py_ssize_t pattern_len,
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1420 Py_ssize_t start,
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1421 Py_ssize_t end,
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1422 int direction)
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1423 {
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1424 if (start < 0) {
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1425 start += target_len;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1426 if (start < 0)
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1427 start = 0;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1428 }
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1429 if (end > target_len) {
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1430 end = target_len;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1431 } else if (end < 0) {
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1432 end += target_len;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1433 if (end < 0)
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1434 end = 0;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1435 }
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1436
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1437 /* zero-length substrings always match at the first attempt */
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1438 if (pattern_len == 0)
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1439 return (direction > 0) ? start : end;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1440
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1441 end -= pattern_len;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1442
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1443 if (direction < 0) {
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1444 for (; end >= start; end--)
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1445 if (Py_STRING_MATCH(target, end, pattern, pattern_len))
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1446 return end;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1447 } else {
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1448 for (; start <= end; start++)
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1449 if (Py_STRING_MATCH(target, start, pattern, pattern_len))
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1450 return start;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1451 }
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1452 return -1;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1453 }
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1454
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1455 Py_LOCAL_INLINE(Py_ssize_t)
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1456 countstring(const char *target, Py_ssize_t target_len,
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1457 const char *pattern, Py_ssize_t pattern_len,
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1458 Py_ssize_t start,
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1459 Py_ssize_t end,
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1460 int direction, Py_ssize_t maxcount)
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1461 {
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1462 Py_ssize_t count=0;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1463
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1464 if (start < 0) {
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1465 start += target_len;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1466 if (start < 0)
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1467 start = 0;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1468 }
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1469 if (end > target_len) {
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1470 end = target_len;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1471 } else if (end < 0) {
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1472 end += target_len;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1473 if (end < 0)
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1474 end = 0;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1475 }
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1476
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1477 /* zero-length substrings match everywhere */
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1478 if (pattern_len == 0 || maxcount == 0) {
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1479 if (target_len+1 < maxcount)
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1480 return target_len+1;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1481 return maxcount;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1482 }
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1483
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1484 end -= pattern_len;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1485 if (direction < 0) {
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1486 for (; (end >= start); end--)
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1487 if (Py_STRING_MATCH(target, end, pattern, pattern_len)) {
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1488 count++;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1489 if (--maxcount <= 0) break;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1490 end -= pattern_len-1;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1491 }
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1492 } else {
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1493 for (; (start <= end); start++)
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1494 if (Py_STRING_MATCH(target, start, pattern, pattern_len)) {
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1495 count++;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1496 if (--maxcount <= 0)
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1497 break;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1498 start += pattern_len-1;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1499 }
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1500 }
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1501 return count;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1502 }
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1503
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1504
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1505 /* Algorithms for different cases of string replacement */
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1506
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1507 /* len(self)>=1, from="", len(to)>=1, maxcount>=1 */
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1508 Py_LOCAL(PyBytesObject *)
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1509 replace_interleave(PyBytesObject *self,
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1510 const char *to_s, Py_ssize_t to_len,
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1511 Py_ssize_t maxcount)
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1512 {
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1513 char *self_s, *result_s;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1514 Py_ssize_t self_len, result_len;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1515 Py_ssize_t count, i, product;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1516 PyBytesObject *result;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1517
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1518 self_len = PyBytes_GET_SIZE(self);
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1519
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1520 /* 1 at the end plus 1 after every character */
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1521 count = self_len+1;
41448
458c8db2e946 Clean up trailing whitespace.
Guido van Rossum <guido@python.org>
parents: 41426
diff changeset
1522 if (maxcount < count)
40978
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1523 count = maxcount;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1524
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1525 /* Check for overflow */
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1526 /* result_len = count * to_len + self_len; */
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1527 product = count * to_len;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1528 if (product / to_len != count) {
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1529 PyErr_SetString(PyExc_OverflowError,
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1530 "replace string is too long");
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1531 return NULL;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1532 }
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1533 result_len = product + self_len;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1534 if (result_len < 0) {
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1535 PyErr_SetString(PyExc_OverflowError,
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1536 "replace string is too long");
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1537 return NULL;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1538 }
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1539
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1540 if (! (result = (PyBytesObject *)
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1541 PyBytes_FromStringAndSize(NULL, result_len)) )
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1542 return NULL;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1543
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1544 self_s = PyBytes_AS_STRING(self);
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1545 result_s = PyBytes_AS_STRING(result);
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1546
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1547 /* TODO: special case single character, which doesn't need memcpy */
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1548
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1549 /* Lay the first one down (guaranteed this will occur) */
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1550 Py_MEMCPY(result_s, to_s, to_len);
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1551 result_s += to_len;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1552 count -= 1;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1553
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1554 for (i=0; i<count; i++) {
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1555 *result_s++ = *self_s++;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1556 Py_MEMCPY(result_s, to_s, to_len);
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1557 result_s += to_len;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1558 }
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1559
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1560 /* Copy the rest of the original string */
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1561 Py_MEMCPY(result_s, self_s, self_len-i);
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1562
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1563 return result;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1564 }
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1565
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1566 /* Special case for deleting a single character */
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1567 /* len(self)>=1, len(from)==1, to="", maxcount>=1 */
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1568 Py_LOCAL(PyBytesObject *)
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1569 replace_delete_single_character(PyBytesObject *self,
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1570 char from_c, Py_ssize_t maxcount)
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1571 {
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1572 char *self_s, *result_s;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1573 char *start, *next, *end;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1574 Py_ssize_t self_len, result_len;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1575 Py_ssize_t count;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1576 PyBytesObject *result;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1577
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1578 self_len = PyBytes_GET_SIZE(self);
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1579 self_s = PyBytes_AS_STRING(self);
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1580
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1581 count = countchar(self_s, self_len, from_c, maxcount);
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1582 if (count == 0) {
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1583 return return_self(self);
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1584 }
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1585
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1586 result_len = self_len - count; /* from_len == 1 */
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1587 assert(result_len>=0);
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1588
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1589 if ( (result = (PyBytesObject *)
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1590 PyBytes_FromStringAndSize(NULL, result_len)) == NULL)
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1591 return NULL;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1592 result_s = PyBytes_AS_STRING(result);
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1593
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1594 start = self_s;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1595 end = self_s + self_len;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1596 while (count-- > 0) {
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1597 next = findchar(start, end-start, from_c);
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1598 if (next == NULL)
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1599 break;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1600 Py_MEMCPY(result_s, start, next-start);
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1601 result_s += (next-start);
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1602 start = next+1;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1603 }
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1604 Py_MEMCPY(result_s, start, end-start);
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1605
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1606 return result;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1607 }
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1608
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1609 /* len(self)>=1, len(from)>=2, to="", maxcount>=1 */
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1610
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1611 Py_LOCAL(PyBytesObject *)
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1612 replace_delete_substring(PyBytesObject *self,
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1613 const char *from_s, Py_ssize_t from_len,
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1614 Py_ssize_t maxcount)
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1615 {
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1616 char *self_s, *result_s;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1617 char *start, *next, *end;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1618 Py_ssize_t self_len, result_len;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1619 Py_ssize_t count, offset;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1620 PyBytesObject *result;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1621
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1622 self_len = PyBytes_GET_SIZE(self);
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1623 self_s = PyBytes_AS_STRING(self);
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1624
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1625 count = countstring(self_s, self_len,
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1626 from_s, from_len,
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1627 0, self_len, 1,
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1628 maxcount);
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1629
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1630 if (count == 0) {
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1631 /* no matches */
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1632 return return_self(self);
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1633 }
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1634
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1635 result_len = self_len - (count * from_len);
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1636 assert (result_len>=0);
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1637
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1638 if ( (result = (PyBytesObject *)
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1639 PyBytes_FromStringAndSize(NULL, result_len)) == NULL )
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1640 return NULL;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1641
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1642 result_s = PyBytes_AS_STRING(result);
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1643
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1644 start = self_s;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1645 end = self_s + self_len;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1646 while (count-- > 0) {
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1647 offset = findstring(start, end-start,
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1648 from_s, from_len,
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1649 0, end-start, FORWARD);
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1650 if (offset == -1)
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1651 break;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1652 next = start + offset;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1653
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1654 Py_MEMCPY(result_s, start, next-start);
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1655
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1656 result_s += (next-start);
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1657 start = next+from_len;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1658 }
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1659 Py_MEMCPY(result_s, start, end-start);
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1660 return result;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1661 }
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1662
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1663 /* len(self)>=1, len(from)==len(to)==1, maxcount>=1 */
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1664 Py_LOCAL(PyBytesObject *)
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1665 replace_single_character_in_place(PyBytesObject *self,
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1666 char from_c, char to_c,
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1667 Py_ssize_t maxcount)
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1668 {
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1669 char *self_s, *result_s, *start, *end, *next;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1670 Py_ssize_t self_len;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1671 PyBytesObject *result;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1672
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1673 /* The result string will be the same size */
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1674 self_s = PyBytes_AS_STRING(self);
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1675 self_len = PyBytes_GET_SIZE(self);
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1676
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1677 next = findchar(self_s, self_len, from_c);
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1678
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1679 if (next == NULL) {
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1680 /* No matches; return the original bytes */
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1681 return return_self(self);
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1682 }
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1683
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1684 /* Need to make a new bytes */
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1685 result = (PyBytesObject *) PyBytes_FromStringAndSize(NULL, self_len);
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1686 if (result == NULL)
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1687 return NULL;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1688 result_s = PyBytes_AS_STRING(result);
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1689 Py_MEMCPY(result_s, self_s, self_len);
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1690
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1691 /* change everything in-place, starting with this one */
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1692 start = result_s + (next-self_s);
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1693 *start = to_c;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1694 start++;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1695 end = result_s + self_len;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1696
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1697 while (--maxcount > 0) {
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1698 next = findchar(start, end-start, from_c);
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1699 if (next == NULL)
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1700 break;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1701 *next = to_c;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1702 start = next+1;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1703 }
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1704
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1705 return result;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1706 }
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1707
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1708 /* len(self)>=1, len(from)==len(to)>=2, maxcount>=1 */
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1709 Py_LOCAL(PyBytesObject *)
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1710 replace_substring_in_place(PyBytesObject *self,
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1711 const char *from_s, Py_ssize_t from_len,
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1712 const char *to_s, Py_ssize_t to_len,
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1713 Py_ssize_t maxcount)
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1714 {
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1715 char *result_s, *start, *end;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1716 char *self_s;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1717 Py_ssize_t self_len, offset;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1718 PyBytesObject *result;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1719
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1720 /* The result bytes will be the same size */
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1721
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1722 self_s = PyBytes_AS_STRING(self);
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1723 self_len = PyBytes_GET_SIZE(self);
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1724
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1725 offset = findstring(self_s, self_len,
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1726 from_s, from_len,
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1727 0, self_len, FORWARD);
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1728 if (offset == -1) {
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1729 /* No matches; return the original bytes */
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1730 return return_self(self);
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1731 }
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1732
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1733 /* Need to make a new bytes */
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1734 result = (PyBytesObject *) PyBytes_FromStringAndSize(NULL, self_len);
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1735 if (result == NULL)
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1736 return NULL;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1737 result_s = PyBytes_AS_STRING(result);
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1738 Py_MEMCPY(result_s, self_s, self_len);
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1739
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1740 /* change everything in-place, starting with this one */
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1741 start = result_s + offset;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1742 Py_MEMCPY(start, to_s, from_len);
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1743 start += from_len;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1744 end = result_s + self_len;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1745
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1746 while ( --maxcount > 0) {
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1747 offset = findstring(start, end-start,
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1748 from_s, from_len,
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1749 0, end-start, FORWARD);
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1750 if (offset==-1)
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1751 break;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1752 Py_MEMCPY(start+offset, to_s, from_len);
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1753 start += offset+from_len;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1754 }
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1755
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1756 return result;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1757 }
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1758
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1759 /* len(self)>=1, len(from)==1, len(to)>=2, maxcount>=1 */
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1760 Py_LOCAL(PyBytesObject *)
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1761 replace_single_character(PyBytesObject *self,
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1762 char from_c,
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1763 const char *to_s, Py_ssize_t to_len,
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1764 Py_ssize_t maxcount)
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1765 {
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1766 char *self_s, *result_s;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1767 char *start, *next, *end;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1768 Py_ssize_t self_len, result_len;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1769 Py_ssize_t count, product;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1770 PyBytesObject *result;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1771
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1772 self_s = PyBytes_AS_STRING(self);
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1773 self_len = PyBytes_GET_SIZE(self);
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1774
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1775 count = countchar(self_s, self_len, from_c, maxcount);
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1776 if (count == 0) {
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1777 /* no matches, return unchanged */
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1778 return return_self(self);
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1779 }
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1780
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1781 /* use the difference between current and new, hence the "-1" */
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1782 /* result_len = self_len + count * (to_len-1) */
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1783 product = count * (to_len-1);
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1784 if (product / (to_len-1) != count) {
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1785 PyErr_SetString(PyExc_OverflowError, "replace bytes is too long");
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1786 return NULL;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1787 }
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1788 result_len = self_len + product;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1789 if (result_len < 0) {
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1790 PyErr_SetString(PyExc_OverflowError, "replace bytes is too long");
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1791 return NULL;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1792 }
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1793
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1794 if ( (result = (PyBytesObject *)
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1795 PyBytes_FromStringAndSize(NULL, result_len)) == NULL)
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1796 return NULL;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1797 result_s = PyBytes_AS_STRING(result);
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1798
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1799 start = self_s;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1800 end = self_s + self_len;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1801 while (count-- > 0) {
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1802 next = findchar(start, end-start, from_c);
41448
458c8db2e946 Clean up trailing whitespace.
Guido van Rossum <guido@python.org>
parents: 41426
diff changeset
1803 if (next == NULL)
40978
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1804 break;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1805
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1806 if (next == start) {
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1807 /* replace with the 'to' */
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1808 Py_MEMCPY(result_s, to_s, to_len);
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1809 result_s += to_len;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1810 start += 1;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1811 } else {
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1812 /* copy the unchanged old then the 'to' */
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1813 Py_MEMCPY(result_s, start, next-start);
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1814 result_s += (next-start);
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1815 Py_MEMCPY(result_s, to_s, to_len);
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1816 result_s += to_len;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1817 start = next+1;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1818 }
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1819 }
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1820 /* Copy the remainder of the remaining bytes */
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1821 Py_MEMCPY(result_s, start, end-start);
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1822
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1823 return result;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1824 }
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1825
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1826 /* len(self)>=1, len(from)>=2, len(to)>=2, maxcount>=1 */
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1827 Py_LOCAL(PyBytesObject *)
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1828 replace_substring(PyBytesObject *self,
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1829 const char *from_s, Py_ssize_t from_len,
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1830 const char *to_s, Py_ssize_t to_len,
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1831 Py_ssize_t maxcount)
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1832 {
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1833 char *self_s, *result_s;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1834 char *start, *next, *end;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1835 Py_ssize_t self_len, result_len;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1836 Py_ssize_t count, offset, product;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1837 PyBytesObject *result;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1838
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1839 self_s = PyBytes_AS_STRING(self);
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1840 self_len = PyBytes_GET_SIZE(self);
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1841
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1842 count = countstring(self_s, self_len,
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1843 from_s, from_len,
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1844 0, self_len, FORWARD, maxcount);
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1845 if (count == 0) {
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1846 /* no matches, return unchanged */
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1847 return return_self(self);
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1848 }
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1849
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1850 /* Check for overflow */
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1851 /* result_len = self_len + count * (to_len-from_len) */
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1852 product = count * (to_len-from_len);
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1853 if (product / (to_len-from_len) != count) {
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1854 PyErr_SetString(PyExc_OverflowError, "replace bytes is too long");
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1855 return NULL;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1856 }
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1857 result_len = self_len + product;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1858 if (result_len < 0) {
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1859 PyErr_SetString(PyExc_OverflowError, "replace bytes is too long");
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1860 return NULL;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1861 }
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1862
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1863 if ( (result = (PyBytesObject *)
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1864 PyBytes_FromStringAndSize(NULL, result_len)) == NULL)
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1865 return NULL;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1866 result_s = PyBytes_AS_STRING(result);
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1867
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1868 start = self_s;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1869 end = self_s + self_len;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1870 while (count-- > 0) {
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1871 offset = findstring(start, end-start,
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1872 from_s, from_len,
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1873 0, end-start, FORWARD);
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1874 if (offset == -1)
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1875 break;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1876 next = start+offset;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1877 if (next == start) {
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1878 /* replace with the 'to' */
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1879 Py_MEMCPY(result_s, to_s, to_len);
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1880 result_s += to_len;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1881 start += from_len;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1882 } else {
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1883 /* copy the unchanged old then the 'to' */
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1884 Py_MEMCPY(result_s, start, next-start);
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1885 result_s += (next-start);
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1886 Py_MEMCPY(result_s, to_s, to_len);
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1887 result_s += to_len;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1888 start = next+from_len;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1889 }
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1890 }
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1891 /* Copy the remainder of the remaining bytes */
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1892 Py_MEMCPY(result_s, start, end-start);
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1893
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1894 return result;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1895 }
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1896
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1897
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1898 Py_LOCAL(PyBytesObject *)
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1899 replace(PyBytesObject *self,
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1900 const char *from_s, Py_ssize_t from_len,
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1901 const char *to_s, Py_ssize_t to_len,
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1902 Py_ssize_t maxcount)
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1903 {
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1904 if (maxcount < 0) {
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1905 maxcount = PY_SSIZE_T_MAX;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1906 } else if (maxcount == 0 || PyBytes_GET_SIZE(self) == 0) {
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1907 /* nothing to do; return the original bytes */
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1908 return return_self(self);
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1909 }
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1910
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1911 if (maxcount == 0 ||
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1912 (from_len == 0 && to_len == 0)) {
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1913 /* nothing to do; return the original bytes */
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1914 return return_self(self);
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1915 }
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1916
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1917 /* Handle zero-length special cases */
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1918
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1919 if (from_len == 0) {
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1920 /* insert the 'to' bytes everywhere. */
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1921 /* >>> "Python".replace("", ".") */
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1922 /* '.P.y.t.h.o.n.' */
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1923 return replace_interleave(self, to_s, to_len, maxcount);
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1924 }
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1925
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1926 /* Except for "".replace("", "A") == "A" there is no way beyond this */
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1927 /* point for an empty self bytes to generate a non-empty bytes */
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1928 /* Special case so the remaining code always gets a non-empty bytes */
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1929 if (PyBytes_GET_SIZE(self) == 0) {
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1930 return return_self(self);
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1931 }
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1932
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1933 if (to_len == 0) {
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1934 /* delete all occurances of 'from' bytes */
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1935 if (from_len == 1) {
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1936 return replace_delete_single_character(
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1937 self, from_s[0], maxcount);
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1938 } else {
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1939 return replace_delete_substring(self, from_s, from_len, maxcount);
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1940 }
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1941 }
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1942
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1943 /* Handle special case where both bytes have the same length */
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1944
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1945 if (from_len == to_len) {
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1946 if (from_len == 1) {
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1947 return replace_single_character_in_place(
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1948 self,
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1949 from_s[0],
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1950 to_s[0],
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1951 maxcount);
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1952 } else {
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1953 return replace_substring_in_place(
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1954 self, from_s, from_len, to_s, to_len, maxcount);
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1955 }
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1956 }
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1957
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1958 /* Otherwise use the more generic algorithms */
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1959 if (from_len == 1) {
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1960 return replace_single_character(self, from_s[0],
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1961 to_s, to_len, maxcount);
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1962 } else {
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1963 /* len('from')>=2, len('to')>=1 */
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1964 return replace_substring(self, from_s, from_len, to_s, to_len, maxcount);
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1965 }
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1966 }
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1967
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1968 PyDoc_STRVAR(replace__doc__,
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1969 "B.replace (old, new[, count]) -> bytes\n\
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1970 \n\
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1971 Return a copy of bytes B with all occurrences of subsection\n\
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1972 old replaced by new. If the optional argument count is\n\
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1973 given, only the first count occurrences are replaced.");
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1974
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1975 static PyObject *
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1976 bytes_replace(PyBytesObject *self, PyObject *args)
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1977 {
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1978 Py_ssize_t count = -1;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1979 PyObject *from, *to;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1980 const char *from_s, *to_s;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1981 Py_ssize_t from_len, to_len;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1982
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1983 if (!PyArg_ParseTuple(args, "OO|n:replace", &from, &to, &count))
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1984 return NULL;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1985
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1986 if (PyBytes_Check(from)) {
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1987 from_s = PyBytes_AS_STRING(from);
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1988 from_len = PyBytes_GET_SIZE(from);
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1989 }
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1990 else if (PyObject_AsCharBuffer(from, &from_s, &from_len))
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1991 return NULL;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1992
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1993 if (PyBytes_Check(to)) {
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1994 to_s = PyBytes_AS_STRING(to);
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1995 to_len = PyBytes_GET_SIZE(to);
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1996 }
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1997 else if (PyObject_AsCharBuffer(to, &to_s, &to_len))
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1998 return NULL;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
1999
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2000 return (PyObject *)replace((PyBytesObject *) self,
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2001 from_s, from_len,
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2002 to_s, to_len, count);
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2003 }
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2004
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2005
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2006 /* Overallocate the initial list to reduce the number of reallocs for small
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2007 split sizes. Eg, "A A A A A A A A A A".split() (10 elements) has three
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2008 resizes, to sizes 4, 8, then 16. Most observed string splits are for human
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2009 text (roughly 11 words per line) and field delimited data (usually 1-10
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2010 fields). For large strings the split algorithms are bandwidth limited
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2011 so increasing the preallocation likely will not improve things.*/
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2012
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2013 #define MAX_PREALLOC 12
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2014
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2015 /* 5 splits gives 6 elements */
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2016 #define PREALLOC_SIZE(maxsplit) \
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2017 (maxsplit >= MAX_PREALLOC ? MAX_PREALLOC : maxsplit+1)
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2018
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2019 #define SPLIT_APPEND(data, left, right) \
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2020 str = PyBytes_FromStringAndSize((data) + (left), \
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2021 (right) - (left)); \
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2022 if (str == NULL) \
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2023 goto onError; \
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2024 if (PyList_Append(list, str)) { \
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2025 Py_DECREF(str); \
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2026 goto onError; \
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2027 } \
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2028 else \
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2029 Py_DECREF(str);
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2030
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2031 #define SPLIT_ADD(data, left, right) { \
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2032 str = PyBytes_FromStringAndSize((data) + (left), \
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2033 (right) - (left)); \
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2034 if (str == NULL) \
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2035 goto onError; \
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2036 if (count < MAX_PREALLOC) { \
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2037 PyList_SET_ITEM(list, count, str); \
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2038 } else { \
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2039 if (PyList_Append(list, str)) { \
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2040 Py_DECREF(str); \
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2041 goto onError; \
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2042 } \
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2043 else \
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2044 Py_DECREF(str); \
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2045 } \
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2046 count++; }
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2047
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2048 /* Always force the list to the expected size. */
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2049 #define FIX_PREALLOC_SIZE(list) ((PyListObject *)list)->ob_size = count
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2050
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2051
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2052 Py_LOCAL_INLINE(PyObject *)
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2053 split_char(const char *s, Py_ssize_t len, char ch, Py_ssize_t maxcount)
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2054 {
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2055 register Py_ssize_t i, j, count=0;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2056 PyObject *str;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2057 PyObject *list = PyList_New(PREALLOC_SIZE(maxcount));
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2058
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2059 if (list == NULL)
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2060 return NULL;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2061
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2062 i = j = 0;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2063 while ((j < len) && (maxcount-- > 0)) {
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2064 for(; j<len; j++) {
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2065 /* I found that using memchr makes no difference */
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2066 if (s[j] == ch) {
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2067 SPLIT_ADD(s, i, j);
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2068 i = j = j + 1;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2069 break;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2070 }
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2071 }
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2072 }
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2073 if (i <= len) {
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2074 SPLIT_ADD(s, i, len);
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2075 }
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2076 FIX_PREALLOC_SIZE(list);
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2077 return list;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2078
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2079 onError:
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2080 Py_DECREF(list);
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2081 return NULL;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2082 }
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2083
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2084 PyDoc_STRVAR(split__doc__,
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2085 "B.split(sep [,maxsplit]) -> list of bytes\n\
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2086 \n\
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2087 Return a list of the bytes in the string B, using sep as the\n\
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2088 delimiter. If maxsplit is given, at most maxsplit\n\
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2089 splits are done.");
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2090
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2091 static PyObject *
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2092 bytes_split(PyBytesObject *self, PyObject *args)
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2093 {
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2094 Py_ssize_t len = PyBytes_GET_SIZE(self), n, i, j;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2095 Py_ssize_t maxsplit = -1, count=0;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2096 const char *s = PyBytes_AS_STRING(self), *sub;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2097 PyObject *list, *str, *subobj;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2098 #ifdef USE_FAST
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2099 Py_ssize_t pos;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2100 #endif
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2101
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2102 if (!PyArg_ParseTuple(args, "O|n:split", &subobj, &maxsplit))
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2103 return NULL;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2104 if (maxsplit < 0)
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2105 maxsplit = PY_SSIZE_T_MAX;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2106 if (PyBytes_Check(subobj)) {
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2107 sub = PyBytes_AS_STRING(subobj);
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2108 n = PyBytes_GET_SIZE(subobj);
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2109 }
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2110 else if (PyObject_AsCharBuffer(subobj, &sub, &n))
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2111 return NULL;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2112
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2113 if (n == 0) {
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2114 PyErr_SetString(PyExc_ValueError, "empty separator");
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2115 return NULL;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2116 }
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2117 else if (n == 1)
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2118 return split_char(s, len, sub[0], maxsplit);
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2119
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2120 list = PyList_New(PREALLOC_SIZE(maxsplit));
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2121 if (list == NULL)
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2122 return NULL;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2123
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2124 #ifdef USE_FAST
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2125 i = j = 0;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2126 while (maxsplit-- > 0) {
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2127 pos = fastsearch(s+i, len-i, sub, n, FAST_SEARCH);
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2128 if (pos < 0)
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2129 break;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2130 j = i+pos;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2131 SPLIT_ADD(s, i, j);
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2132 i = j + n;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2133 }
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2134 #else
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2135 i = j = 0;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2136 while ((j+n <= len) && (maxsplit-- > 0)) {
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2137 for (; j+n <= len; j++) {
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2138 if (Py_STRING_MATCH(s, j, sub, n)) {
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2139 SPLIT_ADD(s, i, j);
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2140 i = j = j + n;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2141 break;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2142 }
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2143 }
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2144 }
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2145 #endif
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2146 SPLIT_ADD(s, i, len);
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2147 FIX_PREALLOC_SIZE(list);
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2148 return list;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2149
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2150 onError:
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2151 Py_DECREF(list);
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2152 return NULL;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2153 }
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2154
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2155 PyDoc_STRVAR(partition__doc__,
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2156 "B.partition(sep) -> (head, sep, tail)\n\
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2157 \n\
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2158 Searches for the separator sep in B, and returns the part before it,\n\
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2159 the separator itself, and the part after it. If the separator is not\n\
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2160 found, returns B and two empty bytes.");
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2161
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2162 static PyObject *
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2163 bytes_partition(PyBytesObject *self, PyObject *sep_obj)
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2164 {
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2165 PyObject *bytesep, *result;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2166
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2167 bytesep = PyBytes_FromObject(sep_obj);
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2168 if (! bytesep)
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2169 return NULL;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2170
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2171 result = stringlib_partition(
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2172 (PyObject*) self,
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2173 PyBytes_AS_STRING(self), PyBytes_GET_SIZE(self),
41448
458c8db2e946 Clean up trailing whitespace.
Guido van Rossum <guido@python.org>
parents: 41426
diff changeset
2174 bytesep,
40978
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2175 PyBytes_AS_STRING(bytesep), PyBytes_GET_SIZE(bytesep)
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2176 );
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2177
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2178 Py_DECREF(bytesep);
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2179 return result;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2180 }
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2181
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2182 PyDoc_STRVAR(rpartition__doc__,
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2183 "B.rpartition(sep) -> (tail, sep, head)\n\
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2184 \n\
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2185 Searches for the separator sep in B, starting at the end of B, and returns\n\
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2186 the part before it, the separator itself, and the part after it. If the\n\
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2187 separator is not found, returns two empty bytes and B.");
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2188
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2189 static PyObject *
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2190 bytes_rpartition(PyBytesObject *self, PyObject *sep_obj)
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2191 {
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2192 PyObject *bytesep, *result;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2193
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2194 bytesep = PyBytes_FromObject(sep_obj);
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2195 if (! bytesep)
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2196 return NULL;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2197
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2198 result = stringlib_rpartition(
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2199 (PyObject*) self,
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2200 PyBytes_AS_STRING(self), PyBytes_GET_SIZE(self),
41448
458c8db2e946 Clean up trailing whitespace.
Guido van Rossum <guido@python.org>
parents: 41426
diff changeset
2201 bytesep,
40978
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2202 PyBytes_AS_STRING(bytesep), PyBytes_GET_SIZE(bytesep)
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2203 );
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2204
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2205 Py_DECREF(bytesep);
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2206 return result;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2207 }
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2208
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2209 Py_LOCAL_INLINE(PyObject *)
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2210 rsplit_char(const char *s, Py_ssize_t len, char ch, Py_ssize_t maxcount)
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2211 {
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2212 register Py_ssize_t i, j, count=0;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2213 PyObject *str;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2214 PyObject *list = PyList_New(PREALLOC_SIZE(maxcount));
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2215
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2216 if (list == NULL)
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2217 return NULL;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2218
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2219 i = j = len - 1;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2220 while ((i >= 0) && (maxcount-- > 0)) {
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2221 for (; i >= 0; i--) {
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2222 if (s[i] == ch) {
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2223 SPLIT_ADD(s, i + 1, j + 1);
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2224 j = i = i - 1;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2225 break;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2226 }
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2227 }
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2228 }
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2229 if (j >= -1) {
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2230 SPLIT_ADD(s, 0, j + 1);
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2231 }
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2232 FIX_PREALLOC_SIZE(list);
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2233 if (PyList_Reverse(list) < 0)
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2234 goto onError;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2235
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2236 return list;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2237
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2238 onError:
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2239 Py_DECREF(list);
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2240 return NULL;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2241 }
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2242
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2243 PyDoc_STRVAR(rsplit__doc__,
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2244 "B.rsplit(sep [,maxsplit]) -> list of bytes\n\
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2245 \n\
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2246 Return a list of the sections in the byte B, using sep as the\n\
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2247 delimiter, starting at the end of the bytes and working\n\
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2248 to the front. If maxsplit is given, at most maxsplit splits are\n\
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2249 done.");
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2250
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2251 static PyObject *
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2252 bytes_rsplit(PyBytesObject *self, PyObject *args)
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2253 {
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2254 Py_ssize_t len = PyBytes_GET_SIZE(self), n, i, j;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2255 Py_ssize_t maxsplit = -1, count=0;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2256 const char *s = PyBytes_AS_STRING(self), *sub;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2257 PyObject *list, *str, *subobj;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2258
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2259 if (!PyArg_ParseTuple(args, "O|n:rsplit", &subobj, &maxsplit))
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2260 return NULL;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2261 if (maxsplit < 0)
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2262 maxsplit = PY_SSIZE_T_MAX;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2263 if (PyBytes_Check(subobj)) {
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2264 sub = PyBytes_AS_STRING(subobj);
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2265 n = PyBytes_GET_SIZE(subobj);
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2266 }
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2267 else if (PyObject_AsCharBuffer(subobj, &sub, &n))
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2268 return NULL;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2269
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2270 if (n == 0) {
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2271 PyErr_SetString(PyExc_ValueError, "empty separator");
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2272 return NULL;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2273 }
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2274 else if (n == 1)
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2275 return rsplit_char(s, len, sub[0], maxsplit);
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2276
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2277 list = PyList_New(PREALLOC_SIZE(maxsplit));
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2278 if (list == NULL)
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2279 return NULL;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2280
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2281 j = len;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2282 i = j - n;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2283
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2284 while ( (i >= 0) && (maxsplit-- > 0) ) {
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2285 for (; i>=0; i--) {
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2286 if (Py_STRING_MATCH(s, i, sub, n)) {
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2287 SPLIT_ADD(s, i + n, j);
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2288 j = i;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2289 i -= n;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2290 break;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2291 }
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2292 }
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2293 }
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2294 SPLIT_ADD(s, 0, j);
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2295 FIX_PREALLOC_SIZE(list);
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2296 if (PyList_Reverse(list) < 0)
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2297 goto onError;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2298 return list;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2299
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2300 onError:
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2301 Py_DECREF(list);
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2302 return NULL;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2303 }
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2304
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2305 PyDoc_STRVAR(extend__doc__,
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2306 "B.extend(iterable int) -> None\n\
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2307 \n\
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2308 Append all the elements from the iterator or sequence to the\n\
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2309 end of the bytes.");
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2310 static PyObject *
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2311 bytes_extend(PyBytesObject *self, PyObject *arg)
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2312 {
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2313 if (bytes_setslice(self, self->ob_size, self->ob_size, arg) == -1)
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2314 return NULL;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2315 Py_RETURN_NONE;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2316 }
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2317
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2318
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2319 PyDoc_STRVAR(reverse__doc__,
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2320 "B.reverse() -> None\n\
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2321 \n\
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2322 Reverse the order of the values in bytes in place.");
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2323 static PyObject *
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2324 bytes_reverse(PyBytesObject *self, PyObject *unused)
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2325 {
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2326 char swap, *head, *tail;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2327 Py_ssize_t i, j, n = self->ob_size;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2328
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2329 j = n / 2;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2330 head = self->ob_bytes;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2331 tail = head + n - 1;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2332 for (i = 0; i < j; i++) {
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2333 swap = *head;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2334 *head++ = *tail;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2335 *tail-- = swap;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2336 }
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2337
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2338 Py_RETURN_NONE;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2339 }
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2340
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2341 PyDoc_STRVAR(insert__doc__,
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2342 "B.insert(index, int) -> None\n\
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2343 \n\
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2344 Insert a single item into the bytes before the given index.");
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2345 static PyObject *
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2346 bytes_insert(PyBytesObject *self, PyObject *args)
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2347 {
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2348 int value;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2349 Py_ssize_t where, n = self->ob_size;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2350
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2351 if (!PyArg_ParseTuple(args, "ni:insert", &where, &value))
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2352 return NULL;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2353
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2354 if (n == PY_SSIZE_T_MAX) {
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2355 PyErr_SetString(PyExc_OverflowError,
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2356 "cannot add more objects to bytes");
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2357 return NULL;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2358 }
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2359 if (value < 0 || value >= 256) {
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2360 PyErr_SetString(PyExc_ValueError,
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2361 "byte must be in range(0, 256)");
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2362 return NULL;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2363 }
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2364 if (PyBytes_Resize((PyObject *)self, n + 1) < 0)
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2365 return NULL;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2366
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2367 if (where < 0) {
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2368 where += n;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2369 if (where < 0)
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2370 where = 0;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2371 }
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2372 if (where > n)
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2373 where = n;
40982
431b3238593e Fix off-by-one bug in memmove() call in bytes_insert().
Guido van Rossum <guido@python.org>
parents: 40978
diff changeset
2374 memmove(self->ob_bytes + where + 1, self->ob_bytes + where, n - where);
40978
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2375 self->ob_bytes[where] = value;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2376
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2377 Py_RETURN_NONE;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2378 }
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2379
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2380 PyDoc_STRVAR(append__doc__,
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2381 "B.append(int) -> None\n\
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2382 \n\
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2383 Append a single item to the end of the bytes.");
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2384 static PyObject *
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2385 bytes_append(PyBytesObject *self, PyObject *arg)
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2386 {
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2387 int value;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2388 Py_ssize_t n = self->ob_size;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2389
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2390 if (! _getbytevalue(arg, &value))
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2391 return NULL;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2392 if (n == PY_SSIZE_T_MAX) {
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2393 PyErr_SetString(PyExc_OverflowError,
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2394 "cannot add more objects to bytes");
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2395 return NULL;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2396 }
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2397 if (PyBytes_Resize((PyObject *)self, n + 1) < 0)
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2398 return NULL;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2399
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2400 self->ob_bytes[n] = value;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2401
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2402 Py_RETURN_NONE;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2403 }
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2404
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2405 PyDoc_STRVAR(pop__doc__,
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2406 "B.pop([index]) -> int\n\
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2407 \n\
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2408 Remove and return a single item from the bytes. If no index\n\
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2409 argument is give, will pop the last value.");
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2410 static PyObject *
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2411 bytes_pop(PyBytesObject *self, PyObject *args)
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2412 {
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2413 int value;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2414 Py_ssize_t where = -1, n = self->ob_size;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2415
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2416 if (!PyArg_ParseTuple(args, "|n:pop", &where))
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2417 return NULL;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2418
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2419 if (n == 0) {
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2420 PyErr_SetString(PyExc_OverflowError,
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2421 "cannot pop an empty bytes");
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2422 return NULL;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2423 }
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2424 if (where < 0)
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2425 where += self->ob_size;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2426 if (where < 0 || where >= self->ob_size) {
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2427 PyErr_SetString(PyExc_IndexError, "pop index out of range");
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2428 return NULL;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2429 }
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2430
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2431 value = self->ob_bytes[where];
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2432 memmove(self->ob_bytes + where, self->ob_bytes + where + 1, n - where);
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2433 if (PyBytes_Resize((PyObject *)self, n - 1) < 0)
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2434 return NULL;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2435
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2436 return PyInt_FromLong(value);
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2437 }
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2438
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2439 PyDoc_STRVAR(remove__doc__,
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2440 "B.remove(int) -> None\n\
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2441 \n\
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2442 Remove the first occurance of a value in bytes");
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2443 static PyObject *
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2444 bytes_remove(PyBytesObject *self, PyObject *arg)
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2445 {
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2446 int value;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2447 Py_ssize_t where, n = self->ob_size;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2448
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2449 if (! _getbytevalue(arg, &value))
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2450 return NULL;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2451
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2452 for (where = 0; where < n; where++) {
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2453 if (self->ob_bytes[where] == value)
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2454 break;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2455 }
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2456 if (where == n) {
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2457 PyErr_SetString(PyExc_ValueError, "value not found in bytes");
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2458 return NULL;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2459 }
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2460
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2461 memmove(self->ob_bytes + where, self->ob_bytes + where + 1, n - where);
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2462 if (PyBytes_Resize((PyObject *)self, n - 1) < 0)
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2463 return NULL;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2464
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2465 Py_RETURN_NONE;
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2466 }
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2467
41450
d1c3dd184e38 Rough and dirty job -- allow concatenation of bytes and arbitrary
Guido van Rossum <guido@python.org>
parents: 41448
diff changeset
2468 /* XXX These two helpers could be optimized if argsize == 1 */
d1c3dd184e38 Rough and dirty job -- allow concatenation of bytes and arbitrary
Guido van Rossum <guido@python.org>
parents: 41448
diff changeset
2469
d1c3dd184e38 Rough and dirty job -- allow concatenation of bytes and arbitrary
Guido van Rossum <guido@python.org>
parents: 41448
diff changeset
2470 Py_ssize_t
d1c3dd184e38 Rough and dirty job -- allow concatenation of bytes and arbitrary
Guido van Rossum <guido@python.org>
parents: 41448
diff changeset
2471 lstrip_helper(unsigned char *myptr, Py_ssize_t mysize,
d1c3dd184e38 Rough and dirty job -- allow concatenation of bytes and arbitrary
Guido van Rossum <guido@python.org>
parents: 41448
diff changeset
2472 void *argptr, Py_ssize_t argsize)
d1c3dd184e38 Rough and dirty job -- allow concatenation of bytes and arbitrary
Guido van Rossum <guido@python.org>
parents: 41448
diff changeset
2473 {
d1c3dd184e38 Rough and dirty job -- allow concatenation of bytes and arbitrary
Guido van Rossum <guido@python.org>
parents: 41448
diff changeset
2474 Py_ssize_t i = 0;
d1c3dd184e38 Rough and dirty job -- allow concatenation of bytes and arbitrary
Guido van Rossum <guido@python.org>
parents: 41448
diff changeset
2475 while (i < mysize && memchr(argptr, myptr[i], argsize))
d1c3dd184e38 Rough and dirty job -- allow concatenation of bytes and arbitrary
Guido van Rossum <guido@python.org>
parents: 41448
diff changeset
2476 i++;
d1c3dd184e38 Rough and dirty job -- allow concatenation of bytes and arbitrary
Guido van Rossum <guido@python.org>
parents: 41448
diff changeset
2477 return i;
d1c3dd184e38 Rough and dirty job -- allow concatenation of bytes and arbitrary
Guido van Rossum <guido@python.org>
parents: 41448
diff changeset
2478 }
d1c3dd184e38 Rough and dirty job -- allow concatenation of bytes and arbitrary
Guido van Rossum <guido@python.org>
parents: 41448
diff changeset
2479
d1c3dd184e38 Rough and dirty job -- allow concatenation of bytes and arbitrary
Guido van Rossum <guido@python.org>
parents: 41448
diff changeset
2480 Py_ssize_t
d1c3dd184e38 Rough and dirty job -- allow concatenation of bytes and arbitrary
Guido van Rossum <guido@python.org>
parents: 41448
diff changeset
2481 rstrip_helper(unsigned char *myptr, Py_ssize_t mysize,
d1c3dd184e38 Rough and dirty job -- allow concatenation of bytes and arbitrary
Guido van Rossum <guido@python.org>
parents: 41448
diff changeset
2482 void *argptr, Py_ssize_t argsize)
d1c3dd184e38 Rough and dirty job -- allow concatenation of bytes and arbitrary
Guido van Rossum <guido@python.org>
parents: 41448
diff changeset
2483 {
d1c3dd184e38 Rough and dirty job -- allow concatenation of bytes and arbitrary
Guido van Rossum <guido@python.org>
parents: 41448
diff changeset
2484 Py_ssize_t i = mysize - 1;
d1c3dd184e38 Rough and dirty job -- allow concatenation of bytes and arbitrary
Guido van Rossum <guido@python.org>
parents: 41448
diff changeset
2485 while (i >= 0 && memchr(argptr, myptr[i], argsize))
d1c3dd184e38 Rough and dirty job -- allow concatenation of bytes and arbitrary
Guido van Rossum <guido@python.org>
parents: 41448
diff changeset
2486 i--;
d1c3dd184e38 Rough and dirty job -- allow concatenation of bytes and arbitrary
Guido van Rossum <guido@python.org>
parents: 41448
diff changeset
2487 return i + 1;
d1c3dd184e38 Rough and dirty job -- allow concatenation of bytes and arbitrary
Guido van Rossum <guido@python.org>
parents: 41448
diff changeset
2488 }
d1c3dd184e38 Rough and dirty job -- allow concatenation of bytes and arbitrary
Guido van Rossum <guido@python.org>
parents: 41448
diff changeset
2489
d1c3dd184e38 Rough and dirty job -- allow concatenation of bytes and arbitrary
Guido van Rossum <guido@python.org>
parents: 41448
diff changeset
2490 PyDoc_STRVAR(strip__doc__,
d1c3dd184e38 Rough and dirty job -- allow concatenation of bytes and arbitrary
Guido van Rossum <guido@python.org>
parents: 41448
diff changeset
2491 "B.strip(bytes) -> bytes\n\
d1c3dd184e38 Rough and dirty job -- allow concatenation of bytes and arbitrary
Guido van Rossum <guido@python.org>
parents: 41448
diff changeset
2492 \n\
d1c3dd184e38 Rough and dirty job -- allow concatenation of bytes and arbitrary
Guido van Rossum <guido@python.org>
parents: 41448
diff changeset
2493 Strip leading and trailing bytes contained in the argument.");
d1c3dd184e38 Rough and dirty job -- allow concatenation of bytes and arbitrary
Guido van Rossum <guido@python.org>
parents: 41448
diff changeset
2494 static PyObject *
d1c3dd184e38 Rough and dirty job -- allow concatenation of bytes and arbitrary
Guido van Rossum <guido@python.org>
parents: 41448
diff changeset
2495 bytes_strip(PyBytesObject *self, PyObject *arg)
d1c3dd184e38 Rough and dirty job -- allow concatenation of bytes and arbitrary
Guido van Rossum <guido@python.org>
parents: 41448
diff changeset
2496 {
d1c3dd184e38 Rough and dirty job -- allow concatenation of bytes and arbitrary
Guido van Rossum <guido@python.org>
parents: 41448
diff changeset
2497 Py_ssize_t left, right, mysize, argsize;
d1c3dd184e38 Rough and dirty job -- allow concatenation of bytes and arbitrary
Guido van Rossum <guido@python.org>
parents: 41448
diff changeset
2498 void *myptr, *argptr;
d1c3dd184e38 Rough and dirty job -- allow concatenation of bytes and arbitrary
Guido van Rossum <guido@python.org>
parents: 41448
diff changeset
2499 if (arg == NULL || !PyBytes_Check(arg)) {
d1c3dd184e38 Rough and dirty job -- allow concatenation of bytes and arbitrary
Guido van Rossum <guido@python.org>
parents: 41448
diff changeset
2500 PyErr_SetString(PyExc_TypeError, "strip() requires a bytes argument");
d1c3dd184e38 Rough and dirty job -- allow concatenation of bytes and arbitrary
Guido van Rossum <guido@python.org>
parents: 41448
diff changeset
2501 return NULL;
d1c3dd184e38 Rough and dirty job -- allow concatenation of bytes and arbitrary
Guido van Rossum <guido@python.org>
parents: 41448
diff changeset
2502 }
d1c3dd184e38 Rough and dirty job -- allow concatenation of bytes and arbitrary
Guido van Rossum <guido@python.org>
parents: 41448
diff changeset
2503 myptr = self->ob_bytes;
d1c3dd184e38 Rough and dirty job -- allow concatenation of bytes and arbitrary
Guido van Rossum <guido@python.org>
parents: 41448
diff changeset
2504 mysize = self->ob_size;
d1c3dd184e38 Rough and dirty job -- allow concatenation of bytes and arbitrary
Guido van Rossum <guido@python.org>
parents: 41448
diff changeset
2505 argptr = ((PyBytesObject *)arg)->ob_bytes;
d1c3dd184e38 Rough and dirty job -- allow concatenation of bytes and arbitrary
Guido van Rossum <guido@python.org>
parents: 41448
diff changeset
2506 argsize = ((PyBytesObject *)arg)->ob_size;
d1c3dd184e38 Rough and dirty job -- allow concatenation of bytes and arbitrary
Guido van Rossum <guido@python.org>
parents: 41448
diff changeset
2507 left = lstrip_helper(myptr, mysize, argptr, argsize);
d1c3dd184e38 Rough and dirty job -- allow concatenation of bytes and arbitrary
Guido van Rossum <guido@python.org>
parents: 41448
diff changeset
2508 right = rstrip_helper(myptr, mysize, argptr, argsize);
d1c3dd184e38 Rough and dirty job -- allow concatenation of bytes and arbitrary
Guido van Rossum <guido@python.org>
parents: 41448
diff changeset
2509 return PyBytes_FromStringAndSize(self->ob_bytes + left, right - left);
d1c3dd184e38 Rough and dirty job -- allow concatenation of bytes and arbitrary
Guido van Rossum <guido@python.org>
parents: 41448
diff changeset
2510 }
d1c3dd184e38 Rough and dirty job -- allow concatenation of bytes and arbitrary
Guido van Rossum <guido@python.org>
parents: 41448
diff changeset
2511
d1c3dd184e38 Rough and dirty job -- allow concatenation of bytes and arbitrary
Guido van Rossum <guido@python.org>
parents: 41448
diff changeset
2512 PyDoc_STRVAR(lstrip__doc__,
d1c3dd184e38 Rough and dirty job -- allow concatenation of bytes and arbitrary
Guido van Rossum <guido@python.org>
parents: 41448
diff changeset
2513 "B.lstrip(bytes) -> bytes\n\
d1c3dd184e38 Rough and dirty job -- allow concatenation of bytes and arbitrary
Guido van Rossum <guido@python.org>
parents: 41448
diff changeset
2514 \n\
d1c3dd184e38 Rough and dirty job -- allow concatenation of bytes and arbitrary
Guido van Rossum <guido@python.org>
parents: 41448
diff changeset
2515 Strip leading bytes contained in the argument.");
d1c3dd184e38 Rough and dirty job -- allow concatenation of bytes and arbitrary
Guido van Rossum <guido@python.org>
parents: 41448
diff changeset
2516 static PyObject *
d1c3dd184e38 Rough and dirty job -- allow concatenation of bytes and arbitrary
Guido van Rossum <guido@python.org>
parents: 41448
diff changeset
2517 bytes_lstrip(PyBytesObject *self, PyObject *arg)
d1c3dd184e38 Rough and dirty job -- allow concatenation of bytes and arbitrary
Guido van Rossum <guido@python.org>
parents: 41448
diff changeset
2518 {
d1c3dd184e38 Rough and dirty job -- allow concatenation of bytes and arbitrary
Guido van Rossum <guido@python.org>
parents: 41448
diff changeset
2519 Py_ssize_t left, right, mysize, argsize;
d1c3dd184e38 Rough and dirty job -- allow concatenation of bytes and arbitrary
Guido van Rossum <guido@python.org>
parents: 41448
diff changeset
2520 void *myptr, *argptr;
d1c3dd184e38 Rough and dirty job -- allow concatenation of bytes and arbitrary
Guido van Rossum <guido@python.org>
parents: 41448
diff changeset
2521 if (arg == NULL || !PyBytes_Check(arg)) {
d1c3dd184e38 Rough and dirty job -- allow concatenation of bytes and arbitrary
Guido van Rossum <guido@python.org>
parents: 41448
diff changeset
2522 PyErr_SetString(PyExc_TypeError, "strip() requires a bytes argument");
d1c3dd184e38 Rough and dirty job -- allow concatenation of bytes and arbitrary
Guido van Rossum <guido@python.org>
parents: 41448
diff changeset
2523 return NULL;
d1c3dd184e38 Rough and dirty job -- allow concatenation of bytes and arbitrary
Guido van Rossum <guido@python.org>
parents: 41448
diff changeset
2524 }
d1c3dd184e38 Rough and dirty job -- allow concatenation of bytes and arbitrary
Guido van Rossum <guido@python.org>
parents: 41448
diff changeset
2525 myptr = self->ob_bytes;
d1c3dd184e38 Rough and dirty job -- allow concatenation of bytes and arbitrary
Guido van Rossum <guido@python.org>
parents: 41448
diff changeset
2526 mysize = self->ob_size;
d1c3dd184e38 Rough and dirty job -- allow concatenation of bytes and arbitrary
Guido van Rossum <guido@python.org>
parents: 41448
diff changeset
2527 argptr = ((PyBytesObject *)arg)->ob_bytes;
d1c3dd184e38 Rough and dirty job -- allow concatenation of bytes and arbitrary
Guido van Rossum <guido@python.org>
parents: 41448
diff changeset
2528 argsize = ((PyBytesObject *)arg)->ob_size;
d1c3dd184e38 Rough and dirty job -- allow concatenation of bytes and arbitrary
Guido van Rossum <guido@python.org>
parents: 41448
diff changeset
2529 left = lstrip_helper(myptr, mysize, argptr, argsize);
d1c3dd184e38 Rough and dirty job -- allow concatenation of bytes and arbitrary
Guido van Rossum <guido@python.org>
parents: 41448
diff changeset
2530 right = mysize;
d1c3dd184e38 Rough and dirty job -- allow concatenation of bytes and arbitrary
Guido van Rossum <guido@python.org>
parents: 41448
diff changeset
2531 return PyBytes_FromStringAndSize(self->ob_bytes + left, right - left);
d1c3dd184e38 Rough and dirty job -- allow concatenation of bytes and arbitrary
Guido van Rossum <guido@python.org>
parents: 41448
diff changeset
2532 }
d1c3dd184e38 Rough and dirty job -- allow concatenation of bytes and arbitrary
Guido van Rossum <guido@python.org>
parents: 41448
diff changeset
2533
d1c3dd184e38 Rough and dirty job -- allow concatenation of bytes and arbitrary
Guido van Rossum <guido@python.org>
parents: 41448
diff changeset
2534 PyDoc_STRVAR(rstrip__doc__,
d1c3dd184e38 Rough and dirty job -- allow concatenation of bytes and arbitrary
Guido van Rossum <guido@python.org>
parents: 41448
diff changeset
2535 "B.rstrip(bytes) -> bytes\n\
d1c3dd184e38 Rough and dirty job -- allow concatenation of bytes and arbitrary
Guido van Rossum <guido@python.org>
parents: 41448
diff changeset
2536 \n\
d1c3dd184e38 Rough and dirty job -- allow concatenation of bytes and arbitrary
Guido van Rossum <guido@python.org>
parents: 41448
diff changeset
2537 Strip trailing bytes contained in the argument.");
d1c3dd184e38 Rough and dirty job -- allow concatenation of bytes and arbitrary
Guido van Rossum <guido@python.org>
parents: 41448
diff changeset
2538 static PyObject *
d1c3dd184e38 Rough and dirty job -- allow concatenation of bytes and arbitrary
Guido van Rossum <guido@python.org>
parents: 41448
diff changeset
2539 bytes_rstrip(PyBytesObject *self, PyObject *arg)
d1c3dd184e38 Rough and dirty job -- allow concatenation of bytes and arbitrary
Guido van Rossum <guido@python.org>
parents: 41448
diff changeset
2540 {
d1c3dd184e38 Rough and dirty job -- allow concatenation of bytes and arbitrary
Guido van Rossum <guido@python.org>
parents: 41448
diff changeset
2541 Py_ssize_t left, right, mysize, argsize;
d1c3dd184e38 Rough and dirty job -- allow concatenation of bytes and arbitrary
Guido van Rossum <guido@python.org>
parents: 41448
diff changeset
2542 void *myptr, *argptr;
d1c3dd184e38 Rough and dirty job -- allow concatenation of bytes and arbitrary
Guido van Rossum <guido@python.org>
parents: 41448
diff changeset
2543 if (arg == NULL || !PyBytes_Check(arg)) {
d1c3dd184e38 Rough and dirty job -- allow concatenation of bytes and arbitrary
Guido van Rossum <guido@python.org>
parents: 41448
diff changeset
2544 PyErr_SetString(PyExc_TypeError, "strip() requires a bytes argument");
d1c3dd184e38 Rough and dirty job -- allow concatenation of bytes and arbitrary
Guido van Rossum <guido@python.org>
parents: 41448
diff changeset
2545 return NULL;
d1c3dd184e38 Rough and dirty job -- allow concatenation of bytes and arbitrary
Guido van Rossum <guido@python.org>
parents: 41448
diff changeset
2546 }
d1c3dd184e38 Rough and dirty job -- allow concatenation of bytes and arbitrary
Guido van Rossum <guido@python.org>
parents: 41448
diff changeset
2547 myptr = self->ob_bytes;
d1c3dd184e38 Rough and dirty job -- allow concatenation of bytes and arbitrary
Guido van Rossum <guido@python.org>
parents: 41448
diff changeset
2548 mysize = self->ob_size;
d1c3dd184e38 Rough and dirty job -- allow concatenation of bytes and arbitrary
Guido van Rossum <guido@python.org>
parents: 41448
diff changeset
2549 argptr = ((PyBytesObject *)arg)->ob_bytes;
d1c3dd184e38 Rough and dirty job -- allow concatenation of bytes and arbitrary
Guido van Rossum <guido@python.org>
parents: 41448
diff changeset
2550 argsize = ((PyBytesObject *)arg)->ob_size;
d1c3dd184e38 Rough and dirty job -- allow concatenation of bytes and arbitrary
Guido van Rossum <guido@python.org>
parents: 41448
diff changeset
2551 left = 0;
d1c3dd184e38 Rough and dirty job -- allow concatenation of bytes and arbitrary
Guido van Rossum <guido@python.org>
parents: 41448
diff changeset
2552 right = rstrip_helper(myptr, mysize, argptr, argsize);
d1c3dd184e38 Rough and dirty job -- allow concatenation of bytes and arbitrary
Guido van Rossum <guido@python.org>
parents: 41448
diff changeset
2553 return PyBytes_FromStringAndSize(self->ob_bytes + left, right - left);
d1c3dd184e38 Rough and dirty job -- allow concatenation of bytes and arbitrary
Guido van Rossum <guido@python.org>
parents: 41448
diff changeset
2554 }
40978
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2555
37960
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
2556 PyDoc_STRVAR(decode_doc,
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
2557 "B.decode([encoding[,errors]]) -> unicode obect.\n\
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
2558 \n\
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
2559 Decodes B using the codec registered for encoding. encoding defaults\n\
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
2560 to the default encoding. errors may be given to set a different error\n\
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
2561 handling scheme. Default is 'strict' meaning that encoding errors raise\n\
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
2562 a UnicodeDecodeError. Other possible values are 'ignore' and 'replace'\n\
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
2563 as well as any other name registerd with codecs.register_error that is\n\
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
2564 able to handle UnicodeDecodeErrors.");
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
2565
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
2566 static PyObject *
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
2567 bytes_decode(PyObject *self, PyObject *args)
41448
458c8db2e946 Clean up trailing whitespace.
Guido van Rossum <guido@python.org>
parents: 41426
diff changeset
2568 {
37960
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
2569 const char *encoding = NULL;
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
2570 const char *errors = NULL;
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
2571
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
2572 if (!PyArg_ParseTuple(args, "|ss:decode", &encoding, &errors))
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
2573 return NULL;
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
2574 if (encoding == NULL)
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
2575 encoding = PyUnicode_GetDefaultEncoding();
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
2576 return PyCodec_Decode(self, encoding, errors);
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
2577 }
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
2578
38115
a6a1359aab84 Optimizations for bytes reallocation.
Guido van Rossum <guido@python.org>
parents: 38017
diff changeset
2579 PyDoc_STRVAR(alloc_doc,
a6a1359aab84 Optimizations for bytes reallocation.
Guido van Rossum <guido@python.org>
parents: 38017
diff changeset
2580 "B.__alloc__() -> int\n\
a6a1359aab84 Optimizations for bytes reallocation.
Guido van Rossum <guido@python.org>
parents: 38017
diff changeset
2581 \n\
a6a1359aab84 Optimizations for bytes reallocation.
Guido van Rossum <guido@python.org>
parents: 38017
diff changeset
2582 Returns the number of bytes actually allocated.");
a6a1359aab84 Optimizations for bytes reallocation.
Guido van Rossum <guido@python.org>
parents: 38017
diff changeset
2583
a6a1359aab84 Optimizations for bytes reallocation.
Guido van Rossum <guido@python.org>
parents: 38017
diff changeset
2584 static PyObject *
a6a1359aab84 Optimizations for bytes reallocation.
Guido van Rossum <guido@python.org>
parents: 38017
diff changeset
2585 bytes_alloc(PyBytesObject *self)
a6a1359aab84 Optimizations for bytes reallocation.
Guido van Rossum <guido@python.org>
parents: 38017
diff changeset
2586 {
a6a1359aab84 Optimizations for bytes reallocation.
Guido van Rossum <guido@python.org>
parents: 38017
diff changeset
2587 return PyInt_FromSsize_t(self->ob_alloc);
a6a1359aab84 Optimizations for bytes reallocation.
Guido van Rossum <guido@python.org>
parents: 38017
diff changeset
2588 }
a6a1359aab84 Optimizations for bytes reallocation.
Guido van Rossum <guido@python.org>
parents: 38017
diff changeset
2589
38117
57bd7c7d91e3 Adding bytes.join() -- a class methods that concatenates an iterable of bytes.
Guido van Rossum <guido@python.org>
parents: 38115
diff changeset
2590 PyDoc_STRVAR(join_doc,
57bd7c7d91e3 Adding bytes.join() -- a class methods that concatenates an iterable of bytes.
Guido van Rossum <guido@python.org>
parents: 38115
diff changeset
2591 "bytes.join(iterable_of_bytes) -> bytes\n\
57bd7c7d91e3 Adding bytes.join() -- a class methods that concatenates an iterable of bytes.
Guido van Rossum <guido@python.org>
parents: 38115
diff changeset
2592 \n\
57bd7c7d91e3 Adding bytes.join() -- a class methods that concatenates an iterable of bytes.
Guido van Rossum <guido@python.org>
parents: 38115
diff changeset
2593 Concatenates any number of bytes objects. Example:\n\
57bd7c7d91e3 Adding bytes.join() -- a class methods that concatenates an iterable of bytes.
Guido van Rossum <guido@python.org>
parents: 38115
diff changeset
2594 bytes.join([bytes('ab'), bytes('pq'), bytes('rs')]) -> bytes('abpqrs').");
57bd7c7d91e3 Adding bytes.join() -- a class methods that concatenates an iterable of bytes.
Guido van Rossum <guido@python.org>
parents: 38115
diff changeset
2595
57bd7c7d91e3 Adding bytes.join() -- a class methods that concatenates an iterable of bytes.
Guido van Rossum <guido@python.org>
parents: 38115
diff changeset
2596 static PyObject *
57bd7c7d91e3 Adding bytes.join() -- a class methods that concatenates an iterable of bytes.
Guido van Rossum <guido@python.org>
parents: 38115
diff changeset
2597 bytes_join(PyObject *cls, PyObject *it)
57bd7c7d91e3 Adding bytes.join() -- a class methods that concatenates an iterable of bytes.
Guido van Rossum <guido@python.org>
parents: 38115
diff changeset
2598 {
57bd7c7d91e3 Adding bytes.join() -- a class methods that concatenates an iterable of bytes.
Guido van Rossum <guido@python.org>
parents: 38115
diff changeset
2599 PyObject *seq;
57bd7c7d91e3 Adding bytes.join() -- a class methods that concatenates an iterable of bytes.
Guido van Rossum <guido@python.org>
parents: 38115
diff changeset
2600 Py_ssize_t i;
57bd7c7d91e3 Adding bytes.join() -- a class methods that concatenates an iterable of bytes.
Guido van Rossum <guido@python.org>
parents: 38115
diff changeset
2601 Py_ssize_t n;
57bd7c7d91e3 Adding bytes.join() -- a class methods that concatenates an iterable of bytes.
Guido van Rossum <guido@python.org>
parents: 38115
diff changeset
2602 PyObject **items;
57bd7c7d91e3 Adding bytes.join() -- a class methods that concatenates an iterable of bytes.
Guido van Rossum <guido@python.org>
parents: 38115
diff changeset
2603 Py_ssize_t totalsize = 0;
57bd7c7d91e3 Adding bytes.join() -- a class methods that concatenates an iterable of bytes.
Guido van Rossum <guido@python.org>
parents: 38115
diff changeset
2604 PyObject *result;
57bd7c7d91e3 Adding bytes.join() -- a class methods that concatenates an iterable of bytes.
Guido van Rossum <guido@python.org>
parents: 38115
diff changeset
2605 char *dest;
57bd7c7d91e3 Adding bytes.join() -- a class methods that concatenates an iterable of bytes.
Guido van Rossum <guido@python.org>
parents: 38115
diff changeset
2606
57bd7c7d91e3 Adding bytes.join() -- a class methods that concatenates an iterable of bytes.
Guido van Rossum <guido@python.org>
parents: 38115
diff changeset
2607 seq = PySequence_Fast(it, "can only join an iterable");
57bd7c7d91e3 Adding bytes.join() -- a class methods that concatenates an iterable of bytes.
Guido van Rossum <guido@python.org>
parents: 38115
diff changeset
2608 if (seq == NULL)
40968
2d9d10702ec4 Remove a few stray tabs from bytesobject.c.
Georg Brandl <georg@python.org>
parents: 40967
diff changeset
2609 return NULL;
38117
57bd7c7d91e3 Adding bytes.join() -- a class methods that concatenates an iterable of bytes.
Guido van Rossum <guido@python.org>
parents: 38115
diff changeset
2610 n = PySequence_Fast_GET_SIZE(seq);
57bd7c7d91e3 Adding bytes.join() -- a class methods that concatenates an iterable of bytes.
Guido van Rossum <guido@python.org>
parents: 38115
diff changeset
2611 items = PySequence_Fast_ITEMS(seq);
57bd7c7d91e3 Adding bytes.join() -- a class methods that concatenates an iterable of bytes.
Guido van Rossum <guido@python.org>
parents: 38115
diff changeset
2612
57bd7c7d91e3 Adding bytes.join() -- a class methods that concatenates an iterable of bytes.
Guido van Rossum <guido@python.org>
parents: 38115
diff changeset
2613 /* Compute the total size, and check that they are all bytes */
57bd7c7d91e3 Adding bytes.join() -- a class methods that concatenates an iterable of bytes.
Guido van Rossum <guido@python.org>
parents: 38115
diff changeset
2614 for (i = 0; i < n; i++) {
40968
2d9d10702ec4 Remove a few stray tabs from bytesobject.c.
Georg Brandl <georg@python.org>
parents: 40967
diff changeset
2615 PyObject *obj = items[i];
2d9d10702ec4 Remove a few stray tabs from bytesobject.c.
Georg Brandl <georg@python.org>
parents: 40967
diff changeset
2616 if (!PyBytes_Check(obj)) {
2d9d10702ec4 Remove a few stray tabs from bytesobject.c.
Georg Brandl <georg@python.org>
parents: 40967
diff changeset
2617 PyErr_Format(PyExc_TypeError,
2d9d10702ec4 Remove a few stray tabs from bytesobject.c.
Georg Brandl <georg@python.org>
parents: 40967
diff changeset
2618 "can only join an iterable of bytes "
2d9d10702ec4 Remove a few stray tabs from bytesobject.c.
Georg Brandl <georg@python.org>
parents: 40967
diff changeset
2619 "(item %ld has type '%.100s')",
39222
b0cdcbcc5f45 Get rid of most of the flags (in tp_flags) that keep track of various
Guido van Rossum <guido@python.org>
parents: 38117
diff changeset
2620 /* XXX %ld isn't right on Win64 */
40968
2d9d10702ec4 Remove a few stray tabs from bytesobject.c.
Georg Brandl <georg@python.org>
parents: 40967
diff changeset
2621 (long)i, obj->ob_type->tp_name);
2d9d10702ec4 Remove a few stray tabs from bytesobject.c.
Georg Brandl <georg@python.org>
parents: 40967
diff changeset
2622 goto error;
2d9d10702ec4 Remove a few stray tabs from bytesobject.c.
Georg Brandl <georg@python.org>
parents: 40967
diff changeset
2623 }
2d9d10702ec4 Remove a few stray tabs from bytesobject.c.
Georg Brandl <georg@python.org>
parents: 40967
diff changeset
2624 totalsize += PyBytes_GET_SIZE(obj);
2d9d10702ec4 Remove a few stray tabs from bytesobject.c.
Georg Brandl <georg@python.org>
parents: 40967
diff changeset
2625 if (totalsize < 0) {
2d9d10702ec4 Remove a few stray tabs from bytesobject.c.
Georg Brandl <georg@python.org>
parents: 40967
diff changeset
2626 PyErr_NoMemory();
2d9d10702ec4 Remove a few stray tabs from bytesobject.c.
Georg Brandl <georg@python.org>
parents: 40967
diff changeset
2627 goto error;
2d9d10702ec4 Remove a few stray tabs from bytesobject.c.
Georg Brandl <georg@python.org>
parents: 40967
diff changeset
2628 }
38117
57bd7c7d91e3 Adding bytes.join() -- a class methods that concatenates an iterable of bytes.
Guido van Rossum <guido@python.org>
parents: 38115
diff changeset
2629 }
57bd7c7d91e3 Adding bytes.join() -- a class methods that concatenates an iterable of bytes.
Guido van Rossum <guido@python.org>
parents: 38115
diff changeset
2630
57bd7c7d91e3 Adding bytes.join() -- a class methods that concatenates an iterable of bytes.
Guido van Rossum <guido@python.org>
parents: 38115
diff changeset
2631 /* Allocate the result, and copy the bytes */
57bd7c7d91e3 Adding bytes.join() -- a class methods that concatenates an iterable of bytes.
Guido van Rossum <guido@python.org>
parents: 38115
diff changeset
2632 result = PyBytes_FromStringAndSize(NULL, totalsize);
57bd7c7d91e3 Adding bytes.join() -- a class methods that concatenates an iterable of bytes.
Guido van Rossum <guido@python.org>
parents: 38115
diff changeset
2633 if (result == NULL)
40968
2d9d10702ec4 Remove a few stray tabs from bytesobject.c.
Georg Brandl <georg@python.org>
parents: 40967
diff changeset
2634 goto error;
38117
57bd7c7d91e3 Adding bytes.join() -- a class methods that concatenates an iterable of bytes.
Guido van Rossum <guido@python.org>
parents: 38115
diff changeset
2635 dest = PyBytes_AS_STRING(result);
57bd7c7d91e3 Adding bytes.join() -- a class methods that concatenates an iterable of bytes.
Guido van Rossum <guido@python.org>
parents: 38115
diff changeset
2636 for (i = 0; i < n; i++) {
40968
2d9d10702ec4 Remove a few stray tabs from bytesobject.c.
Georg Brandl <georg@python.org>
parents: 40967
diff changeset
2637 PyObject *obj = items[i];
2d9d10702ec4 Remove a few stray tabs from bytesobject.c.
Georg Brandl <georg@python.org>
parents: 40967
diff changeset
2638 Py_ssize_t size = PyBytes_GET_SIZE(obj);
2d9d10702ec4 Remove a few stray tabs from bytesobject.c.
Georg Brandl <georg@python.org>
parents: 40967
diff changeset
2639 memcpy(dest, PyBytes_AS_STRING(obj), size);
2d9d10702ec4 Remove a few stray tabs from bytesobject.c.
Georg Brandl <georg@python.org>
parents: 40967
diff changeset
2640 dest += size;
38117
57bd7c7d91e3 Adding bytes.join() -- a class methods that concatenates an iterable of bytes.
Guido van Rossum <guido@python.org>
parents: 38115
diff changeset
2641 }
57bd7c7d91e3 Adding bytes.join() -- a class methods that concatenates an iterable of bytes.
Guido van Rossum <guido@python.org>
parents: 38115
diff changeset
2642
57bd7c7d91e3 Adding bytes.join() -- a class methods that concatenates an iterable of bytes.
Guido van Rossum <guido@python.org>
parents: 38115
diff changeset
2643 /* Done */
57bd7c7d91e3 Adding bytes.join() -- a class methods that concatenates an iterable of bytes.
Guido van Rossum <guido@python.org>
parents: 38115
diff changeset
2644 Py_DECREF(seq);
57bd7c7d91e3 Adding bytes.join() -- a class methods that concatenates an iterable of bytes.
Guido van Rossum <guido@python.org>
parents: 38115
diff changeset
2645 return result;
57bd7c7d91e3 Adding bytes.join() -- a class methods that concatenates an iterable of bytes.
Guido van Rossum <guido@python.org>
parents: 38115
diff changeset
2646
57bd7c7d91e3 Adding bytes.join() -- a class methods that concatenates an iterable of bytes.
Guido van Rossum <guido@python.org>
parents: 38115
diff changeset
2647 /* Error handling */
57bd7c7d91e3 Adding bytes.join() -- a class methods that concatenates an iterable of bytes.
Guido van Rossum <guido@python.org>
parents: 38115
diff changeset
2648 error:
57bd7c7d91e3 Adding bytes.join() -- a class methods that concatenates an iterable of bytes.
Guido van Rossum <guido@python.org>
parents: 38115
diff changeset
2649 Py_DECREF(seq);
57bd7c7d91e3 Adding bytes.join() -- a class methods that concatenates an iterable of bytes.
Guido van Rossum <guido@python.org>
parents: 38115
diff changeset
2650 return NULL;
57bd7c7d91e3 Adding bytes.join() -- a class methods that concatenates an iterable of bytes.
Guido van Rossum <guido@python.org>
parents: 38115
diff changeset
2651 }
57bd7c7d91e3 Adding bytes.join() -- a class methods that concatenates an iterable of bytes.
Guido van Rossum <guido@python.org>
parents: 38115
diff changeset
2652
40967
a9e6c73e0fa5 Implement bytes.fromhex(), with tests.
Georg Brandl <georg@python.org>
parents: 40898
diff changeset
2653 PyDoc_STRVAR(fromhex_doc,
a9e6c73e0fa5 Implement bytes.fromhex(), with tests.
Georg Brandl <georg@python.org>
parents: 40898
diff changeset
2654 "bytes.fromhex(string) -> bytes\n\
a9e6c73e0fa5 Implement bytes.fromhex(), with tests.
Georg Brandl <georg@python.org>
parents: 40898
diff changeset
2655 \n\
a9e6c73e0fa5 Implement bytes.fromhex(), with tests.
Georg Brandl <georg@python.org>
parents: 40898
diff changeset
2656 Create a bytes object from a string of hexadecimal numbers.\n\
a9e6c73e0fa5 Implement bytes.fromhex(), with tests.
Georg Brandl <georg@python.org>
parents: 40898
diff changeset
2657 Spaces between two numbers are accepted. Example:\n\
a9e6c73e0fa5 Implement bytes.fromhex(), with tests.
Georg Brandl <georg@python.org>
parents: 40898
diff changeset
2658 bytes.fromhex('10 2030') -> bytes([0x10, 0x20, 0x30]).");
a9e6c73e0fa5 Implement bytes.fromhex(), with tests.
Georg Brandl <georg@python.org>
parents: 40898
diff changeset
2659
a9e6c73e0fa5 Implement bytes.fromhex(), with tests.
Georg Brandl <georg@python.org>
parents: 40898
diff changeset
2660 static int
a9e6c73e0fa5 Implement bytes.fromhex(), with tests.
Georg Brandl <georg@python.org>
parents: 40898
diff changeset
2661 hex_digit_to_int(int c)
a9e6c73e0fa5 Implement bytes.fromhex(), with tests.
Georg Brandl <georg@python.org>
parents: 40898
diff changeset
2662 {
40968
2d9d10702ec4 Remove a few stray tabs from bytesobject.c.
Georg Brandl <georg@python.org>
parents: 40967
diff changeset
2663 if (isdigit(c))
2d9d10702ec4 Remove a few stray tabs from bytesobject.c.
Georg Brandl <georg@python.org>
parents: 40967
diff changeset
2664 return c - '0';
2d9d10702ec4 Remove a few stray tabs from bytesobject.c.
Georg Brandl <georg@python.org>
parents: 40967
diff changeset
2665 else {
2d9d10702ec4 Remove a few stray tabs from bytesobject.c.
Georg Brandl <georg@python.org>
parents: 40967
diff changeset
2666 if (isupper(c))
2d9d10702ec4 Remove a few stray tabs from bytesobject.c.
Georg Brandl <georg@python.org>
parents: 40967
diff changeset
2667 c = tolower(c);
2d9d10702ec4 Remove a few stray tabs from bytesobject.c.
Georg Brandl <georg@python.org>
parents: 40967
diff changeset
2668 if (c >= 'a' && c <= 'f')
2d9d10702ec4 Remove a few stray tabs from bytesobject.c.
Georg Brandl <georg@python.org>
parents: 40967
diff changeset
2669 return c - 'a' + 10;
2d9d10702ec4 Remove a few stray tabs from bytesobject.c.
Georg Brandl <georg@python.org>
parents: 40967
diff changeset
2670 }
2d9d10702ec4 Remove a few stray tabs from bytesobject.c.
Georg Brandl <georg@python.org>
parents: 40967
diff changeset
2671 return -1;
40967
a9e6c73e0fa5 Implement bytes.fromhex(), with tests.
Georg Brandl <georg@python.org>
parents: 40898
diff changeset
2672 }
a9e6c73e0fa5 Implement bytes.fromhex(), with tests.
Georg Brandl <georg@python.org>
parents: 40898
diff changeset
2673
a9e6c73e0fa5 Implement bytes.fromhex(), with tests.
Georg Brandl <georg@python.org>
parents: 40898
diff changeset
2674 static PyObject *
a9e6c73e0fa5 Implement bytes.fromhex(), with tests.
Georg Brandl <georg@python.org>
parents: 40898
diff changeset
2675 bytes_fromhex(PyObject *cls, PyObject *args)
a9e6c73e0fa5 Implement bytes.fromhex(), with tests.
Georg Brandl <georg@python.org>
parents: 40898
diff changeset
2676 {
a9e6c73e0fa5 Implement bytes.fromhex(), with tests.
Georg Brandl <georg@python.org>
parents: 40898
diff changeset
2677 PyObject *newbytes;
a9e6c73e0fa5 Implement bytes.fromhex(), with tests.
Georg Brandl <georg@python.org>
parents: 40898
diff changeset
2678 char *hex, *buf;
a9e6c73e0fa5 Implement bytes.fromhex(), with tests.
Georg Brandl <georg@python.org>
parents: 40898
diff changeset
2679 Py_ssize_t len, byteslen, i, j;
a9e6c73e0fa5 Implement bytes.fromhex(), with tests.
Georg Brandl <georg@python.org>
parents: 40898
diff changeset
2680 int top, bot;
a9e6c73e0fa5 Implement bytes.fromhex(), with tests.
Georg Brandl <georg@python.org>
parents: 40898
diff changeset
2681
a9e6c73e0fa5 Implement bytes.fromhex(), with tests.
Georg Brandl <georg@python.org>
parents: 40898
diff changeset
2682 if (!PyArg_ParseTuple(args, "s#:fromhex", &hex, &len))
a9e6c73e0fa5 Implement bytes.fromhex(), with tests.
Georg Brandl <georg@python.org>
parents: 40898
diff changeset
2683 return NULL;
a9e6c73e0fa5 Implement bytes.fromhex(), with tests.
Georg Brandl <georg@python.org>
parents: 40898
diff changeset
2684
a9e6c73e0fa5 Implement bytes.fromhex(), with tests.
Georg Brandl <georg@python.org>
parents: 40898
diff changeset
2685 byteslen = len / 2; /* max length if there are no spaces */
a9e6c73e0fa5 Implement bytes.fromhex(), with tests.
Georg Brandl <georg@python.org>
parents: 40898
diff changeset
2686
a9e6c73e0fa5 Implement bytes.fromhex(), with tests.
Georg Brandl <georg@python.org>
parents: 40898
diff changeset
2687 newbytes = PyBytes_FromStringAndSize(NULL, byteslen);
a9e6c73e0fa5 Implement bytes.fromhex(), with tests.
Georg Brandl <georg@python.org>
parents: 40898
diff changeset
2688 if (!newbytes)
a9e6c73e0fa5 Implement bytes.fromhex(), with tests.
Georg Brandl <georg@python.org>
parents: 40898
diff changeset
2689 return NULL;
a9e6c73e0fa5 Implement bytes.fromhex(), with tests.
Georg Brandl <georg@python.org>
parents: 40898
diff changeset
2690 buf = PyBytes_AS_STRING(newbytes);
a9e6c73e0fa5 Implement bytes.fromhex(), with tests.
Georg Brandl <georg@python.org>
parents: 40898
diff changeset
2691
a9e6c73e0fa5 Implement bytes.fromhex(), with tests.
Georg Brandl <georg@python.org>
parents: 40898
diff changeset
2692 for (i = j = 0; ; i += 2) {
a9e6c73e0fa5 Implement bytes.fromhex(), with tests.
Georg Brandl <georg@python.org>
parents: 40898
diff changeset
2693 /* skip over spaces in the input */
a9e6c73e0fa5 Implement bytes.fromhex(), with tests.
Georg Brandl <georg@python.org>
parents: 40898
diff changeset
2694 while (Py_CHARMASK(hex[i]) == ' ')
a9e6c73e0fa5 Implement bytes.fromhex(), with tests.
Georg Brandl <georg@python.org>
parents: 40898
diff changeset
2695 i++;
a9e6c73e0fa5 Implement bytes.fromhex(), with tests.
Georg Brandl <georg@python.org>
parents: 40898
diff changeset
2696 if (i >= len)
a9e6c73e0fa5 Implement bytes.fromhex(), with tests.
Georg Brandl <georg@python.org>
parents: 40898
diff changeset
2697 break;
a9e6c73e0fa5 Implement bytes.fromhex(), with tests.
Georg Brandl <georg@python.org>
parents: 40898
diff changeset
2698 top = hex_digit_to_int(Py_CHARMASK(hex[i]));
a9e6c73e0fa5 Implement bytes.fromhex(), with tests.
Georg Brandl <georg@python.org>
parents: 40898
diff changeset
2699 bot = hex_digit_to_int(Py_CHARMASK(hex[i+1]));
a9e6c73e0fa5 Implement bytes.fromhex(), with tests.
Georg Brandl <georg@python.org>
parents: 40898
diff changeset
2700 if (top == -1 || bot == -1) {
a9e6c73e0fa5 Implement bytes.fromhex(), with tests.
Georg Brandl <georg@python.org>
parents: 40898
diff changeset
2701 PyErr_Format(PyExc_ValueError,
a9e6c73e0fa5 Implement bytes.fromhex(), with tests.
Georg Brandl <georg@python.org>
parents: 40898
diff changeset
2702 "non-hexadecimal number string '%c%c' found in "
a9e6c73e0fa5 Implement bytes.fromhex(), with tests.
Georg Brandl <georg@python.org>
parents: 40898
diff changeset
2703 "fromhex() arg at position %zd",
a9e6c73e0fa5 Implement bytes.fromhex(), with tests.
Georg Brandl <georg@python.org>
parents: 40898
diff changeset
2704 hex[i], hex[i+1], i);
a9e6c73e0fa5 Implement bytes.fromhex(), with tests.
Georg Brandl <georg@python.org>
parents: 40898
diff changeset
2705 goto error;
a9e6c73e0fa5 Implement bytes.fromhex(), with tests.
Georg Brandl <georg@python.org>
parents: 40898
diff changeset
2706 }
a9e6c73e0fa5 Implement bytes.fromhex(), with tests.
Georg Brandl <georg@python.org>
parents: 40898
diff changeset
2707 buf[j++] = (top << 4) + bot;
a9e6c73e0fa5 Implement bytes.fromhex(), with tests.
Georg Brandl <georg@python.org>
parents: 40898
diff changeset
2708 }
a9e6c73e0fa5 Implement bytes.fromhex(), with tests.
Georg Brandl <georg@python.org>
parents: 40898
diff changeset
2709 if (PyBytes_Resize(newbytes, j) < 0)
a9e6c73e0fa5 Implement bytes.fromhex(), with tests.
Georg Brandl <georg@python.org>
parents: 40898
diff changeset
2710 goto error;
a9e6c73e0fa5 Implement bytes.fromhex(), with tests.
Georg Brandl <georg@python.org>
parents: 40898
diff changeset
2711 return newbytes;
a9e6c73e0fa5 Implement bytes.fromhex(), with tests.
Georg Brandl <georg@python.org>
parents: 40898
diff changeset
2712
a9e6c73e0fa5 Implement bytes.fromhex(), with tests.
Georg Brandl <georg@python.org>
parents: 40898
diff changeset
2713 error:
a9e6c73e0fa5 Implement bytes.fromhex(), with tests.
Georg Brandl <georg@python.org>
parents: 40898
diff changeset
2714 Py_DECREF(newbytes);
a9e6c73e0fa5 Implement bytes.fromhex(), with tests.
Georg Brandl <georg@python.org>
parents: 40898
diff changeset
2715 return NULL;
a9e6c73e0fa5 Implement bytes.fromhex(), with tests.
Georg Brandl <georg@python.org>
parents: 40898
diff changeset
2716 }
a9e6c73e0fa5 Implement bytes.fromhex(), with tests.
Georg Brandl <georg@python.org>
parents: 40898
diff changeset
2717
41426
4561f6da3b7d Real pickling for bytes.
Guido van Rossum <guido@python.org>
parents: 41412
diff changeset
2718 PyDoc_STRVAR(reduce_doc, "Return state information for pickling.");
4561f6da3b7d Real pickling for bytes.
Guido van Rossum <guido@python.org>
parents: 41412
diff changeset
2719
4561f6da3b7d Real pickling for bytes.
Guido van Rossum <guido@python.org>
parents: 41412
diff changeset
2720 static PyObject *
4561f6da3b7d Real pickling for bytes.
Guido van Rossum <guido@python.org>
parents: 41412
diff changeset
2721 bytes_reduce(PyBytesObject *self)
4561f6da3b7d Real pickling for bytes.
Guido van Rossum <guido@python.org>
parents: 41412
diff changeset
2722 {
4561f6da3b7d Real pickling for bytes.
Guido van Rossum <guido@python.org>
parents: 41412
diff changeset
2723 return Py_BuildValue("(O(s#))",
4561f6da3b7d Real pickling for bytes.
Guido van Rossum <guido@python.org>
parents: 41412
diff changeset
2724 self->ob_type,
4561f6da3b7d Real pickling for bytes.
Guido van Rossum <guido@python.org>
parents: 41412
diff changeset
2725 self->ob_bytes == NULL ? "" : self->ob_bytes,
4561f6da3b7d Real pickling for bytes.
Guido van Rossum <guido@python.org>
parents: 41412
diff changeset
2726 self->ob_size);
4561f6da3b7d Real pickling for bytes.
Guido van Rossum <guido@python.org>
parents: 41412
diff changeset
2727 }
4561f6da3b7d Real pickling for bytes.
Guido van Rossum <guido@python.org>
parents: 41412
diff changeset
2728
37927
a7f3765ea464 Here is a bytes type. It's very minimal but it's a start.
Guido van Rossum <guido@python.org>
parents:
diff changeset
2729 static PySequenceMethods bytes_as_sequence = {
40967
a9e6c73e0fa5 Implement bytes.fromhex(), with tests.
Georg Brandl <georg@python.org>
parents: 40898
diff changeset
2730 (lenfunc)bytes_length, /* sq_length */
a9e6c73e0fa5 Implement bytes.fromhex(), with tests.
Georg Brandl <georg@python.org>
parents: 40898
diff changeset
2731 (binaryfunc)bytes_concat, /* sq_concat */
a9e6c73e0fa5 Implement bytes.fromhex(), with tests.
Georg Brandl <georg@python.org>
parents: 40898
diff changeset
2732 (ssizeargfunc)bytes_repeat, /* sq_repeat */
a9e6c73e0fa5 Implement bytes.fromhex(), with tests.
Georg Brandl <georg@python.org>
parents: 40898
diff changeset
2733 (ssizeargfunc)bytes_getitem, /* sq_item */
a9e6c73e0fa5 Implement bytes.fromhex(), with tests.
Georg Brandl <georg@python.org>
parents: 40898
diff changeset
2734 0, /* sq_slice */
a9e6c73e0fa5 Implement bytes.fromhex(), with tests.
Georg Brandl <georg@python.org>
parents: 40898
diff changeset
2735 (ssizeobjargproc)bytes_setitem, /* sq_ass_item */
a9e6c73e0fa5 Implement bytes.fromhex(), with tests.
Georg Brandl <georg@python.org>
parents: 40898
diff changeset
2736 0, /* sq_ass_slice */
37960
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
2737 (objobjproc)bytes_contains, /* sq_contains */
40967
a9e6c73e0fa5 Implement bytes.fromhex(), with tests.
Georg Brandl <georg@python.org>
parents: 40898
diff changeset
2738 (binaryfunc)bytes_iconcat, /* sq_inplace_concat */
a9e6c73e0fa5 Implement bytes.fromhex(), with tests.
Georg Brandl <georg@python.org>
parents: 40898
diff changeset
2739 (ssizeargfunc)bytes_irepeat, /* sq_inplace_repeat */
37927
a7f3765ea464 Here is a bytes type. It's very minimal but it's a start.
Guido van Rossum <guido@python.org>
parents:
diff changeset
2740 };
a7f3765ea464 Here is a bytes type. It's very minimal but it's a start.
Guido van Rossum <guido@python.org>
parents:
diff changeset
2741
a7f3765ea464 Here is a bytes type. It's very minimal but it's a start.
Guido van Rossum <guido@python.org>
parents:
diff changeset
2742 static PyMappingMethods bytes_as_mapping = {
37960
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
2743 (lenfunc)bytes_length,
40472
9548ca0e6560 Implement extended slicing in bytes objects.
Thomas Wouters <thomas@python.org>
parents: 39643
diff changeset
2744 (binaryfunc)bytes_subscript,
9548ca0e6560 Implement extended slicing in bytes objects.
Thomas Wouters <thomas@python.org>
parents: 39643
diff changeset
2745 (objobjargproc)bytes_ass_subscript,
37927
a7f3765ea464 Here is a bytes type. It's very minimal but it's a start.
Guido van Rossum <guido@python.org>
parents:
diff changeset
2746 };
a7f3765ea464 Here is a bytes type. It's very minimal but it's a start.
Guido van Rossum <guido@python.org>
parents:
diff changeset
2747
a7f3765ea464 Here is a bytes type. It's very minimal but it's a start.
Guido van Rossum <guido@python.org>
parents:
diff changeset
2748 static PyBufferProcs bytes_as_buffer = {
37960
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
2749 (readbufferproc)bytes_getbuffer,
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
2750 (writebufferproc)bytes_getbuffer,
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
2751 (segcountproc)bytes_getsegcount,
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
2752 /* XXX Bytes are not characters! But we need to implement
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
2753 bf_getcharbuffer() so we can be used as 't#' argument to codecs. */
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
2754 (charbufferproc)bytes_getbuffer,
37927
a7f3765ea464 Here is a bytes type. It's very minimal but it's a start.
Guido van Rossum <guido@python.org>
parents:
diff changeset
2755 };
a7f3765ea464 Here is a bytes type. It's very minimal but it's a start.
Guido van Rossum <guido@python.org>
parents:
diff changeset
2756
a7f3765ea464 Here is a bytes type. It's very minimal but it's a start.
Guido van Rossum <guido@python.org>
parents:
diff changeset
2757 static PyMethodDef
a7f3765ea464 Here is a bytes type. It's very minimal but it's a start.
Guido van Rossum <guido@python.org>
parents:
diff changeset
2758 bytes_methods[] = {
40978
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2759 {"find", (PyCFunction)bytes_find, METH_VARARGS, find__doc__},
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2760 {"count", (PyCFunction)bytes_count, METH_VARARGS, count__doc__},
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2761 {"index", (PyCFunction)bytes_index, METH_VARARGS, index__doc__},
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2762 {"rfind", (PyCFunction)bytes_rfind, METH_VARARGS, rfind__doc__},
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2763 {"rindex", (PyCFunction)bytes_rindex, METH_VARARGS, rindex__doc__},
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2764 {"endswith", (PyCFunction)bytes_endswith, METH_VARARGS, endswith__doc__},
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2765 {"startswith", (PyCFunction)bytes_startswith, METH_VARARGS,
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2766 startswith__doc__},
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2767 {"replace", (PyCFunction)bytes_replace, METH_VARARGS, replace__doc__},
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2768 {"translate", (PyCFunction)bytes_translate, METH_VARARGS, translate__doc__},
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2769 {"partition", (PyCFunction)bytes_partition, METH_O, partition__doc__},
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2770 {"rpartition", (PyCFunction)bytes_rpartition, METH_O, rpartition__doc__},
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2771 {"split", (PyCFunction)bytes_split, METH_VARARGS, split__doc__},
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2772 {"rsplit", (PyCFunction)bytes_rsplit, METH_VARARGS, rsplit__doc__},
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2773 {"extend", (PyCFunction)bytes_extend, METH_O, extend__doc__},
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2774 {"insert", (PyCFunction)bytes_insert, METH_VARARGS, insert__doc__},
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2775 {"append", (PyCFunction)bytes_append, METH_O, append__doc__},
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2776 {"reverse", (PyCFunction)bytes_reverse, METH_NOARGS, reverse__doc__},
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2777 {"pop", (PyCFunction)bytes_pop, METH_VARARGS, pop__doc__},
61fee1853ca8 SF patch #1669633, add methods for bytes from Pete Shinners.
Neal Norwitz <nnorwitz@gmail.com>
parents: 40968
diff changeset
2778 {"remove", (PyCFunction)bytes_remove, METH_O, remove__doc__},
41450
d1c3dd184e38 Rough and dirty job -- allow concatenation of bytes and arbitrary
Guido van Rossum <guido@python.org>
parents: 41448
diff changeset
2779 {"strip", (PyCFunction)bytes_strip, METH_O, strip__doc__},
d1c3dd184e38 Rough and dirty job -- allow concatenation of bytes and arbitrary
Guido van Rossum <guido@python.org>
parents: 41448
diff changeset
2780 {"lstrip", (PyCFunction)bytes_lstrip, METH_O, lstrip__doc__},
d1c3dd184e38 Rough and dirty job -- allow concatenation of bytes and arbitrary
Guido van Rossum <guido@python.org>
parents: 41448
diff changeset
2781 {"rstrip", (PyCFunction)bytes_rstrip, METH_O, rstrip__doc__},
37960
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
2782 {"decode", (PyCFunction)bytes_decode, METH_VARARGS, decode_doc},
38115
a6a1359aab84 Optimizations for bytes reallocation.
Guido van Rossum <guido@python.org>
parents: 38017
diff changeset
2783 {"__alloc__", (PyCFunction)bytes_alloc, METH_NOARGS, alloc_doc},
41426
4561f6da3b7d Real pickling for bytes.
Guido van Rossum <guido@python.org>
parents: 41412
diff changeset
2784 {"fromhex", (PyCFunction)bytes_fromhex, METH_VARARGS|METH_CLASS,
4561f6da3b7d Real pickling for bytes.
Guido van Rossum <guido@python.org>
parents: 41412
diff changeset
2785 fromhex_doc},
38117
57bd7c7d91e3 Adding bytes.join() -- a class methods that concatenates an iterable of bytes.
Guido van Rossum <guido@python.org>
parents: 38115
diff changeset
2786 {"join", (PyCFunction)bytes_join, METH_O|METH_CLASS, join_doc},
41426
4561f6da3b7d Real pickling for bytes.
Guido van Rossum <guido@python.org>
parents: 41412
diff changeset
2787 {"__reduce__", (PyCFunction)bytes_reduce, METH_NOARGS, reduce_doc},
38115
a6a1359aab84 Optimizations for bytes reallocation.
Guido van Rossum <guido@python.org>
parents: 38017
diff changeset
2788 {NULL}
37927
a7f3765ea464 Here is a bytes type. It's very minimal but it's a start.
Guido van Rossum <guido@python.org>
parents:
diff changeset
2789 };
a7f3765ea464 Here is a bytes type. It's very minimal but it's a start.
Guido van Rossum <guido@python.org>
parents:
diff changeset
2790
a7f3765ea464 Here is a bytes type. It's very minimal but it's a start.
Guido van Rossum <guido@python.org>
parents:
diff changeset
2791 PyDoc_STRVAR(bytes_doc,
a7f3765ea464 Here is a bytes type. It's very minimal but it's a start.
Guido van Rossum <guido@python.org>
parents:
diff changeset
2792 "bytes([iterable]) -> new array of bytes.\n\
a7f3765ea464 Here is a bytes type. It's very minimal but it's a start.
Guido van Rossum <guido@python.org>
parents:
diff changeset
2793 \n\
a7f3765ea464 Here is a bytes type. It's very minimal but it's a start.
Guido van Rossum <guido@python.org>
parents:
diff changeset
2794 If an argument is given it must be an iterable yielding ints in range(256).");
a7f3765ea464 Here is a bytes type. It's very minimal but it's a start.
Guido van Rossum <guido@python.org>
parents:
diff changeset
2795
a7f3765ea464 Here is a bytes type. It's very minimal but it's a start.
Guido van Rossum <guido@python.org>
parents:
diff changeset
2796 PyTypeObject PyBytes_Type = {
a7f3765ea464 Here is a bytes type. It's very minimal but it's a start.
Guido van Rossum <guido@python.org>
parents:
diff changeset
2797 PyObject_HEAD_INIT(&PyType_Type)
a7f3765ea464 Here is a bytes type. It's very minimal but it's a start.
Guido van Rossum <guido@python.org>
parents:
diff changeset
2798 0,
a7f3765ea464 Here is a bytes type. It's very minimal but it's a start.
Guido van Rossum <guido@python.org>
parents:
diff changeset
2799 "bytes",
a7f3765ea464 Here is a bytes type. It's very minimal but it's a start.
Guido van Rossum <guido@python.org>
parents:
diff changeset
2800 sizeof(PyBytesObject),
a7f3765ea464 Here is a bytes type. It's very minimal but it's a start.
Guido van Rossum <guido@python.org>
parents:
diff changeset
2801 0,
37960
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
2802 (destructor)bytes_dealloc, /* tp_dealloc */
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
2803 0, /* tp_print */
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
2804 0, /* tp_getattr */
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
2805 0, /* tp_setattr */
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
2806 0, /* tp_compare */
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
2807 (reprfunc)bytes_repr, /* tp_repr */
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
2808 0, /* tp_as_number */
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
2809 &bytes_as_sequence, /* tp_as_sequence */
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
2810 &bytes_as_mapping, /* tp_as_mapping */
40968
2d9d10702ec4 Remove a few stray tabs from bytesobject.c.
Georg Brandl <georg@python.org>
parents: 40967
diff changeset
2811 0, /* tp_hash */
37960
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
2812 0, /* tp_call */
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
2813 (reprfunc)bytes_str, /* tp_str */
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
2814 PyObject_GenericGetAttr, /* tp_getattro */
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
2815 0, /* tp_setattro */
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
2816 &bytes_as_buffer, /* tp_as_buffer */
40968
2d9d10702ec4 Remove a few stray tabs from bytesobject.c.
Georg Brandl <georg@python.org>
parents: 40967
diff changeset
2817 /* bytes is 'final' or 'sealed' */
40967
a9e6c73e0fa5 Implement bytes.fromhex(), with tests.
Georg Brandl <georg@python.org>
parents: 40898
diff changeset
2818 Py_TPFLAGS_DEFAULT, /* tp_flags */
37960
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
2819 bytes_doc, /* tp_doc */
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
2820 0, /* tp_traverse */
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
2821 0, /* tp_clear */
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
2822 (richcmpfunc)bytes_richcompare, /* tp_richcompare */
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
2823 0, /* tp_weaklistoffset */
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
2824 0, /* tp_iter */
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
2825 0, /* tp_iternext */
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
2826 bytes_methods, /* tp_methods */
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
2827 0, /* tp_members */
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
2828 0, /* tp_getset */
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
2829 0, /* tp_base */
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
2830 0, /* tp_dict */
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
2831 0, /* tp_descr_get */
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
2832 0, /* tp_descr_set */
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
2833 0, /* tp_dictoffset */
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
2834 (initproc)bytes_init, /* tp_init */
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
2835 PyType_GenericAlloc, /* tp_alloc */
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
2836 PyType_GenericNew, /* tp_new */
e0b7e34b5971 Added much functionality to the bytes type.
Guido van Rossum <guido@python.org>
parents: 37930
diff changeset
2837 PyObject_Del, /* tp_free */
37927
a7f3765ea464 Here is a bytes type. It's very minimal but it's a start.
Guido van Rossum <guido@python.org>
parents:
diff changeset
2838 };