blob: 5b8c22276b4b9921cadb2804399a8ea092a0f9f9 [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 uint16_t
14typedef uint16_t ucs2_t, DBCHAR;
15#else
16typedef unsigned short ucs2_t, DBCHAR;
17#endif
Hye-Shik Chang3e2a3062004-01-17 14:29:29 +000018
19typedef union {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000020 void *p;
21 int i;
22 unsigned char c[8];
23 ucs2_t u2[4];
Victor Stinnera0dd0212013-04-11 22:09:04 +020024 Py_UCS4 u4[2];
Hye-Shik Chang3e2a3062004-01-17 14:29:29 +000025} MultibyteCodec_State;
26
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +000027typedef int (*mbcodec_init)(const void *config);
Hye-Shik Chang4b96c132006-03-04 16:08:19 +000028typedef Py_ssize_t (*mbencode_func)(MultibyteCodec_State *state,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000029 const void *config,
Victor Stinnerd9491262013-04-14 02:06:32 +020030 int kind, void *data,
31 Py_ssize_t *inpos, Py_ssize_t inlen,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000032 unsigned char **outbuf, Py_ssize_t outleft,
33 int flags);
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +000034typedef int (*mbencodeinit_func)(MultibyteCodec_State *state,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000035 const void *config);
Hye-Shik Chang4b96c132006-03-04 16:08:19 +000036typedef Py_ssize_t (*mbencodereset_func)(MultibyteCodec_State *state,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000037 const void *config,
38 unsigned char **outbuf, Py_ssize_t outleft);
Hye-Shik Chang4b96c132006-03-04 16:08:19 +000039typedef Py_ssize_t (*mbdecode_func)(MultibyteCodec_State *state,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000040 const void *config,
41 const unsigned char **inbuf, Py_ssize_t inleft,
Victor Stinnera0dd0212013-04-11 22:09:04 +020042 _PyUnicodeWriter *writer);
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +000043typedef int (*mbdecodeinit_func)(MultibyteCodec_State *state,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000044 const void *config);
Hye-Shik Chang4b96c132006-03-04 16:08:19 +000045typedef Py_ssize_t (*mbdecodereset_func)(MultibyteCodec_State *state,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000046 const void *config);
Hye-Shik Chang3e2a3062004-01-17 14:29:29 +000047
48typedef struct {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000049 const char *encoding;
50 const void *config;
51 mbcodec_init codecinit;
52 mbencode_func encode;
53 mbencodeinit_func encinit;
54 mbencodereset_func encreset;
55 mbdecode_func decode;
56 mbdecodeinit_func decinit;
57 mbdecodereset_func decreset;
Hye-Shik Chang3e2a3062004-01-17 14:29:29 +000058} MultibyteCodec;
59
60typedef struct {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000061 PyObject_HEAD
62 MultibyteCodec *codec;
Hye-Shik Chang3e2a3062004-01-17 14:29:29 +000063} MultibyteCodecObject;
64
Thomas Wouters49fd7fa2006-04-21 10:40:58 +000065#define MultibyteCodec_Check(op) ((op)->ob_type == &MultibyteCodec_Type)
66
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000067#define _MultibyteStatefulCodec_HEAD \
68 PyObject_HEAD \
69 MultibyteCodec *codec; \
70 MultibyteCodec_State state; \
71 PyObject *errors;
Hye-Shik Chang3e2a3062004-01-17 14:29:29 +000072typedef struct {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000073 _MultibyteStatefulCodec_HEAD
Thomas Wouters49fd7fa2006-04-21 10:40:58 +000074} MultibyteStatefulCodecContext;
Hye-Shik Chang3e2a3062004-01-17 14:29:29 +000075
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000076#define MAXENCPENDING 2
77#define _MultibyteStatefulEncoder_HEAD \
78 _MultibyteStatefulCodec_HEAD \
Victor Stinnerd9491262013-04-14 02:06:32 +020079 PyObject *pending;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +000080typedef struct {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000081 _MultibyteStatefulEncoder_HEAD
Thomas Wouters49fd7fa2006-04-21 10:40:58 +000082} MultibyteStatefulEncoderContext;
83
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000084#define MAXDECPENDING 8
85#define _MultibyteStatefulDecoder_HEAD \
86 _MultibyteStatefulCodec_HEAD \
87 unsigned char pending[MAXDECPENDING]; \
88 Py_ssize_t pendingsize;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +000089typedef struct {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000090 _MultibyteStatefulDecoder_HEAD
Thomas Wouters49fd7fa2006-04-21 10:40:58 +000091} MultibyteStatefulDecoderContext;
92
93typedef struct {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000094 _MultibyteStatefulEncoder_HEAD
Thomas Wouters49fd7fa2006-04-21 10:40:58 +000095} MultibyteIncrementalEncoderObject;
96
97typedef struct {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000098 _MultibyteStatefulDecoder_HEAD
Thomas Wouters49fd7fa2006-04-21 10:40:58 +000099} MultibyteIncrementalDecoderObject;
100
101typedef struct {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000102 _MultibyteStatefulDecoder_HEAD
103 PyObject *stream;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000104} MultibyteStreamReaderObject;
105
106typedef struct {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000107 _MultibyteStatefulEncoder_HEAD
108 PyObject *stream;
Hye-Shik Chang3e2a3062004-01-17 14:29:29 +0000109} MultibyteStreamWriterObject;
110
111/* positive values for illegal sequences */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000112#define MBERR_TOOSMALL (-1) /* insufficient output buffer space */
113#define MBERR_TOOFEW (-2) /* incomplete input buffer */
114#define MBERR_INTERNAL (-3) /* internal runtime error */
Victor Stinnerd1f99422013-07-16 21:41:43 +0200115#define MBERR_EXCEPTION (-4) /* an exception has been raised */
Hye-Shik Chang3e2a3062004-01-17 14:29:29 +0000116
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000117#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))
Victor Stinner14c9fea2013-10-29 00:19:27 +0100121#define ERROR_DECREF(p) \
122 do { \
123 if (p != NULL && ERROR_ISCUSTOM(p)) \
124 Py_DECREF(p); \
125 } while (0);
Hye-Shik Chang3e2a3062004-01-17 14:29:29 +0000126
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000127#define MBENC_FLUSH 0x0001 /* encode all characters encodable */
128#define MBENC_MAX MBENC_FLUSH
Hye-Shik Chang3e2a3062004-01-17 14:29:29 +0000129
Benjamin Petersonb173f782009-05-05 22:31:58 +0000130#define PyMultibyteCodec_CAPSULE_NAME "multibytecodec.__map_*"
131
132
Hye-Shik Chang3e2a3062004-01-17 14:29:29 +0000133#ifdef __cplusplus
134}
135#endif
136#endif