bytesobject.h 7.81 KB
Newer Older
1

Georg Brandl's avatar
Georg Brandl committed
2
/* Bytes (String) object interface */
3

Georg Brandl's avatar
Georg Brandl committed
4 5
#ifndef Py_BYTESOBJECT_H
#define Py_BYTESOBJECT_H
6 7 8 9 10 11
#ifdef __cplusplus
extern "C" {
#endif

#include <stdarg.h>

12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
/*
Type PyBytesObject represents a character string.  An extra zero byte is
reserved at the end to ensure it is zero-terminated, but a size is
present so strings with null bytes in them can be represented.  This
is an immutable object type.

There are functions to create new string objects, to test
an object for string-ness, and to get the
string value.  The latter function returns a null pointer
if the object is not of the proper type.
There is a variant that takes an explicit size as well as a
variant that assumes a zero-terminated string.  Note that none of the
functions should be applied to nil objects.
*/

/* Caching the hash (ob_shash) saves recalculation of a string's hash value.
   This significantly speeds up dict lookups. */

30
#ifndef Py_LIMITED_API
31 32
typedef struct {
    PyObject_VAR_HEAD
33
    Py_hash_t ob_shash;
34 35 36 37 38 39 40 41
    char ob_sval[1];

    /* Invariants:
     *     ob_sval contains space for 'ob_size+1' elements.
     *     ob_sval[ob_size] == 0.
     *     ob_shash is the hash of the string or -1 if not computed yet.
     */
} PyBytesObject;
42
#endif
43 44 45 46 47 48 49 50 51 52

PyAPI_DATA(PyTypeObject) PyBytes_Type;
PyAPI_DATA(PyTypeObject) PyBytesIter_Type;

#define PyBytes_Check(op) \
                 PyType_FastSubclass(Py_TYPE(op), Py_TPFLAGS_BYTES_SUBCLASS)
#define PyBytes_CheckExact(op) (Py_TYPE(op) == &PyBytes_Type)

PyAPI_FUNC(PyObject *) PyBytes_FromStringAndSize(const char *, Py_ssize_t);
PyAPI_FUNC(PyObject *) PyBytes_FromString(const char *);
53
PyAPI_FUNC(PyObject *) PyBytes_FromObject(PyObject *);
54 55 56 57 58 59 60 61 62
PyAPI_FUNC(PyObject *) PyBytes_FromFormatV(const char*, va_list)
				Py_GCC_ATTRIBUTE((format(printf, 1, 0)));
PyAPI_FUNC(PyObject *) PyBytes_FromFormat(const char*, ...)
				Py_GCC_ATTRIBUTE((format(printf, 1, 2)));
PyAPI_FUNC(Py_ssize_t) PyBytes_Size(PyObject *);
PyAPI_FUNC(char *) PyBytes_AsString(PyObject *);
PyAPI_FUNC(PyObject *) PyBytes_Repr(PyObject *, int);
PyAPI_FUNC(void) PyBytes_Concat(PyObject **, PyObject *);
PyAPI_FUNC(void) PyBytes_ConcatAndDel(PyObject **, PyObject *);
63
#ifndef Py_LIMITED_API
64
PyAPI_FUNC(int) _PyBytes_Resize(PyObject **, Py_ssize_t);
65 66 67 68 69
PyAPI_FUNC(PyObject*) _PyBytes_FormatEx(
    const char *format,
    Py_ssize_t format_len,
    PyObject *args,
    int use_bytearray);
70 71 72
PyAPI_FUNC(PyObject*) _PyBytes_FromHex(
    PyObject *string,
    int use_bytearray);
73
#endif
74 75 76 77 78
PyAPI_FUNC(PyObject *) PyBytes_DecodeEscape(const char *, Py_ssize_t,
						   const char *, Py_ssize_t,
						   const char *);

/* Macro, trading safety for speed */
79
#ifndef Py_LIMITED_API
80 81 82
#define PyBytes_AS_STRING(op) (assert(PyBytes_Check(op)), \
                                (((PyBytesObject *)(op))->ob_sval))
#define PyBytes_GET_SIZE(op)  (assert(PyBytes_Check(op)),Py_SIZE(op))
83
#endif
84 85 86

/* _PyBytes_Join(sep, x) is like sep.join(x).  sep must be PyBytesObject*,
   x must be an iterable object. */
87
#ifndef Py_LIMITED_API
88
PyAPI_FUNC(PyObject *) _PyBytes_Join(PyObject *sep, PyObject *x);
89
#endif
90 91

/* Provides access to the internal data buffer and size of a string
92
   object or the default encoded version of a Unicode object. Passing
93 94 95 96
   NULL as *len parameter will force the string buffer to be
   0-terminated (passing a string with embedded NULL characters will
   cause an exception).  */
PyAPI_FUNC(int) PyBytes_AsStringAndSize(
97 98 99 100 101
    PyObject *obj,      /* string or Unicode object */
    char **s,           /* pointer to buffer variable */
    Py_ssize_t *len     /* pointer to length variable or NULL
                           (only possible for 0-terminated
                           strings) */
102 103 104 105 106
    );

/* Using the current locale, insert the thousands grouping
   into the string pointed to by buffer.  For the argument descriptions,
   see Objects/stringlib/localeutil.h */
107
#ifndef Py_LIMITED_API
108 109 110 111 112
PyAPI_FUNC(Py_ssize_t) _PyBytes_InsertThousandsGroupingLocale(char *buffer,
                                                   Py_ssize_t n_buffer,
                                                   char *digits,
                                                   Py_ssize_t n_digits,
                                                   Py_ssize_t min_width);
113

114 115 116
/* Using explicit passed-in values, insert the thousands grouping
   into the string pointed to by buffer.  For the argument descriptions,
   see Objects/stringlib/localeutil.h */
117 118 119 120 121 122 123
PyAPI_FUNC(Py_ssize_t) _PyBytes_InsertThousandsGrouping(char *buffer,
                                                   Py_ssize_t n_buffer,
                                                   char *digits,
                                                   Py_ssize_t n_digits,
                                                   Py_ssize_t min_width,
                                                   const char *grouping,
                                                   const char *thousands_sep);
124
#endif
125

126 127 128 129 130 131
/* Flags used by string formatting */
#define F_LJUST (1<<0)
#define F_SIGN	(1<<1)
#define F_BLANK (1<<2)
#define F_ALT	(1<<3)
#define F_ZERO	(1<<4)
132

133
#ifndef Py_LIMITED_API
134
/* The _PyBytesWriter structure is big: it contains an embedded "stack buffer".
135 136 137
   A _PyBytesWriter variable must be declared at the end of variables in a
   function to optimize the memory allocation on the stack. */
typedef struct {
138
    /* bytes, bytearray or NULL (when the small buffer is used) */
139 140
    PyObject *buffer;

141
    /* Number of allocated size. */
142 143
    Py_ssize_t allocated;

144 145 146
    /* Minimum number of allocated bytes,
       incremented by _PyBytesWriter_Prepare() */
    Py_ssize_t min_size;
147

148 149 150 151 152
    /* If non-zero, use a bytearray instead of a bytes object for buffer. */
    int use_bytearray;

    /* If non-zero, overallocate the buffer (default: 0).
       This flag must be zero if use_bytearray is non-zero. */
153 154 155
    int overallocate;

    /* Stack buffer */
156 157
    int use_small_buffer;
    char small_buffer[512];
158 159 160 161 162 163 164 165 166
} _PyBytesWriter;

/* Initialize a bytes writer

   By default, the overallocation is disabled. Set the overallocate attribute
   to control the allocation of the buffer. */
PyAPI_FUNC(void) _PyBytesWriter_Init(_PyBytesWriter *writer);

/* Get the buffer content and reset the writer.
167
   Return a bytes object, or a bytearray object if use_bytearray is non-zero.
168 169
   Raise an exception and return NULL on error. */
PyAPI_FUNC(PyObject *) _PyBytesWriter_Finish(_PyBytesWriter *writer,
170
    void *str);
171 172 173 174 175 176 177

/* Deallocate memory of a writer (clear its internal buffer). */
PyAPI_FUNC(void) _PyBytesWriter_Dealloc(_PyBytesWriter *writer);

/* Allocate the buffer to write size bytes.
   Return the pointer to the beginning of buffer data.
   Raise an exception and return NULL on error. */
178
PyAPI_FUNC(void*) _PyBytesWriter_Alloc(_PyBytesWriter *writer,
179 180
    Py_ssize_t size);

181 182 183
/* Ensure that the buffer is large enough to write *size* bytes.
   Add size to the writer minimum size (min_size attribute).

184 185 186
   str is the current pointer inside the buffer.
   Return the updated current pointer inside the buffer.
   Raise an exception and return NULL on error. */
187 188
PyAPI_FUNC(void*) _PyBytesWriter_Prepare(_PyBytesWriter *writer,
    void *str,
189
    Py_ssize_t size);
190

191 192 193 194 195 196 197 198 199 200 201 202 203 204 205
/* Resize the buffer to make it larger.
   The new buffer may be larger than size bytes because of overallocation.
   Return the updated current pointer inside the buffer.
   Raise an exception and return NULL on error.

   Note: size must be greater than the number of allocated bytes in the writer.

   This function doesn't use the writer minimum size (min_size attribute).

   See also _PyBytesWriter_Prepare().
   */
PyAPI_FUNC(void*) _PyBytesWriter_Resize(_PyBytesWriter *writer,
    void *str,
    Py_ssize_t size);

206 207
/* Write bytes.
   Raise an exception and return NULL on error. */
208 209 210
PyAPI_FUNC(void*) _PyBytesWriter_WriteBytes(_PyBytesWriter *writer,
    void *str,
    const void *bytes,
211
    Py_ssize_t size);
212 213
#endif   /* Py_LIMITED_API */

214 215 216
#ifdef __cplusplus
}
#endif
Georg Brandl's avatar
Georg Brandl committed
217
#endif /* !Py_BYTESOBJECT_H */