/Modules/cjkcodecs/multibytecodec.h
http://unladen-swallow.googlecode.com/ · C Header · 138 lines · 113 code · 19 blank · 6 comment · 6 complexity · 1c1b11d03bb48e7ed6da4bd39f605284 MD5 · raw file
- /*
- * 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