Home | History | Annotate | Download | only in cjkcodecs
      1 /*
      2  * multibytecodec.h: Common Multibyte Codec Implementation
      3  *
      4  * Written by Hye-Shik Chang <perky (at) FreeBSD.org>
      5  */
      6 
      7 #ifndef _PYTHON_MULTIBYTECODEC_H_
      8 #define _PYTHON_MULTIBYTECODEC_H_
      9 #ifdef __cplusplus
     10 extern "C" {
     11 #endif
     12 
     13 #ifdef uint32_t
     14 typedef uint32_t ucs4_t;
     15 #else
     16 typedef unsigned int ucs4_t;
     17 #endif
     18 
     19 #ifdef uint16_t
     20 typedef uint16_t ucs2_t, DBCHAR;
     21 #else
     22 typedef unsigned short ucs2_t, DBCHAR;
     23 #endif
     24 
     25 typedef union {
     26     void *p;
     27     int i;
     28     unsigned char c[8];
     29     ucs2_t u2[4];
     30     ucs4_t u4[2];
     31 } MultibyteCodec_State;
     32 
     33 typedef int (*mbcodec_init)(const void *config);
     34 typedef Py_ssize_t (*mbencode_func)(MultibyteCodec_State *state,
     35                         const void *config,
     36                         const Py_UNICODE **inbuf, Py_ssize_t inleft,
     37                         unsigned char **outbuf, Py_ssize_t outleft,
     38                         int flags);
     39 typedef int (*mbencodeinit_func)(MultibyteCodec_State *state,
     40                                  const void *config);
     41 typedef Py_ssize_t (*mbencodereset_func)(MultibyteCodec_State *state,
     42                         const void *config,
     43                         unsigned char **outbuf, Py_ssize_t outleft);
     44 typedef Py_ssize_t (*mbdecode_func)(MultibyteCodec_State *state,
     45                         const void *config,
     46                         const unsigned char **inbuf, Py_ssize_t inleft,
     47                         Py_UNICODE **outbuf, Py_ssize_t outleft);
     48 typedef int (*mbdecodeinit_func)(MultibyteCodec_State *state,
     49                                  const void *config);
     50 typedef Py_ssize_t (*mbdecodereset_func)(MultibyteCodec_State *state,
     51                                          const void *config);
     52 
     53 typedef struct {
     54     const char *encoding;
     55     const void *config;
     56     mbcodec_init codecinit;
     57     mbencode_func encode;
     58     mbencodeinit_func encinit;
     59     mbencodereset_func encreset;
     60     mbdecode_func decode;
     61     mbdecodeinit_func decinit;
     62     mbdecodereset_func decreset;
     63 } MultibyteCodec;
     64 
     65 typedef struct {
     66     PyObject_HEAD
     67     MultibyteCodec *codec;
     68 } MultibyteCodecObject;
     69 
     70 #define MultibyteCodec_Check(op) ((op)->ob_type == &MultibyteCodec_Type)
     71 
     72 #define _MultibyteStatefulCodec_HEAD            \
     73     PyObject_HEAD                               \
     74     MultibyteCodec *codec;                      \
     75     MultibyteCodec_State state;                 \
     76     PyObject *errors;
     77 typedef struct {
     78     _MultibyteStatefulCodec_HEAD
     79 } MultibyteStatefulCodecContext;
     80 
     81 #define MAXENCPENDING   2
     82 #define _MultibyteStatefulEncoder_HEAD          \
     83     _MultibyteStatefulCodec_HEAD                \
     84     Py_UNICODE pending[MAXENCPENDING];          \
     85     Py_ssize_t pendingsize;
     86 typedef struct {
     87     _MultibyteStatefulEncoder_HEAD
     88 } MultibyteStatefulEncoderContext;
     89 
     90 #define MAXDECPENDING   8
     91 #define _MultibyteStatefulDecoder_HEAD          \
     92     _MultibyteStatefulCodec_HEAD                \
     93     unsigned char pending[MAXDECPENDING];       \
     94     Py_ssize_t pendingsize;
     95 typedef struct {
     96     _MultibyteStatefulDecoder_HEAD
     97 } MultibyteStatefulDecoderContext;
     98 
     99 typedef struct {
    100     _MultibyteStatefulEncoder_HEAD
    101 } MultibyteIncrementalEncoderObject;
    102 
    103 typedef struct {
    104     _MultibyteStatefulDecoder_HEAD
    105 } MultibyteIncrementalDecoderObject;
    106 
    107 typedef struct {
    108     _MultibyteStatefulDecoder_HEAD
    109     PyObject *stream;
    110 } MultibyteStreamReaderObject;
    111 
    112 typedef struct {
    113     _MultibyteStatefulEncoder_HEAD
    114     PyObject *stream;
    115 } MultibyteStreamWriterObject;
    116 
    117 /* positive values for illegal sequences */
    118 #define MBERR_TOOSMALL          (-1) /* insufficient output buffer space */
    119 #define MBERR_TOOFEW            (-2) /* incomplete input buffer */
    120 #define MBERR_INTERNAL          (-3) /* internal runtime error */
    121 
    122 #define ERROR_STRICT            (PyObject *)(1)
    123 #define ERROR_IGNORE            (PyObject *)(2)
    124 #define ERROR_REPLACE           (PyObject *)(3)
    125 #define ERROR_ISCUSTOM(p)       ((p) < ERROR_STRICT || ERROR_REPLACE < (p))
    126 #define ERROR_DECREF(p) do {                    \
    127     if (p != NULL && ERROR_ISCUSTOM(p)) {       \
    128         Py_DECREF(p);                           \
    129     }                                           \
    130 } while (0);
    131 
    132 #define MBENC_FLUSH             0x0001 /* encode all characters encodable */
    133 #define MBENC_MAX               MBENC_FLUSH
    134 
    135 #define PyMultibyteCodec_CAPSULE_NAME "multibytecodec.__map_*"
    136 
    137 
    138 #ifdef __cplusplus
    139 }
    140 #endif
    141 #endif
    142