--- /dev/null
+/*\r
+ * multibytecodec.h: Common Multibyte Codec Implementation\r
+ *\r
+ * Written by Hye-Shik Chang <perky@FreeBSD.org>\r
+ */\r
+\r
+#ifndef _PYTHON_MULTIBYTECODEC_H_\r
+#define _PYTHON_MULTIBYTECODEC_H_\r
+#ifdef __cplusplus\r
+extern "C" {\r
+#endif\r
+\r
+#ifdef uint32_t\r
+typedef uint32_t ucs4_t;\r
+#else\r
+typedef unsigned int ucs4_t;\r
+#endif\r
+\r
+#ifdef uint16_t\r
+typedef uint16_t ucs2_t, DBCHAR;\r
+#else\r
+typedef unsigned short ucs2_t, DBCHAR;\r
+#endif\r
+\r
+typedef union {\r
+ void *p;\r
+ int i;\r
+ unsigned char c[8];\r
+ ucs2_t u2[4];\r
+ ucs4_t u4[2];\r
+} MultibyteCodec_State;\r
+\r
+typedef int (*mbcodec_init)(const void *config);\r
+typedef Py_ssize_t (*mbencode_func)(MultibyteCodec_State *state,\r
+ const void *config,\r
+ const Py_UNICODE **inbuf, Py_ssize_t inleft,\r
+ unsigned char **outbuf, Py_ssize_t outleft,\r
+ int flags);\r
+typedef int (*mbencodeinit_func)(MultibyteCodec_State *state,\r
+ const void *config);\r
+typedef Py_ssize_t (*mbencodereset_func)(MultibyteCodec_State *state,\r
+ const void *config,\r
+ unsigned char **outbuf, Py_ssize_t outleft);\r
+typedef Py_ssize_t (*mbdecode_func)(MultibyteCodec_State *state,\r
+ const void *config,\r
+ const unsigned char **inbuf, Py_ssize_t inleft,\r
+ Py_UNICODE **outbuf, Py_ssize_t outleft);\r
+typedef int (*mbdecodeinit_func)(MultibyteCodec_State *state,\r
+ const void *config);\r
+typedef Py_ssize_t (*mbdecodereset_func)(MultibyteCodec_State *state,\r
+ const void *config);\r
+\r
+typedef struct {\r
+ const char *encoding;\r
+ const void *config;\r
+ mbcodec_init codecinit;\r
+ mbencode_func encode;\r
+ mbencodeinit_func encinit;\r
+ mbencodereset_func encreset;\r
+ mbdecode_func decode;\r
+ mbdecodeinit_func decinit;\r
+ mbdecodereset_func decreset;\r
+} MultibyteCodec;\r
+\r
+typedef struct {\r
+ PyObject_HEAD\r
+ MultibyteCodec *codec;\r
+} MultibyteCodecObject;\r
+\r
+#define MultibyteCodec_Check(op) ((op)->ob_type == &MultibyteCodec_Type)\r
+\r
+#define _MultibyteStatefulCodec_HEAD \\r
+ PyObject_HEAD \\r
+ MultibyteCodec *codec; \\r
+ MultibyteCodec_State state; \\r
+ PyObject *errors;\r
+typedef struct {\r
+ _MultibyteStatefulCodec_HEAD\r
+} MultibyteStatefulCodecContext;\r
+\r
+#define MAXENCPENDING 2\r
+#define _MultibyteStatefulEncoder_HEAD \\r
+ _MultibyteStatefulCodec_HEAD \\r
+ Py_UNICODE pending[MAXENCPENDING]; \\r
+ Py_ssize_t pendingsize;\r
+typedef struct {\r
+ _MultibyteStatefulEncoder_HEAD\r
+} MultibyteStatefulEncoderContext;\r
+\r
+#define MAXDECPENDING 8\r
+#define _MultibyteStatefulDecoder_HEAD \\r
+ _MultibyteStatefulCodec_HEAD \\r
+ unsigned char pending[MAXDECPENDING]; \\r
+ Py_ssize_t pendingsize;\r
+typedef struct {\r
+ _MultibyteStatefulDecoder_HEAD\r
+} MultibyteStatefulDecoderContext;\r
+\r
+typedef struct {\r
+ _MultibyteStatefulEncoder_HEAD\r
+} MultibyteIncrementalEncoderObject;\r
+\r
+typedef struct {\r
+ _MultibyteStatefulDecoder_HEAD\r
+} MultibyteIncrementalDecoderObject;\r
+\r
+typedef struct {\r
+ _MultibyteStatefulDecoder_HEAD\r
+ PyObject *stream;\r
+} MultibyteStreamReaderObject;\r
+\r
+typedef struct {\r
+ _MultibyteStatefulEncoder_HEAD\r
+ PyObject *stream;\r
+} MultibyteStreamWriterObject;\r
+\r
+/* positive values for illegal sequences */\r
+#define MBERR_TOOSMALL (-1) /* insufficient output buffer space */\r
+#define MBERR_TOOFEW (-2) /* incomplete input buffer */\r
+#define MBERR_INTERNAL (-3) /* internal runtime error */\r
+\r
+#define ERROR_STRICT (PyObject *)(1)\r
+#define ERROR_IGNORE (PyObject *)(2)\r
+#define ERROR_REPLACE (PyObject *)(3)\r
+#define ERROR_ISCUSTOM(p) ((p) < ERROR_STRICT || ERROR_REPLACE < (p))\r
+#define ERROR_DECREF(p) do { \\r
+ if (p != NULL && ERROR_ISCUSTOM(p)) { \\r
+ Py_DECREF(p); \\r
+ } \\r
+} while (0);\r
+\r
+#define MBENC_FLUSH 0x0001 /* encode all characters encodable */\r
+#define MBENC_MAX MBENC_FLUSH\r
+\r
+#define PyMultibyteCodec_CAPSULE_NAME "multibytecodec.__map_*"\r
+\r
+\r
+#ifdef __cplusplus\r
+}\r
+#endif\r
+#endif\r