| 
									
										
										
										
											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 { | 
					
						
							| 
									
										
										
										
											2010-05-09 15:52:27 +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, | 
					
						
							| 
									
										
										
										
											2010-05-09 15:52:27 +00:00
										 |  |  |                         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, | 
					
						
							| 
									
										
										
										
											2010-05-09 15:52:27 +00:00
										 |  |  |                                  const void *config); | 
					
						
							| 
									
										
										
										
											2006-03-04 16:08:19 +00:00
										 |  |  | typedef Py_ssize_t (*mbencodereset_func)(MultibyteCodec_State *state, | 
					
						
							| 
									
										
										
										
											2010-05-09 15:52:27 +00:00
										 |  |  |                         const void *config, | 
					
						
							|  |  |  |                         unsigned char **outbuf, Py_ssize_t outleft); | 
					
						
							| 
									
										
										
										
											2006-03-04 16:08:19 +00:00
										 |  |  | typedef Py_ssize_t (*mbdecode_func)(MultibyteCodec_State *state, | 
					
						
							| 
									
										
										
										
											2010-05-09 15:52:27 +00:00
										 |  |  |                         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, | 
					
						
							| 
									
										
										
										
											2010-05-09 15:52:27 +00:00
										 |  |  |                                  const void *config); | 
					
						
							| 
									
										
										
										
											2006-03-04 16:08:19 +00:00
										 |  |  | typedef Py_ssize_t (*mbdecodereset_func)(MultibyteCodec_State *state, | 
					
						
							| 
									
										
										
										
											2010-05-09 15:52:27 +00:00
										 |  |  |                                          const void *config); | 
					
						
							| 
									
										
										
										
											2004-01-17 14:29:29 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | typedef struct { | 
					
						
							| 
									
										
										
										
											2010-05-09 15:52:27 +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 { | 
					
						
							| 
									
										
										
										
											2010-05-09 15:52:27 +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)
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-05-09 15:52:27 +00:00
										 |  |  | #define _MultibyteStatefulCodec_HEAD            \
 | 
					
						
							|  |  |  |     PyObject_HEAD                               \ | 
					
						
							|  |  |  |     MultibyteCodec *codec;                      \ | 
					
						
							|  |  |  |     MultibyteCodec_State state;                 \ | 
					
						
							|  |  |  |     PyObject *errors; | 
					
						
							| 
									
										
										
										
											2004-01-17 14:29:29 +00:00
										 |  |  | typedef struct { | 
					
						
							| 
									
										
										
										
											2010-05-09 15:52:27 +00:00
										 |  |  |     _MultibyteStatefulCodec_HEAD | 
					
						
							| 
									
										
										
										
											2006-04-21 10:40:58 +00:00
										 |  |  | } MultibyteStatefulCodecContext; | 
					
						
							| 
									
										
										
										
											2004-01-17 14:29:29 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-05-09 15:52:27 +00:00
										 |  |  | #define MAXENCPENDING   2
 | 
					
						
							|  |  |  | #define _MultibyteStatefulEncoder_HEAD          \
 | 
					
						
							|  |  |  |     _MultibyteStatefulCodec_HEAD                \ | 
					
						
							|  |  |  |     Py_UNICODE pending[MAXENCPENDING];          \ | 
					
						
							|  |  |  |     Py_ssize_t pendingsize; | 
					
						
							| 
									
										
										
										
											2004-01-17 14:29:29 +00:00
										 |  |  | typedef struct { | 
					
						
							| 
									
										
										
										
											2010-05-09 15:52:27 +00:00
										 |  |  |     _MultibyteStatefulEncoder_HEAD | 
					
						
							| 
									
										
										
										
											2006-04-21 10:40:58 +00:00
										 |  |  | } MultibyteStatefulEncoderContext; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-05-09 15:52:27 +00:00
										 |  |  | #define MAXDECPENDING   8
 | 
					
						
							|  |  |  | #define _MultibyteStatefulDecoder_HEAD          \
 | 
					
						
							|  |  |  |     _MultibyteStatefulCodec_HEAD                \ | 
					
						
							|  |  |  |     unsigned char pending[MAXDECPENDING];       \ | 
					
						
							|  |  |  |     Py_ssize_t pendingsize; | 
					
						
							| 
									
										
										
										
											2006-04-21 10:40:58 +00:00
										 |  |  | typedef struct { | 
					
						
							| 
									
										
										
										
											2010-05-09 15:52:27 +00:00
										 |  |  |     _MultibyteStatefulDecoder_HEAD | 
					
						
							| 
									
										
										
										
											2006-04-21 10:40:58 +00:00
										 |  |  | } MultibyteStatefulDecoderContext; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | typedef struct { | 
					
						
							| 
									
										
										
										
											2010-05-09 15:52:27 +00:00
										 |  |  |     _MultibyteStatefulEncoder_HEAD | 
					
						
							| 
									
										
										
										
											2006-04-21 10:40:58 +00:00
										 |  |  | } MultibyteIncrementalEncoderObject; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | typedef struct { | 
					
						
							| 
									
										
										
										
											2010-05-09 15:52:27 +00:00
										 |  |  |     _MultibyteStatefulDecoder_HEAD | 
					
						
							| 
									
										
										
										
											2006-04-21 10:40:58 +00:00
										 |  |  | } MultibyteIncrementalDecoderObject; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | typedef struct { | 
					
						
							| 
									
										
										
										
											2010-05-09 15:52:27 +00:00
										 |  |  |     _MultibyteStatefulDecoder_HEAD | 
					
						
							|  |  |  |     PyObject *stream; | 
					
						
							| 
									
										
										
										
											2006-04-21 10:40:58 +00:00
										 |  |  | } MultibyteStreamReaderObject; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | typedef struct { | 
					
						
							| 
									
										
										
										
											2010-05-09 15:52:27 +00:00
										 |  |  |     _MultibyteStatefulEncoder_HEAD | 
					
						
							|  |  |  |     PyObject *stream; | 
					
						
							| 
									
										
										
										
											2004-01-17 14:29:29 +00:00
										 |  |  | } MultibyteStreamWriterObject; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* positive values for illegal sequences */ | 
					
						
							| 
									
										
										
										
											2010-05-09 15:52:27 +00:00
										 |  |  | #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);                           \ | 
					
						
							|  |  |  |     }                                           \ | 
					
						
							| 
									
										
										
										
											2006-04-21 10:40:58 +00:00
										 |  |  | } while (0); | 
					
						
							| 
									
										
										
										
											2004-01-17 14:29:29 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-05-09 15:52:27 +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
 |