(root)/
Python-3.12.0/
Modules/
cjkcodecs/
multibytecodec.h
       1  /*
       2   * multibytecodec.h: Common Multibyte Codec Implementation
       3   *
       4   * Written by Hye-Shik Chang <perky@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  /*
      20   * A struct that provides 8 bytes of state for multibyte
      21   * codecs. Codecs are free to use this how they want. Note: if you
      22   * need to add a new field to this struct, ensure that its byte order
      23   * is independent of CPU endianness so that the return value of
      24   * getstate doesn't differ between little and big endian CPUs.
      25   */
      26  typedef struct {
      27      unsigned char c[8];
      28  } MultibyteCodec_State;
      29  
      30  struct _cjk_mod_state;
      31  struct _multibyte_codec;
      32  
      33  typedef int (*mbcodec_init)(const struct _multibyte_codec *codec);
      34  typedef Py_ssize_t (*mbencode_func)(MultibyteCodec_State *state,
      35                          const struct _multibyte_codec *codec,
      36                          int kind, const void *data,
      37                          Py_ssize_t *inpos, Py_ssize_t inlen,
      38                          unsigned char **outbuf, Py_ssize_t outleft,
      39                          int flags);
      40  typedef int (*mbencodeinit_func)(MultibyteCodec_State *state,
      41                                   const struct _multibyte_codec *codec);
      42  typedef Py_ssize_t (*mbencodereset_func)(MultibyteCodec_State *state,
      43                          const struct _multibyte_codec *codec,
      44                          unsigned char **outbuf, Py_ssize_t outleft);
      45  typedef Py_ssize_t (*mbdecode_func)(MultibyteCodec_State *state,
      46                          const struct _multibyte_codec *codec,
      47                          const unsigned char **inbuf, Py_ssize_t inleft,
      48                          _PyUnicodeWriter *writer);
      49  typedef int (*mbdecodeinit_func)(MultibyteCodec_State *state,
      50                                   const struct _multibyte_codec *codec);
      51  typedef Py_ssize_t (*mbdecodereset_func)(MultibyteCodec_State *state,
      52                                           const struct _multibyte_codec *codec);
      53  
      54  typedef struct _multibyte_codec {
      55      const char *encoding;
      56      const void *config;
      57      mbcodec_init codecinit;
      58      mbencode_func encode;
      59      mbencodeinit_func encinit;
      60      mbencodereset_func encreset;
      61      mbdecode_func decode;
      62      mbdecodeinit_func decinit;
      63      mbdecodereset_func decreset;
      64      struct _cjk_mod_state *modstate;
      65  } MultibyteCodec;
      66  
      67  typedef struct {
      68      PyObject_HEAD
      69      const MultibyteCodec *codec;
      70      PyObject *cjk_module;
      71  } MultibyteCodecObject;
      72  
      73  #define MultibyteCodec_Check(state, op) Py_IS_TYPE((op), state->multibytecodec_type)
      74  
      75  #define _MultibyteStatefulCodec_HEAD            \
      76      PyObject_HEAD                               \
      77      const MultibyteCodec *codec;                \
      78      MultibyteCodec_State state;                 \
      79      PyObject *errors;
      80  typedef struct {
      81      _MultibyteStatefulCodec_HEAD
      82  } MultibyteStatefulCodecContext;
      83  
      84  #define MAXENCPENDING   2
      85  #define _MultibyteStatefulEncoder_HEAD          \
      86      _MultibyteStatefulCodec_HEAD                \
      87      PyObject *pending;
      88  typedef struct {
      89      _MultibyteStatefulEncoder_HEAD
      90  } MultibyteStatefulEncoderContext;
      91  
      92  #define MAXDECPENDING   8
      93  #define _MultibyteStatefulDecoder_HEAD          \
      94      _MultibyteStatefulCodec_HEAD                \
      95      unsigned char pending[MAXDECPENDING];       \
      96      Py_ssize_t pendingsize;
      97  typedef struct {
      98      _MultibyteStatefulDecoder_HEAD
      99  } MultibyteStatefulDecoderContext;
     100  
     101  typedef struct {
     102      _MultibyteStatefulEncoder_HEAD
     103  } MultibyteIncrementalEncoderObject;
     104  
     105  typedef struct {
     106      _MultibyteStatefulDecoder_HEAD
     107  } MultibyteIncrementalDecoderObject;
     108  
     109  typedef struct {
     110      _MultibyteStatefulDecoder_HEAD
     111      PyObject *stream;
     112  } MultibyteStreamReaderObject;
     113  
     114  typedef struct {
     115      _MultibyteStatefulEncoder_HEAD
     116      PyObject *stream;
     117  } MultibyteStreamWriterObject;
     118  
     119  /* positive values for illegal sequences */
     120  #define MBERR_TOOSMALL          (-1) /* insufficient output buffer space */
     121  #define MBERR_TOOFEW            (-2) /* incomplete input buffer */
     122  #define MBERR_INTERNAL          (-3) /* internal runtime error */
     123  #define MBERR_EXCEPTION         (-4) /* an exception has been raised */
     124  
     125  #define ERROR_STRICT            (PyObject *)(1)
     126  #define ERROR_IGNORE            (PyObject *)(2)
     127  #define ERROR_REPLACE           (PyObject *)(3)
     128  #define ERROR_ISCUSTOM(p)       ((p) < ERROR_STRICT || ERROR_REPLACE < (p))
     129  #define ERROR_DECREF(p)                             \
     130      do {                                            \
     131          if (p != NULL && ERROR_ISCUSTOM(p))         \
     132              Py_DECREF(p);                           \
     133      } while (0);
     134  
     135  #define MBENC_FLUSH             0x0001 /* encode all characters encodable */
     136  #define MBENC_MAX               MBENC_FLUSH
     137  
     138  typedef struct {
     139      const MultibyteCodec *codec;
     140      PyObject *cjk_module;
     141  } codec_capsule;
     142  
     143  #define MAP_CAPSULE "multibytecodec.map"
     144  #define CODEC_CAPSULE "multibytecodec.codec"
     145  
     146  
     147  #ifdef __cplusplus
     148  }
     149  #endif
     150  #endif