blob: 8e71266756bae54c3874b1348157cb2e9ae50adf [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,
30 const Py_UNICODE **inbuf, Py_ssize_t inleft,
31 unsigned char **outbuf, Py_ssize_t outleft,
32 int flags);
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +000033typedef int (*mbencodeinit_func)(MultibyteCodec_State *state,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000034 const void *config);
Hye-Shik Chang4b96c132006-03-04 16:08:19 +000035typedef Py_ssize_t (*mbencodereset_func)(MultibyteCodec_State *state,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000036 const void *config,
37 unsigned char **outbuf, Py_ssize_t outleft);
Hye-Shik Chang4b96c132006-03-04 16:08:19 +000038typedef Py_ssize_t (*mbdecode_func)(MultibyteCodec_State *state,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000039 const void *config,
40 const unsigned char **inbuf, Py_ssize_t inleft,
Victor Stinnera0dd0212013-04-11 22:09:04 +020041 _PyUnicodeWriter *writer);
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +000042typedef int (*mbdecodeinit_func)(MultibyteCodec_State *state,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000043 const void *config);
Hye-Shik Chang4b96c132006-03-04 16:08:19 +000044typedef Py_ssize_t (*mbdecodereset_func)(MultibyteCodec_State *state,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000045 const void *config);
Hye-Shik Chang3e2a3062004-01-17 14:29:29 +000046
47typedef struct {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000048 const char *encoding;
49 const void *config;
50 mbcodec_init codecinit;
51 mbencode_func encode;
52 mbencodeinit_func encinit;
53 mbencodereset_func encreset;
54 mbdecode_func decode;
55 mbdecodeinit_func decinit;
56 mbdecodereset_func decreset;
Hye-Shik Chang3e2a3062004-01-17 14:29:29 +000057} MultibyteCodec;
58
59typedef struct {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000060 PyObject_HEAD
61 MultibyteCodec *codec;
Hye-Shik Chang3e2a3062004-01-17 14:29:29 +000062} MultibyteCodecObject;
63
Thomas Wouters49fd7fa2006-04-21 10:40:58 +000064#define MultibyteCodec_Check(op) ((op)->ob_type == &MultibyteCodec_Type)
65
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000066#define _MultibyteStatefulCodec_HEAD \
67 PyObject_HEAD \
68 MultibyteCodec *codec; \
69 MultibyteCodec_State state; \
70 PyObject *errors;
Hye-Shik Chang3e2a3062004-01-17 14:29:29 +000071typedef struct {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000072 _MultibyteStatefulCodec_HEAD
Thomas Wouters49fd7fa2006-04-21 10:40:58 +000073} MultibyteStatefulCodecContext;
Hye-Shik Chang3e2a3062004-01-17 14:29:29 +000074
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000075#define MAXENCPENDING 2
76#define _MultibyteStatefulEncoder_HEAD \
77 _MultibyteStatefulCodec_HEAD \
78 Py_UNICODE pending[MAXENCPENDING]; \
79 Py_ssize_t pendingsize;
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 */
Hye-Shik Chang3e2a3062004-01-17 14:29:29 +0000115
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000116#define ERROR_STRICT (PyObject *)(1)
117#define ERROR_IGNORE (PyObject *)(2)
118#define ERROR_REPLACE (PyObject *)(3)
119#define ERROR_ISCUSTOM(p) ((p) < ERROR_STRICT || ERROR_REPLACE < (p))
120#define ERROR_DECREF(p) do { \
121 if (p != NULL && ERROR_ISCUSTOM(p)) { \
122 Py_DECREF(p); \
123 } \
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000124} while (0);
Hye-Shik Chang3e2a3062004-01-17 14:29:29 +0000125
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000126#define MBENC_FLUSH 0x0001 /* encode all characters encodable */
127#define MBENC_MAX MBENC_FLUSH
Hye-Shik Chang3e2a3062004-01-17 14:29:29 +0000128
Benjamin Petersonb173f782009-05-05 22:31:58 +0000129#define PyMultibyteCodec_CAPSULE_NAME "multibytecodec.__map_*"
130
131
Hye-Shik Chang3e2a3062004-01-17 14:29:29 +0000132#ifdef __cplusplus
133}
134#endif
135#endif