multibytecodec.h 2.63 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12
/*
 * multibytecodec.h: Common Multibyte Codec Implementation
 *
 * Written by Hye-Shik Chang <perky@FreeBSD.org>
 */

#ifndef _PYTHON_MULTIBYTECODEC_H_
#define _PYTHON_MULTIBYTECODEC_H_
#ifdef __cplusplus
extern "C" {
#endif

13 14 15 16 17 18 19 20 21 22 23
#ifdef uint32_t
typedef uint32_t ucs4_t;
#else
typedef unsigned int ucs4_t;
#endif

#ifdef uint16_t
typedef uint16_t ucs2_t, DBCHAR;
#else
typedef unsigned short ucs2_t, DBCHAR;
#endif
24 25

typedef union {
26 27 28 29 30
	void *p;
	int i;
	unsigned char c[8];
	ucs2_t u2[4];
	ucs4_t u4[2];
31 32
} MultibyteCodec_State;

33
typedef int (*mbcodec_init)(const void *config);
34 35 36 37 38
typedef Py_ssize_t (*mbencode_func)(MultibyteCodec_State *state,
			const void *config,
			const Py_UNICODE **inbuf, Py_ssize_t inleft,
			unsigned char **outbuf, Py_ssize_t outleft,
			int flags);
39 40
typedef int (*mbencodeinit_func)(MultibyteCodec_State *state,
				 const void *config);
41 42 43 44 45 46 47
typedef Py_ssize_t (*mbencodereset_func)(MultibyteCodec_State *state,
			const void *config,
			unsigned char **outbuf, Py_ssize_t outleft);
typedef Py_ssize_t (*mbdecode_func)(MultibyteCodec_State *state,
			const void *config,
			const unsigned char **inbuf, Py_ssize_t inleft,
			Py_UNICODE **outbuf, Py_ssize_t outleft);
48 49
typedef int (*mbdecodeinit_func)(MultibyteCodec_State *state,
				 const void *config);
50 51
typedef Py_ssize_t (*mbdecodereset_func)(MultibyteCodec_State *state,
					 const void *config);
52 53

typedef struct {
54 55 56 57 58 59 60 61 62
	const char *encoding;
	const void *config;
	mbcodec_init codecinit;
	mbencode_func encode;
	mbencodeinit_func encinit;
	mbencodereset_func encreset;
	mbdecode_func decode;
	mbdecodeinit_func decinit;
	mbdecodereset_func decreset;
63 64 65
} MultibyteCodec;

typedef struct {
66 67
	PyObject_HEAD
	MultibyteCodec *codec;
68 69
} MultibyteCodecObject;

70
#define MAXDECPENDING	8
71
typedef struct {
72 73 74 75
	PyObject_HEAD
	MultibyteCodec *codec;
	MultibyteCodec_State state;
	unsigned char pending[MAXDECPENDING];
76
	Py_ssize_t pendingsize;
77
	PyObject *stream, *errors;
78 79
} MultibyteStreamReaderObject;

80
#define MAXENCPENDING	2
81
typedef struct {
82 83 84 85
	PyObject_HEAD
	MultibyteCodec *codec;
	MultibyteCodec_State state;
	Py_UNICODE pending[MAXENCPENDING];
86
	Py_ssize_t pendingsize;
87
	PyObject *stream, *errors;
88 89 90
} MultibyteStreamWriterObject;

/* positive values for illegal sequences */
91 92 93
#define MBERR_TOOSMALL		(-1) /* insufficient output buffer space */
#define MBERR_TOOFEW		(-2) /* incomplete input buffer */
#define MBERR_INTERNAL		(-3) /* internal runtime error */
94

95 96 97 98
#define ERROR_STRICT		(PyObject *)(1)
#define ERROR_IGNORE		(PyObject *)(2)
#define ERROR_REPLACE		(PyObject *)(3)
#define ERROR_MAX		ERROR_REPLACE
99

100 101
#define MBENC_FLUSH		0x0001 /* encode all characters encodable */
#define MBENC_MAX		MBENC_FLUSH
102 103 104 105 106

#ifdef __cplusplus
}
#endif
#endif