1 
2 /* Bytes (String) object interface */
3 
4 #ifndef Py_BYTESOBJECT_H
5 #define Py_BYTESOBJECT_H
6 #ifdef __cplusplus
7 extern "C" {
8 #endif
9 
10 #include <stdarg.h>
11 
12 /*
13 Type PyBytesObject represents a character string.  An extra zero byte is
14 reserved at the end to ensure it is zero-terminated, but a size is
15 present so strings with null bytes in them can be represented.  This
16 is an immutable object type.
17 
18 There are functions to create new string objects, to test
19 an object for string-ness, and to get the
20 string value.  The latter function returns a null pointer
21 if the object is not of the proper type.
22 There is a variant that takes an explicit size as well as a
23 variant that assumes a zero-terminated string.  Note that none of the
24 functions 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 
30 #ifndef Py_LIMITED_API
31 typedef struct {
32     PyObject_VAR_HEAD
33     Py_hash_t ob_shash;
34     char ob_sval[1];
35 
36     /* 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;
42 #endif
43 
44 PyAPI_DATA(PyTypeObject) PyBytes_Type;
45 PyAPI_DATA(PyTypeObject) PyBytesIter_Type;
46 
47 #define PyBytes_Check(op) \
48                  PyType_FastSubclass(Py_TYPE(op), Py_TPFLAGS_BYTES_SUBCLASS)
49 #define PyBytes_CheckExact(op) (Py_TYPE(op) == &PyBytes_Type)
50 
51 PyAPI_FUNC(PyObject *) PyBytes_FromStringAndSize(const char *, Py_ssize_t);
52 PyAPI_FUNC(PyObject *) PyBytes_FromString(const char *);
53 PyAPI_FUNC(PyObject *) PyBytes_FromObject(PyObject *);
54 PyAPI_FUNC(PyObject *) PyBytes_FromFormatV(const char*, va_list)
55                                 Py_GCC_ATTRIBUTE((format(printf, 1, 0)));
56 PyAPI_FUNC(PyObject *) PyBytes_FromFormat(const char*, ...)
57                                 Py_GCC_ATTRIBUTE((format(printf, 1, 2)));
58 PyAPI_FUNC(Py_ssize_t) PyBytes_Size(PyObject *);
59 PyAPI_FUNC(char *) PyBytes_AsString(PyObject *);
60 PyAPI_FUNC(PyObject *) PyBytes_Repr(PyObject *, int);
61 PyAPI_FUNC(void) PyBytes_Concat(PyObject **, PyObject *);
62 PyAPI_FUNC(void) PyBytes_ConcatAndDel(PyObject **, PyObject *);
63 #ifndef Py_LIMITED_API
64 PyAPI_FUNC(int) _PyBytes_Resize(PyObject **, Py_ssize_t);
65 PyAPI_FUNC(PyObject*) _PyBytes_FormatEx(
66     const char *format,
67     Py_ssize_t format_len,
68     PyObject *args,
69     int use_bytearray);
70 PyAPI_FUNC(PyObject*) _PyBytes_FromHex(
71     PyObject *string,
72     int use_bytearray);
73 #endif
74 PyAPI_FUNC(PyObject *) PyBytes_DecodeEscape(const char *, Py_ssize_t,
75                                             const char *, Py_ssize_t,
76                                             const char *);
77 #ifndef Py_LIMITED_API
78 /* Helper for PyBytes_DecodeEscape that detects invalid escape chars. */
79 PyAPI_FUNC(PyObject *) _PyBytes_DecodeEscape(const char *, Py_ssize_t,
80                                              const char *, Py_ssize_t,
81                                              const char *,
82                                              const char **);
83 #endif
84 
85 /* Macro, trading safety for speed */
86 #ifndef Py_LIMITED_API
87 #define PyBytes_AS_STRING(op) (assert(PyBytes_Check(op)), \
88                                 (((PyBytesObject *)(op))->ob_sval))
89 #define PyBytes_GET_SIZE(op)  (assert(PyBytes_Check(op)),Py_SIZE(op))
90 #endif
91 
92 /* _PyBytes_Join(sep, x) is like sep.join(x).  sep must be PyBytesObject*,
93    x must be an iterable object. */
94 #ifndef Py_LIMITED_API
95 PyAPI_FUNC(PyObject *) _PyBytes_Join(PyObject *sep, PyObject *x);
96 #endif
97 
98 /* Provides access to the internal data buffer and size of a string
99    object or the default encoded version of a Unicode object. Passing
100    NULL as *len parameter will force the string buffer to be
101    0-terminated (passing a string with embedded NULL characters will
102    cause an exception).  */
103 PyAPI_FUNC(int) PyBytes_AsStringAndSize(
104     PyObject *obj,      /* string or Unicode object */
105     char **s,           /* pointer to buffer variable */
106     Py_ssize_t *len     /* pointer to length variable or NULL
107                            (only possible for 0-terminated
108                            strings) */
109     );
110 
111 /* Using the current locale, insert the thousands grouping
112    into the string pointed to by buffer.  For the argument descriptions,
113    see Objects/stringlib/localeutil.h */
114 #ifndef Py_LIMITED_API
115 PyAPI_FUNC(Py_ssize_t) _PyBytes_InsertThousandsGroupingLocale(char *buffer,
116                                                    Py_ssize_t n_buffer,
117                                                    char *digits,
118                                                    Py_ssize_t n_digits,
119                                                    Py_ssize_t min_width);
120 
121 /* Using explicit passed-in values, insert the thousands grouping
122    into the string pointed to by buffer.  For the argument descriptions,
123    see Objects/stringlib/localeutil.h */
124 PyAPI_FUNC(Py_ssize_t) _PyBytes_InsertThousandsGrouping(char *buffer,
125                                                    Py_ssize_t n_buffer,
126                                                    char *digits,
127                                                    Py_ssize_t n_digits,
128                                                    Py_ssize_t min_width,
129                                                    const char *grouping,
130                                                    const char *thousands_sep);
131 #endif
132 
133 /* Flags used by string formatting */
134 #define F_LJUST (1<<0)
135 #define F_SIGN  (1<<1)
136 #define F_BLANK (1<<2)
137 #define F_ALT   (1<<3)
138 #define F_ZERO  (1<<4)
139 
140 #ifndef Py_LIMITED_API
141 /* The _PyBytesWriter structure is big: it contains an embedded "stack buffer".
142    A _PyBytesWriter variable must be declared at the end of variables in a
143    function to optimize the memory allocation on the stack. */
144 typedef struct {
145     /* bytes, bytearray or NULL (when the small buffer is used) */
146     PyObject *buffer;
147 
148     /* Number of allocated size. */
149     Py_ssize_t allocated;
150 
151     /* Minimum number of allocated bytes,
152        incremented by _PyBytesWriter_Prepare() */
153     Py_ssize_t min_size;
154 
155     /* If non-zero, use a bytearray instead of a bytes object for buffer. */
156     int use_bytearray;
157 
158     /* If non-zero, overallocate the buffer (default: 0).
159        This flag must be zero if use_bytearray is non-zero. */
160     int overallocate;
161 
162     /* Stack buffer */
163     int use_small_buffer;
164     char small_buffer[512];
165 } _PyBytesWriter;
166 
167 /* Initialize a bytes writer
168 
169    By default, the overallocation is disabled. Set the overallocate attribute
170    to control the allocation of the buffer. */
171 PyAPI_FUNC(void) _PyBytesWriter_Init(_PyBytesWriter *writer);
172 
173 /* Get the buffer content and reset the writer.
174    Return a bytes object, or a bytearray object if use_bytearray is non-zero.
175    Raise an exception and return NULL on error. */
176 PyAPI_FUNC(PyObject *) _PyBytesWriter_Finish(_PyBytesWriter *writer,
177     void *str);
178 
179 /* Deallocate memory of a writer (clear its internal buffer). */
180 PyAPI_FUNC(void) _PyBytesWriter_Dealloc(_PyBytesWriter *writer);
181 
182 /* Allocate the buffer to write size bytes.
183    Return the pointer to the beginning of buffer data.
184    Raise an exception and return NULL on error. */
185 PyAPI_FUNC(void*) _PyBytesWriter_Alloc(_PyBytesWriter *writer,
186     Py_ssize_t size);
187 
188 /* Ensure that the buffer is large enough to write *size* bytes.
189    Add size to the writer minimum size (min_size attribute).
190 
191    str is the current pointer inside the buffer.
192    Return the updated current pointer inside the buffer.
193    Raise an exception and return NULL on error. */
194 PyAPI_FUNC(void*) _PyBytesWriter_Prepare(_PyBytesWriter *writer,
195     void *str,
196     Py_ssize_t size);
197 
198 /* Resize the buffer to make it larger.
199    The new buffer may be larger than size bytes because of overallocation.
200    Return the updated current pointer inside the buffer.
201    Raise an exception and return NULL on error.
202 
203    Note: size must be greater than the number of allocated bytes in the writer.
204 
205    This function doesn't use the writer minimum size (min_size attribute).
206 
207    See also _PyBytesWriter_Prepare().
208    */
209 PyAPI_FUNC(void*) _PyBytesWriter_Resize(_PyBytesWriter *writer,
210     void *str,
211     Py_ssize_t size);
212 
213 /* Write bytes.
214    Raise an exception and return NULL on error. */
215 PyAPI_FUNC(void*) _PyBytesWriter_WriteBytes(_PyBytesWriter *writer,
216     void *str,
217     const void *bytes,
218     Py_ssize_t size);
219 #endif   /* Py_LIMITED_API */
220 
221 #ifdef __cplusplus
222 }
223 #endif
224 #endif /* !Py_BYTESOBJECT_H */
225