blob: 172c7f38b9e258a6db2c90e578571e78f817399d [file] [log] [blame]
Benjamin Peterson4116f362008-05-27 00:36:20 +00001/* bytes object implementation */
Guido van Rossum4dfe8a12006-04-22 23:28:04 +00002
Guido van Rossum4dfe8a12006-04-22 23:28:04 +00003#define PY_SSIZE_T_CLEAN
Christian Heimes2c9c7a52008-05-26 13:42:13 +00004
Guido van Rossum4dfe8a12006-04-22 23:28:04 +00005#include "Python.h"
Eric Snow2ebc5ce2017-09-07 23:51:28 -06006#include "internal/mem.h"
7#include "internal/pystate.h"
Christian Heimes2c9c7a52008-05-26 13:42:13 +00008
Gregory P. Smith60d241f2007-10-16 06:31:30 +00009#include "bytes_methods.h"
Gregory P. Smith8cb65692015-04-25 23:22:26 +000010#include "pystrhex.h"
Mark Dickinsonfd24b322008-12-06 15:33:31 +000011#include <stddef.h>
Guido van Rossum4dfe8a12006-04-22 23:28:04 +000012
Martin v. Löwis7252a6e2014-07-27 16:25:09 +020013/*[clinic input]
Serhiy Storchaka7a9579c2016-05-02 13:45:20 +030014class bytes "PyBytesObject *" "&PyBytes_Type"
Martin v. Löwis7252a6e2014-07-27 16:25:09 +020015[clinic start generated code]*/
Serhiy Storchaka7a9579c2016-05-02 13:45:20 +030016/*[clinic end generated code: output=da39a3ee5e6b4b0d input=7a238f965d64892b]*/
Martin v. Löwis7252a6e2014-07-27 16:25:09 +020017
Serhiy Storchaka1009bf12015-04-03 23:53:51 +030018#include "clinic/bytesobject.c.h"
19
Christian Heimes2c9c7a52008-05-26 13:42:13 +000020#ifdef COUNT_ALLOCS
Benjamin Petersona4a37fe2009-01-11 17:13:55 +000021Py_ssize_t null_strings, one_strings;
Christian Heimes2c9c7a52008-05-26 13:42:13 +000022#endif
Guido van Rossum4dfe8a12006-04-22 23:28:04 +000023
Christian Heimes2c9c7a52008-05-26 13:42:13 +000024static PyBytesObject *characters[UCHAR_MAX + 1];
25static PyBytesObject *nullstring;
26
Mark Dickinsonfd24b322008-12-06 15:33:31 +000027/* PyBytesObject_SIZE gives the basic size of a string; any memory allocation
28 for a string of length n should request PyBytesObject_SIZE + n bytes.
29
30 Using PyBytesObject_SIZE instead of sizeof(PyBytesObject) saves
31 3 bytes per string allocation on a typical system.
32*/
33#define PyBytesObject_SIZE (offsetof(PyBytesObject, ob_sval) + 1)
34
Victor Stinner2bf89932015-10-14 11:25:33 +020035/* Forward declaration */
36Py_LOCAL_INLINE(Py_ssize_t) _PyBytesWriter_GetSize(_PyBytesWriter *writer,
37 char *str);
38
Christian Heimes2c9c7a52008-05-26 13:42:13 +000039/*
Christian Heimes2c9c7a52008-05-26 13:42:13 +000040 For PyBytes_FromString(), the parameter `str' points to a null-terminated
41 string containing exactly `size' bytes.
42
Martin Pantera90a4a92016-05-30 04:04:50 +000043 For PyBytes_FromStringAndSize(), the parameter `str' is
Christian Heimes2c9c7a52008-05-26 13:42:13 +000044 either NULL or else points to a string containing at least `size' bytes.
45 For PyBytes_FromStringAndSize(), the string in the `str' parameter does
46 not have to be null-terminated. (Therefore it is safe to construct a
47 substring by calling `PyBytes_FromStringAndSize(origstring, substrlen)'.)
48 If `str' is NULL then PyBytes_FromStringAndSize() will allocate `size+1'
49 bytes (setting the last byte to the null terminating character) and you can
50 fill in the data yourself. If `str' is non-NULL then the resulting
Antoine Pitrouf2c54842010-01-13 08:07:53 +000051 PyBytes object must be treated as immutable and you must not fill in nor
Christian Heimes2c9c7a52008-05-26 13:42:13 +000052 alter the data yourself, since the strings may be shared.
53
54 The PyObject member `op->ob_size', which denotes the number of "extra
55 items" in a variable-size object, will contain the number of bytes
Eli Bendersky1aef6b62011-03-24 22:32:56 +020056 allocated for string data, not counting the null terminating character.
57 It is therefore equal to the `size' parameter (for
Christian Heimes2c9c7a52008-05-26 13:42:13 +000058 PyBytes_FromStringAndSize()) or the length of the string in the `str'
59 parameter (for PyBytes_FromString()).
60*/
Victor Stinnerdb067af2014-05-02 22:31:14 +020061static PyObject *
62_PyBytes_FromSize(Py_ssize_t size, int use_calloc)
Guido van Rossumd624f182006-04-24 13:47:05 +000063{
Antoine Pitrou9ed5f272013-08-13 20:18:52 +020064 PyBytesObject *op;
Victor Stinnerdb067af2014-05-02 22:31:14 +020065 assert(size >= 0);
Victor Stinner049e5092014-08-17 22:20:00 +020066
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000067 if (size == 0 && (op = nullstring) != NULL) {
Christian Heimes2c9c7a52008-05-26 13:42:13 +000068#ifdef COUNT_ALLOCS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000069 null_strings++;
Christian Heimes2c9c7a52008-05-26 13:42:13 +000070#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000071 Py_INCREF(op);
72 return (PyObject *)op;
73 }
Christian Heimes2c9c7a52008-05-26 13:42:13 +000074
Victor Stinner049e5092014-08-17 22:20:00 +020075 if ((size_t)size > (size_t)PY_SSIZE_T_MAX - PyBytesObject_SIZE) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000076 PyErr_SetString(PyExc_OverflowError,
77 "byte string is too large");
78 return NULL;
79 }
Neal Norwitz3ce5d922008-08-24 07:08:55 +000080
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000081 /* Inline PyObject_NewVar */
Victor Stinnerdb067af2014-05-02 22:31:14 +020082 if (use_calloc)
83 op = (PyBytesObject *)PyObject_Calloc(1, PyBytesObject_SIZE + size);
84 else
85 op = (PyBytesObject *)PyObject_Malloc(PyBytesObject_SIZE + size);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000086 if (op == NULL)
87 return PyErr_NoMemory();
Christian Heimesd3afe782013-12-04 09:27:47 +010088 (void)PyObject_INIT_VAR(op, &PyBytes_Type, size);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000089 op->ob_shash = -1;
Victor Stinnerdb067af2014-05-02 22:31:14 +020090 if (!use_calloc)
91 op->ob_sval[size] = '\0';
92 /* empty byte string singleton */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000093 if (size == 0) {
94 nullstring = op;
95 Py_INCREF(op);
Victor Stinnerdb067af2014-05-02 22:31:14 +020096 }
97 return (PyObject *) op;
98}
99
100PyObject *
101PyBytes_FromStringAndSize(const char *str, Py_ssize_t size)
102{
103 PyBytesObject *op;
104 if (size < 0) {
105 PyErr_SetString(PyExc_SystemError,
106 "Negative size passed to PyBytes_FromStringAndSize");
107 return NULL;
108 }
109 if (size == 1 && str != NULL &&
110 (op = characters[*str & UCHAR_MAX]) != NULL)
111 {
112#ifdef COUNT_ALLOCS
113 one_strings++;
114#endif
115 Py_INCREF(op);
116 return (PyObject *)op;
117 }
118
119 op = (PyBytesObject *)_PyBytes_FromSize(size, 0);
120 if (op == NULL)
121 return NULL;
122 if (str == NULL)
123 return (PyObject *) op;
124
Christian Heimesf051e432016-09-13 20:22:02 +0200125 memcpy(op->ob_sval, str, size);
Victor Stinnerdb067af2014-05-02 22:31:14 +0200126 /* share short strings */
127 if (size == 1) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000128 characters[*str & UCHAR_MAX] = op;
129 Py_INCREF(op);
130 }
131 return (PyObject *) op;
Guido van Rossumd624f182006-04-24 13:47:05 +0000132}
133
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000134PyObject *
135PyBytes_FromString(const char *str)
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000136{
Antoine Pitrou9ed5f272013-08-13 20:18:52 +0200137 size_t size;
138 PyBytesObject *op;
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000139
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000140 assert(str != NULL);
141 size = strlen(str);
142 if (size > PY_SSIZE_T_MAX - PyBytesObject_SIZE) {
143 PyErr_SetString(PyExc_OverflowError,
144 "byte string is too long");
145 return NULL;
146 }
147 if (size == 0 && (op = nullstring) != NULL) {
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000148#ifdef COUNT_ALLOCS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000149 null_strings++;
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000150#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000151 Py_INCREF(op);
152 return (PyObject *)op;
153 }
154 if (size == 1 && (op = characters[*str & UCHAR_MAX]) != NULL) {
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000155#ifdef COUNT_ALLOCS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000156 one_strings++;
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000157#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000158 Py_INCREF(op);
159 return (PyObject *)op;
160 }
Guido van Rossum98297ee2007-11-06 21:34:58 +0000161
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000162 /* Inline PyObject_NewVar */
163 op = (PyBytesObject *)PyObject_MALLOC(PyBytesObject_SIZE + size);
164 if (op == NULL)
165 return PyErr_NoMemory();
Christian Heimesd3afe782013-12-04 09:27:47 +0100166 (void)PyObject_INIT_VAR(op, &PyBytes_Type, size);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000167 op->ob_shash = -1;
Christian Heimesf051e432016-09-13 20:22:02 +0200168 memcpy(op->ob_sval, str, size+1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000169 /* share short strings */
170 if (size == 0) {
171 nullstring = op;
172 Py_INCREF(op);
173 } else if (size == 1) {
174 characters[*str & UCHAR_MAX] = op;
175 Py_INCREF(op);
176 }
177 return (PyObject *) op;
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000178}
Guido van Rossumebea9be2007-04-09 00:49:13 +0000179
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000180PyObject *
181PyBytes_FromFormatV(const char *format, va_list vargs)
182{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000183 char *s;
Victor Stinner03dab782015-10-14 00:21:35 +0200184 const char *f;
185 const char *p;
186 Py_ssize_t prec;
187 int longflag;
188 int size_tflag;
189 /* Longest 64-bit formatted numbers:
190 - "18446744073709551615\0" (21 bytes)
191 - "-9223372036854775808\0" (21 bytes)
192 Decimal takes the most space (it isn't enough for octal.)
Guido van Rossum343e97f2007-04-09 00:43:24 +0000193
Victor Stinner03dab782015-10-14 00:21:35 +0200194 Longest 64-bit pointer representation:
195 "0xffffffffffffffff\0" (19 bytes). */
196 char buffer[21];
197 _PyBytesWriter writer;
Guido van Rossum343e97f2007-04-09 00:43:24 +0000198
Victor Stinner03dab782015-10-14 00:21:35 +0200199 _PyBytesWriter_Init(&writer);
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000200
Victor Stinner03dab782015-10-14 00:21:35 +0200201 s = _PyBytesWriter_Alloc(&writer, strlen(format));
202 if (s == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000203 return NULL;
Victor Stinner03dab782015-10-14 00:21:35 +0200204 writer.overallocate = 1;
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000205
Victor Stinner03dab782015-10-14 00:21:35 +0200206#define WRITE_BYTES(str) \
207 do { \
208 s = _PyBytesWriter_WriteBytes(&writer, s, (str), strlen(str)); \
209 if (s == NULL) \
210 goto error; \
211 } while (0)
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000212
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000213 for (f = format; *f; f++) {
Victor Stinner03dab782015-10-14 00:21:35 +0200214 if (*f != '%') {
215 *s++ = *f;
216 continue;
217 }
218
219 p = f++;
220
221 /* ignore the width (ex: 10 in "%10s") */
222 while (Py_ISDIGIT(*f))
223 f++;
224
225 /* parse the precision (ex: 10 in "%.10s") */
226 prec = 0;
227 if (*f == '.') {
228 f++;
229 for (; Py_ISDIGIT(*f); f++) {
230 prec = (prec * 10) + (*f - '0');
231 }
232 }
233
234 while (*f && *f != '%' && !Py_ISALPHA(*f))
235 f++;
236
237 /* handle the long flag ('l'), but only for %ld and %lu.
238 others can be added when necessary. */
239 longflag = 0;
240 if (*f == 'l' && (f[1] == 'd' || f[1] == 'u')) {
241 longflag = 1;
242 ++f;
243 }
244
245 /* handle the size_t flag ('z'). */
246 size_tflag = 0;
247 if (*f == 'z' && (f[1] == 'd' || f[1] == 'u')) {
248 size_tflag = 1;
249 ++f;
250 }
251
Raymond Hettinger15f44ab2016-08-30 10:47:49 -0700252 /* subtract bytes preallocated for the format string
Victor Stinner03dab782015-10-14 00:21:35 +0200253 (ex: 2 for "%s") */
254 writer.min_size -= (f - p + 1);
255
256 switch (*f) {
257 case 'c':
258 {
259 int c = va_arg(vargs, int);
260 if (c < 0 || c > 255) {
261 PyErr_SetString(PyExc_OverflowError,
262 "PyBytes_FromFormatV(): %c format "
263 "expects an integer in range [0; 255]");
264 goto error;
265 }
266 writer.min_size++;
267 *s++ = (unsigned char)c;
268 break;
269 }
270
271 case 'd':
272 if (longflag)
273 sprintf(buffer, "%ld", va_arg(vargs, long));
274 else if (size_tflag)
275 sprintf(buffer, "%" PY_FORMAT_SIZE_T "d",
276 va_arg(vargs, Py_ssize_t));
277 else
278 sprintf(buffer, "%d", va_arg(vargs, int));
279 assert(strlen(buffer) < sizeof(buffer));
280 WRITE_BYTES(buffer);
281 break;
282
283 case 'u':
284 if (longflag)
285 sprintf(buffer, "%lu",
286 va_arg(vargs, unsigned long));
287 else if (size_tflag)
288 sprintf(buffer, "%" PY_FORMAT_SIZE_T "u",
289 va_arg(vargs, size_t));
290 else
291 sprintf(buffer, "%u",
292 va_arg(vargs, unsigned int));
293 assert(strlen(buffer) < sizeof(buffer));
294 WRITE_BYTES(buffer);
295 break;
296
297 case 'i':
298 sprintf(buffer, "%i", va_arg(vargs, int));
299 assert(strlen(buffer) < sizeof(buffer));
300 WRITE_BYTES(buffer);
301 break;
302
303 case 'x':
304 sprintf(buffer, "%x", va_arg(vargs, int));
305 assert(strlen(buffer) < sizeof(buffer));
306 WRITE_BYTES(buffer);
307 break;
308
309 case 's':
310 {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000311 Py_ssize_t i;
Victor Stinner03dab782015-10-14 00:21:35 +0200312
Serhiy Storchakaef1585e2015-12-25 20:01:53 +0200313 p = va_arg(vargs, const char*);
Miss Islington (bot)cbc7c2c2019-01-12 00:52:55 -0800314 if (prec <= 0) {
315 i = strlen(p);
316 }
317 else {
318 i = 0;
319 while (i < prec && p[i]) {
320 i++;
321 }
322 }
Victor Stinner03dab782015-10-14 00:21:35 +0200323 s = _PyBytesWriter_WriteBytes(&writer, s, p, i);
324 if (s == NULL)
325 goto error;
326 break;
327 }
328
329 case 'p':
330 sprintf(buffer, "%p", va_arg(vargs, void*));
331 assert(strlen(buffer) < sizeof(buffer));
332 /* %p is ill-defined: ensure leading 0x. */
333 if (buffer[1] == 'X')
334 buffer[1] = 'x';
335 else if (buffer[1] != 'x') {
336 memmove(buffer+2, buffer, strlen(buffer)+1);
337 buffer[0] = '0';
338 buffer[1] = 'x';
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000339 }
Victor Stinner03dab782015-10-14 00:21:35 +0200340 WRITE_BYTES(buffer);
341 break;
342
343 case '%':
344 writer.min_size++;
345 *s++ = '%';
346 break;
347
348 default:
349 if (*f == 0) {
350 /* fix min_size if we reached the end of the format string */
351 writer.min_size++;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000352 }
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000353
Victor Stinner03dab782015-10-14 00:21:35 +0200354 /* invalid format string: copy unformatted string and exit */
355 WRITE_BYTES(p);
356 return _PyBytesWriter_Finish(&writer, s);
357 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000358 }
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000359
Victor Stinner03dab782015-10-14 00:21:35 +0200360#undef WRITE_BYTES
361
362 return _PyBytesWriter_Finish(&writer, s);
363
364 error:
365 _PyBytesWriter_Dealloc(&writer);
366 return NULL;
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000367}
368
369PyObject *
370PyBytes_FromFormat(const char *format, ...)
371{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000372 PyObject* ret;
373 va_list vargs;
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000374
375#ifdef HAVE_STDARG_PROTOTYPES
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000376 va_start(vargs, format);
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000377#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000378 va_start(vargs);
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000379#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000380 ret = PyBytes_FromFormatV(format, vargs);
381 va_end(vargs);
382 return ret;
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000383}
384
Ethan Furmanb95b5612015-01-23 20:05:18 -0800385/* Helpers for formatstring */
386
387Py_LOCAL_INLINE(PyObject *)
388getnextarg(PyObject *args, Py_ssize_t arglen, Py_ssize_t *p_argidx)
389{
390 Py_ssize_t argidx = *p_argidx;
391 if (argidx < arglen) {
392 (*p_argidx)++;
393 if (arglen < 0)
394 return args;
395 else
396 return PyTuple_GetItem(args, argidx);
397 }
398 PyErr_SetString(PyExc_TypeError,
399 "not enough arguments for format string");
400 return NULL;
401}
402
403/* Format codes
404 * F_LJUST '-'
405 * F_SIGN '+'
406 * F_BLANK ' '
407 * F_ALT '#'
408 * F_ZERO '0'
409 */
410#define F_LJUST (1<<0)
411#define F_SIGN (1<<1)
412#define F_BLANK (1<<2)
413#define F_ALT (1<<3)
414#define F_ZERO (1<<4)
415
416/* Returns a new reference to a PyBytes object, or NULL on failure. */
417
Victor Stinnerfa7762e2015-10-09 11:48:06 +0200418static char*
419formatfloat(PyObject *v, int flags, int prec, int type,
Victor Stinnerad771582015-10-09 12:38:53 +0200420 PyObject **p_result, _PyBytesWriter *writer, char *str)
Ethan Furmanb95b5612015-01-23 20:05:18 -0800421{
422 char *p;
423 PyObject *result;
424 double x;
Victor Stinnerfa7762e2015-10-09 11:48:06 +0200425 size_t len;
Ethan Furmanb95b5612015-01-23 20:05:18 -0800426
427 x = PyFloat_AsDouble(v);
428 if (x == -1.0 && PyErr_Occurred()) {
429 PyErr_Format(PyExc_TypeError, "float argument required, "
430 "not %.200s", Py_TYPE(v)->tp_name);
431 return NULL;
432 }
433
434 if (prec < 0)
435 prec = 6;
436
437 p = PyOS_double_to_string(x, type, prec,
438 (flags & F_ALT) ? Py_DTSF_ALT : 0, NULL);
439
440 if (p == NULL)
441 return NULL;
Victor Stinnerfa7762e2015-10-09 11:48:06 +0200442
443 len = strlen(p);
444 if (writer != NULL) {
Victor Stinnerad771582015-10-09 12:38:53 +0200445 str = _PyBytesWriter_Prepare(writer, str, len);
446 if (str == NULL)
447 return NULL;
Christian Heimesf051e432016-09-13 20:22:02 +0200448 memcpy(str, p, len);
Victor Stinner71dc3d82016-04-26 12:35:13 +0200449 PyMem_Free(p);
Victor Stinnerfa7762e2015-10-09 11:48:06 +0200450 str += len;
451 return str;
452 }
453
454 result = PyBytes_FromStringAndSize(p, len);
Ethan Furmanb95b5612015-01-23 20:05:18 -0800455 PyMem_Free(p);
Victor Stinnerfa7762e2015-10-09 11:48:06 +0200456 *p_result = result;
Miss Islington (bot)063755c2018-10-02 23:33:42 -0700457 return result != NULL ? str : NULL;
Ethan Furmanb95b5612015-01-23 20:05:18 -0800458}
459
Serhiy Storchaka2c7b5a92015-03-30 09:19:08 +0300460static PyObject *
461formatlong(PyObject *v, int flags, int prec, int type)
462{
463 PyObject *result, *iobj;
464 if (type == 'i')
465 type = 'd';
466 if (PyLong_Check(v))
467 return _PyUnicode_FormatLong(v, flags & F_ALT, prec, type);
468 if (PyNumber_Check(v)) {
469 /* make sure number is a type of integer for o, x, and X */
470 if (type == 'o' || type == 'x' || type == 'X')
471 iobj = PyNumber_Index(v);
472 else
473 iobj = PyNumber_Long(v);
474 if (iobj == NULL) {
475 if (!PyErr_ExceptionMatches(PyExc_TypeError))
476 return NULL;
477 }
478 else if (!PyLong_Check(iobj))
479 Py_CLEAR(iobj);
480 if (iobj != NULL) {
481 result = _PyUnicode_FormatLong(iobj, flags & F_ALT, prec, type);
482 Py_DECREF(iobj);
483 return result;
484 }
485 }
486 PyErr_Format(PyExc_TypeError,
487 "%%%c format: %s is required, not %.200s", type,
488 (type == 'o' || type == 'x' || type == 'X') ? "an integer"
489 : "a number",
490 Py_TYPE(v)->tp_name);
491 return NULL;
492}
493
494static int
Serhiy Storchakaea5ce5a2015-02-10 23:23:12 +0200495byte_converter(PyObject *arg, char *p)
Ethan Furmanb95b5612015-01-23 20:05:18 -0800496{
Serhiy Storchakadd40fc32016-05-04 22:23:26 +0300497 if (PyBytes_Check(arg) && PyBytes_GET_SIZE(arg) == 1) {
Serhiy Storchakaea5ce5a2015-02-10 23:23:12 +0200498 *p = PyBytes_AS_STRING(arg)[0];
499 return 1;
Ethan Furmanb95b5612015-01-23 20:05:18 -0800500 }
Serhiy Storchakadd40fc32016-05-04 22:23:26 +0300501 else if (PyByteArray_Check(arg) && PyByteArray_GET_SIZE(arg) == 1) {
Serhiy Storchakaea5ce5a2015-02-10 23:23:12 +0200502 *p = PyByteArray_AS_STRING(arg)[0];
503 return 1;
Ethan Furmanb95b5612015-01-23 20:05:18 -0800504 }
505 else {
Serhiy Storchaka2c7b5a92015-03-30 09:19:08 +0300506 PyObject *iobj;
507 long ival;
508 int overflow;
509 /* make sure number is a type of integer */
510 if (PyLong_Check(arg)) {
511 ival = PyLong_AsLongAndOverflow(arg, &overflow);
512 }
513 else {
514 iobj = PyNumber_Index(arg);
515 if (iobj == NULL) {
516 if (!PyErr_ExceptionMatches(PyExc_TypeError))
517 return 0;
518 goto onError;
519 }
520 ival = PyLong_AsLongAndOverflow(iobj, &overflow);
521 Py_DECREF(iobj);
522 }
Serhiy Storchaka41525e32015-04-03 20:53:46 +0300523 if (!overflow && ival == -1 && PyErr_Occurred())
524 goto onError;
525 if (overflow || !(0 <= ival && ival <= 255)) {
526 PyErr_SetString(PyExc_OverflowError,
527 "%c arg not in range(256)");
528 return 0;
Ethan Furmanb95b5612015-01-23 20:05:18 -0800529 }
Serhiy Storchaka41525e32015-04-03 20:53:46 +0300530 *p = (char)ival;
531 return 1;
Ethan Furmanb95b5612015-01-23 20:05:18 -0800532 }
Serhiy Storchaka2c7b5a92015-03-30 09:19:08 +0300533 onError:
Serhiy Storchakaea5ce5a2015-02-10 23:23:12 +0200534 PyErr_SetString(PyExc_TypeError,
535 "%c requires an integer in range(256) or a single byte");
536 return 0;
Ethan Furmanb95b5612015-01-23 20:05:18 -0800537}
538
Xiang Zhang7e2a54c2017-03-14 15:07:15 +0800539static PyObject *_PyBytes_FromBuffer(PyObject *x);
540
Ethan Furmanb95b5612015-01-23 20:05:18 -0800541static PyObject *
Serhiy Storchakaea5ce5a2015-02-10 23:23:12 +0200542format_obj(PyObject *v, const char **pbuf, Py_ssize_t *plen)
Ethan Furmanb95b5612015-01-23 20:05:18 -0800543{
Serhiy Storchakaea5ce5a2015-02-10 23:23:12 +0200544 PyObject *func, *result;
Ethan Furmanb95b5612015-01-23 20:05:18 -0800545 _Py_IDENTIFIER(__bytes__);
Ethan Furmanb95b5612015-01-23 20:05:18 -0800546 /* is it a bytes object? */
547 if (PyBytes_Check(v)) {
Serhiy Storchakaea5ce5a2015-02-10 23:23:12 +0200548 *pbuf = PyBytes_AS_STRING(v);
549 *plen = PyBytes_GET_SIZE(v);
Ethan Furmanb95b5612015-01-23 20:05:18 -0800550 Py_INCREF(v);
Serhiy Storchakaea5ce5a2015-02-10 23:23:12 +0200551 return v;
552 }
553 if (PyByteArray_Check(v)) {
554 *pbuf = PyByteArray_AS_STRING(v);
555 *plen = PyByteArray_GET_SIZE(v);
556 Py_INCREF(v);
557 return v;
Ethan Furmanb95b5612015-01-23 20:05:18 -0800558 }
559 /* does it support __bytes__? */
560 func = _PyObject_LookupSpecial(v, &PyId___bytes__);
561 if (func != NULL) {
Victor Stinnerf17c3de2016-12-06 18:46:19 +0100562 result = _PyObject_CallNoArg(func);
Ethan Furmanb95b5612015-01-23 20:05:18 -0800563 Py_DECREF(func);
564 if (result == NULL)
565 return NULL;
566 if (!PyBytes_Check(result)) {
567 PyErr_Format(PyExc_TypeError,
568 "__bytes__ returned non-bytes (type %.200s)",
569 Py_TYPE(result)->tp_name);
570 Py_DECREF(result);
571 return NULL;
572 }
Serhiy Storchakaea5ce5a2015-02-10 23:23:12 +0200573 *pbuf = PyBytes_AS_STRING(result);
574 *plen = PyBytes_GET_SIZE(result);
Ethan Furmanb95b5612015-01-23 20:05:18 -0800575 return result;
576 }
Xiang Zhang7e2a54c2017-03-14 15:07:15 +0800577 /* does it support buffer protocol? */
578 if (PyObject_CheckBuffer(v)) {
579 /* maybe we can avoid making a copy of the buffer object here? */
580 result = _PyBytes_FromBuffer(v);
581 if (result == NULL)
582 return NULL;
583 *pbuf = PyBytes_AS_STRING(result);
584 *plen = PyBytes_GET_SIZE(result);
585 return result;
586 }
Ethan Furmanb95b5612015-01-23 20:05:18 -0800587 PyErr_Format(PyExc_TypeError,
Xiang Zhang7e2a54c2017-03-14 15:07:15 +0800588 "%%b requires a bytes-like object, "
589 "or an object that implements __bytes__, not '%.100s'",
Ethan Furmanb95b5612015-01-23 20:05:18 -0800590 Py_TYPE(v)->tp_name);
591 return NULL;
592}
593
Victor Stinnerfa7762e2015-10-09 11:48:06 +0200594/* fmt%(v1,v2,...) is roughly equivalent to sprintf(fmt, v1, v2, ...) */
Ethan Furmanb95b5612015-01-23 20:05:18 -0800595
596PyObject *
Victor Stinner772b2b02015-10-14 09:56:53 +0200597_PyBytes_FormatEx(const char *format, Py_ssize_t format_len,
598 PyObject *args, int use_bytearray)
Ethan Furmanb95b5612015-01-23 20:05:18 -0800599{
Victor Stinner772b2b02015-10-14 09:56:53 +0200600 const char *fmt;
601 char *res;
Ethan Furmanb95b5612015-01-23 20:05:18 -0800602 Py_ssize_t arglen, argidx;
Victor Stinnerfa7762e2015-10-09 11:48:06 +0200603 Py_ssize_t fmtcnt;
Ethan Furmanb95b5612015-01-23 20:05:18 -0800604 int args_owned = 0;
Ethan Furmanb95b5612015-01-23 20:05:18 -0800605 PyObject *dict = NULL;
Victor Stinnerfa7762e2015-10-09 11:48:06 +0200606 _PyBytesWriter writer;
607
Victor Stinner772b2b02015-10-14 09:56:53 +0200608 if (args == NULL) {
Ethan Furmanb95b5612015-01-23 20:05:18 -0800609 PyErr_BadInternalCall();
610 return NULL;
611 }
Victor Stinner772b2b02015-10-14 09:56:53 +0200612 fmt = format;
613 fmtcnt = format_len;
Victor Stinnerfa7762e2015-10-09 11:48:06 +0200614
615 _PyBytesWriter_Init(&writer);
Victor Stinner772b2b02015-10-14 09:56:53 +0200616 writer.use_bytearray = use_bytearray;
Victor Stinnerfa7762e2015-10-09 11:48:06 +0200617
618 res = _PyBytesWriter_Alloc(&writer, fmtcnt);
619 if (res == NULL)
Ethan Furmanb95b5612015-01-23 20:05:18 -0800620 return NULL;
Victor Stinner772b2b02015-10-14 09:56:53 +0200621 if (!use_bytearray)
622 writer.overallocate = 1;
Victor Stinnerfa7762e2015-10-09 11:48:06 +0200623
Ethan Furmanb95b5612015-01-23 20:05:18 -0800624 if (PyTuple_Check(args)) {
625 arglen = PyTuple_GET_SIZE(args);
626 argidx = 0;
627 }
628 else {
629 arglen = -1;
630 argidx = -2;
631 }
632 if (Py_TYPE(args)->tp_as_mapping && Py_TYPE(args)->tp_as_mapping->mp_subscript &&
633 !PyTuple_Check(args) && !PyBytes_Check(args) && !PyUnicode_Check(args) &&
634 !PyByteArray_Check(args)) {
635 dict = args;
636 }
Victor Stinnerfa7762e2015-10-09 11:48:06 +0200637
Ethan Furmanb95b5612015-01-23 20:05:18 -0800638 while (--fmtcnt >= 0) {
639 if (*fmt != '%') {
Victor Stinnerfa7762e2015-10-09 11:48:06 +0200640 Py_ssize_t len;
641 char *pos;
642
Xiang Zhangb76ad512017-03-06 17:17:05 +0800643 pos = (char *)memchr(fmt + 1, '%', fmtcnt);
Victor Stinnerfa7762e2015-10-09 11:48:06 +0200644 if (pos != NULL)
645 len = pos - fmt;
Victor Stinner772b2b02015-10-14 09:56:53 +0200646 else
Xiang Zhangb76ad512017-03-06 17:17:05 +0800647 len = fmtcnt + 1;
Victor Stinnerfa7762e2015-10-09 11:48:06 +0200648 assert(len != 0);
649
Christian Heimesf051e432016-09-13 20:22:02 +0200650 memcpy(res, fmt, len);
Victor Stinnerfa7762e2015-10-09 11:48:06 +0200651 res += len;
652 fmt += len;
653 fmtcnt -= (len - 1);
Ethan Furmanb95b5612015-01-23 20:05:18 -0800654 }
655 else {
656 /* Got a format specifier */
657 int flags = 0;
658 Py_ssize_t width = -1;
659 int prec = -1;
660 int c = '\0';
661 int fill;
Ethan Furmanb95b5612015-01-23 20:05:18 -0800662 PyObject *v = NULL;
663 PyObject *temp = NULL;
Serhiy Storchakaea5ce5a2015-02-10 23:23:12 +0200664 const char *pbuf = NULL;
Ethan Furmanb95b5612015-01-23 20:05:18 -0800665 int sign;
Serhiy Storchakaea5ce5a2015-02-10 23:23:12 +0200666 Py_ssize_t len = 0;
667 char onechar; /* For byte_converter() */
Victor Stinnerfa7762e2015-10-09 11:48:06 +0200668 Py_ssize_t alloc;
669#ifdef Py_DEBUG
670 char *before;
671#endif
Ethan Furmanb95b5612015-01-23 20:05:18 -0800672
Ethan Furmanb95b5612015-01-23 20:05:18 -0800673 fmt++;
Serhiy Storchaka9f8ad3f2017-03-08 05:51:19 +0200674 if (*fmt == '%') {
675 *res++ = '%';
676 fmt++;
677 fmtcnt--;
678 continue;
679 }
Ethan Furmanb95b5612015-01-23 20:05:18 -0800680 if (*fmt == '(') {
Victor Stinner772b2b02015-10-14 09:56:53 +0200681 const char *keystart;
Ethan Furmanb95b5612015-01-23 20:05:18 -0800682 Py_ssize_t keylen;
683 PyObject *key;
684 int pcount = 1;
685
686 if (dict == NULL) {
687 PyErr_SetString(PyExc_TypeError,
688 "format requires a mapping");
689 goto error;
690 }
691 ++fmt;
692 --fmtcnt;
693 keystart = fmt;
694 /* Skip over balanced parentheses */
695 while (pcount > 0 && --fmtcnt >= 0) {
696 if (*fmt == ')')
697 --pcount;
698 else if (*fmt == '(')
699 ++pcount;
700 fmt++;
701 }
702 keylen = fmt - keystart - 1;
703 if (fmtcnt < 0 || pcount > 0) {
704 PyErr_SetString(PyExc_ValueError,
705 "incomplete format key");
706 goto error;
707 }
708 key = PyBytes_FromStringAndSize(keystart,
709 keylen);
710 if (key == NULL)
711 goto error;
712 if (args_owned) {
713 Py_DECREF(args);
714 args_owned = 0;
715 }
716 args = PyObject_GetItem(dict, key);
717 Py_DECREF(key);
718 if (args == NULL) {
719 goto error;
720 }
721 args_owned = 1;
722 arglen = -1;
723 argidx = -2;
724 }
Victor Stinnerfa7762e2015-10-09 11:48:06 +0200725
726 /* Parse flags. Example: "%+i" => flags=F_SIGN. */
Ethan Furmanb95b5612015-01-23 20:05:18 -0800727 while (--fmtcnt >= 0) {
728 switch (c = *fmt++) {
729 case '-': flags |= F_LJUST; continue;
730 case '+': flags |= F_SIGN; continue;
731 case ' ': flags |= F_BLANK; continue;
732 case '#': flags |= F_ALT; continue;
733 case '0': flags |= F_ZERO; continue;
734 }
735 break;
736 }
Victor Stinnerfa7762e2015-10-09 11:48:06 +0200737
738 /* Parse width. Example: "%10s" => width=10 */
Ethan Furmanb95b5612015-01-23 20:05:18 -0800739 if (c == '*') {
740 v = getnextarg(args, arglen, &argidx);
741 if (v == NULL)
742 goto error;
743 if (!PyLong_Check(v)) {
744 PyErr_SetString(PyExc_TypeError,
745 "* wants int");
746 goto error;
747 }
748 width = PyLong_AsSsize_t(v);
749 if (width == -1 && PyErr_Occurred())
750 goto error;
751 if (width < 0) {
752 flags |= F_LJUST;
753 width = -width;
754 }
755 if (--fmtcnt >= 0)
756 c = *fmt++;
757 }
758 else if (c >= 0 && isdigit(c)) {
759 width = c - '0';
760 while (--fmtcnt >= 0) {
761 c = Py_CHARMASK(*fmt++);
762 if (!isdigit(c))
763 break;
764 if (width > (PY_SSIZE_T_MAX - ((int)c - '0')) / 10) {
765 PyErr_SetString(
766 PyExc_ValueError,
767 "width too big");
768 goto error;
769 }
770 width = width*10 + (c - '0');
771 }
772 }
Victor Stinnerfa7762e2015-10-09 11:48:06 +0200773
774 /* Parse precision. Example: "%.3f" => prec=3 */
Ethan Furmanb95b5612015-01-23 20:05:18 -0800775 if (c == '.') {
776 prec = 0;
777 if (--fmtcnt >= 0)
778 c = *fmt++;
779 if (c == '*') {
780 v = getnextarg(args, arglen, &argidx);
781 if (v == NULL)
782 goto error;
783 if (!PyLong_Check(v)) {
784 PyErr_SetString(
785 PyExc_TypeError,
786 "* wants int");
787 goto error;
788 }
Serhiy Storchaka26861b02015-02-16 20:52:17 +0200789 prec = _PyLong_AsInt(v);
Ethan Furmanb95b5612015-01-23 20:05:18 -0800790 if (prec == -1 && PyErr_Occurred())
791 goto error;
792 if (prec < 0)
793 prec = 0;
794 if (--fmtcnt >= 0)
795 c = *fmt++;
796 }
797 else if (c >= 0 && isdigit(c)) {
798 prec = c - '0';
799 while (--fmtcnt >= 0) {
800 c = Py_CHARMASK(*fmt++);
801 if (!isdigit(c))
802 break;
803 if (prec > (INT_MAX - ((int)c - '0')) / 10) {
804 PyErr_SetString(
805 PyExc_ValueError,
806 "prec too big");
807 goto error;
808 }
809 prec = prec*10 + (c - '0');
810 }
811 }
812 } /* prec */
813 if (fmtcnt >= 0) {
814 if (c == 'h' || c == 'l' || c == 'L') {
815 if (--fmtcnt >= 0)
816 c = *fmt++;
817 }
818 }
819 if (fmtcnt < 0) {
820 PyErr_SetString(PyExc_ValueError,
821 "incomplete format");
822 goto error;
823 }
Serhiy Storchaka9f8ad3f2017-03-08 05:51:19 +0200824 v = getnextarg(args, arglen, &argidx);
825 if (v == NULL)
826 goto error;
Victor Stinnerfa7762e2015-10-09 11:48:06 +0200827
Miss Islington (bot)04208262018-08-23 04:03:02 -0400828 if (fmtcnt == 0) {
829 /* last write: disable writer overallocation */
Victor Stinnerfa7762e2015-10-09 11:48:06 +0200830 writer.overallocate = 0;
831 }
832
Ethan Furmanb95b5612015-01-23 20:05:18 -0800833 sign = 0;
834 fill = ' ';
835 switch (c) {
Ethan Furman62e977f2015-03-11 08:17:00 -0700836 case 'r':
837 // %r is only for 2/3 code; 3 only code should use %a
Ethan Furmanb95b5612015-01-23 20:05:18 -0800838 case 'a':
Serhiy Storchakaea5ce5a2015-02-10 23:23:12 +0200839 temp = PyObject_ASCII(v);
Ethan Furmanb95b5612015-01-23 20:05:18 -0800840 if (temp == NULL)
841 goto error;
Serhiy Storchakaea5ce5a2015-02-10 23:23:12 +0200842 assert(PyUnicode_IS_ASCII(temp));
843 pbuf = (const char *)PyUnicode_1BYTE_DATA(temp);
844 len = PyUnicode_GET_LENGTH(temp);
Ethan Furmanb95b5612015-01-23 20:05:18 -0800845 if (prec >= 0 && len > prec)
846 len = prec;
847 break;
Victor Stinnerfa7762e2015-10-09 11:48:06 +0200848
Ethan Furmanb95b5612015-01-23 20:05:18 -0800849 case 's':
850 // %s is only for 2/3 code; 3 only code should use %b
851 case 'b':
Serhiy Storchakaea5ce5a2015-02-10 23:23:12 +0200852 temp = format_obj(v, &pbuf, &len);
Ethan Furmanb95b5612015-01-23 20:05:18 -0800853 if (temp == NULL)
854 goto error;
Ethan Furmanb95b5612015-01-23 20:05:18 -0800855 if (prec >= 0 && len > prec)
856 len = prec;
857 break;
Victor Stinnerfa7762e2015-10-09 11:48:06 +0200858
Ethan Furmanb95b5612015-01-23 20:05:18 -0800859 case 'i':
860 case 'd':
861 case 'u':
862 case 'o':
863 case 'x':
864 case 'X':
Victor Stinnerbe75b8c2015-10-09 22:43:24 +0200865 if (PyLong_CheckExact(v)
Victor Stinner0cdad1e2015-10-09 22:50:36 +0200866 && width == -1 && prec == -1
867 && !(flags & (F_SIGN | F_BLANK))
868 && c != 'X')
Victor Stinnerbe75b8c2015-10-09 22:43:24 +0200869 {
870 /* Fast path */
871 int alternate = flags & F_ALT;
872 int base;
873
874 switch(c)
875 {
876 default:
Barry Warsawb2e57942017-09-14 18:13:16 -0700877 Py_UNREACHABLE();
Victor Stinnerbe75b8c2015-10-09 22:43:24 +0200878 case 'd':
879 case 'i':
880 case 'u':
881 base = 10;
882 break;
883 case 'o':
884 base = 8;
885 break;
886 case 'x':
887 case 'X':
888 base = 16;
889 break;
890 }
891
892 /* Fast path */
Victor Stinner0cdad1e2015-10-09 22:50:36 +0200893 writer.min_size -= 2; /* size preallocated for "%d" */
Victor Stinnerbe75b8c2015-10-09 22:43:24 +0200894 res = _PyLong_FormatBytesWriter(&writer, res,
895 v, base, alternate);
896 if (res == NULL)
897 goto error;
898 continue;
899 }
900
Serhiy Storchaka2c7b5a92015-03-30 09:19:08 +0300901 temp = formatlong(v, flags, prec, c);
Serhiy Storchakaea5ce5a2015-02-10 23:23:12 +0200902 if (!temp)
903 goto error;
904 assert(PyUnicode_IS_ASCII(temp));
905 pbuf = (const char *)PyUnicode_1BYTE_DATA(temp);
906 len = PyUnicode_GET_LENGTH(temp);
907 sign = 1;
Ethan Furmanb95b5612015-01-23 20:05:18 -0800908 if (flags & F_ZERO)
909 fill = '0';
910 break;
Victor Stinnerfa7762e2015-10-09 11:48:06 +0200911
Ethan Furmanb95b5612015-01-23 20:05:18 -0800912 case 'e':
913 case 'E':
914 case 'f':
915 case 'F':
916 case 'g':
917 case 'G':
Victor Stinnerfa7762e2015-10-09 11:48:06 +0200918 if (width == -1 && prec == -1
919 && !(flags & (F_SIGN | F_BLANK)))
920 {
921 /* Fast path */
Victor Stinner0cdad1e2015-10-09 22:50:36 +0200922 writer.min_size -= 2; /* size preallocated for "%f" */
Victor Stinnerad771582015-10-09 12:38:53 +0200923 res = formatfloat(v, flags, prec, c, NULL, &writer, res);
Victor Stinnerfa7762e2015-10-09 11:48:06 +0200924 if (res == NULL)
925 goto error;
926 continue;
927 }
928
Victor Stinnerad771582015-10-09 12:38:53 +0200929 if (!formatfloat(v, flags, prec, c, &temp, NULL, res))
Ethan Furmanb95b5612015-01-23 20:05:18 -0800930 goto error;
931 pbuf = PyBytes_AS_STRING(temp);
932 len = PyBytes_GET_SIZE(temp);
933 sign = 1;
934 if (flags & F_ZERO)
935 fill = '0';
936 break;
Victor Stinnerfa7762e2015-10-09 11:48:06 +0200937
Ethan Furmanb95b5612015-01-23 20:05:18 -0800938 case 'c':
Serhiy Storchakaea5ce5a2015-02-10 23:23:12 +0200939 pbuf = &onechar;
940 len = byte_converter(v, &onechar);
941 if (!len)
Ethan Furmanb95b5612015-01-23 20:05:18 -0800942 goto error;
Victor Stinner0cdad1e2015-10-09 22:50:36 +0200943 if (width == -1) {
944 /* Fast path */
945 *res++ = onechar;
946 continue;
947 }
Ethan Furmanb95b5612015-01-23 20:05:18 -0800948 break;
Victor Stinnerfa7762e2015-10-09 11:48:06 +0200949
Ethan Furmanb95b5612015-01-23 20:05:18 -0800950 default:
951 PyErr_Format(PyExc_ValueError,
952 "unsupported format character '%c' (0x%x) "
953 "at index %zd",
954 c, c,
Victor Stinner772b2b02015-10-14 09:56:53 +0200955 (Py_ssize_t)(fmt - 1 - format));
Ethan Furmanb95b5612015-01-23 20:05:18 -0800956 goto error;
957 }
Victor Stinnerfa7762e2015-10-09 11:48:06 +0200958
Ethan Furmanb95b5612015-01-23 20:05:18 -0800959 if (sign) {
960 if (*pbuf == '-' || *pbuf == '+') {
961 sign = *pbuf++;
962 len--;
963 }
964 else if (flags & F_SIGN)
965 sign = '+';
966 else if (flags & F_BLANK)
967 sign = ' ';
968 else
969 sign = 0;
970 }
971 if (width < len)
972 width = len;
Victor Stinnerfa7762e2015-10-09 11:48:06 +0200973
974 alloc = width;
975 if (sign != 0 && len == width)
976 alloc++;
Victor Stinner0cdad1e2015-10-09 22:50:36 +0200977 /* 2: size preallocated for %s */
978 if (alloc > 2) {
979 res = _PyBytesWriter_Prepare(&writer, res, alloc - 2);
Victor Stinnerfa7762e2015-10-09 11:48:06 +0200980 if (res == NULL)
981 goto error;
Ethan Furmanb95b5612015-01-23 20:05:18 -0800982 }
Victor Stinnerfa7762e2015-10-09 11:48:06 +0200983#ifdef Py_DEBUG
984 before = res;
985#endif
986
987 /* Write the sign if needed */
Ethan Furmanb95b5612015-01-23 20:05:18 -0800988 if (sign) {
989 if (fill != ' ')
990 *res++ = sign;
Ethan Furmanb95b5612015-01-23 20:05:18 -0800991 if (width > len)
992 width--;
993 }
Victor Stinnerfa7762e2015-10-09 11:48:06 +0200994
995 /* Write the numeric prefix for "x", "X" and "o" formats
996 if the alternate form is used.
997 For example, write "0x" for the "%#x" format. */
Serhiy Storchakab1a16192016-12-17 21:48:03 +0200998 if ((flags & F_ALT) && (c == 'o' || c == 'x' || c == 'X')) {
Ethan Furmanb95b5612015-01-23 20:05:18 -0800999 assert(pbuf[0] == '0');
1000 assert(pbuf[1] == c);
1001 if (fill != ' ') {
1002 *res++ = *pbuf++;
1003 *res++ = *pbuf++;
1004 }
Ethan Furmanb95b5612015-01-23 20:05:18 -08001005 width -= 2;
1006 if (width < 0)
1007 width = 0;
1008 len -= 2;
1009 }
Victor Stinnerfa7762e2015-10-09 11:48:06 +02001010
1011 /* Pad left with the fill character if needed */
Ethan Furmanb95b5612015-01-23 20:05:18 -08001012 if (width > len && !(flags & F_LJUST)) {
Victor Stinnerfa7762e2015-10-09 11:48:06 +02001013 memset(res, fill, width - len);
1014 res += (width - len);
1015 width = len;
Ethan Furmanb95b5612015-01-23 20:05:18 -08001016 }
Victor Stinnerfa7762e2015-10-09 11:48:06 +02001017
1018 /* If padding with spaces: write sign if needed and/or numeric
1019 prefix if the alternate form is used */
Ethan Furmanb95b5612015-01-23 20:05:18 -08001020 if (fill == ' ') {
1021 if (sign)
1022 *res++ = sign;
Serhiy Storchakab1a16192016-12-17 21:48:03 +02001023 if ((flags & F_ALT) && (c == 'o' || c == 'x' || c == 'X')) {
Ethan Furmanb95b5612015-01-23 20:05:18 -08001024 assert(pbuf[0] == '0');
1025 assert(pbuf[1] == c);
1026 *res++ = *pbuf++;
1027 *res++ = *pbuf++;
1028 }
1029 }
Victor Stinnerfa7762e2015-10-09 11:48:06 +02001030
1031 /* Copy bytes */
Christian Heimesf051e432016-09-13 20:22:02 +02001032 memcpy(res, pbuf, len);
Ethan Furmanb95b5612015-01-23 20:05:18 -08001033 res += len;
Victor Stinnerfa7762e2015-10-09 11:48:06 +02001034
1035 /* Pad right with the fill character if needed */
1036 if (width > len) {
1037 memset(res, ' ', width - len);
1038 res += (width - len);
Ethan Furmanb95b5612015-01-23 20:05:18 -08001039 }
Victor Stinnerfa7762e2015-10-09 11:48:06 +02001040
Serhiy Storchaka9f8ad3f2017-03-08 05:51:19 +02001041 if (dict && (argidx < arglen)) {
Ethan Furmanb95b5612015-01-23 20:05:18 -08001042 PyErr_SetString(PyExc_TypeError,
1043 "not all arguments converted during bytes formatting");
Ethan Furmanb95b5612015-01-23 20:05:18 -08001044 Py_XDECREF(temp);
1045 goto error;
1046 }
Ethan Furmanb95b5612015-01-23 20:05:18 -08001047 Py_XDECREF(temp);
Victor Stinnerfa7762e2015-10-09 11:48:06 +02001048
1049#ifdef Py_DEBUG
1050 /* check that we computed the exact size for this write */
1051 assert((res - before) == alloc);
1052#endif
Ethan Furmanb95b5612015-01-23 20:05:18 -08001053 } /* '%' */
Victor Stinnerfa7762e2015-10-09 11:48:06 +02001054
1055 /* If overallocation was disabled, ensure that it was the last
1056 write. Otherwise, we missed an optimization */
Miss Islington (bot)04208262018-08-23 04:03:02 -04001057 assert(writer.overallocate || fmtcnt == 0 || use_bytearray);
Ethan Furmanb95b5612015-01-23 20:05:18 -08001058 } /* until end */
Victor Stinnerfa7762e2015-10-09 11:48:06 +02001059
Ethan Furmanb95b5612015-01-23 20:05:18 -08001060 if (argidx < arglen && !dict) {
1061 PyErr_SetString(PyExc_TypeError,
1062 "not all arguments converted during bytes formatting");
1063 goto error;
1064 }
Victor Stinnerfa7762e2015-10-09 11:48:06 +02001065
Ethan Furmanb95b5612015-01-23 20:05:18 -08001066 if (args_owned) {
1067 Py_DECREF(args);
1068 }
Victor Stinnerfa7762e2015-10-09 11:48:06 +02001069 return _PyBytesWriter_Finish(&writer, res);
Ethan Furmanb95b5612015-01-23 20:05:18 -08001070
1071 error:
Victor Stinnerfa7762e2015-10-09 11:48:06 +02001072 _PyBytesWriter_Dealloc(&writer);
Ethan Furmanb95b5612015-01-23 20:05:18 -08001073 if (args_owned) {
1074 Py_DECREF(args);
1075 }
1076 return NULL;
1077}
1078
1079/* =-= */
1080
Guido van Rossum4dfe8a12006-04-22 23:28:04 +00001081static void
Benjamin Peterson80688ef2009-04-18 15:17:02 +00001082bytes_dealloc(PyObject *op)
Guido van Rossum4dfe8a12006-04-22 23:28:04 +00001083{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001084 Py_TYPE(op)->tp_free(op);
Guido van Rossum4dfe8a12006-04-22 23:28:04 +00001085}
1086
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001087/* Unescape a backslash-escaped string. If unicode is non-zero,
1088 the string is a u-literal. If recode_encoding is non-zero,
1089 the string is UTF-8 encoded and should be re-encoded in the
1090 specified encoding. */
1091
Victor Stinner2ec80632015-10-14 13:32:13 +02001092static char *
1093_PyBytes_DecodeEscapeRecode(const char **s, const char *end,
1094 const char *errors, const char *recode_encoding,
1095 _PyBytesWriter *writer, char *p)
1096{
1097 PyObject *u, *w;
1098 const char* t;
1099
1100 t = *s;
1101 /* Decode non-ASCII bytes as UTF-8. */
1102 while (t < end && (*t & 0x80))
1103 t++;
1104 u = PyUnicode_DecodeUTF8(*s, t - *s, errors);
1105 if (u == NULL)
1106 return NULL;
1107
1108 /* Recode them in target encoding. */
1109 w = PyUnicode_AsEncodedString(u, recode_encoding, errors);
1110 Py_DECREF(u);
1111 if (w == NULL)
1112 return NULL;
1113 assert(PyBytes_Check(w));
1114
1115 /* Append bytes to output buffer. */
Raymond Hettinger15f44ab2016-08-30 10:47:49 -07001116 writer->min_size--; /* subtract 1 preallocated byte */
Victor Stinner2ec80632015-10-14 13:32:13 +02001117 p = _PyBytesWriter_WriteBytes(writer, p,
1118 PyBytes_AS_STRING(w),
1119 PyBytes_GET_SIZE(w));
1120 Py_DECREF(w);
1121 if (p == NULL)
1122 return NULL;
1123
1124 *s = t;
1125 return p;
1126}
1127
Eric V. Smith42454af2016-10-31 09:22:08 -04001128PyObject *_PyBytes_DecodeEscape(const char *s,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001129 Py_ssize_t len,
1130 const char *errors,
1131 Py_ssize_t unicode,
Eric V. Smith42454af2016-10-31 09:22:08 -04001132 const char *recode_encoding,
1133 const char **first_invalid_escape)
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001134{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001135 int c;
Victor Stinner2ec80632015-10-14 13:32:13 +02001136 char *p;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001137 const char *end;
Victor Stinner2ec80632015-10-14 13:32:13 +02001138 _PyBytesWriter writer;
1139
1140 _PyBytesWriter_Init(&writer);
1141
1142 p = _PyBytesWriter_Alloc(&writer, len);
1143 if (p == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001144 return NULL;
Victor Stinner2ec80632015-10-14 13:32:13 +02001145 writer.overallocate = 1;
1146
Eric V. Smith42454af2016-10-31 09:22:08 -04001147 *first_invalid_escape = NULL;
1148
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001149 end = s + len;
1150 while (s < end) {
1151 if (*s != '\\') {
1152 non_esc:
Victor Stinner2ec80632015-10-14 13:32:13 +02001153 if (!(recode_encoding && (*s & 0x80))) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001154 *p++ = *s++;
1155 }
Victor Stinner2ec80632015-10-14 13:32:13 +02001156 else {
1157 /* non-ASCII character and need to recode */
1158 p = _PyBytes_DecodeEscapeRecode(&s, end,
1159 errors, recode_encoding,
1160 &writer, p);
1161 if (p == NULL)
1162 goto failed;
1163 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001164 continue;
1165 }
Victor Stinner2ec80632015-10-14 13:32:13 +02001166
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001167 s++;
Victor Stinner2ec80632015-10-14 13:32:13 +02001168 if (s == end) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001169 PyErr_SetString(PyExc_ValueError,
1170 "Trailing \\ in string");
1171 goto failed;
1172 }
Victor Stinner2ec80632015-10-14 13:32:13 +02001173
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001174 switch (*s++) {
1175 /* XXX This assumes ASCII! */
1176 case '\n': break;
1177 case '\\': *p++ = '\\'; break;
1178 case '\'': *p++ = '\''; break;
1179 case '\"': *p++ = '\"'; break;
1180 case 'b': *p++ = '\b'; break;
1181 case 'f': *p++ = '\014'; break; /* FF */
1182 case 't': *p++ = '\t'; break;
1183 case 'n': *p++ = '\n'; break;
1184 case 'r': *p++ = '\r'; break;
1185 case 'v': *p++ = '\013'; break; /* VT */
1186 case 'a': *p++ = '\007'; break; /* BEL, not classic C */
1187 case '0': case '1': case '2': case '3':
1188 case '4': case '5': case '6': case '7':
1189 c = s[-1] - '0';
1190 if (s < end && '0' <= *s && *s <= '7') {
1191 c = (c<<3) + *s++ - '0';
1192 if (s < end && '0' <= *s && *s <= '7')
1193 c = (c<<3) + *s++ - '0';
1194 }
1195 *p++ = c;
1196 break;
1197 case 'x':
Victor Stinner2ec80632015-10-14 13:32:13 +02001198 if (s+1 < end) {
1199 int digit1, digit2;
1200 digit1 = _PyLong_DigitValue[Py_CHARMASK(s[0])];
1201 digit2 = _PyLong_DigitValue[Py_CHARMASK(s[1])];
1202 if (digit1 < 16 && digit2 < 16) {
1203 *p++ = (unsigned char)((digit1 << 4) + digit2);
1204 s += 2;
1205 break;
1206 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001207 }
Victor Stinner2ec80632015-10-14 13:32:13 +02001208 /* invalid hexadecimal digits */
1209
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001210 if (!errors || strcmp(errors, "strict") == 0) {
Serhiy Storchaka5e61f142013-02-10 17:36:00 +02001211 PyErr_Format(PyExc_ValueError,
1212 "invalid \\x escape at position %d",
Serhiy Storchaka801d9552013-02-10 17:42:01 +02001213 s - 2 - (end - len));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001214 goto failed;
1215 }
1216 if (strcmp(errors, "replace") == 0) {
1217 *p++ = '?';
1218 } else if (strcmp(errors, "ignore") == 0)
1219 /* do nothing */;
1220 else {
1221 PyErr_Format(PyExc_ValueError,
1222 "decoding error; unknown "
1223 "error handling code: %.400s",
1224 errors);
1225 goto failed;
1226 }
Serhiy Storchakaace3ad32013-01-25 23:31:43 +02001227 /* skip \x */
1228 if (s < end && Py_ISXDIGIT(s[0]))
1229 s++; /* and a hexdigit */
1230 break;
Victor Stinner2ec80632015-10-14 13:32:13 +02001231
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001232 default:
Eric V. Smith42454af2016-10-31 09:22:08 -04001233 if (*first_invalid_escape == NULL) {
1234 *first_invalid_escape = s-1; /* Back up one char, since we've
1235 already incremented s. */
1236 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001237 *p++ = '\\';
Eric V. Smith42454af2016-10-31 09:22:08 -04001238 s--;
Ezio Melotti42da6632011-03-15 05:18:48 +02001239 goto non_esc; /* an arbitrary number of unescaped
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001240 UTF-8 bytes may follow. */
1241 }
1242 }
Victor Stinner2ec80632015-10-14 13:32:13 +02001243
1244 return _PyBytesWriter_Finish(&writer, p);
1245
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001246 failed:
Victor Stinner2ec80632015-10-14 13:32:13 +02001247 _PyBytesWriter_Dealloc(&writer);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001248 return NULL;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001249}
1250
Eric V. Smith42454af2016-10-31 09:22:08 -04001251PyObject *PyBytes_DecodeEscape(const char *s,
1252 Py_ssize_t len,
1253 const char *errors,
1254 Py_ssize_t unicode,
1255 const char *recode_encoding)
1256{
1257 const char* first_invalid_escape;
1258 PyObject *result = _PyBytes_DecodeEscape(s, len, errors, unicode,
1259 recode_encoding,
1260 &first_invalid_escape);
1261 if (result == NULL)
1262 return NULL;
1263 if (first_invalid_escape != NULL) {
1264 if (PyErr_WarnFormat(PyExc_DeprecationWarning, 1,
1265 "invalid escape sequence '\\%c'",
Serhiy Storchaka56cb4652017-10-20 17:08:15 +03001266 (unsigned char)*first_invalid_escape) < 0) {
Eric V. Smith42454af2016-10-31 09:22:08 -04001267 Py_DECREF(result);
1268 return NULL;
1269 }
1270 }
1271 return result;
1272
1273}
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001274/* -------------------------------------------------------------------- */
1275/* object api */
1276
1277Py_ssize_t
Antoine Pitrou9ed5f272013-08-13 20:18:52 +02001278PyBytes_Size(PyObject *op)
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001279{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001280 if (!PyBytes_Check(op)) {
1281 PyErr_Format(PyExc_TypeError,
1282 "expected bytes, %.200s found", Py_TYPE(op)->tp_name);
1283 return -1;
1284 }
1285 return Py_SIZE(op);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001286}
1287
1288char *
Antoine Pitrou9ed5f272013-08-13 20:18:52 +02001289PyBytes_AsString(PyObject *op)
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001290{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001291 if (!PyBytes_Check(op)) {
1292 PyErr_Format(PyExc_TypeError,
1293 "expected bytes, %.200s found", Py_TYPE(op)->tp_name);
1294 return NULL;
1295 }
1296 return ((PyBytesObject *)op)->ob_sval;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001297}
1298
1299int
Antoine Pitrou9ed5f272013-08-13 20:18:52 +02001300PyBytes_AsStringAndSize(PyObject *obj,
1301 char **s,
1302 Py_ssize_t *len)
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001303{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001304 if (s == NULL) {
1305 PyErr_BadInternalCall();
1306 return -1;
1307 }
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001308
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001309 if (!PyBytes_Check(obj)) {
1310 PyErr_Format(PyExc_TypeError,
1311 "expected bytes, %.200s found", Py_TYPE(obj)->tp_name);
1312 return -1;
1313 }
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001314
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001315 *s = PyBytes_AS_STRING(obj);
1316 if (len != NULL)
1317 *len = PyBytes_GET_SIZE(obj);
1318 else if (strlen(*s) != (size_t)PyBytes_GET_SIZE(obj)) {
Serhiy Storchakad8a14472014-09-06 20:07:17 +03001319 PyErr_SetString(PyExc_ValueError,
1320 "embedded null byte");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001321 return -1;
1322 }
1323 return 0;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001324}
Neal Norwitz6968b052007-02-27 19:02:19 +00001325
1326/* -------------------------------------------------------------------- */
1327/* Methods */
1328
Eric Smith0923d1d2009-04-16 20:16:10 +00001329#include "stringlib/stringdefs.h"
Neal Norwitz6968b052007-02-27 19:02:19 +00001330
1331#include "stringlib/fastsearch.h"
1332#include "stringlib/count.h"
1333#include "stringlib/find.h"
Antoine Pitroucfc22b42012-10-16 21:07:23 +02001334#include "stringlib/join.h"
Neal Norwitz6968b052007-02-27 19:02:19 +00001335#include "stringlib/partition.h"
Antoine Pitrouf2c54842010-01-13 08:07:53 +00001336#include "stringlib/split.h"
Gregory P. Smith60d241f2007-10-16 06:31:30 +00001337#include "stringlib/ctype.h"
Neal Norwitz6968b052007-02-27 19:02:19 +00001338
Eric Smith0f78bff2009-11-30 01:01:42 +00001339#include "stringlib/transmogrify.h"
Neal Norwitz6968b052007-02-27 19:02:19 +00001340
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001341PyObject *
1342PyBytes_Repr(PyObject *obj, int smartquotes)
Neal Norwitz6968b052007-02-27 19:02:19 +00001343{
Antoine Pitrou9ed5f272013-08-13 20:18:52 +02001344 PyBytesObject* op = (PyBytesObject*) obj;
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02001345 Py_ssize_t i, length = Py_SIZE(op);
Benjamin Petersond48bc942014-09-29 19:12:26 -04001346 Py_ssize_t newsize, squotes, dquotes;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001347 PyObject *v;
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02001348 unsigned char quote, *s, *p;
1349
1350 /* Compute size of output string */
1351 squotes = dquotes = 0;
1352 newsize = 3; /* b'' */
1353 s = (unsigned char*)op->ob_sval;
1354 for (i = 0; i < length; i++) {
Benjamin Peterson42ff1052014-09-29 19:01:18 -04001355 Py_ssize_t incr = 1;
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02001356 switch(s[i]) {
Benjamin Peterson42ff1052014-09-29 19:01:18 -04001357 case '\'': squotes++; break;
1358 case '"': dquotes++; break;
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02001359 case '\\': case '\t': case '\n': case '\r':
Benjamin Peterson42ff1052014-09-29 19:01:18 -04001360 incr = 2; break; /* \C */
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02001361 default:
1362 if (s[i] < ' ' || s[i] >= 0x7f)
Benjamin Peterson42ff1052014-09-29 19:01:18 -04001363 incr = 4; /* \xHH */
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02001364 }
Benjamin Peterson42ff1052014-09-29 19:01:18 -04001365 if (newsize > PY_SSIZE_T_MAX - incr)
1366 goto overflow;
1367 newsize += incr;
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02001368 }
1369 quote = '\'';
1370 if (smartquotes && squotes && !dquotes)
1371 quote = '"';
Benjamin Peterson42ff1052014-09-29 19:01:18 -04001372 if (squotes && quote == '\'') {
1373 if (newsize > PY_SSIZE_T_MAX - squotes)
1374 goto overflow;
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02001375 newsize += squotes;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001376 }
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02001377
1378 v = PyUnicode_New(newsize, 127);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001379 if (v == NULL) {
1380 return NULL;
1381 }
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02001382 p = PyUnicode_1BYTE_DATA(v);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001383
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02001384 *p++ = 'b', *p++ = quote;
1385 for (i = 0; i < length; i++) {
1386 unsigned char c = op->ob_sval[i];
1387 if (c == quote || c == '\\')
1388 *p++ = '\\', *p++ = c;
1389 else if (c == '\t')
1390 *p++ = '\\', *p++ = 't';
1391 else if (c == '\n')
1392 *p++ = '\\', *p++ = 'n';
1393 else if (c == '\r')
1394 *p++ = '\\', *p++ = 'r';
1395 else if (c < ' ' || c >= 0x7f) {
1396 *p++ = '\\';
1397 *p++ = 'x';
Victor Stinnerf5cff562011-10-14 02:13:11 +02001398 *p++ = Py_hexdigits[(c & 0xf0) >> 4];
1399 *p++ = Py_hexdigits[c & 0xf];
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001400 }
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02001401 else
1402 *p++ = c;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001403 }
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02001404 *p++ = quote;
Victor Stinner8f825062012-04-27 13:55:39 +02001405 assert(_PyUnicode_CheckConsistency(v, 1));
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02001406 return v;
Benjamin Peterson42ff1052014-09-29 19:01:18 -04001407
1408 overflow:
1409 PyErr_SetString(PyExc_OverflowError,
1410 "bytes object is too large to make repr");
1411 return NULL;
Neal Norwitz6968b052007-02-27 19:02:19 +00001412}
1413
Neal Norwitz6968b052007-02-27 19:02:19 +00001414static PyObject *
Benjamin Peterson80688ef2009-04-18 15:17:02 +00001415bytes_repr(PyObject *op)
Neal Norwitz6968b052007-02-27 19:02:19 +00001416{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001417 return PyBytes_Repr(op, 1);
Neal Norwitz6968b052007-02-27 19:02:19 +00001418}
1419
Neal Norwitz6968b052007-02-27 19:02:19 +00001420static PyObject *
Benjamin Peterson80688ef2009-04-18 15:17:02 +00001421bytes_str(PyObject *op)
Neal Norwitz6968b052007-02-27 19:02:19 +00001422{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001423 if (Py_BytesWarningFlag) {
1424 if (PyErr_WarnEx(PyExc_BytesWarning,
1425 "str() on a bytes instance", 1))
1426 return NULL;
1427 }
1428 return bytes_repr(op);
Neal Norwitz6968b052007-02-27 19:02:19 +00001429}
1430
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001431static Py_ssize_t
Benjamin Peterson80688ef2009-04-18 15:17:02 +00001432bytes_length(PyBytesObject *a)
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001433{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001434 return Py_SIZE(a);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001435}
Neal Norwitz6968b052007-02-27 19:02:19 +00001436
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001437/* This is also used by PyBytes_Concat() */
1438static PyObject *
Benjamin Peterson80688ef2009-04-18 15:17:02 +00001439bytes_concat(PyObject *a, PyObject *b)
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001440{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001441 Py_buffer va, vb;
1442 PyObject *result = NULL;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001443
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001444 va.len = -1;
1445 vb.len = -1;
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +02001446 if (PyObject_GetBuffer(a, &va, PyBUF_SIMPLE) != 0 ||
1447 PyObject_GetBuffer(b, &vb, PyBUF_SIMPLE) != 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001448 PyErr_Format(PyExc_TypeError, "can't concat %.100s to %.100s",
Serhiy Storchaka6b5a9ec2017-03-19 19:47:02 +02001449 Py_TYPE(b)->tp_name, Py_TYPE(a)->tp_name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001450 goto done;
1451 }
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001452
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001453 /* Optimize end cases */
1454 if (va.len == 0 && PyBytes_CheckExact(b)) {
1455 result = b;
1456 Py_INCREF(result);
1457 goto done;
1458 }
1459 if (vb.len == 0 && PyBytes_CheckExact(a)) {
1460 result = a;
1461 Py_INCREF(result);
1462 goto done;
1463 }
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001464
Serhiy Storchaka06cfb0c2016-07-10 20:48:43 +03001465 if (va.len > PY_SSIZE_T_MAX - vb.len) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001466 PyErr_NoMemory();
1467 goto done;
1468 }
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001469
Serhiy Storchaka06cfb0c2016-07-10 20:48:43 +03001470 result = PyBytes_FromStringAndSize(NULL, va.len + vb.len);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001471 if (result != NULL) {
1472 memcpy(PyBytes_AS_STRING(result), va.buf, va.len);
1473 memcpy(PyBytes_AS_STRING(result) + va.len, vb.buf, vb.len);
1474 }
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001475
1476 done:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001477 if (va.len != -1)
1478 PyBuffer_Release(&va);
1479 if (vb.len != -1)
1480 PyBuffer_Release(&vb);
1481 return result;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001482}
Neal Norwitz6968b052007-02-27 19:02:19 +00001483
1484static PyObject *
Antoine Pitrou9ed5f272013-08-13 20:18:52 +02001485bytes_repeat(PyBytesObject *a, Py_ssize_t n)
Neal Norwitz6968b052007-02-27 19:02:19 +00001486{
Antoine Pitrou9ed5f272013-08-13 20:18:52 +02001487 Py_ssize_t i;
1488 Py_ssize_t j;
1489 Py_ssize_t size;
1490 PyBytesObject *op;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001491 size_t nbytes;
1492 if (n < 0)
1493 n = 0;
1494 /* watch out for overflows: the size can overflow int,
1495 * and the # of bytes needed can overflow size_t
1496 */
Mark Dickinsoncf940c72010-08-10 18:35:01 +00001497 if (n > 0 && Py_SIZE(a) > PY_SSIZE_T_MAX / n) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001498 PyErr_SetString(PyExc_OverflowError,
1499 "repeated bytes are too long");
1500 return NULL;
1501 }
Mark Dickinsoncf940c72010-08-10 18:35:01 +00001502 size = Py_SIZE(a) * n;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001503 if (size == Py_SIZE(a) && PyBytes_CheckExact(a)) {
1504 Py_INCREF(a);
1505 return (PyObject *)a;
1506 }
1507 nbytes = (size_t)size;
1508 if (nbytes + PyBytesObject_SIZE <= nbytes) {
1509 PyErr_SetString(PyExc_OverflowError,
1510 "repeated bytes are too long");
1511 return NULL;
1512 }
1513 op = (PyBytesObject *)PyObject_MALLOC(PyBytesObject_SIZE + nbytes);
1514 if (op == NULL)
1515 return PyErr_NoMemory();
Christian Heimesd3afe782013-12-04 09:27:47 +01001516 (void)PyObject_INIT_VAR(op, &PyBytes_Type, size);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001517 op->ob_shash = -1;
1518 op->ob_sval[size] = '\0';
1519 if (Py_SIZE(a) == 1 && n > 0) {
1520 memset(op->ob_sval, a->ob_sval[0] , n);
1521 return (PyObject *) op;
1522 }
1523 i = 0;
1524 if (i < size) {
Christian Heimesf051e432016-09-13 20:22:02 +02001525 memcpy(op->ob_sval, a->ob_sval, Py_SIZE(a));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001526 i = Py_SIZE(a);
1527 }
1528 while (i < size) {
1529 j = (i <= size-i) ? i : size-i;
Christian Heimesf051e432016-09-13 20:22:02 +02001530 memcpy(op->ob_sval+i, op->ob_sval, j);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001531 i += j;
1532 }
1533 return (PyObject *) op;
Neal Norwitz6968b052007-02-27 19:02:19 +00001534}
1535
Serhiy Storchakae09132f2016-07-03 13:57:48 +03001536static int
1537bytes_contains(PyObject *self, PyObject *arg)
1538{
1539 return _Py_bytes_contains(PyBytes_AS_STRING(self), PyBytes_GET_SIZE(self), arg);
1540}
1541
Neal Norwitz6968b052007-02-27 19:02:19 +00001542static PyObject *
Antoine Pitrou9ed5f272013-08-13 20:18:52 +02001543bytes_item(PyBytesObject *a, Py_ssize_t i)
Neal Norwitz6968b052007-02-27 19:02:19 +00001544{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001545 if (i < 0 || i >= Py_SIZE(a)) {
1546 PyErr_SetString(PyExc_IndexError, "index out of range");
1547 return NULL;
1548 }
1549 return PyLong_FromLong((unsigned char)a->ob_sval[i]);
Neal Norwitz6968b052007-02-27 19:02:19 +00001550}
1551
Benjamin Peterson621b4302016-09-09 13:54:34 -07001552static int
Victor Stinnerc8bc5372013-11-04 11:08:10 +01001553bytes_compare_eq(PyBytesObject *a, PyBytesObject *b)
1554{
1555 int cmp;
1556 Py_ssize_t len;
1557
1558 len = Py_SIZE(a);
1559 if (Py_SIZE(b) != len)
1560 return 0;
1561
1562 if (a->ob_sval[0] != b->ob_sval[0])
1563 return 0;
1564
1565 cmp = memcmp(a->ob_sval, b->ob_sval, len);
1566 return (cmp == 0);
1567}
1568
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001569static PyObject*
Benjamin Peterson80688ef2009-04-18 15:17:02 +00001570bytes_richcompare(PyBytesObject *a, PyBytesObject *b, int op)
Neal Norwitz6968b052007-02-27 19:02:19 +00001571{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001572 int c;
1573 Py_ssize_t len_a, len_b;
1574 Py_ssize_t min_len;
Serhiy Storchakafa494fd2015-05-30 17:45:22 +03001575 int rc;
Neal Norwitz6968b052007-02-27 19:02:19 +00001576
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001577 /* Make sure both arguments are strings. */
1578 if (!(PyBytes_Check(a) && PyBytes_Check(b))) {
Serhiy Storchaka1dd49822015-03-20 16:54:57 +02001579 if (Py_BytesWarningFlag && (op == Py_EQ || op == Py_NE)) {
Serhiy Storchakafa494fd2015-05-30 17:45:22 +03001580 rc = PyObject_IsInstance((PyObject*)a,
1581 (PyObject*)&PyUnicode_Type);
1582 if (!rc)
1583 rc = PyObject_IsInstance((PyObject*)b,
1584 (PyObject*)&PyUnicode_Type);
1585 if (rc < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001586 return NULL;
Serhiy Storchakafa494fd2015-05-30 17:45:22 +03001587 if (rc) {
Serhiy Storchaka1dd49822015-03-20 16:54:57 +02001588 if (PyErr_WarnEx(PyExc_BytesWarning,
Serhiy Storchakafa494fd2015-05-30 17:45:22 +03001589 "Comparison between bytes and string", 1))
Serhiy Storchaka1dd49822015-03-20 16:54:57 +02001590 return NULL;
1591 }
Serhiy Storchakaac5569b2015-05-30 17:48:19 +03001592 else {
1593 rc = PyObject_IsInstance((PyObject*)a,
1594 (PyObject*)&PyLong_Type);
1595 if (!rc)
1596 rc = PyObject_IsInstance((PyObject*)b,
1597 (PyObject*)&PyLong_Type);
1598 if (rc < 0)
Serhiy Storchaka1dd49822015-03-20 16:54:57 +02001599 return NULL;
Serhiy Storchakaac5569b2015-05-30 17:48:19 +03001600 if (rc) {
1601 if (PyErr_WarnEx(PyExc_BytesWarning,
1602 "Comparison between bytes and int", 1))
1603 return NULL;
1604 }
Serhiy Storchaka1dd49822015-03-20 16:54:57 +02001605 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001606 }
stratakise8b19652017-11-02 11:32:54 +01001607 Py_RETURN_NOTIMPLEMENTED;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001608 }
Victor Stinnerc8bc5372013-11-04 11:08:10 +01001609 else if (a == b) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001610 switch (op) {
Victor Stinnerfd9e44d2013-11-04 11:23:05 +01001611 case Py_EQ:
1612 case Py_LE:
1613 case Py_GE:
1614 /* a string is equal to itself */
stratakise8b19652017-11-02 11:32:54 +01001615 Py_RETURN_TRUE;
Victor Stinnerc8bc5372013-11-04 11:08:10 +01001616 break;
Victor Stinnerfd9e44d2013-11-04 11:23:05 +01001617 case Py_NE:
1618 case Py_LT:
1619 case Py_GT:
stratakise8b19652017-11-02 11:32:54 +01001620 Py_RETURN_FALSE;
Victor Stinnerc8bc5372013-11-04 11:08:10 +01001621 break;
Victor Stinnerfd9e44d2013-11-04 11:23:05 +01001622 default:
1623 PyErr_BadArgument();
1624 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001625 }
1626 }
Victor Stinnerc8bc5372013-11-04 11:08:10 +01001627 else if (op == Py_EQ || op == Py_NE) {
1628 int eq = bytes_compare_eq(a, b);
1629 eq ^= (op == Py_NE);
stratakise8b19652017-11-02 11:32:54 +01001630 return PyBool_FromLong(eq);
Victor Stinnerc8bc5372013-11-04 11:08:10 +01001631 }
1632 else {
Victor Stinnerfd9e44d2013-11-04 11:23:05 +01001633 len_a = Py_SIZE(a);
1634 len_b = Py_SIZE(b);
1635 min_len = Py_MIN(len_a, len_b);
Victor Stinnerc8bc5372013-11-04 11:08:10 +01001636 if (min_len > 0) {
1637 c = Py_CHARMASK(*a->ob_sval) - Py_CHARMASK(*b->ob_sval);
Victor Stinnerfd9e44d2013-11-04 11:23:05 +01001638 if (c == 0)
Victor Stinnerc8bc5372013-11-04 11:08:10 +01001639 c = memcmp(a->ob_sval, b->ob_sval, min_len);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001640 }
Victor Stinnerc8bc5372013-11-04 11:08:10 +01001641 else
1642 c = 0;
stratakise8b19652017-11-02 11:32:54 +01001643 if (c != 0)
1644 Py_RETURN_RICHCOMPARE(c, 0, op);
1645 Py_RETURN_RICHCOMPARE(len_a, len_b, op);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001646 }
Neal Norwitz6968b052007-02-27 19:02:19 +00001647}
1648
Benjamin Peterson8f67d082010-10-17 20:54:53 +00001649static Py_hash_t
Benjamin Peterson80688ef2009-04-18 15:17:02 +00001650bytes_hash(PyBytesObject *a)
Neal Norwitz6968b052007-02-27 19:02:19 +00001651{
Antoine Pitrouce4a9da2011-11-21 20:46:33 +01001652 if (a->ob_shash == -1) {
1653 /* Can't fail */
Christian Heimes985ecdc2013-11-20 11:46:18 +01001654 a->ob_shash = _Py_HashBytes(a->ob_sval, Py_SIZE(a));
Antoine Pitrouce4a9da2011-11-21 20:46:33 +01001655 }
1656 return a->ob_shash;
Neal Norwitz6968b052007-02-27 19:02:19 +00001657}
1658
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001659static PyObject*
Benjamin Peterson80688ef2009-04-18 15:17:02 +00001660bytes_subscript(PyBytesObject* self, PyObject* item)
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001661{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001662 if (PyIndex_Check(item)) {
1663 Py_ssize_t i = PyNumber_AsSsize_t(item, PyExc_IndexError);
1664 if (i == -1 && PyErr_Occurred())
1665 return NULL;
1666 if (i < 0)
1667 i += PyBytes_GET_SIZE(self);
1668 if (i < 0 || i >= PyBytes_GET_SIZE(self)) {
1669 PyErr_SetString(PyExc_IndexError,
1670 "index out of range");
1671 return NULL;
1672 }
1673 return PyLong_FromLong((unsigned char)self->ob_sval[i]);
1674 }
1675 else if (PySlice_Check(item)) {
1676 Py_ssize_t start, stop, step, slicelength, cur, i;
1677 char* source_buf;
1678 char* result_buf;
1679 PyObject* result;
Neal Norwitz6968b052007-02-27 19:02:19 +00001680
Serhiy Storchakab879fe82017-04-08 09:53:51 +03001681 if (PySlice_Unpack(item, &start, &stop, &step) < 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001682 return NULL;
1683 }
Serhiy Storchakab879fe82017-04-08 09:53:51 +03001684 slicelength = PySlice_AdjustIndices(PyBytes_GET_SIZE(self), &start,
1685 &stop, step);
Neal Norwitz6968b052007-02-27 19:02:19 +00001686
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001687 if (slicelength <= 0) {
1688 return PyBytes_FromStringAndSize("", 0);
1689 }
1690 else if (start == 0 && step == 1 &&
1691 slicelength == PyBytes_GET_SIZE(self) &&
1692 PyBytes_CheckExact(self)) {
1693 Py_INCREF(self);
1694 return (PyObject *)self;
1695 }
1696 else if (step == 1) {
1697 return PyBytes_FromStringAndSize(
1698 PyBytes_AS_STRING(self) + start,
1699 slicelength);
1700 }
1701 else {
1702 source_buf = PyBytes_AS_STRING(self);
1703 result = PyBytes_FromStringAndSize(NULL, slicelength);
1704 if (result == NULL)
1705 return NULL;
Neal Norwitz6968b052007-02-27 19:02:19 +00001706
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001707 result_buf = PyBytes_AS_STRING(result);
1708 for (cur = start, i = 0; i < slicelength;
1709 cur += step, i++) {
1710 result_buf[i] = source_buf[cur];
1711 }
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001712
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001713 return result;
1714 }
1715 }
1716 else {
1717 PyErr_Format(PyExc_TypeError,
Terry Jan Reedyffff1442014-08-02 01:30:37 -04001718 "byte indices must be integers or slices, not %.200s",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001719 Py_TYPE(item)->tp_name);
1720 return NULL;
1721 }
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001722}
1723
1724static int
Benjamin Peterson80688ef2009-04-18 15:17:02 +00001725bytes_buffer_getbuffer(PyBytesObject *self, Py_buffer *view, int flags)
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001726{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001727 return PyBuffer_FillInfo(view, (PyObject*)self, (void *)self->ob_sval, Py_SIZE(self),
1728 1, flags);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001729}
1730
Benjamin Peterson80688ef2009-04-18 15:17:02 +00001731static PySequenceMethods bytes_as_sequence = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001732 (lenfunc)bytes_length, /*sq_length*/
1733 (binaryfunc)bytes_concat, /*sq_concat*/
1734 (ssizeargfunc)bytes_repeat, /*sq_repeat*/
1735 (ssizeargfunc)bytes_item, /*sq_item*/
1736 0, /*sq_slice*/
1737 0, /*sq_ass_item*/
1738 0, /*sq_ass_slice*/
Serhiy Storchakae09132f2016-07-03 13:57:48 +03001739 (objobjproc)bytes_contains /*sq_contains*/
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001740};
1741
Benjamin Peterson80688ef2009-04-18 15:17:02 +00001742static PyMappingMethods bytes_as_mapping = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001743 (lenfunc)bytes_length,
1744 (binaryfunc)bytes_subscript,
1745 0,
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001746};
1747
Benjamin Peterson80688ef2009-04-18 15:17:02 +00001748static PyBufferProcs bytes_as_buffer = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001749 (getbufferproc)bytes_buffer_getbuffer,
1750 NULL,
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001751};
1752
1753
1754#define LEFTSTRIP 0
1755#define RIGHTSTRIP 1
1756#define BOTHSTRIP 2
1757
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001758/*[clinic input]
1759bytes.split
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001760
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001761 sep: object = None
1762 The delimiter according which to split the bytes.
1763 None (the default value) means split on ASCII whitespace characters
1764 (space, tab, return, newline, formfeed, vertical tab).
1765 maxsplit: Py_ssize_t = -1
1766 Maximum number of splits to do.
1767 -1 (the default value) means no limit.
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001768
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001769Return a list of the sections in the bytes, using sep as the delimiter.
1770[clinic start generated code]*/
1771
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001772static PyObject *
Serhiy Storchaka7a9579c2016-05-02 13:45:20 +03001773bytes_split_impl(PyBytesObject *self, PyObject *sep, Py_ssize_t maxsplit)
1774/*[clinic end generated code: output=52126b5844c1d8ef input=8b809b39074abbfa]*/
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001775{
1776 Py_ssize_t len = PyBytes_GET_SIZE(self), n;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001777 const char *s = PyBytes_AS_STRING(self), *sub;
1778 Py_buffer vsub;
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001779 PyObject *list;
Neal Norwitz6968b052007-02-27 19:02:19 +00001780
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001781 if (maxsplit < 0)
1782 maxsplit = PY_SSIZE_T_MAX;
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001783 if (sep == Py_None)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001784 return stringlib_split_whitespace((PyObject*) self, s, len, maxsplit);
Serhiy Storchaka3dd3e262015-02-03 01:25:42 +02001785 if (PyObject_GetBuffer(sep, &vsub, PyBUF_SIMPLE) != 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001786 return NULL;
1787 sub = vsub.buf;
1788 n = vsub.len;
Guido van Rossum8f950672007-09-10 16:53:45 +00001789
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001790 list = stringlib_split((PyObject*) self, s, len, sub, n, maxsplit);
1791 PyBuffer_Release(&vsub);
1792 return list;
Guido van Rossum98297ee2007-11-06 21:34:58 +00001793}
1794
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001795/*[clinic input]
1796bytes.partition
1797
Serhiy Storchaka3dd3e262015-02-03 01:25:42 +02001798 sep: Py_buffer
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001799 /
1800
1801Partition the bytes into three parts using the given separator.
1802
1803This will search for the separator sep in the bytes. If the separator is found,
1804returns a 3-tuple containing the part before the separator, the separator
1805itself, and the part after it.
1806
1807If the separator is not found, returns a 3-tuple containing the original bytes
1808object and two empty bytes objects.
1809[clinic start generated code]*/
1810
Neal Norwitz6968b052007-02-27 19:02:19 +00001811static PyObject *
Serhiy Storchaka3dd3e262015-02-03 01:25:42 +02001812bytes_partition_impl(PyBytesObject *self, Py_buffer *sep)
Serhiy Storchaka7a9579c2016-05-02 13:45:20 +03001813/*[clinic end generated code: output=f532b392a17ff695 input=61cca95519406099]*/
Neal Norwitz6968b052007-02-27 19:02:19 +00001814{
Neal Norwitz6968b052007-02-27 19:02:19 +00001815 return stringlib_partition(
1816 (PyObject*) self,
1817 PyBytes_AS_STRING(self), PyBytes_GET_SIZE(self),
Serhiy Storchaka3dd3e262015-02-03 01:25:42 +02001818 sep->obj, (const char *)sep->buf, sep->len
Neal Norwitz6968b052007-02-27 19:02:19 +00001819 );
1820}
1821
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001822/*[clinic input]
1823bytes.rpartition
1824
Serhiy Storchaka3dd3e262015-02-03 01:25:42 +02001825 sep: Py_buffer
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001826 /
1827
1828Partition the bytes into three parts using the given separator.
1829
Serhiy Storchakaa2314282017-10-29 02:11:54 +03001830This will search for the separator sep in the bytes, starting at the end. If
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001831the separator is found, returns a 3-tuple containing the part before the
1832separator, the separator itself, and the part after it.
1833
1834If the separator is not found, returns a 3-tuple containing two empty bytes
1835objects and the original bytes object.
1836[clinic start generated code]*/
1837
Serhiy Storchaka3dd3e262015-02-03 01:25:42 +02001838static PyObject *
1839bytes_rpartition_impl(PyBytesObject *self, Py_buffer *sep)
Serhiy Storchakaa2314282017-10-29 02:11:54 +03001840/*[clinic end generated code: output=191b114cbb028e50 input=d78db010c8cfdbe1]*/
Serhiy Storchaka3dd3e262015-02-03 01:25:42 +02001841{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001842 return stringlib_rpartition(
1843 (PyObject*) self,
1844 PyBytes_AS_STRING(self), PyBytes_GET_SIZE(self),
Serhiy Storchaka3dd3e262015-02-03 01:25:42 +02001845 sep->obj, (const char *)sep->buf, sep->len
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001846 );
Neal Norwitz6968b052007-02-27 19:02:19 +00001847}
1848
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001849/*[clinic input]
1850bytes.rsplit = bytes.split
Neal Norwitz6968b052007-02-27 19:02:19 +00001851
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001852Return a list of the sections in the bytes, using sep as the delimiter.
1853
1854Splitting is done starting at the end of the bytes and working to the front.
1855[clinic start generated code]*/
1856
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001857static PyObject *
Serhiy Storchaka7a9579c2016-05-02 13:45:20 +03001858bytes_rsplit_impl(PyBytesObject *self, PyObject *sep, Py_ssize_t maxsplit)
1859/*[clinic end generated code: output=ba698d9ea01e1c8f input=0f86c9f28f7d7b7b]*/
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001860{
1861 Py_ssize_t len = PyBytes_GET_SIZE(self), n;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001862 const char *s = PyBytes_AS_STRING(self), *sub;
1863 Py_buffer vsub;
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001864 PyObject *list;
Neal Norwitz6968b052007-02-27 19:02:19 +00001865
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001866 if (maxsplit < 0)
1867 maxsplit = PY_SSIZE_T_MAX;
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001868 if (sep == Py_None)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001869 return stringlib_rsplit_whitespace((PyObject*) self, s, len, maxsplit);
Serhiy Storchaka3dd3e262015-02-03 01:25:42 +02001870 if (PyObject_GetBuffer(sep, &vsub, PyBUF_SIMPLE) != 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001871 return NULL;
1872 sub = vsub.buf;
1873 n = vsub.len;
Guido van Rossum8f950672007-09-10 16:53:45 +00001874
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001875 list = stringlib_rsplit((PyObject*) self, s, len, sub, n, maxsplit);
1876 PyBuffer_Release(&vsub);
1877 return list;
Neal Norwitz6968b052007-02-27 19:02:19 +00001878}
1879
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001880
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02001881/*[clinic input]
1882bytes.join
1883
1884 iterable_of_bytes: object
1885 /
1886
1887Concatenate any number of bytes objects.
1888
1889The bytes whose method is called is inserted in between each pair.
1890
1891The result is returned as a new bytes object.
1892
1893Example: b'.'.join([b'ab', b'pq', b'rs']) -> b'ab.pq.rs'.
1894[clinic start generated code]*/
1895
Neal Norwitz6968b052007-02-27 19:02:19 +00001896static PyObject *
Serhiy Storchaka7a9579c2016-05-02 13:45:20 +03001897bytes_join(PyBytesObject *self, PyObject *iterable_of_bytes)
1898/*[clinic end generated code: output=a046f379f626f6f8 input=7fe377b95bd549d2]*/
Neal Norwitz6968b052007-02-27 19:02:19 +00001899{
Martin v. Löwis0efea322014-07-27 17:29:17 +02001900 return stringlib_bytes_join((PyObject*)self, iterable_of_bytes);
Neal Norwitz6968b052007-02-27 19:02:19 +00001901}
1902
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001903PyObject *
1904_PyBytes_Join(PyObject *sep, PyObject *x)
1905{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001906 assert(sep != NULL && PyBytes_Check(sep));
1907 assert(x != NULL);
Martin v. Löwis0efea322014-07-27 17:29:17 +02001908 return bytes_join((PyBytesObject*)sep, x);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001909}
1910
Serhiy Storchakae09132f2016-07-03 13:57:48 +03001911static PyObject *
1912bytes_find(PyBytesObject *self, PyObject *args)
1913{
1914 return _Py_bytes_find(PyBytes_AS_STRING(self), PyBytes_GET_SIZE(self), args);
1915}
1916
1917static PyObject *
1918bytes_index(PyBytesObject *self, PyObject *args)
1919{
1920 return _Py_bytes_index(PyBytes_AS_STRING(self), PyBytes_GET_SIZE(self), args);
1921}
1922
1923
1924static PyObject *
1925bytes_rfind(PyBytesObject *self, PyObject *args)
1926{
1927 return _Py_bytes_rfind(PyBytes_AS_STRING(self), PyBytes_GET_SIZE(self), args);
1928}
1929
1930
1931static PyObject *
1932bytes_rindex(PyBytesObject *self, PyObject *args)
1933{
1934 return _Py_bytes_rindex(PyBytes_AS_STRING(self), PyBytes_GET_SIZE(self), args);
1935}
1936
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001937
1938Py_LOCAL_INLINE(PyObject *)
1939do_xstrip(PyBytesObject *self, int striptype, PyObject *sepobj)
Guido van Rossumad7d8d12007-04-13 01:39:34 +00001940{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001941 Py_buffer vsep;
1942 char *s = PyBytes_AS_STRING(self);
1943 Py_ssize_t len = PyBytes_GET_SIZE(self);
1944 char *sep;
1945 Py_ssize_t seplen;
1946 Py_ssize_t i, j;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001947
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +02001948 if (PyObject_GetBuffer(sepobj, &vsep, PyBUF_SIMPLE) != 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001949 return NULL;
1950 sep = vsep.buf;
1951 seplen = vsep.len;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001952
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001953 i = 0;
1954 if (striptype != RIGHTSTRIP) {
1955 while (i < len && memchr(sep, Py_CHARMASK(s[i]), seplen)) {
1956 i++;
1957 }
1958 }
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001959
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001960 j = len;
1961 if (striptype != LEFTSTRIP) {
1962 do {
1963 j--;
1964 } while (j >= i && memchr(sep, Py_CHARMASK(s[j]), seplen));
1965 j++;
1966 }
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001967
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001968 PyBuffer_Release(&vsep);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001969
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001970 if (i == 0 && j == len && PyBytes_CheckExact(self)) {
1971 Py_INCREF(self);
1972 return (PyObject*)self;
1973 }
1974 else
1975 return PyBytes_FromStringAndSize(s+i, j-i);
Guido van Rossumad7d8d12007-04-13 01:39:34 +00001976}
1977
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001978
1979Py_LOCAL_INLINE(PyObject *)
1980do_strip(PyBytesObject *self, int striptype)
1981{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001982 char *s = PyBytes_AS_STRING(self);
1983 Py_ssize_t len = PyBytes_GET_SIZE(self), i, j;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001984
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001985 i = 0;
1986 if (striptype != RIGHTSTRIP) {
David Malcolm96960882010-11-05 17:23:41 +00001987 while (i < len && Py_ISSPACE(s[i])) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001988 i++;
1989 }
1990 }
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001991
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001992 j = len;
1993 if (striptype != LEFTSTRIP) {
1994 do {
1995 j--;
David Malcolm96960882010-11-05 17:23:41 +00001996 } while (j >= i && Py_ISSPACE(s[j]));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001997 j++;
1998 }
Christian Heimes2c9c7a52008-05-26 13:42:13 +00001999
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002000 if (i == 0 && j == len && PyBytes_CheckExact(self)) {
2001 Py_INCREF(self);
2002 return (PyObject*)self;
2003 }
2004 else
2005 return PyBytes_FromStringAndSize(s+i, j-i);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002006}
2007
2008
2009Py_LOCAL_INLINE(PyObject *)
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002010do_argstrip(PyBytesObject *self, int striptype, PyObject *bytes)
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002011{
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002012 if (bytes != NULL && bytes != Py_None) {
2013 return do_xstrip(self, striptype, bytes);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002014 }
2015 return do_strip(self, striptype);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002016}
2017
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002018/*[clinic input]
2019bytes.strip
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002020
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002021 bytes: object = None
2022 /
2023
2024Strip leading and trailing bytes contained in the argument.
2025
2026If the argument is omitted or None, strip leading and trailing ASCII whitespace.
2027[clinic start generated code]*/
2028
Guido van Rossumad7d8d12007-04-13 01:39:34 +00002029static PyObject *
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002030bytes_strip_impl(PyBytesObject *self, PyObject *bytes)
Serhiy Storchaka7a9579c2016-05-02 13:45:20 +03002031/*[clinic end generated code: output=c7c228d3bd104a1b input=8a354640e4e0b3ef]*/
Guido van Rossumad7d8d12007-04-13 01:39:34 +00002032{
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002033 return do_argstrip(self, BOTHSTRIP, bytes);
Guido van Rossumad7d8d12007-04-13 01:39:34 +00002034}
2035
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002036/*[clinic input]
2037bytes.lstrip
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002038
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002039 bytes: object = None
2040 /
2041
2042Strip leading bytes contained in the argument.
2043
2044If the argument is omitted or None, strip leading ASCII whitespace.
2045[clinic start generated code]*/
2046
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002047static PyObject *
2048bytes_lstrip_impl(PyBytesObject *self, PyObject *bytes)
Serhiy Storchaka7a9579c2016-05-02 13:45:20 +03002049/*[clinic end generated code: output=28602e586f524e82 input=9baff4398c3f6857]*/
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002050{
2051 return do_argstrip(self, LEFTSTRIP, bytes);
2052}
2053
2054/*[clinic input]
2055bytes.rstrip
2056
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002057 bytes: object = None
2058 /
2059
2060Strip trailing bytes contained in the argument.
2061
2062If the argument is omitted or None, strip trailing ASCII whitespace.
2063[clinic start generated code]*/
2064
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002065static PyObject *
2066bytes_rstrip_impl(PyBytesObject *self, PyObject *bytes)
Serhiy Storchaka7a9579c2016-05-02 13:45:20 +03002067/*[clinic end generated code: output=547e3815c95447da input=b78af445c727e32b]*/
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002068{
2069 return do_argstrip(self, RIGHTSTRIP, bytes);
Guido van Rossumad7d8d12007-04-13 01:39:34 +00002070}
Neal Norwitz6968b052007-02-27 19:02:19 +00002071
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002072
Serhiy Storchakae09132f2016-07-03 13:57:48 +03002073static PyObject *
2074bytes_count(PyBytesObject *self, PyObject *args)
2075{
2076 return _Py_bytes_count(PyBytes_AS_STRING(self), PyBytes_GET_SIZE(self), args);
2077}
2078
2079
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002080/*[clinic input]
2081bytes.translate
2082
Victor Stinner049e5092014-08-17 22:20:00 +02002083 table: object
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002084 Translation table, which must be a bytes object of length 256.
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002085 /
Martin Panter1b6c6da2016-08-27 08:35:02 +00002086 delete as deletechars: object(c_default="NULL") = b''
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002087
2088Return a copy with each character mapped by the given translation table.
2089
Martin Panter1b6c6da2016-08-27 08:35:02 +00002090All characters occurring in the optional argument delete are removed.
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002091The remaining characters are mapped through the given translation table.
2092[clinic start generated code]*/
2093
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002094static PyObject *
Martin Panter1b6c6da2016-08-27 08:35:02 +00002095bytes_translate_impl(PyBytesObject *self, PyObject *table,
Larry Hastings89964c42015-04-14 18:07:59 -04002096 PyObject *deletechars)
Martin Panter1b6c6da2016-08-27 08:35:02 +00002097/*[clinic end generated code: output=43be3437f1956211 input=0ecdf159f654233c]*/
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002098{
Antoine Pitrou9ed5f272013-08-13 20:18:52 +02002099 char *input, *output;
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +02002100 Py_buffer table_view = {NULL, NULL};
2101 Py_buffer del_table_view = {NULL, NULL};
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002102 const char *table_chars;
Antoine Pitrou9ed5f272013-08-13 20:18:52 +02002103 Py_ssize_t i, c, changed = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002104 PyObject *input_obj = (PyObject*)self;
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002105 const char *output_start, *del_table_chars=NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002106 Py_ssize_t inlen, tablen, dellen = 0;
2107 PyObject *result;
2108 int trans_table[256];
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002109
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002110 if (PyBytes_Check(table)) {
2111 table_chars = PyBytes_AS_STRING(table);
2112 tablen = PyBytes_GET_SIZE(table);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002113 }
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002114 else if (table == Py_None) {
2115 table_chars = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002116 tablen = 256;
2117 }
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +02002118 else {
Serhiy Storchaka3dd3e262015-02-03 01:25:42 +02002119 if (PyObject_GetBuffer(table, &table_view, PyBUF_SIMPLE) != 0)
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +02002120 return NULL;
Serhiy Storchaka3dd3e262015-02-03 01:25:42 +02002121 table_chars = table_view.buf;
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +02002122 tablen = table_view.len;
2123 }
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002124
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002125 if (tablen != 256) {
2126 PyErr_SetString(PyExc_ValueError,
2127 "translation table must be 256 characters long");
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +02002128 PyBuffer_Release(&table_view);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002129 return NULL;
2130 }
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002131
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002132 if (deletechars != NULL) {
2133 if (PyBytes_Check(deletechars)) {
2134 del_table_chars = PyBytes_AS_STRING(deletechars);
2135 dellen = PyBytes_GET_SIZE(deletechars);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002136 }
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +02002137 else {
Serhiy Storchaka3dd3e262015-02-03 01:25:42 +02002138 if (PyObject_GetBuffer(deletechars, &del_table_view, PyBUF_SIMPLE) != 0) {
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +02002139 PyBuffer_Release(&table_view);
2140 return NULL;
2141 }
Serhiy Storchaka3dd3e262015-02-03 01:25:42 +02002142 del_table_chars = del_table_view.buf;
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +02002143 dellen = del_table_view.len;
2144 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002145 }
2146 else {
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002147 del_table_chars = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002148 dellen = 0;
2149 }
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002150
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002151 inlen = PyBytes_GET_SIZE(input_obj);
2152 result = PyBytes_FromStringAndSize((char *)NULL, inlen);
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +02002153 if (result == NULL) {
2154 PyBuffer_Release(&del_table_view);
2155 PyBuffer_Release(&table_view);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002156 return NULL;
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +02002157 }
Serhiy Storchakadd40fc32016-05-04 22:23:26 +03002158 output_start = output = PyBytes_AS_STRING(result);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002159 input = PyBytes_AS_STRING(input_obj);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002160
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002161 if (dellen == 0 && table_chars != NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002162 /* If no deletions are required, use faster code */
2163 for (i = inlen; --i >= 0; ) {
2164 c = Py_CHARMASK(*input++);
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002165 if (Py_CHARMASK((*output++ = table_chars[c])) != c)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002166 changed = 1;
2167 }
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +02002168 if (!changed && PyBytes_CheckExact(input_obj)) {
2169 Py_INCREF(input_obj);
2170 Py_DECREF(result);
2171 result = input_obj;
2172 }
2173 PyBuffer_Release(&del_table_view);
2174 PyBuffer_Release(&table_view);
2175 return result;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002176 }
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002177
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002178 if (table_chars == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002179 for (i = 0; i < 256; i++)
2180 trans_table[i] = Py_CHARMASK(i);
2181 } else {
2182 for (i = 0; i < 256; i++)
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002183 trans_table[i] = Py_CHARMASK(table_chars[i]);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002184 }
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +02002185 PyBuffer_Release(&table_view);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002186
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002187 for (i = 0; i < dellen; i++)
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002188 trans_table[(int) Py_CHARMASK(del_table_chars[i])] = -1;
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +02002189 PyBuffer_Release(&del_table_view);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002190
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002191 for (i = inlen; --i >= 0; ) {
2192 c = Py_CHARMASK(*input++);
2193 if (trans_table[c] != -1)
2194 if (Py_CHARMASK(*output++ = (char)trans_table[c]) == c)
2195 continue;
2196 changed = 1;
2197 }
2198 if (!changed && PyBytes_CheckExact(input_obj)) {
2199 Py_DECREF(result);
2200 Py_INCREF(input_obj);
2201 return input_obj;
2202 }
2203 /* Fix the size of the resulting string */
2204 if (inlen > 0)
2205 _PyBytes_Resize(&result, output - output_start);
2206 return result;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002207}
2208
2209
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002210/*[clinic input]
2211
2212@staticmethod
2213bytes.maketrans
2214
Serhiy Storchaka3dd3e262015-02-03 01:25:42 +02002215 frm: Py_buffer
2216 to: Py_buffer
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002217 /
2218
2219Return a translation table useable for the bytes or bytearray translate method.
2220
2221The returned table will be one where each byte in frm is mapped to the byte at
2222the same position in to.
2223
2224The bytes objects frm and to must be of the same length.
2225[clinic start generated code]*/
2226
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002227static PyObject *
Serhiy Storchaka3dd3e262015-02-03 01:25:42 +02002228bytes_maketrans_impl(Py_buffer *frm, Py_buffer *to)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03002229/*[clinic end generated code: output=a36f6399d4b77f6f input=de7a8fc5632bb8f1]*/
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002230{
2231 return _Py_bytes_maketrans(frm, to);
Georg Brandlabc38772009-04-12 15:51:51 +00002232}
2233
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002234
2235/*[clinic input]
2236bytes.replace
2237
Serhiy Storchaka3dd3e262015-02-03 01:25:42 +02002238 old: Py_buffer
2239 new: Py_buffer
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002240 count: Py_ssize_t = -1
2241 Maximum number of occurrences to replace.
2242 -1 (the default value) means replace all occurrences.
2243 /
2244
2245Return a copy with all occurrences of substring old replaced by new.
2246
2247If the optional argument count is given, only the first count occurrences are
2248replaced.
2249[clinic start generated code]*/
2250
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002251static PyObject *
Serhiy Storchaka7a9579c2016-05-02 13:45:20 +03002252bytes_replace_impl(PyBytesObject *self, Py_buffer *old, Py_buffer *new,
Larry Hastings89964c42015-04-14 18:07:59 -04002253 Py_ssize_t count)
Serhiy Storchaka7a9579c2016-05-02 13:45:20 +03002254/*[clinic end generated code: output=994fa588b6b9c104 input=b2fbbf0bf04de8e5]*/
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002255{
Serhiy Storchakafb81d3c2016-05-05 09:26:07 +03002256 return stringlib_replace((PyObject *)self,
2257 (const char *)old->buf, old->len,
2258 (const char *)new->buf, new->len, count);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002259}
2260
2261/** End DALKE **/
2262
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002263
Serhiy Storchakae09132f2016-07-03 13:57:48 +03002264static PyObject *
2265bytes_startswith(PyBytesObject *self, PyObject *args)
2266{
2267 return _Py_bytes_startswith(PyBytes_AS_STRING(self), PyBytes_GET_SIZE(self), args);
2268}
2269
2270static PyObject *
2271bytes_endswith(PyBytesObject *self, PyObject *args)
2272{
2273 return _Py_bytes_endswith(PyBytes_AS_STRING(self), PyBytes_GET_SIZE(self), args);
2274}
2275
2276
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002277/*[clinic input]
2278bytes.decode
2279
2280 encoding: str(c_default="NULL") = 'utf-8'
2281 The encoding with which to decode the bytes.
2282 errors: str(c_default="NULL") = 'strict'
2283 The error handling scheme to use for the handling of decoding errors.
2284 The default is 'strict' meaning that decoding errors raise a
2285 UnicodeDecodeError. Other possible values are 'ignore' and 'replace'
2286 as well as any other name registered with codecs.register_error that
2287 can handle UnicodeDecodeErrors.
2288
2289Decode the bytes using the codec registered for encoding.
2290[clinic start generated code]*/
2291
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002292static PyObject *
Serhiy Storchaka7a9579c2016-05-02 13:45:20 +03002293bytes_decode_impl(PyBytesObject *self, const char *encoding,
Larry Hastings89964c42015-04-14 18:07:59 -04002294 const char *errors)
Serhiy Storchaka7a9579c2016-05-02 13:45:20 +03002295/*[clinic end generated code: output=5649a53dde27b314 input=958174769d2a40ca]*/
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002296{
Martin v. Löwis0efea322014-07-27 17:29:17 +02002297 return PyUnicode_FromEncodedObject((PyObject*)self, encoding, errors);
Guido van Rossumd624f182006-04-24 13:47:05 +00002298}
2299
Guido van Rossum20188312006-05-05 15:15:40 +00002300
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002301/*[clinic input]
2302bytes.splitlines
Antoine Pitrouf2c54842010-01-13 08:07:53 +00002303
Serhiy Storchaka202fda52017-03-12 10:10:47 +02002304 keepends: bool(accept={int}) = False
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002305
2306Return a list of the lines in the bytes, breaking at line boundaries.
2307
2308Line breaks are not included in the resulting list unless keepends is given and
2309true.
2310[clinic start generated code]*/
2311
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002312static PyObject *
Serhiy Storchaka7a9579c2016-05-02 13:45:20 +03002313bytes_splitlines_impl(PyBytesObject *self, int keepends)
Serhiy Storchaka202fda52017-03-12 10:10:47 +02002314/*[clinic end generated code: output=3484149a5d880ffb input=a8b32eb01ff5a5ed]*/
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002315{
Antoine Pitrouf2c54842010-01-13 08:07:53 +00002316 return stringlib_splitlines(
Antoine Pitroud1188562010-06-09 16:38:55 +00002317 (PyObject*) self, PyBytes_AS_STRING(self),
2318 PyBytes_GET_SIZE(self), keepends
2319 );
Antoine Pitrouf2c54842010-01-13 08:07:53 +00002320}
2321
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002322/*[clinic input]
2323@classmethod
2324bytes.fromhex
2325
2326 string: unicode
2327 /
2328
2329Create a bytes object from a string of hexadecimal numbers.
2330
2331Spaces between two numbers are accepted.
2332Example: bytes.fromhex('B9 01EF') -> b'\\xb9\\x01\\xef'.
2333[clinic start generated code]*/
2334
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002335static PyObject *
Martin v. Löwis0efea322014-07-27 17:29:17 +02002336bytes_fromhex_impl(PyTypeObject *type, PyObject *string)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03002337/*[clinic end generated code: output=0973acc63661bb2e input=bf4d1c361670acd3]*/
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002338{
Serhiy Storchaka0855e702016-07-01 17:22:31 +03002339 PyObject *result = _PyBytes_FromHex(string, 0);
2340 if (type != &PyBytes_Type && result != NULL) {
Victor Stinnerde4ae3d2016-12-04 22:59:09 +01002341 Py_SETREF(result, PyObject_CallFunctionObjArgs((PyObject *)type,
2342 result, NULL));
Serhiy Storchaka0855e702016-07-01 17:22:31 +03002343 }
2344 return result;
Victor Stinner2bf89932015-10-14 11:25:33 +02002345}
2346
2347PyObject*
2348_PyBytes_FromHex(PyObject *string, int use_bytearray)
2349{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002350 char *buf;
Victor Stinner2bf89932015-10-14 11:25:33 +02002351 Py_ssize_t hexlen, invalid_char;
2352 unsigned int top, bot;
2353 Py_UCS1 *str, *end;
2354 _PyBytesWriter writer;
2355
2356 _PyBytesWriter_Init(&writer);
2357 writer.use_bytearray = use_bytearray;
Georg Brandl0b9b9e02007-02-27 08:40:54 +00002358
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002359 assert(PyUnicode_Check(string));
2360 if (PyUnicode_READY(string))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002361 return NULL;
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002362 hexlen = PyUnicode_GET_LENGTH(string);
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02002363
Victor Stinner2bf89932015-10-14 11:25:33 +02002364 if (!PyUnicode_IS_ASCII(string)) {
2365 void *data = PyUnicode_DATA(string);
2366 unsigned int kind = PyUnicode_KIND(string);
2367 Py_ssize_t i;
2368
2369 /* search for the first non-ASCII character */
2370 for (i = 0; i < hexlen; i++) {
2371 if (PyUnicode_READ(kind, data, i) >= 128)
2372 break;
2373 }
2374 invalid_char = i;
2375 goto error;
2376 }
2377
2378 assert(PyUnicode_KIND(string) == PyUnicode_1BYTE_KIND);
2379 str = PyUnicode_1BYTE_DATA(string);
2380
2381 /* This overestimates if there are spaces */
2382 buf = _PyBytesWriter_Alloc(&writer, hexlen / 2);
2383 if (buf == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002384 return NULL;
Victor Stinner2bf89932015-10-14 11:25:33 +02002385
2386 end = str + hexlen;
2387 while (str < end) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002388 /* skip over spaces in the input */
Serhiy Storchakadd1da7f2016-12-19 18:51:37 +02002389 if (Py_ISSPACE(*str)) {
Victor Stinner2bf89932015-10-14 11:25:33 +02002390 do {
2391 str++;
Serhiy Storchakadd1da7f2016-12-19 18:51:37 +02002392 } while (Py_ISSPACE(*str));
Victor Stinner2bf89932015-10-14 11:25:33 +02002393 if (str >= end)
2394 break;
2395 }
2396
2397 top = _PyLong_DigitValue[*str];
2398 if (top >= 16) {
2399 invalid_char = str - PyUnicode_1BYTE_DATA(string);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002400 goto error;
2401 }
Victor Stinner2bf89932015-10-14 11:25:33 +02002402 str++;
2403
2404 bot = _PyLong_DigitValue[*str];
2405 if (bot >= 16) {
2406 invalid_char = str - PyUnicode_1BYTE_DATA(string);
2407 goto error;
2408 }
2409 str++;
2410
2411 *buf++ = (unsigned char)((top << 4) + bot);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002412 }
Victor Stinner2bf89932015-10-14 11:25:33 +02002413
2414 return _PyBytesWriter_Finish(&writer, buf);
Georg Brandl0b9b9e02007-02-27 08:40:54 +00002415
2416 error:
Victor Stinner2bf89932015-10-14 11:25:33 +02002417 PyErr_Format(PyExc_ValueError,
2418 "non-hexadecimal number found in "
2419 "fromhex() arg at position %zd", invalid_char);
2420 _PyBytesWriter_Dealloc(&writer);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002421 return NULL;
Georg Brandl0b9b9e02007-02-27 08:40:54 +00002422}
2423
Gregory P. Smith8cb65692015-04-25 23:22:26 +00002424PyDoc_STRVAR(hex__doc__,
2425"B.hex() -> string\n\
2426\n\
2427Create a string of hexadecimal numbers from a bytes object.\n\
2428Example: b'\\xb9\\x01\\xef'.hex() -> 'b901ef'.");
2429
2430static PyObject *
Serhiy Storchakae09132f2016-07-03 13:57:48 +03002431bytes_hex(PyBytesObject *self)
2432{
2433 char* argbuf = PyBytes_AS_STRING(self);
2434 Py_ssize_t arglen = PyBytes_GET_SIZE(self);
2435 return _Py_strhex(argbuf, arglen);
2436}
2437
2438static PyObject *
Benjamin Peterson80688ef2009-04-18 15:17:02 +00002439bytes_getnewargs(PyBytesObject *v)
Guido van Rossum0dd32e22007-04-11 05:40:58 +00002440{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002441 return Py_BuildValue("(y#)", v->ob_sval, Py_SIZE(v));
Guido van Rossum0dd32e22007-04-11 05:40:58 +00002442}
2443
Guido van Rossum4dfe8a12006-04-22 23:28:04 +00002444
2445static PyMethodDef
Benjamin Peterson80688ef2009-04-18 15:17:02 +00002446bytes_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002447 {"__getnewargs__", (PyCFunction)bytes_getnewargs, METH_NOARGS},
2448 {"capitalize", (PyCFunction)stringlib_capitalize, METH_NOARGS,
2449 _Py_capitalize__doc__},
Serhiy Storchakae09132f2016-07-03 13:57:48 +03002450 {"center", (PyCFunction)stringlib_center, METH_VARARGS,
2451 _Py_center__doc__},
2452 {"count", (PyCFunction)bytes_count, METH_VARARGS,
Serhiy Storchakadd40fc32016-05-04 22:23:26 +03002453 _Py_count__doc__},
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002454 BYTES_DECODE_METHODDEF
Serhiy Storchakae09132f2016-07-03 13:57:48 +03002455 {"endswith", (PyCFunction)bytes_endswith, METH_VARARGS,
Serhiy Storchakadd40fc32016-05-04 22:23:26 +03002456 _Py_endswith__doc__},
Ezio Melotti745d54d2013-11-16 19:10:57 +02002457 {"expandtabs", (PyCFunction)stringlib_expandtabs, METH_VARARGS | METH_KEYWORDS,
Serhiy Storchakadd40fc32016-05-04 22:23:26 +03002458 _Py_expandtabs__doc__},
Serhiy Storchakae09132f2016-07-03 13:57:48 +03002459 {"find", (PyCFunction)bytes_find, METH_VARARGS,
Serhiy Storchakadd40fc32016-05-04 22:23:26 +03002460 _Py_find__doc__},
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002461 BYTES_FROMHEX_METHODDEF
Serhiy Storchakae09132f2016-07-03 13:57:48 +03002462 {"hex", (PyCFunction)bytes_hex, METH_NOARGS, hex__doc__},
2463 {"index", (PyCFunction)bytes_index, METH_VARARGS, _Py_index__doc__},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002464 {"isalnum", (PyCFunction)stringlib_isalnum, METH_NOARGS,
2465 _Py_isalnum__doc__},
2466 {"isalpha", (PyCFunction)stringlib_isalpha, METH_NOARGS,
2467 _Py_isalpha__doc__},
INADA Naokia49ac992018-01-27 14:06:21 +09002468 {"isascii", (PyCFunction)stringlib_isascii, METH_NOARGS,
2469 _Py_isascii__doc__},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002470 {"isdigit", (PyCFunction)stringlib_isdigit, METH_NOARGS,
2471 _Py_isdigit__doc__},
2472 {"islower", (PyCFunction)stringlib_islower, METH_NOARGS,
2473 _Py_islower__doc__},
2474 {"isspace", (PyCFunction)stringlib_isspace, METH_NOARGS,
2475 _Py_isspace__doc__},
2476 {"istitle", (PyCFunction)stringlib_istitle, METH_NOARGS,
2477 _Py_istitle__doc__},
2478 {"isupper", (PyCFunction)stringlib_isupper, METH_NOARGS,
2479 _Py_isupper__doc__},
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002480 BYTES_JOIN_METHODDEF
Serhiy Storchakadd40fc32016-05-04 22:23:26 +03002481 {"ljust", (PyCFunction)stringlib_ljust, METH_VARARGS, _Py_ljust__doc__},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002482 {"lower", (PyCFunction)stringlib_lower, METH_NOARGS, _Py_lower__doc__},
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002483 BYTES_LSTRIP_METHODDEF
2484 BYTES_MAKETRANS_METHODDEF
2485 BYTES_PARTITION_METHODDEF
2486 BYTES_REPLACE_METHODDEF
Serhiy Storchakae09132f2016-07-03 13:57:48 +03002487 {"rfind", (PyCFunction)bytes_rfind, METH_VARARGS, _Py_rfind__doc__},
2488 {"rindex", (PyCFunction)bytes_rindex, METH_VARARGS, _Py_rindex__doc__},
Serhiy Storchakadd40fc32016-05-04 22:23:26 +03002489 {"rjust", (PyCFunction)stringlib_rjust, METH_VARARGS, _Py_rjust__doc__},
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002490 BYTES_RPARTITION_METHODDEF
2491 BYTES_RSPLIT_METHODDEF
2492 BYTES_RSTRIP_METHODDEF
2493 BYTES_SPLIT_METHODDEF
2494 BYTES_SPLITLINES_METHODDEF
Serhiy Storchakae09132f2016-07-03 13:57:48 +03002495 {"startswith", (PyCFunction)bytes_startswith, METH_VARARGS,
Serhiy Storchakadd40fc32016-05-04 22:23:26 +03002496 _Py_startswith__doc__},
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002497 BYTES_STRIP_METHODDEF
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002498 {"swapcase", (PyCFunction)stringlib_swapcase, METH_NOARGS,
2499 _Py_swapcase__doc__},
2500 {"title", (PyCFunction)stringlib_title, METH_NOARGS, _Py_title__doc__},
Martin v. Löwis7252a6e2014-07-27 16:25:09 +02002501 BYTES_TRANSLATE_METHODDEF
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002502 {"upper", (PyCFunction)stringlib_upper, METH_NOARGS, _Py_upper__doc__},
Serhiy Storchakadd40fc32016-05-04 22:23:26 +03002503 {"zfill", (PyCFunction)stringlib_zfill, METH_VARARGS, _Py_zfill__doc__},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002504 {NULL, NULL} /* sentinel */
Guido van Rossum4dfe8a12006-04-22 23:28:04 +00002505};
2506
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002507static PyObject *
Serhiy Storchakac9a59e62016-04-15 14:11:10 +03002508bytes_mod(PyObject *self, PyObject *arg)
Ethan Furmanb95b5612015-01-23 20:05:18 -08002509{
Serhiy Storchakac9a59e62016-04-15 14:11:10 +03002510 if (!PyBytes_Check(self)) {
2511 Py_RETURN_NOTIMPLEMENTED;
Victor Stinner772b2b02015-10-14 09:56:53 +02002512 }
Victor Stinner772b2b02015-10-14 09:56:53 +02002513 return _PyBytes_FormatEx(PyBytes_AS_STRING(self), PyBytes_GET_SIZE(self),
Serhiy Storchakac9a59e62016-04-15 14:11:10 +03002514 arg, 0);
Ethan Furmanb95b5612015-01-23 20:05:18 -08002515}
2516
2517static PyNumberMethods bytes_as_number = {
2518 0, /*nb_add*/
2519 0, /*nb_subtract*/
2520 0, /*nb_multiply*/
2521 bytes_mod, /*nb_remainder*/
2522};
2523
2524static PyObject *
Serhiy Storchaka15095802015-11-25 15:47:01 +02002525bytes_subtype_new(PyTypeObject *type, PyObject *args, PyObject *kwds);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002526
2527static PyObject *
Benjamin Peterson80688ef2009-04-18 15:17:02 +00002528bytes_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002529{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002530 PyObject *x = NULL;
2531 const char *encoding = NULL;
2532 const char *errors = NULL;
2533 PyObject *new = NULL;
Benjamin Peterson5ff3f732012-12-19 15:27:41 -06002534 PyObject *func;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002535 Py_ssize_t size;
2536 static char *kwlist[] = {"source", "encoding", "errors", 0};
Benjamin Peterson5ff3f732012-12-19 15:27:41 -06002537 _Py_IDENTIFIER(__bytes__);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002538
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002539 if (type != &PyBytes_Type)
Serhiy Storchaka15095802015-11-25 15:47:01 +02002540 return bytes_subtype_new(type, args, kwds);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002541 if (!PyArg_ParseTupleAndKeywords(args, kwds, "|Oss:bytes", kwlist, &x,
2542 &encoding, &errors))
2543 return NULL;
2544 if (x == NULL) {
2545 if (encoding != NULL || errors != NULL) {
2546 PyErr_SetString(PyExc_TypeError,
2547 "encoding or errors without sequence "
2548 "argument");
2549 return NULL;
2550 }
Victor Stinnerdb067af2014-05-02 22:31:14 +02002551 return PyBytes_FromStringAndSize(NULL, 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002552 }
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002553
Serhiy Storchaka5aac3ed2015-12-20 16:36:34 +02002554 if (encoding != NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002555 /* Encode via the codec registry */
Serhiy Storchaka5aac3ed2015-12-20 16:36:34 +02002556 if (!PyUnicode_Check(x)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002557 PyErr_SetString(PyExc_TypeError,
Serhiy Storchaka5aac3ed2015-12-20 16:36:34 +02002558 "encoding without a string argument");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002559 return NULL;
2560 }
2561 new = PyUnicode_AsEncodedString(x, encoding, errors);
2562 if (new == NULL)
2563 return NULL;
2564 assert(PyBytes_Check(new));
2565 return new;
2566 }
Benjamin Peterson5ff3f732012-12-19 15:27:41 -06002567
Serhiy Storchaka5aac3ed2015-12-20 16:36:34 +02002568 if (errors != NULL) {
Serhiy Storchaka83cf99d2014-12-02 09:24:06 +02002569 PyErr_SetString(PyExc_TypeError,
Serhiy Storchaka5aac3ed2015-12-20 16:36:34 +02002570 PyUnicode_Check(x) ?
2571 "string argument without an encoding" :
2572 "errors without a string argument");
Serhiy Storchaka83cf99d2014-12-02 09:24:06 +02002573 return NULL;
2574 }
2575
Benjamin Peterson5ff3f732012-12-19 15:27:41 -06002576 /* We'd like to call PyObject_Bytes here, but we need to check for an
2577 integer argument before deferring to PyBytes_FromObject, something
2578 PyObject_Bytes doesn't do. */
2579 func = _PyObject_LookupSpecial(x, &PyId___bytes__);
2580 if (func != NULL) {
Victor Stinnerf17c3de2016-12-06 18:46:19 +01002581 new = _PyObject_CallNoArg(func);
Benjamin Peterson5ff3f732012-12-19 15:27:41 -06002582 Py_DECREF(func);
2583 if (new == NULL)
2584 return NULL;
2585 if (!PyBytes_Check(new)) {
2586 PyErr_Format(PyExc_TypeError,
2587 "__bytes__ returned non-bytes (type %.200s)",
2588 Py_TYPE(new)->tp_name);
2589 Py_DECREF(new);
2590 return NULL;
2591 }
2592 return new;
2593 }
2594 else if (PyErr_Occurred())
2595 return NULL;
2596
Serhiy Storchaka5aac3ed2015-12-20 16:36:34 +02002597 if (PyUnicode_Check(x)) {
2598 PyErr_SetString(PyExc_TypeError,
2599 "string argument without an encoding");
2600 return NULL;
2601 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002602 /* Is it an integer? */
Serhiy Storchakaeb249882016-08-15 09:46:07 +03002603 if (PyIndex_Check(x)) {
2604 size = PyNumber_AsSsize_t(x, PyExc_OverflowError);
2605 if (size == -1 && PyErr_Occurred()) {
Miss Islington (bot)13708322018-10-14 14:26:28 -07002606 if (!PyErr_ExceptionMatches(PyExc_TypeError))
INADA Naokia634e232017-01-06 17:32:01 +09002607 return NULL;
2608 PyErr_Clear(); /* fall through */
Serhiy Storchakaeb249882016-08-15 09:46:07 +03002609 }
INADA Naokia634e232017-01-06 17:32:01 +09002610 else {
2611 if (size < 0) {
2612 PyErr_SetString(PyExc_ValueError, "negative count");
2613 return NULL;
2614 }
2615 new = _PyBytes_FromSize(size, 1);
2616 if (new == NULL)
2617 return NULL;
2618 return new;
Serhiy Storchakaeb249882016-08-15 09:46:07 +03002619 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002620 }
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002621
Benjamin Peterson5ff3f732012-12-19 15:27:41 -06002622 return PyBytes_FromObject(x);
Benjamin Petersonc15a0732008-08-26 16:46:47 +00002623}
2624
Victor Stinnerf2eafa32015-10-14 13:44:29 +02002625static PyObject*
2626_PyBytes_FromBuffer(PyObject *x)
2627{
2628 PyObject *new;
2629 Py_buffer view;
2630
2631 if (PyObject_GetBuffer(x, &view, PyBUF_FULL_RO) < 0)
2632 return NULL;
2633
2634 new = PyBytes_FromStringAndSize(NULL, view.len);
2635 if (!new)
2636 goto fail;
2637 if (PyBuffer_ToContiguous(((PyBytesObject *)new)->ob_sval,
2638 &view, view.len, 'C') < 0)
2639 goto fail;
2640 PyBuffer_Release(&view);
2641 return new;
2642
2643fail:
2644 Py_XDECREF(new);
2645 PyBuffer_Release(&view);
2646 return NULL;
2647}
2648
2649static PyObject*
2650_PyBytes_FromList(PyObject *x)
2651{
Miss Islington (bot)7f34d552018-10-21 05:55:52 -07002652 Py_ssize_t i, size = PyList_GET_SIZE(x);
2653 Py_ssize_t value;
2654 char *str;
2655 PyObject *item;
2656 _PyBytesWriter writer;
2657
2658 _PyBytesWriter_Init(&writer);
2659 str = _PyBytesWriter_Alloc(&writer, size);
2660 if (str == NULL)
2661 return NULL;
2662 writer.overallocate = 1;
2663 size = writer.allocated;
2664
2665 for (i = 0; i < PyList_GET_SIZE(x); i++) {
2666 item = PyList_GET_ITEM(x, i);
2667 Py_INCREF(item);
2668 value = PyNumber_AsSsize_t(item, NULL);
2669 Py_DECREF(item);
2670 if (value == -1 && PyErr_Occurred())
2671 goto error;
2672
2673 if (value < 0 || value >= 256) {
2674 PyErr_SetString(PyExc_ValueError,
2675 "bytes must be in range(0, 256)");
2676 goto error;
2677 }
2678
2679 if (i >= size) {
2680 str = _PyBytesWriter_Resize(&writer, str, size+1);
2681 if (str == NULL)
2682 return NULL;
2683 size = writer.allocated;
2684 }
2685 *str++ = (char) value;
2686 }
2687 return _PyBytesWriter_Finish(&writer, str);
2688
2689 error:
2690 _PyBytesWriter_Dealloc(&writer);
2691 return NULL;
Victor Stinnerf2eafa32015-10-14 13:44:29 +02002692}
2693
2694static PyObject*
2695_PyBytes_FromTuple(PyObject *x)
2696{
Miss Islington (bot)7f34d552018-10-21 05:55:52 -07002697 PyObject *bytes;
2698 Py_ssize_t i, size = PyTuple_GET_SIZE(x);
2699 Py_ssize_t value;
2700 char *str;
2701 PyObject *item;
2702
2703 bytes = PyBytes_FromStringAndSize(NULL, size);
2704 if (bytes == NULL)
2705 return NULL;
2706 str = ((PyBytesObject *)bytes)->ob_sval;
2707
2708 for (i = 0; i < size; i++) {
2709 item = PyTuple_GET_ITEM(x, i);
2710 value = PyNumber_AsSsize_t(item, NULL);
2711 if (value == -1 && PyErr_Occurred())
2712 goto error;
2713
2714 if (value < 0 || value >= 256) {
2715 PyErr_SetString(PyExc_ValueError,
2716 "bytes must be in range(0, 256)");
2717 goto error;
2718 }
2719 *str++ = (char) value;
2720 }
2721 return bytes;
2722
2723 error:
2724 Py_DECREF(bytes);
2725 return NULL;
Victor Stinnerf2eafa32015-10-14 13:44:29 +02002726}
2727
2728static PyObject *
Serhiy Storchaka03f17f82016-04-10 14:44:59 +03002729_PyBytes_FromIterator(PyObject *it, PyObject *x)
Benjamin Petersonc15a0732008-08-26 16:46:47 +00002730{
Victor Stinnerc3d2bc12015-10-14 14:15:49 +02002731 char *str;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002732 Py_ssize_t i, size;
Victor Stinnerc3d2bc12015-10-14 14:15:49 +02002733 _PyBytesWriter writer;
2734
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002735 /* For iterator version, create a string object and resize as needed */
Armin Ronacheraa9a79d2012-10-06 14:03:24 +02002736 size = PyObject_LengthHint(x, 64);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002737 if (size == -1 && PyErr_Occurred())
2738 return NULL;
Victor Stinnerc3d2bc12015-10-14 14:15:49 +02002739
Serhiy Storchaka03f17f82016-04-10 14:44:59 +03002740 _PyBytesWriter_Init(&writer);
Victor Stinnerc3d2bc12015-10-14 14:15:49 +02002741 str = _PyBytesWriter_Alloc(&writer, size);
2742 if (str == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002743 return NULL;
Victor Stinnerc3d2bc12015-10-14 14:15:49 +02002744 writer.overallocate = 1;
2745 size = writer.allocated;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002746
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002747 /* Run the iterator to exhaustion */
2748 for (i = 0; ; i++) {
2749 PyObject *item;
2750 Py_ssize_t value;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002751
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002752 /* Get the next item */
2753 item = PyIter_Next(it);
2754 if (item == NULL) {
2755 if (PyErr_Occurred())
2756 goto error;
2757 break;
2758 }
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002759
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002760 /* Interpret it as an int (__index__) */
Serhiy Storchakaf54d7812016-07-06 21:39:44 +03002761 value = PyNumber_AsSsize_t(item, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002762 Py_DECREF(item);
2763 if (value == -1 && PyErr_Occurred())
2764 goto error;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002765
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002766 /* Range check */
2767 if (value < 0 || value >= 256) {
2768 PyErr_SetString(PyExc_ValueError,
2769 "bytes must be in range(0, 256)");
2770 goto error;
2771 }
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002772
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002773 /* Append the byte */
2774 if (i >= size) {
Victor Stinnerc3d2bc12015-10-14 14:15:49 +02002775 str = _PyBytesWriter_Resize(&writer, str, size+1);
2776 if (str == NULL)
2777 return NULL;
2778 size = writer.allocated;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002779 }
Victor Stinnerc3d2bc12015-10-14 14:15:49 +02002780 *str++ = (char) value;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002781 }
Victor Stinnerc3d2bc12015-10-14 14:15:49 +02002782
2783 return _PyBytesWriter_Finish(&writer, str);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002784
2785 error:
Victor Stinnerc3d2bc12015-10-14 14:15:49 +02002786 _PyBytesWriter_Dealloc(&writer);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002787 return NULL;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002788}
2789
Victor Stinnerf2eafa32015-10-14 13:44:29 +02002790PyObject *
2791PyBytes_FromObject(PyObject *x)
2792{
Serhiy Storchaka03f17f82016-04-10 14:44:59 +03002793 PyObject *it, *result;
2794
Victor Stinnerf2eafa32015-10-14 13:44:29 +02002795 if (x == NULL) {
2796 PyErr_BadInternalCall();
2797 return NULL;
2798 }
2799
2800 if (PyBytes_CheckExact(x)) {
2801 Py_INCREF(x);
2802 return x;
2803 }
2804
2805 /* Use the modern buffer interface */
2806 if (PyObject_CheckBuffer(x))
2807 return _PyBytes_FromBuffer(x);
2808
2809 if (PyList_CheckExact(x))
2810 return _PyBytes_FromList(x);
2811
2812 if (PyTuple_CheckExact(x))
2813 return _PyBytes_FromTuple(x);
2814
Serhiy Storchaka03f17f82016-04-10 14:44:59 +03002815 if (!PyUnicode_Check(x)) {
2816 it = PyObject_GetIter(x);
2817 if (it != NULL) {
2818 result = _PyBytes_FromIterator(it, x);
2819 Py_DECREF(it);
2820 return result;
2821 }
Miss Islington (bot)13708322018-10-14 14:26:28 -07002822 if (!PyErr_ExceptionMatches(PyExc_TypeError)) {
2823 return NULL;
2824 }
Victor Stinnerf2eafa32015-10-14 13:44:29 +02002825 }
2826
Serhiy Storchaka03f17f82016-04-10 14:44:59 +03002827 PyErr_Format(PyExc_TypeError,
2828 "cannot convert '%.200s' object to bytes",
2829 x->ob_type->tp_name);
2830 return NULL;
Victor Stinnerf2eafa32015-10-14 13:44:29 +02002831}
2832
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002833static PyObject *
Serhiy Storchaka15095802015-11-25 15:47:01 +02002834bytes_subtype_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002835{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002836 PyObject *tmp, *pnew;
2837 Py_ssize_t n;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002838
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002839 assert(PyType_IsSubtype(type, &PyBytes_Type));
2840 tmp = bytes_new(&PyBytes_Type, args, kwds);
2841 if (tmp == NULL)
2842 return NULL;
Serhiy Storchaka15095802015-11-25 15:47:01 +02002843 assert(PyBytes_Check(tmp));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002844 n = PyBytes_GET_SIZE(tmp);
2845 pnew = type->tp_alloc(type, n);
2846 if (pnew != NULL) {
Christian Heimesf051e432016-09-13 20:22:02 +02002847 memcpy(PyBytes_AS_STRING(pnew),
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002848 PyBytes_AS_STRING(tmp), n+1);
2849 ((PyBytesObject *)pnew)->ob_shash =
2850 ((PyBytesObject *)tmp)->ob_shash;
2851 }
2852 Py_DECREF(tmp);
2853 return pnew;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002854}
2855
Benjamin Peterson80688ef2009-04-18 15:17:02 +00002856PyDoc_STRVAR(bytes_doc,
Georg Brandl17cb8a82008-05-30 08:20:09 +00002857"bytes(iterable_of_ints) -> bytes\n\
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002858bytes(string, encoding[, errors]) -> bytes\n\
Georg Brandl17cb8a82008-05-30 08:20:09 +00002859bytes(bytes_or_buffer) -> immutable copy of bytes_or_buffer\n\
Victor Stinnerbb2e9c42011-12-17 23:18:07 +01002860bytes(int) -> bytes object of size given by the parameter initialized with null bytes\n\
2861bytes() -> empty bytes object\n\
Guido van Rossum4dfe8a12006-04-22 23:28:04 +00002862\n\
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002863Construct an immutable array of bytes from:\n\
Guido van Rossum98297ee2007-11-06 21:34:58 +00002864 - an iterable yielding integers in range(256)\n\
2865 - a text string encoded using the specified encoding\n\
Victor Stinnerbb2e9c42011-12-17 23:18:07 +01002866 - any object implementing the buffer API.\n\
2867 - an integer");
Guido van Rossum98297ee2007-11-06 21:34:58 +00002868
Benjamin Peterson80688ef2009-04-18 15:17:02 +00002869static PyObject *bytes_iter(PyObject *seq);
Guido van Rossum4dfe8a12006-04-22 23:28:04 +00002870
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002871PyTypeObject PyBytes_Type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002872 PyVarObject_HEAD_INIT(&PyType_Type, 0)
2873 "bytes",
2874 PyBytesObject_SIZE,
2875 sizeof(char),
2876 bytes_dealloc, /* tp_dealloc */
2877 0, /* tp_print */
2878 0, /* tp_getattr */
2879 0, /* tp_setattr */
2880 0, /* tp_reserved */
2881 (reprfunc)bytes_repr, /* tp_repr */
Ethan Furmanb95b5612015-01-23 20:05:18 -08002882 &bytes_as_number, /* tp_as_number */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002883 &bytes_as_sequence, /* tp_as_sequence */
2884 &bytes_as_mapping, /* tp_as_mapping */
2885 (hashfunc)bytes_hash, /* tp_hash */
2886 0, /* tp_call */
2887 bytes_str, /* tp_str */
2888 PyObject_GenericGetAttr, /* tp_getattro */
2889 0, /* tp_setattro */
2890 &bytes_as_buffer, /* tp_as_buffer */
2891 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE |
2892 Py_TPFLAGS_BYTES_SUBCLASS, /* tp_flags */
2893 bytes_doc, /* tp_doc */
2894 0, /* tp_traverse */
2895 0, /* tp_clear */
2896 (richcmpfunc)bytes_richcompare, /* tp_richcompare */
2897 0, /* tp_weaklistoffset */
2898 bytes_iter, /* tp_iter */
2899 0, /* tp_iternext */
2900 bytes_methods, /* tp_methods */
2901 0, /* tp_members */
2902 0, /* tp_getset */
2903 &PyBaseObject_Type, /* tp_base */
2904 0, /* tp_dict */
2905 0, /* tp_descr_get */
2906 0, /* tp_descr_set */
2907 0, /* tp_dictoffset */
2908 0, /* tp_init */
2909 0, /* tp_alloc */
2910 bytes_new, /* tp_new */
2911 PyObject_Del, /* tp_free */
Guido van Rossum4dfe8a12006-04-22 23:28:04 +00002912};
Guido van Rossuma5d2d552007-10-26 17:39:48 +00002913
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002914void
Antoine Pitrou9ed5f272013-08-13 20:18:52 +02002915PyBytes_Concat(PyObject **pv, PyObject *w)
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002916{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002917 assert(pv != NULL);
2918 if (*pv == NULL)
2919 return;
2920 if (w == NULL) {
Serhiy Storchakaf458a032013-02-02 18:45:22 +02002921 Py_CLEAR(*pv);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002922 return;
2923 }
Antoine Pitrou161d6952014-05-01 14:36:20 +02002924
2925 if (Py_REFCNT(*pv) == 1 && PyBytes_CheckExact(*pv)) {
2926 /* Only one reference, so we can resize in place */
Zachary Warebca96942014-05-06 11:42:37 -05002927 Py_ssize_t oldsize;
Antoine Pitrou161d6952014-05-01 14:36:20 +02002928 Py_buffer wb;
Victor Stinner049e5092014-08-17 22:20:00 +02002929
Antoine Pitrou161d6952014-05-01 14:36:20 +02002930 wb.len = -1;
Serhiy Storchaka3dd3e262015-02-03 01:25:42 +02002931 if (PyObject_GetBuffer(w, &wb, PyBUF_SIMPLE) != 0) {
Antoine Pitrou161d6952014-05-01 14:36:20 +02002932 PyErr_Format(PyExc_TypeError, "can't concat %.100s to %.100s",
2933 Py_TYPE(w)->tp_name, Py_TYPE(*pv)->tp_name);
2934 Py_CLEAR(*pv);
2935 return;
2936 }
2937
2938 oldsize = PyBytes_GET_SIZE(*pv);
2939 if (oldsize > PY_SSIZE_T_MAX - wb.len) {
2940 PyErr_NoMemory();
2941 goto error;
2942 }
2943 if (_PyBytes_Resize(pv, oldsize + wb.len) < 0)
2944 goto error;
2945
2946 memcpy(PyBytes_AS_STRING(*pv) + oldsize, wb.buf, wb.len);
2947 PyBuffer_Release(&wb);
2948 return;
2949
2950 error:
2951 PyBuffer_Release(&wb);
2952 Py_CLEAR(*pv);
2953 return;
2954 }
2955
2956 else {
2957 /* Multiple references, need to create new object */
2958 PyObject *v;
2959 v = bytes_concat(*pv, w);
Serhiy Storchaka57a01d32016-04-10 18:05:40 +03002960 Py_SETREF(*pv, v);
Antoine Pitrou161d6952014-05-01 14:36:20 +02002961 }
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002962}
2963
2964void
Antoine Pitrou9ed5f272013-08-13 20:18:52 +02002965PyBytes_ConcatAndDel(PyObject **pv, PyObject *w)
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002966{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002967 PyBytes_Concat(pv, w);
2968 Py_XDECREF(w);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002969}
2970
2971
Ethan Furmanb95b5612015-01-23 20:05:18 -08002972/* The following function breaks the notion that bytes are immutable:
2973 it changes the size of a bytes object. We get away with this only if there
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002974 is only one module referencing the object. You can also think of it
Ethan Furmanb95b5612015-01-23 20:05:18 -08002975 as creating a new bytes object and destroying the old one, only
2976 more efficiently. In any case, don't use this if the bytes object may
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002977 already be known to some other part of the code...
Ethan Furmanb95b5612015-01-23 20:05:18 -08002978 Note that if there's not enough memory to resize the bytes object, the
2979 original bytes object at *pv is deallocated, *pv is set to NULL, an "out of
Christian Heimes2c9c7a52008-05-26 13:42:13 +00002980 memory" exception is set, and -1 is returned. Else (on success) 0 is
2981 returned, and the value in *pv may or may not be the same as on input.
2982 As always, an extra byte is allocated for a trailing \0 byte (newsize
2983 does *not* include that), and a trailing \0 byte is stored.
2984*/
2985
2986int
2987_PyBytes_Resize(PyObject **pv, Py_ssize_t newsize)
2988{
Antoine Pitrou9ed5f272013-08-13 20:18:52 +02002989 PyObject *v;
2990 PyBytesObject *sv;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002991 v = *pv;
Berker Peksag4a72a7b2016-09-16 17:31:06 +03002992 if (!PyBytes_Check(v) || newsize < 0) {
2993 goto error;
2994 }
2995 if (Py_SIZE(v) == newsize) {
2996 /* return early if newsize equals to v->ob_size */
2997 return 0;
2998 }
Miss Islington (bot)d39c1922019-01-11 23:40:09 -08002999 if (Py_SIZE(v) == 0) {
3000 if (newsize == 0) {
3001 return 0;
3002 }
3003 *pv = _PyBytes_FromSize(newsize, 0);
3004 Py_DECREF(v);
3005 return (*pv == NULL) ? -1 : 0;
3006 }
Berker Peksag4a72a7b2016-09-16 17:31:06 +03003007 if (Py_REFCNT(v) != 1) {
3008 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003009 }
Miss Islington (bot)d39c1922019-01-11 23:40:09 -08003010 if (newsize == 0) {
3011 *pv = _PyBytes_FromSize(0, 0);
3012 Py_DECREF(v);
3013 return (*pv == NULL) ? -1 : 0;
3014 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003015 /* XXX UNREF/NEWREF interface should be more symmetrical */
3016 _Py_DEC_REFTOTAL;
3017 _Py_ForgetReference(v);
3018 *pv = (PyObject *)
Serhiy Storchaka20b39b22014-09-28 11:27:24 +03003019 PyObject_REALLOC(v, PyBytesObject_SIZE + newsize);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003020 if (*pv == NULL) {
3021 PyObject_Del(v);
3022 PyErr_NoMemory();
3023 return -1;
3024 }
3025 _Py_NewReference(*pv);
3026 sv = (PyBytesObject *) *pv;
3027 Py_SIZE(sv) = newsize;
3028 sv->ob_sval[newsize] = '\0';
3029 sv->ob_shash = -1; /* invalidate cached hash value */
3030 return 0;
Berker Peksag4a72a7b2016-09-16 17:31:06 +03003031error:
3032 *pv = 0;
3033 Py_DECREF(v);
3034 PyErr_BadInternalCall();
3035 return -1;
Christian Heimes2c9c7a52008-05-26 13:42:13 +00003036}
3037
Christian Heimes2c9c7a52008-05-26 13:42:13 +00003038void
3039PyBytes_Fini(void)
3040{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003041 int i;
Serhiy Storchakaf458a032013-02-02 18:45:22 +02003042 for (i = 0; i < UCHAR_MAX + 1; i++)
3043 Py_CLEAR(characters[i]);
3044 Py_CLEAR(nullstring);
Christian Heimes2c9c7a52008-05-26 13:42:13 +00003045}
3046
Benjamin Peterson4116f362008-05-27 00:36:20 +00003047/*********************** Bytes Iterator ****************************/
Guido van Rossuma5d2d552007-10-26 17:39:48 +00003048
3049typedef struct {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003050 PyObject_HEAD
3051 Py_ssize_t it_index;
3052 PyBytesObject *it_seq; /* Set to NULL when iterator is exhausted */
Christian Heimes2c9c7a52008-05-26 13:42:13 +00003053} striterobject;
Guido van Rossuma5d2d552007-10-26 17:39:48 +00003054
3055static void
Christian Heimes2c9c7a52008-05-26 13:42:13 +00003056striter_dealloc(striterobject *it)
Guido van Rossuma5d2d552007-10-26 17:39:48 +00003057{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003058 _PyObject_GC_UNTRACK(it);
3059 Py_XDECREF(it->it_seq);
3060 PyObject_GC_Del(it);
Guido van Rossuma5d2d552007-10-26 17:39:48 +00003061}
3062
3063static int
Christian Heimes2c9c7a52008-05-26 13:42:13 +00003064striter_traverse(striterobject *it, visitproc visit, void *arg)
Guido van Rossuma5d2d552007-10-26 17:39:48 +00003065{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003066 Py_VISIT(it->it_seq);
3067 return 0;
Guido van Rossuma5d2d552007-10-26 17:39:48 +00003068}
3069
3070static PyObject *
Christian Heimes2c9c7a52008-05-26 13:42:13 +00003071striter_next(striterobject *it)
Guido van Rossuma5d2d552007-10-26 17:39:48 +00003072{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003073 PyBytesObject *seq;
3074 PyObject *item;
Guido van Rossuma5d2d552007-10-26 17:39:48 +00003075
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003076 assert(it != NULL);
3077 seq = it->it_seq;
3078 if (seq == NULL)
3079 return NULL;
3080 assert(PyBytes_Check(seq));
Guido van Rossuma5d2d552007-10-26 17:39:48 +00003081
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003082 if (it->it_index < PyBytes_GET_SIZE(seq)) {
3083 item = PyLong_FromLong(
3084 (unsigned char)seq->ob_sval[it->it_index]);
3085 if (item != NULL)
3086 ++it->it_index;
3087 return item;
3088 }
Guido van Rossuma5d2d552007-10-26 17:39:48 +00003089
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003090 it->it_seq = NULL;
Serhiy Storchakafbb1c5e2016-03-30 20:40:02 +03003091 Py_DECREF(seq);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003092 return NULL;
Guido van Rossuma5d2d552007-10-26 17:39:48 +00003093}
3094
3095static PyObject *
Christian Heimes2c9c7a52008-05-26 13:42:13 +00003096striter_len(striterobject *it)
Guido van Rossuma5d2d552007-10-26 17:39:48 +00003097{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003098 Py_ssize_t len = 0;
3099 if (it->it_seq)
3100 len = PyBytes_GET_SIZE(it->it_seq) - it->it_index;
3101 return PyLong_FromSsize_t(len);
Guido van Rossuma5d2d552007-10-26 17:39:48 +00003102}
3103
3104PyDoc_STRVAR(length_hint_doc,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003105 "Private method returning an estimate of len(list(it)).");
Guido van Rossuma5d2d552007-10-26 17:39:48 +00003106
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00003107static PyObject *
3108striter_reduce(striterobject *it)
3109{
3110 if (it->it_seq != NULL) {
Antoine Pitroua7013882012-04-05 00:04:20 +02003111 return Py_BuildValue("N(O)n", _PyObject_GetBuiltin("iter"),
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00003112 it->it_seq, it->it_index);
3113 } else {
Serhiy Storchaka460bd0d2016-11-20 12:16:46 +02003114 return Py_BuildValue("N(())", _PyObject_GetBuiltin("iter"));
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00003115 }
3116}
3117
3118PyDoc_STRVAR(reduce_doc, "Return state information for pickling.");
3119
3120static PyObject *
3121striter_setstate(striterobject *it, PyObject *state)
3122{
3123 Py_ssize_t index = PyLong_AsSsize_t(state);
3124 if (index == -1 && PyErr_Occurred())
3125 return NULL;
Kristján Valur Jónsson25dded02014-03-05 13:47:57 +00003126 if (it->it_seq != NULL) {
3127 if (index < 0)
3128 index = 0;
3129 else if (index > PyBytes_GET_SIZE(it->it_seq))
3130 index = PyBytes_GET_SIZE(it->it_seq); /* iterator exhausted */
3131 it->it_index = index;
3132 }
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00003133 Py_RETURN_NONE;
3134}
3135
3136PyDoc_STRVAR(setstate_doc, "Set state information for unpickling.");
3137
Christian Heimes2c9c7a52008-05-26 13:42:13 +00003138static PyMethodDef striter_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003139 {"__length_hint__", (PyCFunction)striter_len, METH_NOARGS,
3140 length_hint_doc},
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00003141 {"__reduce__", (PyCFunction)striter_reduce, METH_NOARGS,
3142 reduce_doc},
3143 {"__setstate__", (PyCFunction)striter_setstate, METH_O,
3144 setstate_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003145 {NULL, NULL} /* sentinel */
Guido van Rossuma5d2d552007-10-26 17:39:48 +00003146};
3147
Christian Heimes2c9c7a52008-05-26 13:42:13 +00003148PyTypeObject PyBytesIter_Type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003149 PyVarObject_HEAD_INIT(&PyType_Type, 0)
3150 "bytes_iterator", /* tp_name */
3151 sizeof(striterobject), /* tp_basicsize */
3152 0, /* tp_itemsize */
3153 /* methods */
3154 (destructor)striter_dealloc, /* tp_dealloc */
3155 0, /* tp_print */
3156 0, /* tp_getattr */
3157 0, /* tp_setattr */
3158 0, /* tp_reserved */
3159 0, /* tp_repr */
3160 0, /* tp_as_number */
3161 0, /* tp_as_sequence */
3162 0, /* tp_as_mapping */
3163 0, /* tp_hash */
3164 0, /* tp_call */
3165 0, /* tp_str */
3166 PyObject_GenericGetAttr, /* tp_getattro */
3167 0, /* tp_setattro */
3168 0, /* tp_as_buffer */
3169 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
3170 0, /* tp_doc */
3171 (traverseproc)striter_traverse, /* tp_traverse */
3172 0, /* tp_clear */
3173 0, /* tp_richcompare */
3174 0, /* tp_weaklistoffset */
3175 PyObject_SelfIter, /* tp_iter */
3176 (iternextfunc)striter_next, /* tp_iternext */
3177 striter_methods, /* tp_methods */
3178 0,
Guido van Rossuma5d2d552007-10-26 17:39:48 +00003179};
3180
3181static PyObject *
Benjamin Peterson80688ef2009-04-18 15:17:02 +00003182bytes_iter(PyObject *seq)
Guido van Rossuma5d2d552007-10-26 17:39:48 +00003183{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003184 striterobject *it;
Guido van Rossuma5d2d552007-10-26 17:39:48 +00003185
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003186 if (!PyBytes_Check(seq)) {
3187 PyErr_BadInternalCall();
3188 return NULL;
3189 }
3190 it = PyObject_GC_New(striterobject, &PyBytesIter_Type);
3191 if (it == NULL)
3192 return NULL;
3193 it->it_index = 0;
3194 Py_INCREF(seq);
3195 it->it_seq = (PyBytesObject *)seq;
3196 _PyObject_GC_TRACK(it);
3197 return (PyObject *)it;
Guido van Rossuma5d2d552007-10-26 17:39:48 +00003198}
Victor Stinner00165072015-10-09 01:53:21 +02003199
3200
3201/* _PyBytesWriter API */
3202
3203#ifdef MS_WINDOWS
3204 /* On Windows, overallocate by 50% is the best factor */
3205# define OVERALLOCATE_FACTOR 2
3206#else
3207 /* On Linux, overallocate by 25% is the best factor */
3208# define OVERALLOCATE_FACTOR 4
3209#endif
3210
3211void
3212_PyBytesWriter_Init(_PyBytesWriter *writer)
3213{
Victor Stinner661aacc2015-10-14 09:41:48 +02003214 /* Set all attributes before small_buffer to 0 */
3215 memset(writer, 0, offsetof(_PyBytesWriter, small_buffer));
Victor Stinner00165072015-10-09 01:53:21 +02003216#ifdef Py_DEBUG
Victor Stinnerb3653a32015-10-09 03:38:24 +02003217 memset(writer->small_buffer, 0xCB, sizeof(writer->small_buffer));
Victor Stinner00165072015-10-09 01:53:21 +02003218#endif
3219}
3220
3221void
3222_PyBytesWriter_Dealloc(_PyBytesWriter *writer)
3223{
3224 Py_CLEAR(writer->buffer);
3225}
3226
3227Py_LOCAL_INLINE(char*)
3228_PyBytesWriter_AsString(_PyBytesWriter *writer)
3229{
Victor Stinner661aacc2015-10-14 09:41:48 +02003230 if (writer->use_small_buffer) {
Victor Stinner00165072015-10-09 01:53:21 +02003231 assert(writer->buffer == NULL);
Victor Stinnerb3653a32015-10-09 03:38:24 +02003232 return writer->small_buffer;
Victor Stinner00165072015-10-09 01:53:21 +02003233 }
Victor Stinner661aacc2015-10-14 09:41:48 +02003234 else if (writer->use_bytearray) {
3235 assert(writer->buffer != NULL);
3236 return PyByteArray_AS_STRING(writer->buffer);
3237 }
3238 else {
3239 assert(writer->buffer != NULL);
3240 return PyBytes_AS_STRING(writer->buffer);
3241 }
Victor Stinner00165072015-10-09 01:53:21 +02003242}
3243
3244Py_LOCAL_INLINE(Py_ssize_t)
Victor Stinner2bf89932015-10-14 11:25:33 +02003245_PyBytesWriter_GetSize(_PyBytesWriter *writer, char *str)
Victor Stinner00165072015-10-09 01:53:21 +02003246{
3247 char *start = _PyBytesWriter_AsString(writer);
3248 assert(str != NULL);
3249 assert(str >= start);
Victor Stinnerb3653a32015-10-09 03:38:24 +02003250 assert(str - start <= writer->allocated);
Victor Stinner00165072015-10-09 01:53:21 +02003251 return str - start;
3252}
3253
3254Py_LOCAL_INLINE(void)
3255_PyBytesWriter_CheckConsistency(_PyBytesWriter *writer, char *str)
3256{
3257#ifdef Py_DEBUG
3258 char *start, *end;
3259
Victor Stinner661aacc2015-10-14 09:41:48 +02003260 if (writer->use_small_buffer) {
Victor Stinner00165072015-10-09 01:53:21 +02003261 assert(writer->buffer == NULL);
3262 }
Victor Stinner661aacc2015-10-14 09:41:48 +02003263 else {
3264 assert(writer->buffer != NULL);
3265 if (writer->use_bytearray)
3266 assert(PyByteArray_CheckExact(writer->buffer));
3267 else
3268 assert(PyBytes_CheckExact(writer->buffer));
3269 assert(Py_REFCNT(writer->buffer) == 1);
3270 }
Victor Stinner00165072015-10-09 01:53:21 +02003271
Victor Stinner661aacc2015-10-14 09:41:48 +02003272 if (writer->use_bytearray) {
3273 /* bytearray has its own overallocation algorithm,
3274 writer overallocation must be disabled */
3275 assert(!writer->overallocate);
3276 }
3277
3278 assert(0 <= writer->allocated);
Victor Stinner53926a12015-10-09 12:37:03 +02003279 assert(0 <= writer->min_size && writer->min_size <= writer->allocated);
Victor Stinner00165072015-10-09 01:53:21 +02003280 /* the last byte must always be null */
Victor Stinner661aacc2015-10-14 09:41:48 +02003281 start = _PyBytesWriter_AsString(writer);
Victor Stinner00165072015-10-09 01:53:21 +02003282 assert(start[writer->allocated] == 0);
3283
3284 end = start + writer->allocated;
3285 assert(str != NULL);
3286 assert(start <= str && str <= end);
3287#endif
3288}
3289
Victor Stinnerc29e29b2015-10-12 13:12:54 +02003290void*
Victor Stinnerc5c3ba42015-10-14 13:56:47 +02003291_PyBytesWriter_Resize(_PyBytesWriter *writer, void *str, Py_ssize_t size)
Victor Stinner00165072015-10-09 01:53:21 +02003292{
3293 Py_ssize_t allocated, pos;
3294
3295 _PyBytesWriter_CheckConsistency(writer, str);
Victor Stinnerc5c3ba42015-10-14 13:56:47 +02003296 assert(writer->allocated < size);
Victor Stinner00165072015-10-09 01:53:21 +02003297
Victor Stinnerc5c3ba42015-10-14 13:56:47 +02003298 allocated = size;
Victor Stinner00165072015-10-09 01:53:21 +02003299 if (writer->overallocate
3300 && allocated <= (PY_SSIZE_T_MAX - allocated / OVERALLOCATE_FACTOR)) {
3301 /* overallocate to limit the number of realloc() */
3302 allocated += allocated / OVERALLOCATE_FACTOR;
3303 }
3304
Victor Stinner2bf89932015-10-14 11:25:33 +02003305 pos = _PyBytesWriter_GetSize(writer, str);
Victor Stinnerb3653a32015-10-09 03:38:24 +02003306 if (!writer->use_small_buffer) {
Victor Stinner661aacc2015-10-14 09:41:48 +02003307 if (writer->use_bytearray) {
3308 if (PyByteArray_Resize(writer->buffer, allocated))
3309 goto error;
3310 /* writer->allocated can be smaller than writer->buffer->ob_alloc,
3311 but we cannot use ob_alloc because bytes may need to be moved
3312 to use the whole buffer. bytearray uses an internal optimization
3313 to avoid moving or copying bytes when bytes are removed at the
3314 beginning (ex: del bytearray[:1]). */
3315 }
3316 else {
3317 if (_PyBytes_Resize(&writer->buffer, allocated))
3318 goto error;
Victor Stinner00165072015-10-09 01:53:21 +02003319 }
3320 }
3321 else {
3322 /* convert from stack buffer to bytes object buffer */
3323 assert(writer->buffer == NULL);
3324
Victor Stinner661aacc2015-10-14 09:41:48 +02003325 if (writer->use_bytearray)
3326 writer->buffer = PyByteArray_FromStringAndSize(NULL, allocated);
3327 else
3328 writer->buffer = PyBytes_FromStringAndSize(NULL, allocated);
Victor Stinner00165072015-10-09 01:53:21 +02003329 if (writer->buffer == NULL)
Victor Stinner661aacc2015-10-14 09:41:48 +02003330 goto error;
Victor Stinner00165072015-10-09 01:53:21 +02003331
3332 if (pos != 0) {
Victor Stinner661aacc2015-10-14 09:41:48 +02003333 char *dest;
3334 if (writer->use_bytearray)
3335 dest = PyByteArray_AS_STRING(writer->buffer);
3336 else
3337 dest = PyBytes_AS_STRING(writer->buffer);
Christian Heimesf051e432016-09-13 20:22:02 +02003338 memcpy(dest,
Victor Stinnerb3653a32015-10-09 03:38:24 +02003339 writer->small_buffer,
Victor Stinner00165072015-10-09 01:53:21 +02003340 pos);
3341 }
3342
Victor Stinnerb3653a32015-10-09 03:38:24 +02003343 writer->use_small_buffer = 0;
Victor Stinner00165072015-10-09 01:53:21 +02003344#ifdef Py_DEBUG
Victor Stinnerb3653a32015-10-09 03:38:24 +02003345 memset(writer->small_buffer, 0xDB, sizeof(writer->small_buffer));
Victor Stinner00165072015-10-09 01:53:21 +02003346#endif
Victor Stinner00165072015-10-09 01:53:21 +02003347 }
3348 writer->allocated = allocated;
3349
3350 str = _PyBytesWriter_AsString(writer) + pos;
3351 _PyBytesWriter_CheckConsistency(writer, str);
3352 return str;
Victor Stinner661aacc2015-10-14 09:41:48 +02003353
3354error:
3355 _PyBytesWriter_Dealloc(writer);
3356 return NULL;
Victor Stinner00165072015-10-09 01:53:21 +02003357}
3358
Victor Stinnerc5c3ba42015-10-14 13:56:47 +02003359void*
3360_PyBytesWriter_Prepare(_PyBytesWriter *writer, void *str, Py_ssize_t size)
3361{
3362 Py_ssize_t new_min_size;
3363
3364 _PyBytesWriter_CheckConsistency(writer, str);
3365 assert(size >= 0);
3366
3367 if (size == 0) {
3368 /* nothing to do */
3369 return str;
3370 }
3371
3372 if (writer->min_size > PY_SSIZE_T_MAX - size) {
3373 PyErr_NoMemory();
3374 _PyBytesWriter_Dealloc(writer);
3375 return NULL;
3376 }
3377 new_min_size = writer->min_size + size;
3378
3379 if (new_min_size > writer->allocated)
3380 str = _PyBytesWriter_Resize(writer, str, new_min_size);
3381
3382 writer->min_size = new_min_size;
3383 return str;
3384}
3385
Victor Stinner00165072015-10-09 01:53:21 +02003386/* Allocate the buffer to write size bytes.
3387 Return the pointer to the beginning of buffer data.
3388 Raise an exception and return NULL on error. */
Victor Stinnerc29e29b2015-10-12 13:12:54 +02003389void*
Victor Stinner00165072015-10-09 01:53:21 +02003390_PyBytesWriter_Alloc(_PyBytesWriter *writer, Py_ssize_t size)
3391{
3392 /* ensure that _PyBytesWriter_Alloc() is only called once */
Victor Stinner53926a12015-10-09 12:37:03 +02003393 assert(writer->min_size == 0 && writer->buffer == NULL);
Victor Stinner00165072015-10-09 01:53:21 +02003394 assert(size >= 0);
3395
Victor Stinnerb3653a32015-10-09 03:38:24 +02003396 writer->use_small_buffer = 1;
Victor Stinnerb13b97d2015-10-09 02:52:16 +02003397#ifdef Py_DEBUG
Victor Stinnerb3653a32015-10-09 03:38:24 +02003398 writer->allocated = sizeof(writer->small_buffer) - 1;
Victor Stinnerf6358a72015-10-14 12:02:39 +02003399 /* In debug mode, don't use the full small buffer because it is less
3400 efficient than bytes and bytearray objects to detect buffer underflow
3401 and buffer overflow. Use 10 bytes of the small buffer to test also
3402 code using the smaller buffer in debug mode.
3403
3404 Don't modify the _PyBytesWriter structure (use a shorter small buffer)
3405 in debug mode to also be able to detect stack overflow when running
3406 tests in debug mode. The _PyBytesWriter is large (more than 512 bytes),
3407 if Py_EnterRecursiveCall() is not used in deep C callback, we may hit a
3408 stack overflow. */
3409 writer->allocated = Py_MIN(writer->allocated, 10);
3410 /* _PyBytesWriter_CheckConsistency() requires the last byte to be 0,
3411 to detect buffer overflow */
Victor Stinnerb3653a32015-10-09 03:38:24 +02003412 writer->small_buffer[writer->allocated] = 0;
Victor Stinner00165072015-10-09 01:53:21 +02003413#else
Victor Stinnerb3653a32015-10-09 03:38:24 +02003414 writer->allocated = sizeof(writer->small_buffer);
Victor Stinner00165072015-10-09 01:53:21 +02003415#endif
Victor Stinnerb3653a32015-10-09 03:38:24 +02003416 return _PyBytesWriter_Prepare(writer, writer->small_buffer, size);
Victor Stinner00165072015-10-09 01:53:21 +02003417}
3418
3419PyObject *
Victor Stinnerc29e29b2015-10-12 13:12:54 +02003420_PyBytesWriter_Finish(_PyBytesWriter *writer, void *str)
Victor Stinner00165072015-10-09 01:53:21 +02003421{
Victor Stinner2bf89932015-10-14 11:25:33 +02003422 Py_ssize_t size;
Victor Stinner00165072015-10-09 01:53:21 +02003423 PyObject *result;
3424
3425 _PyBytesWriter_CheckConsistency(writer, str);
3426
Victor Stinner2bf89932015-10-14 11:25:33 +02003427 size = _PyBytesWriter_GetSize(writer, str);
3428 if (size == 0 && !writer->use_bytearray) {
Victor Stinner6c2cdae2015-10-12 13:29:43 +02003429 Py_CLEAR(writer->buffer);
3430 /* Get the empty byte string singleton */
3431 result = PyBytes_FromStringAndSize(NULL, 0);
3432 }
3433 else if (writer->use_small_buffer) {
Victor Stinnere914d412016-04-15 17:52:27 +02003434 if (writer->use_bytearray) {
3435 result = PyByteArray_FromStringAndSize(writer->small_buffer, size);
3436 }
3437 else {
3438 result = PyBytes_FromStringAndSize(writer->small_buffer, size);
3439 }
Victor Stinner6c2cdae2015-10-12 13:29:43 +02003440 }
3441 else {
3442 result = writer->buffer;
3443 writer->buffer = NULL;
3444
Victor Stinner2bf89932015-10-14 11:25:33 +02003445 if (size != writer->allocated) {
Victor Stinner661aacc2015-10-14 09:41:48 +02003446 if (writer->use_bytearray) {
Victor Stinner2bf89932015-10-14 11:25:33 +02003447 if (PyByteArray_Resize(result, size)) {
Victor Stinner661aacc2015-10-14 09:41:48 +02003448 Py_DECREF(result);
3449 return NULL;
3450 }
3451 }
3452 else {
Victor Stinner2bf89932015-10-14 11:25:33 +02003453 if (_PyBytes_Resize(&result, size)) {
Victor Stinner661aacc2015-10-14 09:41:48 +02003454 assert(result == NULL);
3455 return NULL;
3456 }
Victor Stinner00165072015-10-09 01:53:21 +02003457 }
3458 }
Victor Stinner00165072015-10-09 01:53:21 +02003459 }
Victor Stinner00165072015-10-09 01:53:21 +02003460 return result;
3461}
Victor Stinnerce179bf2015-10-09 12:57:22 +02003462
Victor Stinnerc29e29b2015-10-12 13:12:54 +02003463void*
Victor Stinnere9aa5952015-10-12 13:57:47 +02003464_PyBytesWriter_WriteBytes(_PyBytesWriter *writer, void *ptr,
Victor Stinnerc29e29b2015-10-12 13:12:54 +02003465 const void *bytes, Py_ssize_t size)
Victor Stinnerce179bf2015-10-09 12:57:22 +02003466{
Victor Stinnere9aa5952015-10-12 13:57:47 +02003467 char *str = (char *)ptr;
3468
Victor Stinnerce179bf2015-10-09 12:57:22 +02003469 str = _PyBytesWriter_Prepare(writer, str, size);
3470 if (str == NULL)
3471 return NULL;
3472
Christian Heimesf051e432016-09-13 20:22:02 +02003473 memcpy(str, bytes, size);
Victor Stinnerce179bf2015-10-09 12:57:22 +02003474 str += size;
3475
3476 return str;
3477}