/*
 * 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

#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

typedef union {
	void *p;
	int i;
	unsigned char c[8];
	ucs2_t u2[4];
	ucs4_t u4[2];
} MultibyteCodec_State;

typedef int (*mbcodec_init)(const void *config);
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);
typedef int (*mbencodeinit_func)(MultibyteCodec_State *state,
				 const void *config);
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);
typedef int (*mbdecodeinit_func)(MultibyteCodec_State *state,
				 const void *config);
typedef Py_ssize_t (*mbdecodereset_func)(MultibyteCodec_State *state,
					 const void *config);

typedef struct {
	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;
} MultibyteCodec;

typedef struct {
	PyObject_HEAD
	MultibyteCodec *codec;
} MultibyteCodecObject;

#define MultibyteCodec_Check(op) ((op)->ob_type == &MultibyteCodec_Type)

#define _MultibyteStatefulCodec_HEAD		\
	PyObject_HEAD				\
	MultibyteCodec *codec;			\
	MultibyteCodec_State state;		\
	PyObject *errors;
typedef struct {
	_MultibyteStatefulCodec_HEAD
} MultibyteStatefulCodecContext;

#define MAXENCPENDING	2
#define _MultibyteStatefulEncoder_HEAD		\
	_MultibyteStatefulCodec_HEAD		\
	Py_UNICODE pending[MAXENCPENDING];	\
	Py_ssize_t pendingsize;
typedef struct {
	_MultibyteStatefulEncoder_HEAD
} MultibyteStatefulEncoderContext;

#define MAXDECPENDING	8
#define _MultibyteStatefulDecoder_HEAD		\
	_MultibyteStatefulCodec_HEAD		\
	unsigned char pending[MAXDECPENDING];	\
	Py_ssize_t pendingsize;
typedef struct {
	_MultibyteStatefulDecoder_HEAD
} MultibyteStatefulDecoderContext;

typedef struct {
	_MultibyteStatefulEncoder_HEAD
} MultibyteIncrementalEncoderObject;

typedef struct {
	_MultibyteStatefulDecoder_HEAD
} MultibyteIncrementalDecoderObject;

typedef struct {
	_MultibyteStatefulDecoder_HEAD
	PyObject *stream;
} MultibyteStreamReaderObject;

typedef struct {
	_MultibyteStatefulEncoder_HEAD
	PyObject *stream;
} MultibyteStreamWriterObject;

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

#define ERROR_STRICT		(PyObject *)(1)
#define ERROR_IGNORE		(PyObject *)(2)
#define ERROR_REPLACE		(PyObject *)(3)
#define ERROR_ISCUSTOM(p)	((p) < ERROR_STRICT || ERROR_REPLACE < (p))
#define ERROR_DECREF(p) do {			\
	if (p != NULL && ERROR_ISCUSTOM(p)) {	\
		Py_DECREF(p);			\
	}					\
} while (0);

#define MBENC_FLUSH		0x0001 /* encode all characters encodable */
#define MBENC_MAX		MBENC_FLUSH

#ifdef __cplusplus
}
#endif
#endif
