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