multibytecodec.h 4.8 KB

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