cinap_lenrekadd hg and python4bb9e2215 years agoHistory
138 lines · 3.5 KB · C
RawDownload
/* * multibytecodec.h: Common Multibyte Codec Implementation * * Written by Hye-Shik Chang <perky@FreeBSD.org> */ #ifndef _PYTHON_MULTIBYTECODEC_H_#define _PYTHON_MULTIBYTECODEC_H_#ifdef __cplusplusextern "C" {#endif #ifdef uint32_ttypedef uint32_t ucs4_t;#elsetypedef unsigned int ucs4_t;#endif #ifdef uint16_ttypedef uint16_t ucs2_t, DBCHAR;#elsetypedef 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