| 
									
										
										
										
											2004-01-17 14:29:29 +00:00
										 |  |  | /*
 | 
					
						
							|  |  |  |  * 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
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2004-07-18 03:06:29 +00:00
										 |  |  | #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
 | 
					
						
							| 
									
										
										
										
											2004-01-17 14:29:29 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | typedef union { | 
					
						
							| 
									
										
										
										
											2004-07-18 03:06:29 +00:00
										 |  |  | 	void *p; | 
					
						
							|  |  |  | 	int i; | 
					
						
							|  |  |  | 	unsigned char c[8]; | 
					
						
							|  |  |  | 	ucs2_t u2[4]; | 
					
						
							|  |  |  | 	ucs4_t u4[2]; | 
					
						
							| 
									
										
										
										
											2004-01-17 14:29:29 +00:00
										 |  |  | } MultibyteCodec_State; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2004-07-18 03:06:29 +00:00
										 |  |  | typedef int (*mbcodec_init)(const void *config); | 
					
						
							| 
									
										
										
										
											2006-03-04 16:08:19 +00:00
										 |  |  | 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); | 
					
						
							| 
									
										
										
										
											2004-07-18 03:06:29 +00:00
										 |  |  | typedef int (*mbencodeinit_func)(MultibyteCodec_State *state, | 
					
						
							|  |  |  | 				 const void *config); | 
					
						
							| 
									
										
										
										
											2006-03-04 16:08:19 +00:00
										 |  |  | 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); | 
					
						
							| 
									
										
										
										
											2004-07-18 03:06:29 +00:00
										 |  |  | typedef int (*mbdecodeinit_func)(MultibyteCodec_State *state, | 
					
						
							|  |  |  | 				 const void *config); | 
					
						
							| 
									
										
										
										
											2006-03-04 16:08:19 +00:00
										 |  |  | typedef Py_ssize_t (*mbdecodereset_func)(MultibyteCodec_State *state, | 
					
						
							|  |  |  | 					 const void *config); | 
					
						
							| 
									
										
										
										
											2004-01-17 14:29:29 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | typedef struct { | 
					
						
							| 
									
										
										
										
											2004-07-18 03:06:29 +00:00
										 |  |  | 	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; | 
					
						
							| 
									
										
										
										
											2004-01-17 14:29:29 +00:00
										 |  |  | } MultibyteCodec; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | typedef struct { | 
					
						
							| 
									
										
										
										
											2004-07-18 03:06:29 +00:00
										 |  |  | 	PyObject_HEAD | 
					
						
							|  |  |  | 	MultibyteCodec *codec; | 
					
						
							| 
									
										
										
										
											2004-01-17 14:29:29 +00:00
										 |  |  | } MultibyteCodecObject; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-04-21 10:40:58 +00:00
										 |  |  | #define MultibyteCodec_Check(op) ((op)->ob_type == &MultibyteCodec_Type)
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #define _MultibyteStatefulCodec_HEAD		\
 | 
					
						
							|  |  |  | 	PyObject_HEAD				\ | 
					
						
							|  |  |  | 	MultibyteCodec *codec;			\ | 
					
						
							|  |  |  | 	MultibyteCodec_State state;		\ | 
					
						
							|  |  |  | 	PyObject *errors; | 
					
						
							| 
									
										
										
										
											2004-01-17 14:29:29 +00:00
										 |  |  | typedef struct { | 
					
						
							| 
									
										
										
										
											2006-04-21 10:40:58 +00:00
										 |  |  | 	_MultibyteStatefulCodec_HEAD | 
					
						
							|  |  |  | } MultibyteStatefulCodecContext; | 
					
						
							| 
									
										
										
										
											2004-01-17 14:29:29 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2004-07-18 03:06:29 +00:00
										 |  |  | #define MAXENCPENDING	2
 | 
					
						
							| 
									
										
										
										
											2006-04-21 10:40:58 +00:00
										 |  |  | #define _MultibyteStatefulEncoder_HEAD		\
 | 
					
						
							|  |  |  | 	_MultibyteStatefulCodec_HEAD		\ | 
					
						
							|  |  |  | 	Py_UNICODE pending[MAXENCPENDING];	\ | 
					
						
							|  |  |  | 	Py_ssize_t pendingsize; | 
					
						
							| 
									
										
										
										
											2004-01-17 14:29:29 +00:00
										 |  |  | typedef struct { | 
					
						
							| 
									
										
										
										
											2006-04-21 10:40:58 +00:00
										 |  |  | 	_MultibyteStatefulEncoder_HEAD | 
					
						
							|  |  |  | } MultibyteStatefulEncoderContext; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #define MAXDECPENDING	8
 | 
					
						
							|  |  |  | #define _MultibyteStatefulDecoder_HEAD		\
 | 
					
						
							|  |  |  | 	_MultibyteStatefulCodec_HEAD		\ | 
					
						
							|  |  |  | 	unsigned char pending[MAXDECPENDING];	\ | 
					
						
							| 
									
										
										
										
											2006-03-04 16:08:19 +00:00
										 |  |  | 	Py_ssize_t pendingsize; | 
					
						
							| 
									
										
										
										
											2006-04-21 10:40:58 +00:00
										 |  |  | 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; | 
					
						
							| 
									
										
										
										
											2004-01-17 14:29:29 +00:00
										 |  |  | } MultibyteStreamWriterObject; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* positive values for illegal sequences */ | 
					
						
							| 
									
										
										
										
											2004-07-18 03:06:29 +00:00
										 |  |  | #define MBERR_TOOSMALL		(-1) /* insufficient output buffer space */
 | 
					
						
							|  |  |  | #define MBERR_TOOFEW		(-2) /* incomplete input buffer */
 | 
					
						
							|  |  |  | #define MBERR_INTERNAL		(-3) /* internal runtime error */
 | 
					
						
							| 
									
										
										
										
											2004-01-17 14:29:29 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2004-07-18 03:06:29 +00:00
										 |  |  | #define ERROR_STRICT		(PyObject *)(1)
 | 
					
						
							|  |  |  | #define ERROR_IGNORE		(PyObject *)(2)
 | 
					
						
							|  |  |  | #define ERROR_REPLACE		(PyObject *)(3)
 | 
					
						
							| 
									
										
										
										
											2006-04-21 10:40:58 +00:00
										 |  |  | #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); | 
					
						
							| 
									
										
										
										
											2004-01-17 14:29:29 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2004-07-18 03:06:29 +00:00
										 |  |  | #define MBENC_FLUSH		0x0001 /* encode all characters encodable */
 | 
					
						
							|  |  |  | #define MBENC_MAX		MBENC_FLUSH
 | 
					
						
							| 
									
										
										
										
											2004-01-17 14:29:29 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-05-05 22:31:58 +00:00
										 |  |  | #define PyMultibyteCodec_CAPSULE_NAME "multibytecodec.__map_*"
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2004-01-17 14:29:29 +00:00
										 |  |  | #ifdef __cplusplus
 | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | #endif
 |