blob: 59468210b970c828134044414fac64674d0a53d5 [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
Christopher Thorneac22f6a2018-11-01 10:48:49 +000019/*
20 * A struct that provides 8 bytes of state for multibyte
21 * codecs. Codecs are free to use this how they want. Note: if you
22 * need to add a new field to this struct, ensure that its byte order
23 * is independent of CPU endianness so that the return value of
24 * getstate doesn't differ between little and big endian CPUs.
25 */
26typedef struct {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000027 unsigned char c[8];
Hye-Shik Chang3e2a3062004-01-17 14:29:29 +000028} MultibyteCodec_State;
29
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +000030typedef int (*mbcodec_init)(const void *config);
Hye-Shik Chang4b96c132006-03-04 16:08:19 +000031typedef Py_ssize_t (*mbencode_func)(MultibyteCodec_State *state,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000032 const void *config,
Serhiy Storchakacd8295f2020-04-11 10:48:40 +030033 int kind, const void *data,
Victor Stinnerd9491262013-04-14 02:06:32 +020034 Py_ssize_t *inpos, Py_ssize_t inlen,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000035 unsigned char **outbuf, Py_ssize_t outleft,
36 int flags);
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +000037typedef int (*mbencodeinit_func)(MultibyteCodec_State *state,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000038 const void *config);
Hye-Shik Chang4b96c132006-03-04 16:08:19 +000039typedef Py_ssize_t (*mbencodereset_func)(MultibyteCodec_State *state,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000040 const void *config,
41 unsigned char **outbuf, Py_ssize_t outleft);
Hye-Shik Chang4b96c132006-03-04 16:08:19 +000042typedef Py_ssize_t (*mbdecode_func)(MultibyteCodec_State *state,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000043 const void *config,
44 const unsigned char **inbuf, Py_ssize_t inleft,
Victor Stinnera0dd0212013-04-11 22:09:04 +020045 _PyUnicodeWriter *writer);
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +000046typedef int (*mbdecodeinit_func)(MultibyteCodec_State *state,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000047 const void *config);
Hye-Shik Chang4b96c132006-03-04 16:08:19 +000048typedef Py_ssize_t (*mbdecodereset_func)(MultibyteCodec_State *state,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000049 const void *config);
Hye-Shik Chang3e2a3062004-01-17 14:29:29 +000050
51typedef struct {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000052 const char *encoding;
53 const void *config;
54 mbcodec_init codecinit;
55 mbencode_func encode;
56 mbencodeinit_func encinit;
57 mbencodereset_func encreset;
58 mbdecode_func decode;
59 mbdecodeinit_func decinit;
60 mbdecodereset_func decreset;
Hye-Shik Chang3e2a3062004-01-17 14:29:29 +000061} MultibyteCodec;
62
63typedef struct {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000064 PyObject_HEAD
65 MultibyteCodec *codec;
Hye-Shik Chang3e2a3062004-01-17 14:29:29 +000066} MultibyteCodecObject;
67
Andy Lesterdffe4c02020-03-04 07:15:20 -060068#define MultibyteCodec_Check(op) Py_IS_TYPE((op), &MultibyteCodec_Type)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +000069
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000070#define _MultibyteStatefulCodec_HEAD \
71 PyObject_HEAD \
72 MultibyteCodec *codec; \
73 MultibyteCodec_State state; \
74 PyObject *errors;
Hye-Shik Chang3e2a3062004-01-17 14:29:29 +000075typedef struct {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000076 _MultibyteStatefulCodec_HEAD
Thomas Wouters49fd7fa2006-04-21 10:40:58 +000077} MultibyteStatefulCodecContext;
Hye-Shik Chang3e2a3062004-01-17 14:29:29 +000078
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000079#define MAXENCPENDING 2
80#define _MultibyteStatefulEncoder_HEAD \
81 _MultibyteStatefulCodec_HEAD \
Victor Stinnerd9491262013-04-14 02:06:32 +020082 PyObject *pending;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +000083typedef struct {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000084 _MultibyteStatefulEncoder_HEAD
Thomas Wouters49fd7fa2006-04-21 10:40:58 +000085} MultibyteStatefulEncoderContext;
86
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000087#define MAXDECPENDING 8
88#define _MultibyteStatefulDecoder_HEAD \
89 _MultibyteStatefulCodec_HEAD \
90 unsigned char pending[MAXDECPENDING]; \
91 Py_ssize_t pendingsize;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +000092typedef struct {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000093 _MultibyteStatefulDecoder_HEAD
Thomas Wouters49fd7fa2006-04-21 10:40:58 +000094} MultibyteStatefulDecoderContext;
95
96typedef struct {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000097 _MultibyteStatefulEncoder_HEAD
Thomas Wouters49fd7fa2006-04-21 10:40:58 +000098} MultibyteIncrementalEncoderObject;
99
100typedef struct {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000101 _MultibyteStatefulDecoder_HEAD
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000102} MultibyteIncrementalDecoderObject;
103
104typedef struct {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000105 _MultibyteStatefulDecoder_HEAD
106 PyObject *stream;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000107} MultibyteStreamReaderObject;
108
109typedef struct {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000110 _MultibyteStatefulEncoder_HEAD
111 PyObject *stream;
Hye-Shik Chang3e2a3062004-01-17 14:29:29 +0000112} MultibyteStreamWriterObject;
113
114/* positive values for illegal sequences */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000115#define MBERR_TOOSMALL (-1) /* insufficient output buffer space */
116#define MBERR_TOOFEW (-2) /* incomplete input buffer */
117#define MBERR_INTERNAL (-3) /* internal runtime error */
Victor Stinnerd1f99422013-07-16 21:41:43 +0200118#define MBERR_EXCEPTION (-4) /* an exception has been raised */
Hye-Shik Chang3e2a3062004-01-17 14:29:29 +0000119
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000120#define ERROR_STRICT (PyObject *)(1)
121#define ERROR_IGNORE (PyObject *)(2)
122#define ERROR_REPLACE (PyObject *)(3)
123#define ERROR_ISCUSTOM(p) ((p) < ERROR_STRICT || ERROR_REPLACE < (p))
Victor Stinner14c9fea2013-10-29 00:19:27 +0100124#define ERROR_DECREF(p) \
125 do { \
126 if (p != NULL && ERROR_ISCUSTOM(p)) \
127 Py_DECREF(p); \
128 } while (0);
Hye-Shik Chang3e2a3062004-01-17 14:29:29 +0000129
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000130#define MBENC_FLUSH 0x0001 /* encode all characters encodable */
131#define MBENC_MAX MBENC_FLUSH
Hye-Shik Chang3e2a3062004-01-17 14:29:29 +0000132
Benjamin Petersonb173f782009-05-05 22:31:58 +0000133#define PyMultibyteCodec_CAPSULE_NAME "multibytecodec.__map_*"
134
135
Hye-Shik Chang3e2a3062004-01-17 14:29:29 +0000136#ifdef __cplusplus
137}
138#endif
139#endif