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