2
* multibytecodec.h: Common Multibyte Codec Implementation
4
* Written by Hye-Shik Chang <perky@FreeBSD.org>
7
#ifndef _PYTHON_MULTIBYTECODEC_H_
8
#define _PYTHON_MULTIBYTECODEC_H_
14
typedef uint16_t ucs2_t, DBCHAR;
16
typedef unsigned short ucs2_t, DBCHAR;
25
} MultibyteCodec_State;
27
typedef int (*mbcodec_init)(const void *config);
28
typedef Py_ssize_t (*mbencode_func)(MultibyteCodec_State *state,
31
Py_ssize_t *inpos, Py_ssize_t inlen,
32
unsigned char **outbuf, Py_ssize_t outleft,
34
typedef int (*mbencodeinit_func)(MultibyteCodec_State *state,
36
typedef Py_ssize_t (*mbencodereset_func)(MultibyteCodec_State *state,
38
unsigned char **outbuf, Py_ssize_t outleft);
39
typedef Py_ssize_t (*mbdecode_func)(MultibyteCodec_State *state,
41
const unsigned char **inbuf, Py_ssize_t inleft,
42
_PyUnicodeWriter *writer);
43
typedef int (*mbdecodeinit_func)(MultibyteCodec_State *state,
45
typedef Py_ssize_t (*mbdecodereset_func)(MultibyteCodec_State *state,
51
mbcodec_init codecinit;
53
mbencodeinit_func encinit;
54
mbencodereset_func encreset;
56
mbdecodeinit_func decinit;
57
mbdecodereset_func decreset;
62
MultibyteCodec *codec;
63
} MultibyteCodecObject;
65
#define MultibyteCodec_Check(op) ((op)->ob_type == &MultibyteCodec_Type)
67
#define _MultibyteStatefulCodec_HEAD \
69
MultibyteCodec *codec; \
70
MultibyteCodec_State state; \
73
_MultibyteStatefulCodec_HEAD
74
} MultibyteStatefulCodecContext;
76
#define MAXENCPENDING 2
77
#define _MultibyteStatefulEncoder_HEAD \
78
_MultibyteStatefulCodec_HEAD \
81
_MultibyteStatefulEncoder_HEAD
82
} MultibyteStatefulEncoderContext;
84
#define MAXDECPENDING 8
85
#define _MultibyteStatefulDecoder_HEAD \
86
_MultibyteStatefulCodec_HEAD \
87
unsigned char pending[MAXDECPENDING]; \
88
Py_ssize_t pendingsize;
90
_MultibyteStatefulDecoder_HEAD
91
} MultibyteStatefulDecoderContext;
94
_MultibyteStatefulEncoder_HEAD
95
} MultibyteIncrementalEncoderObject;
98
_MultibyteStatefulDecoder_HEAD
99
} MultibyteIncrementalDecoderObject;
102
_MultibyteStatefulDecoder_HEAD
104
} MultibyteStreamReaderObject;
107
_MultibyteStatefulEncoder_HEAD
109
} MultibyteStreamWriterObject;
111
/* positive values for illegal sequences */
112
#define MBERR_TOOSMALL (-1) /* insufficient output buffer space */
113
#define MBERR_TOOFEW (-2) /* incomplete input buffer */
114
#define MBERR_INTERNAL (-3) /* internal runtime error */
115
#define MBERR_EXCEPTION (-4) /* an exception has been raised */
117
#define ERROR_STRICT (PyObject *)(1)
118
#define ERROR_IGNORE (PyObject *)(2)
119
#define ERROR_REPLACE (PyObject *)(3)
120
#define ERROR_ISCUSTOM(p) ((p) < ERROR_STRICT || ERROR_REPLACE < (p))
121
#define ERROR_DECREF(p) \
123
if (p != NULL && ERROR_ISCUSTOM(p)) \
127
#define MBENC_FLUSH 0x0001 /* encode all characters encodable */
128
#define MBENC_MAX MBENC_FLUSH
130
#define PyMultibyteCodec_CAPSULE_NAME "multibytecodec.__map_*"