blob: 4aaa71a832bd78b5e41bf27349c278679216ba3a [file] [log] [blame]
Guido van Rossum4dfe8a12006-04-22 23:28:04 +00001
Georg Brandl0c77a822008-06-10 16:37:50 +00002/* Bytes (String) object interface */
Christian Heimes2c9c7a52008-05-26 13:42:13 +00003
Georg Brandl0c77a822008-06-10 16:37:50 +00004#ifndef Py_BYTESOBJECT_H
5#define Py_BYTESOBJECT_H
Guido van Rossum4dfe8a12006-04-22 23:28:04 +00006#ifdef __cplusplus
7extern "C" {
8#endif
9
10#include <stdarg.h>
11
Christian Heimes2c9c7a52008-05-26 13:42:13 +000012/*
13Type PyBytesObject represents a character string. An extra zero byte is
14reserved at the end to ensure it is zero-terminated, but a size is
15present so strings with null bytes in them can be represented. This
16is an immutable object type.
Guido van Rossum4dfe8a12006-04-22 23:28:04 +000017
Christian Heimes2c9c7a52008-05-26 13:42:13 +000018There are functions to create new string objects, to test
19an object for string-ness, and to get the
20string value. The latter function returns a null pointer
21if the object is not of the proper type.
22There is a variant that takes an explicit size as well as a
23variant that assumes a zero-terminated string. Note that none of the
24functions should be applied to nil objects.
25*/
26
27/* Caching the hash (ob_shash) saves recalculation of a string's hash value.
28 This significantly speeds up dict lookups. */
29
Martin v. Löwis4d0d4712010-12-03 20:14:31 +000030#ifndef Py_LIMITED_API
Guido van Rossum4dfe8a12006-04-22 23:28:04 +000031typedef struct {
32 PyObject_VAR_HEAD
Benjamin Peterson8f67d082010-10-17 20:54:53 +000033 Py_hash_t ob_shash;
Christian Heimes2c9c7a52008-05-26 13:42:13 +000034 char ob_sval[1];
Guido van Rossum4dfe8a12006-04-22 23:28:04 +000035
Christian Heimes2c9c7a52008-05-26 13:42:13 +000036 /* Invariants:
37 * ob_sval contains space for 'ob_size+1' elements.
38 * ob_sval[ob_size] == 0.
39 * ob_shash is the hash of the string or -1 if not computed yet.
40 */
41} PyBytesObject;
Martin v. Löwis4d0d4712010-12-03 20:14:31 +000042#endif
Guido van Rossum4dfe8a12006-04-22 23:28:04 +000043
Christian Heimes2c9c7a52008-05-26 13:42:13 +000044PyAPI_DATA(PyTypeObject) PyBytes_Type;
45PyAPI_DATA(PyTypeObject) PyBytesIter_Type;
Guido van Rossum4dfe8a12006-04-22 23:28:04 +000046
Christian Heimes2c9c7a52008-05-26 13:42:13 +000047#define PyBytes_Check(op) \
48 PyType_FastSubclass(Py_TYPE(op), Py_TPFLAGS_BYTES_SUBCLASS)
49#define PyBytes_CheckExact(op) (Py_TYPE(op) == &PyBytes_Type)
Guido van Rossum4dfe8a12006-04-22 23:28:04 +000050
Christian Heimes2c9c7a52008-05-26 13:42:13 +000051PyAPI_FUNC(PyObject *) PyBytes_FromStringAndSize(const char *, Py_ssize_t);
52PyAPI_FUNC(PyObject *) PyBytes_FromString(const char *);
Benjamin Petersonc15a0732008-08-26 16:46:47 +000053PyAPI_FUNC(PyObject *) PyBytes_FromObject(PyObject *);
Christian Heimes2c9c7a52008-05-26 13:42:13 +000054PyAPI_FUNC(PyObject *) PyBytes_FromFormatV(const char*, va_list)
Serhiy Storchaka598ceae2017-11-28 17:56:10 +020055 Py_GCC_ATTRIBUTE((format(printf, 1, 0)));
Christian Heimes2c9c7a52008-05-26 13:42:13 +000056PyAPI_FUNC(PyObject *) PyBytes_FromFormat(const char*, ...)
Serhiy Storchaka598ceae2017-11-28 17:56:10 +020057 Py_GCC_ATTRIBUTE((format(printf, 1, 2)));
Christian Heimes2c9c7a52008-05-26 13:42:13 +000058PyAPI_FUNC(Py_ssize_t) PyBytes_Size(PyObject *);
59PyAPI_FUNC(char *) PyBytes_AsString(PyObject *);
60PyAPI_FUNC(PyObject *) PyBytes_Repr(PyObject *, int);
61PyAPI_FUNC(void) PyBytes_Concat(PyObject **, PyObject *);
62PyAPI_FUNC(void) PyBytes_ConcatAndDel(PyObject **, PyObject *);
Martin v. Löwis4d0d4712010-12-03 20:14:31 +000063#ifndef Py_LIMITED_API
Christian Heimes2c9c7a52008-05-26 13:42:13 +000064PyAPI_FUNC(int) _PyBytes_Resize(PyObject **, Py_ssize_t);
Victor Stinner772b2b02015-10-14 09:56:53 +020065PyAPI_FUNC(PyObject*) _PyBytes_FormatEx(
66 const char *format,
67 Py_ssize_t format_len,
68 PyObject *args,
69 int use_bytearray);
Victor Stinner2bf89932015-10-14 11:25:33 +020070PyAPI_FUNC(PyObject*) _PyBytes_FromHex(
71 PyObject *string,
72 int use_bytearray);
Martin v. Löwis4d0d4712010-12-03 20:14:31 +000073#endif
Christian Heimes2c9c7a52008-05-26 13:42:13 +000074PyAPI_FUNC(PyObject *) PyBytes_DecodeEscape(const char *, Py_ssize_t,
Serhiy Storchaka598ceae2017-11-28 17:56:10 +020075 const char *, Py_ssize_t,
76 const char *);
Serhiy Storchaka34d0ac82016-12-27 14:57:39 +020077#ifndef Py_LIMITED_API
Eric V. Smith56466482016-10-31 14:46:26 -040078/* Helper for PyBytes_DecodeEscape that detects invalid escape chars. */
79PyAPI_FUNC(PyObject *) _PyBytes_DecodeEscape(const char *, Py_ssize_t,
Greg Price3a4f6672019-09-12 11:12:22 -070080 const char *, const char **);
Serhiy Storchaka34d0ac82016-12-27 14:57:39 +020081#endif
Christian Heimes2c9c7a52008-05-26 13:42:13 +000082
83/* Macro, trading safety for speed */
Martin v. Löwis4d0d4712010-12-03 20:14:31 +000084#ifndef Py_LIMITED_API
Christian Heimes2c9c7a52008-05-26 13:42:13 +000085#define PyBytes_AS_STRING(op) (assert(PyBytes_Check(op)), \
86 (((PyBytesObject *)(op))->ob_sval))
87#define PyBytes_GET_SIZE(op) (assert(PyBytes_Check(op)),Py_SIZE(op))
Martin v. Löwis4d0d4712010-12-03 20:14:31 +000088#endif
Christian Heimes2c9c7a52008-05-26 13:42:13 +000089
90/* _PyBytes_Join(sep, x) is like sep.join(x). sep must be PyBytesObject*,
91 x must be an iterable object. */
Martin v. Löwis4d0d4712010-12-03 20:14:31 +000092#ifndef Py_LIMITED_API
Christian Heimes2c9c7a52008-05-26 13:42:13 +000093PyAPI_FUNC(PyObject *) _PyBytes_Join(PyObject *sep, PyObject *x);
Martin v. Löwis4d0d4712010-12-03 20:14:31 +000094#endif
Christian Heimes2c9c7a52008-05-26 13:42:13 +000095
96/* Provides access to the internal data buffer and size of a string
Martin Panter6245cb32016-04-15 02:14:19 +000097 object or the default encoded version of a Unicode object. Passing
Christian Heimes2c9c7a52008-05-26 13:42:13 +000098 NULL as *len parameter will force the string buffer to be
99 0-terminated (passing a string with embedded NULL characters will
100 cause an exception). */
101PyAPI_FUNC(int) PyBytes_AsStringAndSize(
Antoine Pitrou9ed5f272013-08-13 20:18:52 +0200102 PyObject *obj, /* string or Unicode object */
103 char **s, /* pointer to buffer variable */
104 Py_ssize_t *len /* pointer to length variable or NULL
105 (only possible for 0-terminated
106 strings) */
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000107 );
108
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000109/* Flags used by string formatting */
110#define F_LJUST (1<<0)
Serhiy Storchaka598ceae2017-11-28 17:56:10 +0200111#define F_SIGN (1<<1)
Christian Heimes2c9c7a52008-05-26 13:42:13 +0000112#define F_BLANK (1<<2)
Serhiy Storchaka598ceae2017-11-28 17:56:10 +0200113#define F_ALT (1<<3)
114#define F_ZERO (1<<4)
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000115
Victor Stinner00165072015-10-09 01:53:21 +0200116#ifndef Py_LIMITED_API
Raymond Hettinger15f44ab2016-08-30 10:47:49 -0700117/* The _PyBytesWriter structure is big: it contains an embedded "stack buffer".
Victor Stinner00165072015-10-09 01:53:21 +0200118 A _PyBytesWriter variable must be declared at the end of variables in a
119 function to optimize the memory allocation on the stack. */
120typedef struct {
Victor Stinner661aacc2015-10-14 09:41:48 +0200121 /* bytes, bytearray or NULL (when the small buffer is used) */
Victor Stinner00165072015-10-09 01:53:21 +0200122 PyObject *buffer;
123
Victor Stinner661aacc2015-10-14 09:41:48 +0200124 /* Number of allocated size. */
Victor Stinner00165072015-10-09 01:53:21 +0200125 Py_ssize_t allocated;
126
Victor Stinner53926a12015-10-09 12:37:03 +0200127 /* Minimum number of allocated bytes,
128 incremented by _PyBytesWriter_Prepare() */
129 Py_ssize_t min_size;
Victor Stinner00165072015-10-09 01:53:21 +0200130
Victor Stinner661aacc2015-10-14 09:41:48 +0200131 /* If non-zero, use a bytearray instead of a bytes object for buffer. */
132 int use_bytearray;
133
134 /* If non-zero, overallocate the buffer (default: 0).
135 This flag must be zero if use_bytearray is non-zero. */
Victor Stinner00165072015-10-09 01:53:21 +0200136 int overallocate;
137
138 /* Stack buffer */
Victor Stinnerb3653a32015-10-09 03:38:24 +0200139 int use_small_buffer;
140 char small_buffer[512];
Victor Stinner00165072015-10-09 01:53:21 +0200141} _PyBytesWriter;
142
143/* Initialize a bytes writer
144
145 By default, the overallocation is disabled. Set the overallocate attribute
146 to control the allocation of the buffer. */
147PyAPI_FUNC(void) _PyBytesWriter_Init(_PyBytesWriter *writer);
148
149/* Get the buffer content and reset the writer.
Victor Stinner661aacc2015-10-14 09:41:48 +0200150 Return a bytes object, or a bytearray object if use_bytearray is non-zero.
Victor Stinner00165072015-10-09 01:53:21 +0200151 Raise an exception and return NULL on error. */
152PyAPI_FUNC(PyObject *) _PyBytesWriter_Finish(_PyBytesWriter *writer,
Victor Stinnerc29e29b2015-10-12 13:12:54 +0200153 void *str);
Victor Stinner00165072015-10-09 01:53:21 +0200154
155/* Deallocate memory of a writer (clear its internal buffer). */
156PyAPI_FUNC(void) _PyBytesWriter_Dealloc(_PyBytesWriter *writer);
157
158/* Allocate the buffer to write size bytes.
159 Return the pointer to the beginning of buffer data.
160 Raise an exception and return NULL on error. */
Victor Stinnerc29e29b2015-10-12 13:12:54 +0200161PyAPI_FUNC(void*) _PyBytesWriter_Alloc(_PyBytesWriter *writer,
Victor Stinner00165072015-10-09 01:53:21 +0200162 Py_ssize_t size);
163
Victor Stinnerc5c3ba42015-10-14 13:56:47 +0200164/* Ensure that the buffer is large enough to write *size* bytes.
165 Add size to the writer minimum size (min_size attribute).
166
Victor Stinner00165072015-10-09 01:53:21 +0200167 str is the current pointer inside the buffer.
168 Return the updated current pointer inside the buffer.
169 Raise an exception and return NULL on error. */
Victor Stinnerc29e29b2015-10-12 13:12:54 +0200170PyAPI_FUNC(void*) _PyBytesWriter_Prepare(_PyBytesWriter *writer,
171 void *str,
Victor Stinner00165072015-10-09 01:53:21 +0200172 Py_ssize_t size);
Victor Stinnerce179bf2015-10-09 12:57:22 +0200173
Victor Stinnerc5c3ba42015-10-14 13:56:47 +0200174/* Resize the buffer to make it larger.
175 The new buffer may be larger than size bytes because of overallocation.
176 Return the updated current pointer inside the buffer.
177 Raise an exception and return NULL on error.
178
179 Note: size must be greater than the number of allocated bytes in the writer.
180
181 This function doesn't use the writer minimum size (min_size attribute).
182
183 See also _PyBytesWriter_Prepare().
184 */
185PyAPI_FUNC(void*) _PyBytesWriter_Resize(_PyBytesWriter *writer,
186 void *str,
187 Py_ssize_t size);
188
Victor Stinnerce179bf2015-10-09 12:57:22 +0200189/* Write bytes.
190 Raise an exception and return NULL on error. */
Victor Stinnerc29e29b2015-10-12 13:12:54 +0200191PyAPI_FUNC(void*) _PyBytesWriter_WriteBytes(_PyBytesWriter *writer,
192 void *str,
193 const void *bytes,
Victor Stinnerce179bf2015-10-09 12:57:22 +0200194 Py_ssize_t size);
Victor Stinner00165072015-10-09 01:53:21 +0200195#endif /* Py_LIMITED_API */
196
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000197#ifdef __cplusplus
198}
199#endif
Georg Brandl0c77a822008-06-10 16:37:50 +0000200#endif /* !Py_BYTESOBJECT_H */