blob: 1b6ef55855f558c3dde6c75631cf278d73334245 [file] [log] [blame]
Hye-Shik Chang3e2a3062004-01-17 14:29:29 +00001/*
2 * multibytecodec.h: Common Multibyte Codec Implementation
3 *
4 * Written by Hye-Shik Chang <perky@FreeBSD.org>
Hye-Shik Chang3e2a3062004-01-17 14:29:29 +00005 */
6
7#ifndef _PYTHON_MULTIBYTECODEC_H_
8#define _PYTHON_MULTIBYTECODEC_H_
9#ifdef __cplusplus
10extern "C" {
11#endif
12
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +000013#ifdef uint32_t
14typedef uint32_t ucs4_t;
15#else
16typedef unsigned int ucs4_t;
17#endif
18
19#ifdef uint16_t
20typedef uint16_t ucs2_t, DBCHAR;
21#else
22typedef unsigned short ucs2_t, DBCHAR;
23#endif
Hye-Shik Chang3e2a3062004-01-17 14:29:29 +000024
25typedef union {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000026 void *p;
27 int i;
28 unsigned char c[8];
29 ucs2_t u2[4];
30 ucs4_t u4[2];
Hye-Shik Chang3e2a3062004-01-17 14:29:29 +000031} MultibyteCodec_State;
32
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +000033typedef int (*mbcodec_init)(const void *config);
Hye-Shik Chang4b96c132006-03-04 16:08:19 +000034typedef Py_ssize_t (*mbencode_func)(MultibyteCodec_State *state,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000035 const void *config,
36 const Py_UNICODE **inbuf, Py_ssize_t inleft,
37 unsigned char **outbuf, Py_ssize_t outleft,
38 int flags);
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +000039typedef int (*mbencodeinit_func)(MultibyteCodec_State *state,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000040 const void *config);
Hye-Shik Chang4b96c132006-03-04 16:08:19 +000041typedef Py_ssize_t (*mbencodereset_func)(MultibyteCodec_State *state,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000042 const void *config,
43 unsigned char **outbuf, Py_ssize_t outleft);
Hye-Shik Chang4b96c132006-03-04 16:08:19 +000044typedef Py_ssize_t (*mbdecode_func)(MultibyteCodec_State *state,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000045 const void *config,
46 const unsigned char **inbuf, Py_ssize_t inleft,
47 Py_UNICODE **outbuf, Py_ssize_t outleft);
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +000048typedef int (*mbdecodeinit_func)(MultibyteCodec_State *state,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000049 const void *config);
Hye-Shik Chang4b96c132006-03-04 16:08:19 +000050typedef Py_ssize_t (*mbdecodereset_func)(MultibyteCodec_State *state,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000051 const void *config);
Hye-Shik Chang3e2a3062004-01-17 14:29:29 +000052
53typedef struct {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000054 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;
Hye-Shik Chang3e2a3062004-01-17 14:29:29 +000063} MultibyteCodec;
64
65typedef struct {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000066 PyObject_HEAD
67 MultibyteCodec *codec;
Hye-Shik Chang3e2a3062004-01-17 14:29:29 +000068} MultibyteCodecObject;
69
Thomas Wouters49fd7fa2006-04-21 10:40:58 +000070#define MultibyteCodec_Check(op) ((op)->ob_type == &MultibyteCodec_Type)
71
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000072#define _MultibyteStatefulCodec_HEAD \
73 PyObject_HEAD \
74 MultibyteCodec *codec; \
75 MultibyteCodec_State state; \
76 PyObject *errors;
Hye-Shik Chang3e2a3062004-01-17 14:29:29 +000077typedef struct {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000078 _MultibyteStatefulCodec_HEAD
Thomas Wouters49fd7fa2006-04-21 10:40:58 +000079} MultibyteStatefulCodecContext;
Hye-Shik Chang3e2a3062004-01-17 14:29:29 +000080
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000081#define MAXENCPENDING 2
82#define _MultibyteStatefulEncoder_HEAD \
83 _MultibyteStatefulCodec_HEAD \
84 Py_UNICODE pending[MAXENCPENDING]; \
85 Py_ssize_t pendingsize;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +000086typedef struct {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000087 _MultibyteStatefulEncoder_HEAD
Thomas Wouters49fd7fa2006-04-21 10:40:58 +000088} MultibyteStatefulEncoderContext;
89
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000090#define MAXDECPENDING 8
91#define _MultibyteStatefulDecoder_HEAD \
92 _MultibyteStatefulCodec_HEAD \
93 unsigned char pending[MAXDECPENDING]; \
94 Py_ssize_t pendingsize;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +000095typedef struct {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000096 _MultibyteStatefulDecoder_HEAD
Thomas Wouters49fd7fa2006-04-21 10:40:58 +000097} MultibyteStatefulDecoderContext;
98
99typedef struct {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000100 _MultibyteStatefulEncoder_HEAD
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000101} MultibyteIncrementalEncoderObject;
102
103typedef struct {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000104 _MultibyteStatefulDecoder_HEAD
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000105} MultibyteIncrementalDecoderObject;
106
107typedef struct {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000108 _MultibyteStatefulDecoder_HEAD
109 PyObject *stream;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000110} MultibyteStreamReaderObject;
111
112typedef struct {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000113 _MultibyteStatefulEncoder_HEAD
114 PyObject *stream;
Hye-Shik Chang3e2a3062004-01-17 14:29:29 +0000115} MultibyteStreamWriterObject;
116
117/* positive values for illegal sequences */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000118#define MBERR_TOOSMALL (-1) /* insufficient output buffer space */
119#define MBERR_TOOFEW (-2) /* incomplete input buffer */
120#define MBERR_INTERNAL (-3) /* internal runtime error */
Hye-Shik Chang3e2a3062004-01-17 14:29:29 +0000121
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000122#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 } \
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000130} while (0);
Hye-Shik Chang3e2a3062004-01-17 14:29:29 +0000131
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000132#define MBENC_FLUSH 0x0001 /* encode all characters encodable */
133#define MBENC_MAX MBENC_FLUSH
Hye-Shik Chang3e2a3062004-01-17 14:29:29 +0000134
Benjamin Petersonb173f782009-05-05 22:31:58 +0000135#define PyMultibyteCodec_CAPSULE_NAME "multibytecodec.__map_*"
136
137
Hye-Shik Chang3e2a3062004-01-17 14:29:29 +0000138#ifdef __cplusplus
139}
140#endif
141#endif