symbian-qemu-0.9.1-12/python-2.6.1/Modules/cjkcodecs/_codecs_hk.c
changeset 1 2fb8b9db1c86
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/symbian-qemu-0.9.1-12/python-2.6.1/Modules/cjkcodecs/_codecs_hk.c	Fri Jul 31 15:01:17 2009 +0100
@@ -0,0 +1,183 @@
+/*
+ * _codecs_hk.c: Codecs collection for encodings from Hong Kong
+ *
+ * Written by Hye-Shik Chang <perky@FreeBSD.org>
+ */
+
+#define USING_IMPORTED_MAPS
+
+#include "cjkcodecs.h"
+#include "mappings_hk.h"
+
+/*
+ * BIG5HKSCS codec
+ */
+
+static const encode_map *big5_encmap = NULL;
+static const decode_map *big5_decmap = NULL;
+
+CODEC_INIT(big5hkscs)
+{
+	static int initialized = 0;
+
+	if (!initialized && IMPORT_MAP(tw, big5, &big5_encmap, &big5_decmap))
+		return -1;
+	initialized = 1;
+	return 0;
+}
+
+/*
+ * There are four possible pair unicode -> big5hkscs maps as in HKSCS 2004:
+ *  U+00CA U+0304 -> 8862  (U+00CA alone is mapped to 8866)
+ *  U+00CA U+030C -> 8864
+ *  U+00EA U+0304 -> 88a3  (U+00EA alone is mapped to 88a7)
+ *  U+00EA U+030C -> 88a5
+ * These are handled by not mapping tables but a hand-written code.
+ */
+static const DBCHAR big5hkscs_pairenc_table[4] = {0x8862, 0x8864, 0x88a3, 0x88a5};
+
+ENCODER(big5hkscs)
+{
+	while (inleft > 0) {
+		ucs4_t c = **inbuf;
+		DBCHAR code;
+		Py_ssize_t insize;
+
+		if (c < 0x80) {
+			REQUIRE_OUTBUF(1)
+			**outbuf = (unsigned char)c;
+			NEXT(1, 1)
+			continue;
+		}
+
+		DECODE_SURROGATE(c)
+		insize = GET_INSIZE(c);
+
+		REQUIRE_OUTBUF(2)
+
+		if (c < 0x10000) {
+			TRYMAP_ENC(big5hkscs_bmp, code, c) {
+				if (code == MULTIC) {
+					if (inleft >= 2 &&
+					    ((c & 0xffdf) == 0x00ca) &&
+					    (((*inbuf)[1] & 0xfff7) == 0x0304)) {
+						code = big5hkscs_pairenc_table[
+							((c >> 4) |
+							 ((*inbuf)[1] >> 3)) & 3];
+						insize = 2;
+					}
+					else if (inleft < 2 &&
+						 !(flags & MBENC_FLUSH))
+						return MBERR_TOOFEW;
+					else {
+						if (c == 0xca)
+							code = 0x8866;
+						else /* c == 0xea */
+							code = 0x88a7;
+					}
+				}
+			}
+			else TRYMAP_ENC(big5, code, c);
+			else return 1;
+		}
+		else if (c < 0x20000)
+			return insize;
+		else if (c < 0x30000) {
+			TRYMAP_ENC(big5hkscs_nonbmp, code, c & 0xffff);
+			else return insize;
+		}
+		else
+			return insize;
+
+		OUT1(code >> 8)
+		OUT2(code & 0xFF)
+		NEXT(insize, 2)
+	}
+
+	return 0;
+}
+
+#define BH2S(c1, c2) (((c1) - 0x87) * (0xfe - 0x40 + 1) + ((c2) - 0x40))
+
+DECODER(big5hkscs)
+{
+	while (inleft > 0) {
+		unsigned char c = IN1;
+		ucs4_t decoded;
+
+		REQUIRE_OUTBUF(1)
+
+		if (c < 0x80) {
+			OUT1(c)
+			NEXT(1, 1)
+			continue;
+		}
+
+		REQUIRE_INBUF(2)
+
+		if (0xc6 <= c && c <= 0xc8 && (c >= 0xc7 || IN2 >= 0xa1))
+			goto hkscsdec;
+
+		TRYMAP_DEC(big5, **outbuf, c, IN2) {
+			NEXT(2, 1)
+		}
+		else
+hkscsdec:	TRYMAP_DEC(big5hkscs, decoded, c, IN2) {
+			int s = BH2S(c, IN2);
+			const unsigned char *hintbase;
+
+			assert(0x87 <= c && c <= 0xfe);
+			assert(0x40 <= IN2 && IN2 <= 0xfe);
+
+			if (BH2S(0x87, 0x40) <= s && s <= BH2S(0xa0, 0xfe)) {
+				hintbase = big5hkscs_phint_0;
+				s -= BH2S(0x87, 0x40);
+			}
+			else if (BH2S(0xc6,0xa1) <= s && s <= BH2S(0xc8,0xfe)){
+				hintbase = big5hkscs_phint_12130;
+				s -= BH2S(0xc6, 0xa1);
+			}
+			else if (BH2S(0xf9,0xd6) <= s && s <= BH2S(0xfe,0xfe)){
+				hintbase = big5hkscs_phint_21924;
+				s -= BH2S(0xf9, 0xd6);
+			}
+			else
+				return MBERR_INTERNAL;
+
+			if (hintbase[s >> 3] & (1 << (s & 7))) {
+				WRITEUCS4(decoded | 0x20000)
+				NEXT_IN(2)
+			}
+			else {
+				OUT1(decoded)
+				NEXT(2, 1)
+			}
+		}
+		else {
+			switch ((c << 8) | IN2) {
+			case 0x8862: WRITE2(0x00ca, 0x0304); break;
+			case 0x8864: WRITE2(0x00ca, 0x030c); break;
+			case 0x88a3: WRITE2(0x00ea, 0x0304); break;
+			case 0x88a5: WRITE2(0x00ea, 0x030c); break;
+			default: return 2;
+			}
+
+			NEXT(2, 2) /* all decoded codepoints are pairs, above. */
+		}
+	}
+
+	return 0;
+}
+
+
+BEGIN_MAPPINGS_LIST
+  MAPPING_DECONLY(big5hkscs)
+  MAPPING_ENCONLY(big5hkscs_bmp)
+  MAPPING_ENCONLY(big5hkscs_nonbmp)
+END_MAPPINGS_LIST
+
+BEGIN_CODECS_LIST
+  CODEC_STATELESS_WINIT(big5hkscs)
+END_CODECS_LIST
+
+I_AM_A_MODULE_FOR(hk)