1 /*
2 * multibytecodec.h: Common Multibyte Codec Implementation
3 *
4 * Written by Hye-Shik Chang <perky@FreeBSD.org>
5 */
6
7 #ifndef _PYTHON_MULTIBYTECODEC_H_
8 #define _PYTHON_MULTIBYTECODEC_H_
9 #ifdef __cplusplus
10 extern "C" {
11 #endif
12
13 #ifdef uint16_t
14 typedef uint16_t ucs2_t, DBCHAR;
15 #else
16 typedef unsigned short ucs2_t, DBCHAR;
17 #endif
18
19 /*
20 * A struct that provides 8 bytes of state for multibyte
21 * codecs. Codecs are free to use this how they want. Note: if you
22 * need to add a new field to this struct, ensure that its byte order
23 * is independent of CPU endianness so that the return value of
24 * getstate doesn't differ between little and big endian CPUs.
25 */
26 typedef struct {
27 unsigned char c[8];
28 } MultibyteCodec_State;
29
30 struct _cjk_mod_state;
31 struct _multibyte_codec;
32
33 typedef int (*mbcodec_init)(const struct _multibyte_codec *codec);
34 typedef Py_ssize_t (*mbencode_func)(MultibyteCodec_State *state,
35 const struct _multibyte_codec *codec,
36 int kind, const void *data,
37 Py_ssize_t *inpos, Py_ssize_t inlen,
38 unsigned char **outbuf, Py_ssize_t outleft,
39 int flags);
40 typedef int (*mbencodeinit_func)(MultibyteCodec_State *state,
41 const struct _multibyte_codec *codec);
42 typedef Py_ssize_t (*mbencodereset_func)(MultibyteCodec_State *state,
43 const struct _multibyte_codec *codec,
44 unsigned char **outbuf, Py_ssize_t outleft);
45 typedef Py_ssize_t (*mbdecode_func)(MultibyteCodec_State *state,
46 const struct _multibyte_codec *codec,
47 const unsigned char **inbuf, Py_ssize_t inleft,
48 _PyUnicodeWriter *writer);
49 typedef int (*mbdecodeinit_func)(MultibyteCodec_State *state,
50 const struct _multibyte_codec *codec);
51 typedef Py_ssize_t (*mbdecodereset_func)(MultibyteCodec_State *state,
52 const struct _multibyte_codec *codec);
53
54 typedef struct _multibyte_codec {
55 const char *encoding;
56 const void *config;
57 mbcodec_init codecinit;
58 mbencode_func encode;
59 mbencodeinit_func encinit;
60 mbencodereset_func encreset;
61 mbdecode_func decode;
62 mbdecodeinit_func decinit;
63 mbdecodereset_func decreset;
64 struct _cjk_mod_state *modstate;
65 } MultibyteCodec;
66
67 typedef struct {
68 PyObject_HEAD
69 const MultibyteCodec *codec;
70 PyObject *cjk_module;
71 } MultibyteCodecObject;
72
73 #define MultibyteCodec_Check(state, op) Py_IS_TYPE((op), state->multibytecodec_type)
74
75 #define _MultibyteStatefulCodec_HEAD \
76 PyObject_HEAD \
77 const MultibyteCodec *codec; \
78 MultibyteCodec_State state; \
79 PyObject *errors;
80 typedef struct {
81 _MultibyteStatefulCodec_HEAD
82 } MultibyteStatefulCodecContext;
83
84 #define MAXENCPENDING 2
85 #define _MultibyteStatefulEncoder_HEAD \
86 _MultibyteStatefulCodec_HEAD \
87 PyObject *pending;
88 typedef struct {
89 _MultibyteStatefulEncoder_HEAD
90 } MultibyteStatefulEncoderContext;
91
92 #define MAXDECPENDING 8
93 #define _MultibyteStatefulDecoder_HEAD \
94 _MultibyteStatefulCodec_HEAD \
95 unsigned char pending[MAXDECPENDING]; \
96 Py_ssize_t pendingsize;
97 typedef struct {
98 _MultibyteStatefulDecoder_HEAD
99 } MultibyteStatefulDecoderContext;
100
101 typedef struct {
102 _MultibyteStatefulEncoder_HEAD
103 } MultibyteIncrementalEncoderObject;
104
105 typedef struct {
106 _MultibyteStatefulDecoder_HEAD
107 } MultibyteIncrementalDecoderObject;
108
109 typedef struct {
110 _MultibyteStatefulDecoder_HEAD
111 PyObject *stream;
112 } MultibyteStreamReaderObject;
113
114 typedef struct {
115 _MultibyteStatefulEncoder_HEAD
116 PyObject *stream;
117 } MultibyteStreamWriterObject;
118
119 /* positive values for illegal sequences */
120 #define MBERR_TOOSMALL (-1) /* insufficient output buffer space */
121 #define MBERR_TOOFEW (-2) /* incomplete input buffer */
122 #define MBERR_INTERNAL (-3) /* internal runtime error */
123 #define MBERR_EXCEPTION (-4) /* an exception has been raised */
124
125 #define ERROR_STRICT (PyObject *)(1)
126 #define ERROR_IGNORE (PyObject *)(2)
127 #define ERROR_REPLACE (PyObject *)(3)
128 #define ERROR_ISCUSTOM(p) ((p) < ERROR_STRICT || ERROR_REPLACE < (p))
129 #define ERROR_DECREF(p) \
130 do { \
131 if (p != NULL && ERROR_ISCUSTOM(p)) \
132 Py_DECREF(p); \
133 } while (0);
134
135 #define MBENC_FLUSH 0x0001 /* encode all characters encodable */
136 #define MBENC_MAX MBENC_FLUSH
137
138 typedef struct {
139 const MultibyteCodec *codec;
140 PyObject *cjk_module;
141 } codec_capsule;
142
143 #define MAP_CAPSULE "multibytecodec.map"
144 #define CODEC_CAPSULE "multibytecodec.codec"
145
146
147 #ifdef __cplusplus
148 }
149 #endif
150 #endif