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 uint32_t
|
---|
14 | typedef uint32_t ucs4_t;
|
---|
15 | #else
|
---|
16 | typedef unsigned int ucs4_t;
|
---|
17 | #endif
|
---|
18 |
|
---|
19 | #ifdef uint16_t
|
---|
20 | typedef uint16_t ucs2_t, DBCHAR;
|
---|
21 | #else
|
---|
22 | typedef unsigned short ucs2_t, DBCHAR;
|
---|
23 | #endif
|
---|
24 |
|
---|
25 | typedef union {
|
---|
26 | void *p;
|
---|
27 | int i;
|
---|
28 | unsigned char c[8];
|
---|
29 | ucs2_t u2[4];
|
---|
30 | ucs4_t u4[2];
|
---|
31 | } MultibyteCodec_State;
|
---|
32 |
|
---|
33 | typedef int (*mbcodec_init)(const void *config);
|
---|
34 | typedef Py_ssize_t (*mbencode_func)(MultibyteCodec_State *state,
|
---|
35 | const void *config,
|
---|
36 | const Py_UNICODE **inbuf, Py_ssize_t inleft,
|
---|
37 | unsigned char **outbuf, Py_ssize_t outleft,
|
---|
38 | int flags);
|
---|
39 | typedef int (*mbencodeinit_func)(MultibyteCodec_State *state,
|
---|
40 | const void *config);
|
---|
41 | typedef Py_ssize_t (*mbencodereset_func)(MultibyteCodec_State *state,
|
---|
42 | const void *config,
|
---|
43 | unsigned char **outbuf, Py_ssize_t outleft);
|
---|
44 | typedef Py_ssize_t (*mbdecode_func)(MultibyteCodec_State *state,
|
---|
45 | const void *config,
|
---|
46 | const unsigned char **inbuf, Py_ssize_t inleft,
|
---|
47 | Py_UNICODE **outbuf, Py_ssize_t outleft);
|
---|
48 | typedef int (*mbdecodeinit_func)(MultibyteCodec_State *state,
|
---|
49 | const void *config);
|
---|
50 | typedef Py_ssize_t (*mbdecodereset_func)(MultibyteCodec_State *state,
|
---|
51 | const void *config);
|
---|
52 |
|
---|
53 | typedef struct {
|
---|
54 | const char *encoding;
|
---|
55 | const void *config;
|
---|
56 | mbcodec_init codecinit;
|
---|
57 | mbencode_func encode;
|
---|
58 | mbencodeinit_func encinit;
|
---|
59 | mbencodereset_func encreset;
|
---|
60 | mbdecode_func decode;
|
---|
61 | mbdecodeinit_func decinit;
|
---|
62 | mbdecodereset_func decreset;
|
---|
63 | } MultibyteCodec;
|
---|
64 |
|
---|
65 | typedef struct {
|
---|
66 | PyObject_HEAD
|
---|
67 | MultibyteCodec *codec;
|
---|
68 | } MultibyteCodecObject;
|
---|
69 |
|
---|
70 | #define MultibyteCodec_Check(op) ((op)->ob_type == &MultibyteCodec_Type)
|
---|
71 |
|
---|
72 | #define _MultibyteStatefulCodec_HEAD \
|
---|
73 | PyObject_HEAD \
|
---|
74 | MultibyteCodec *codec; \
|
---|
75 | MultibyteCodec_State state; \
|
---|
76 | PyObject *errors;
|
---|
77 | typedef struct {
|
---|
78 | _MultibyteStatefulCodec_HEAD
|
---|
79 | } MultibyteStatefulCodecContext;
|
---|
80 |
|
---|
81 | #define MAXENCPENDING 2
|
---|
82 | #define _MultibyteStatefulEncoder_HEAD \
|
---|
83 | _MultibyteStatefulCodec_HEAD \
|
---|
84 | Py_UNICODE pending[MAXENCPENDING]; \
|
---|
85 | Py_ssize_t pendingsize;
|
---|
86 | typedef struct {
|
---|
87 | _MultibyteStatefulEncoder_HEAD
|
---|
88 | } MultibyteStatefulEncoderContext;
|
---|
89 |
|
---|
90 | #define MAXDECPENDING 8
|
---|
91 | #define _MultibyteStatefulDecoder_HEAD \
|
---|
92 | _MultibyteStatefulCodec_HEAD \
|
---|
93 | unsigned char pending[MAXDECPENDING]; \
|
---|
94 | Py_ssize_t pendingsize;
|
---|
95 | typedef struct {
|
---|
96 | _MultibyteStatefulDecoder_HEAD
|
---|
97 | } MultibyteStatefulDecoderContext;
|
---|
98 |
|
---|
99 | typedef struct {
|
---|
100 | _MultibyteStatefulEncoder_HEAD
|
---|
101 | } MultibyteIncrementalEncoderObject;
|
---|
102 |
|
---|
103 | typedef struct {
|
---|
104 | _MultibyteStatefulDecoder_HEAD
|
---|
105 | } MultibyteIncrementalDecoderObject;
|
---|
106 |
|
---|
107 | typedef struct {
|
---|
108 | _MultibyteStatefulDecoder_HEAD
|
---|
109 | PyObject *stream;
|
---|
110 | } MultibyteStreamReaderObject;
|
---|
111 |
|
---|
112 | typedef struct {
|
---|
113 | _MultibyteStatefulEncoder_HEAD
|
---|
114 | PyObject *stream;
|
---|
115 | } MultibyteStreamWriterObject;
|
---|
116 |
|
---|
117 | /* positive values for illegal sequences */
|
---|
118 | #define MBERR_TOOSMALL (-1) /* insufficient output buffer space */
|
---|
119 | #define MBERR_TOOFEW (-2) /* incomplete input buffer */
|
---|
120 | #define MBERR_INTERNAL (-3) /* internal runtime error */
|
---|
121 |
|
---|
122 | #define ERROR_STRICT (PyObject *)(1)
|
---|
123 | #define ERROR_IGNORE (PyObject *)(2)
|
---|
124 | #define ERROR_REPLACE (PyObject *)(3)
|
---|
125 | #define ERROR_ISCUSTOM(p) ((p) < ERROR_STRICT || ERROR_REPLACE < (p))
|
---|
126 | #define ERROR_DECREF(p) do { \
|
---|
127 | if (p != NULL && ERROR_ISCUSTOM(p)) { \
|
---|
128 | Py_DECREF(p); \
|
---|
129 | } \
|
---|
130 | } while (0);
|
---|
131 |
|
---|
132 | #define MBENC_FLUSH 0x0001 /* encode all characters encodable */
|
---|
133 | #define MBENC_MAX MBENC_FLUSH
|
---|
134 |
|
---|
135 | #ifdef __cplusplus
|
---|
136 | }
|
---|
137 | #endif
|
---|
138 | #endif
|
---|