blob: f66d892c9b7ca00dc44983379f08d692b488223b [file] [log] [blame]
Hye-Shik Chang3e2a3062004-01-17 14:29:29 +00001/*
2 * codeccommon.h: Common Codec Routines
3 *
4 * Written by Hye-Shik Chang <perky@FreeBSD.org>
5 * $CJKCodecs: codeccommon.h,v 1.4 2003/12/31 05:46:55 perky Exp $
6 */
7
8#include "Python.h"
9#include "multibytecodec.h"
10
11
12#ifdef STRICT_BUILD
13#define STRICT_SUFX "_strict"
14#else
15#define STRICT_SUFX
16#endif
17
18#define ENCMAP(encoding) \
19 const static encode_map *encoding##encmap;
20#define DECMAP(encoding) \
21 const static decode_map *encoding##decmap;
22
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)
35
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)
47
48#if Py_UNICODE_SIZE == 4
49#define UCS4INVALID(code) \
50 if ((code) > 0xFFFF) \
51 return 1;
52#else
53#define UCS4INVALID(code) \
54 if (0) ;
55#endif
56
57#define NEXT_IN(i) \
58 (*inbuf) += (i); \
59 (inleft) -= (i);
60#define NEXT_OUT(o) \
61 (*outbuf) += (o); \
62 (outleft) -= (o);
63#define NEXT(i, o) NEXT_IN(i) NEXT_OUT(o)
64
65#define RESERVE_INBUF(n) \
66 if (inleft < (n)) \
67 return MBERR_TOOFEW;
68#define RESERVE_OUTBUF(n) \
69 if (outleft < (n)) \
70 return MBERR_TOOSMALL;
71
72#define IN1 ((*inbuf)[0])
73#define IN2 ((*inbuf)[1])
74#define IN3 ((*inbuf)[2])
75#define IN4 ((*inbuf)[3])
76
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);
81
82#define WRITE1(c1) \
83 RESERVE_OUTBUF(1) \
84 (*outbuf)[0] = (c1);
85#define WRITE2(c1, c2) \
86 RESERVE_OUTBUF(2) \
87 (*outbuf)[0] = (c1); \
88 (*outbuf)[1] = (c2);
89#define WRITE3(c1, c2, c3) \
90 RESERVE_OUTBUF(3) \
91 (*outbuf)[0] = (c1); \
92 (*outbuf)[1] = (c2); \
93 (*outbuf)[2] = (c3);
94#define WRITE4(c1, c2, c3, c4) \
95 RESERVE_OUTBUF(4) \
96 (*outbuf)[0] = (c1); \
97 (*outbuf)[1] = (c2); \
98 (*outbuf)[2] = (c3); \
99 (*outbuf)[3] = (c4);
100
101#if Py_UNICODE_SIZE == 2
102# define PUTUCS4(c) \
103 RESERVE_OUTBUF(2) \
104 (*outbuf)[0] = 0xd800 + (((c) - 0x10000) >> 10); \
105 (*outbuf)[1] = 0xdc00 + (((c) - 0x10000) & 0x3ff); \
106 NEXT_OUT(2)
107#else
108# define PUTUCS4(c) \
109 RESERVE_OUTBUF(1) \
110 **outbuf = (Py_UNICODE)(c); \
111 NEXT_OUT(1)
112#endif
113
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)
126
127#if Py_UNICODE_SIZE == 2
128#define DECODE_SURROGATE(c) \
129 if (c >> 10 == 0xd800 >> 10) { /* high surrogate */ \
130 RESERVE_INBUF(2) \
131 if (IN2 >> 10 == 0xdc00 >> 10) { /* low surrogate */ \
132 c = 0x10000 + ((ucs4_t)(c - 0xd800) << 10) + \
133 ((ucs4_t)(IN2) - 0xdc00); \
134 } \
135 }
136#define GET_INSIZE(c) ((c) > 0xffff ? 2 : 1)
137#else
138#define DECODE_SURROGATE(c) {;}
139#define GET_INSIZE(c) 1
140#endif
141
142#ifdef USING_BINARY_PAIR_SEARCH
143static DBCHAR find_pairencmap(ucs2_t , ucs2_t, struct pair_encodemap *, int);
144#endif