2 * codeccommon.h: Common Codec Routines
4 * Written by Hye-Shik Chang <perky@FreeBSD.org>
5 * $CJKCodecs: codeccommon.h,v 1.4 2003/12/31 05:46:55 perky Exp $
9 #include "multibytecodec.h"
13 #define STRICT_SUFX "_strict"
18 #define ENCMAP(encoding) \
19 static const encode_map *encoding##encmap;
20 #define DECMAP(encoding) \
21 static const decode_map *encoding##decmap;
23 #define ENCODER_INIT(encoding) \
24 static int encoding##_encode_init( \
25 MultibyteCodec_State *state)
26 #define ENCODER(encoding) \
27 static int encoding##_encode( \
28 MultibyteCodec_State *state, \
29 const Py_UNICODE **inbuf, size_t inleft, \
30 unsigned char **outbuf, size_t outleft, int flags)
31 #define ENCODER_RESET(encoding) \
32 static int encoding##_encode_reset( \
33 MultibyteCodec_State *state, \
34 unsigned char **outbuf, size_t outleft)
36 #define DECODER_INIT(encoding) \
37 static int encoding##_decode_init( \
38 MultibyteCodec_State *state)
39 #define DECODER(encoding) \
40 static int encoding##_decode( \
41 MultibyteCodec_State *state, \
42 const unsigned char **inbuf, size_t inleft, \
43 Py_UNICODE **outbuf, size_t outleft)
44 #define DECODER_RESET(encoding) \
45 static int encoding##_decode_reset( \
46 MultibyteCodec_State *state)
48 #if Py_UNICODE_SIZE == 4
49 #define UCS4INVALID(code) \
50 if ((code) > 0xFFFF) \
53 #define UCS4INVALID(code) \
63 #define NEXT(i, o) NEXT_IN(i) NEXT_OUT(o)
65 #define RESERVE_INBUF(n) \
68 #define RESERVE_OUTBUF(n) \
70 return MBERR_TOOSMALL;
72 #define IN1 ((*inbuf)[0])
73 #define IN2 ((*inbuf)[1])
74 #define IN3 ((*inbuf)[2])
75 #define IN4 ((*inbuf)[3])
77 #define OUT1(c) ((*outbuf)[0]) = (c);
78 #define OUT2(c) ((*outbuf)[1]) = (c);
79 #define OUT3(c) ((*outbuf)[2]) = (c);
80 #define OUT4(c) ((*outbuf)[3]) = (c);
85 #define WRITE2(c1, c2) \
87 (*outbuf)[0] = (c1); \
89 #define WRITE3(c1, c2, c3) \
91 (*outbuf)[0] = (c1); \
92 (*outbuf)[1] = (c2); \
94 #define WRITE4(c1, c2, c3, c4) \
96 (*outbuf)[0] = (c1); \
97 (*outbuf)[1] = (c2); \
98 (*outbuf)[2] = (c3); \
101 #if Py_UNICODE_SIZE == 2
102 # define PUTUCS4(c) \
104 (*outbuf)[0] = 0xd800 + (((c) - 0x10000) >> 10); \
105 (*outbuf)[1] = 0xdc00 + (((c) - 0x10000) & 0x3ff); \
108 # define PUTUCS4(c) \
110 **outbuf = (Py_UNICODE)(c); \
114 #define _TRYMAP_ENC(m, assi, val) \
115 if ((m)->map != NULL && (val) >= (m)->bottom && \
116 (val)<= (m)->top && ((assi) = (m)->map[(val) - \
117 (m)->bottom]) != NOCHAR)
118 #define TRYMAP_ENC(charset, assi, uni) \
119 _TRYMAP_ENC(&charset##encmap[(uni) >> 8], assi, (uni) & 0xff)
120 #define _TRYMAP_DEC(m, assi, val) \
121 if ((m)->map != NULL && (val) >= (m)->bottom && \
122 (val)<= (m)->top && ((assi) = (m)->map[(val) - \
123 (m)->bottom]) != UNIINV)
124 #define TRYMAP_DEC(charset, assi, c1, c2) \
125 _TRYMAP_DEC(&charset##decmap[c1], assi, c2)
127 #if Py_UNICODE_SIZE == 2
128 #define DECODE_SURROGATE(c) \
129 if (c >> 10 == 0xd800 >> 10) { /* high surrogate */ \
131 if (IN2 >> 10 == 0xdc00 >> 10) { /* low surrogate */ \
132 c = 0x10000 + ((ucs4_t)(c - 0xd800) << 10) + \
133 ((ucs4_t)(IN2) - 0xdc00); \
136 #define GET_INSIZE(c) ((c) > 0xffff ? 2 : 1)
138 #define DECODE_SURROGATE(c) {;}
139 #define GET_INSIZE(c) 1
142 #ifdef USING_BINARY_PAIR_SEARCH
143 static DBCHAR
find_pairencmap(ucs2_t
, ucs2_t
, struct pair_encodemap
*, int);