Guido van Rossum | 4dfe8a1 | 2006-04-22 23:28:04 +0000 | [diff] [blame] | 1 | /* Bytes object interface */ |
| 2 | |
| 3 | #ifndef Py_BYTESOBJECT_H |
| 4 | #define Py_BYTESOBJECT_H |
| 5 | #ifdef __cplusplus |
| 6 | extern "C" { |
| 7 | #endif |
| 8 | |
| 9 | #include <stdarg.h> |
| 10 | |
| 11 | /* Type PyBytesObject represents a mutable array of bytes. |
| 12 | * The Python API is that of a sequence; |
| 13 | * the bytes are mapped to ints in [0, 256). |
| 14 | * Bytes are not characters; they may be used to encode characters. |
| 15 | * The only way to go between bytes and str/unicode is via encoding |
| 16 | * and decoding. |
Neal Norwitz | 1978470 | 2007-08-25 05:22:02 +0000 | [diff] [blame] | 17 | * For the convenience of C programmers, the bytes type is considered |
Guido van Rossum | 4dfe8a1 | 2006-04-22 23:28:04 +0000 | [diff] [blame] | 18 | * to contain a char pointer, not an unsigned char pointer. |
| 19 | */ |
| 20 | |
| 21 | /* Object layout */ |
| 22 | typedef struct { |
| 23 | PyObject_VAR_HEAD |
Neal Norwitz | faa54a3 | 2007-08-19 04:23:20 +0000 | [diff] [blame] | 24 | /* XXX(nnorwitz): should ob_exports be Py_ssize_t? */ |
Travis E. Oliphant | b99f762 | 2007-08-18 11:21:56 +0000 | [diff] [blame] | 25 | int ob_exports; /* how many buffer exports */ |
Guido van Rossum | a0867f7 | 2006-05-05 04:34:18 +0000 | [diff] [blame] | 26 | Py_ssize_t ob_alloc; /* How many bytes allocated */ |
Guido van Rossum | d624f18 | 2006-04-24 13:47:05 +0000 | [diff] [blame] | 27 | char *ob_bytes; |
Guido van Rossum | 4dfe8a1 | 2006-04-22 23:28:04 +0000 | [diff] [blame] | 28 | } PyBytesObject; |
| 29 | |
| 30 | /* Type object */ |
| 31 | PyAPI_DATA(PyTypeObject) PyBytes_Type; |
Christian Heimes | a22e8bd | 2007-11-29 22:35:39 +0000 | [diff] [blame] | 32 | PyAPI_DATA(PyTypeObject) PyBytesIter_Type; |
Guido van Rossum | 4dfe8a1 | 2006-04-22 23:28:04 +0000 | [diff] [blame] | 33 | |
| 34 | /* Type check macros */ |
| 35 | #define PyBytes_Check(self) PyObject_TypeCheck(self, &PyBytes_Type) |
Christian Heimes | 90aa764 | 2007-12-19 02:45:37 +0000 | [diff] [blame^] | 36 | #define PyBytes_CheckExact(self) (Py_TYPE(self) == &PyBytes_Type) |
Guido van Rossum | 4dfe8a1 | 2006-04-22 23:28:04 +0000 | [diff] [blame] | 37 | |
| 38 | /* Direct API functions */ |
Guido van Rossum | d624f18 | 2006-04-24 13:47:05 +0000 | [diff] [blame] | 39 | PyAPI_FUNC(PyObject *) PyBytes_FromObject(PyObject *); |
Guido van Rossum | ad7d8d1 | 2007-04-13 01:39:34 +0000 | [diff] [blame] | 40 | PyAPI_FUNC(PyObject *) PyBytes_Concat(PyObject *, PyObject *); |
Guido van Rossum | 4dfe8a1 | 2006-04-22 23:28:04 +0000 | [diff] [blame] | 41 | PyAPI_FUNC(PyObject *) PyBytes_FromStringAndSize(const char *, Py_ssize_t); |
| 42 | PyAPI_FUNC(Py_ssize_t) PyBytes_Size(PyObject *); |
| 43 | PyAPI_FUNC(char *) PyBytes_AsString(PyObject *); |
| 44 | PyAPI_FUNC(int) PyBytes_Resize(PyObject *, Py_ssize_t); |
| 45 | |
| 46 | /* Macros, trading safety for speed */ |
Guido van Rossum | 2d28f59 | 2007-06-14 00:31:21 +0000 | [diff] [blame] | 47 | #define PyBytes_AS_STRING(self) (assert(PyBytes_Check(self)),((PyBytesObject *)(self))->ob_bytes) |
Christian Heimes | 90aa764 | 2007-12-19 02:45:37 +0000 | [diff] [blame^] | 48 | #define PyBytes_GET_SIZE(self) (assert(PyBytes_Check(self)),Py_SIZE(self)) |
Guido van Rossum | 4dfe8a1 | 2006-04-22 23:28:04 +0000 | [diff] [blame] | 49 | |
| 50 | #ifdef __cplusplus |
| 51 | } |
| 52 | #endif |
| 53 | #endif /* !Py_BYTESOBJECT_H */ |