| /* | 
 |  * 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 | 
 |  | 
 | #define PyMultibyteCodec_CAPSULE_NAME "multibytecodec.__map_*" | 
 |  | 
 |  | 
 | #ifdef __cplusplus | 
 | } | 
 | #endif | 
 | #endif |