From 5451cada955bd952f5c732857e27ed676e873aa1 Mon Sep 17 00:00:00 2001 From: Martin Mares Date: Sat, 2 May 1998 08:54:22 +0000 Subject: [PATCH] New character set conversion routines from CharConv Library. I've left the old charset routines as-is for now. --- charset/Makefile | 8 +- charset/charconv.c | 263 +++++++++++++ charset/charconv.h | 43 ++ charset/chartable.h | 804 ++++++++++++++++++++++++++++++++++++++ charset/misc/chartable.in | 14 + charset/misc/tabgen | 181 +++++++++ charset/misc/user_expand | 8 + charset/setnames.c | 46 +++ 8 files changed, 1365 insertions(+), 2 deletions(-) create mode 100644 charset/charconv.c create mode 100644 charset/charconv.h create mode 100644 charset/chartable.h create mode 100644 charset/misc/chartable.in create mode 100755 charset/misc/tabgen create mode 100644 charset/misc/user_expand create mode 100644 charset/setnames.c diff --git a/charset/Makefile b/charset/Makefile index fab75f42..ad9911cb 100644 --- a/charset/Makefile +++ b/charset/Makefile @@ -2,7 +2,8 @@ CLIB=../lib/libunicode.a -OBJS=toupper.o tolower.o tocat.o utf8.o unaccent.o tosig.o strlen.o debug.o +OBJS=toupper.o tolower.o tocat.o utf8.o unaccent.o tosig.o strlen.o debug.o \ + charconv.o setnames.o all: .stamp $(CLIB) @@ -23,6 +24,8 @@ unaccent.o: unaccent.c unicode.h U-unacc.h tosig.o: tosig.c unicode.h U-sig.h strlen.o: strlen.c unicode.h debug.o: debug.c unicode.h +charconv.o: charconv.c charconv.h chartable.h +setnames.o: setnames.c charconv.h test: test.o $(CLIB) $(TOPDIR)/lib/libsh.a $(CC) $(LDFLAGS) test.o -o test -lsh -lunicode @@ -40,9 +43,10 @@ buildall: cleanall misc/gentab _U_unaccent word U-unacc.h misc/mksig >misc/u-sig misc/gentab _U_sig byte U-sig.h + misc/tabgen chartable.h cleanall: - rm -rf exp misc/u-* U-*.h + rm -rf exp misc/u-* U-*.h chartable.h tags: etags *.[ch] diff --git a/charset/charconv.c b/charset/charconv.c new file mode 100644 index 00000000..8da42ffe --- /dev/null +++ b/charset/charconv.c @@ -0,0 +1,263 @@ +/* + * Character Set Conversion Library 1.0 + * + * (c) 1998 Martin Mares + * + * This software may be freely distributed and used according to the terms + * of the GNU General Public License. + */ + +#include "charconv.h" +#include "chartable.h" + +#ifndef NULL +#define NULL ((void *)0) +#endif + +void +conv_init(struct conv_context *c) +{ + c->source = c->source_end = NULL; + c->dest = c->dest_start = c->dest_end = NULL; +} + +static int +conv_none(struct conv_context *c) +{ + c->dest_start = (char *) c->source; + c->dest = (char *) c->source_end; + return CONV_SOURCE_END | CONV_DEST_END | CONV_SKIP; +} + +static int +conv_from_utf8(struct conv_context *c) +{ + unsigned short *x_to_out = c->x_to_out; + const unsigned char *s = c->source; + const unsigned char *se = c->source_end; + unsigned char *d = c->dest; + unsigned char *de = c->dest_end; + unsigned char *strings = string_table - 0x100; + unsigned int counter, code, cc; + + if (c->state) + goto go_slow; + + while (s < se) /* Optimized for speed, beware of spaghetti code */ + { + cc = *s++; + if (cc < 0x80) + code = cc; + else if (cc >= 0xc0) + { + if (s + 6 > se) + goto go_slow_1; + if (cc < 0xe0) + { + if ((s[0] & 0xc0) != 0x80) + goto nocode; + code = cc & 0x1f; + code = (code << 6) | (*s++ & 0x3f); + } + else if (cc < 0xf0) + { + if ((s[0] & 0xc0) != 0x80 || (s[1] & 0xc0) != 0x80) + goto nocode; + code = cc & 0x0f; + code = (code << 6) | (*s++ & 0x3f); + code = (code << 6) | (*s++ & 0x3f); + } + else if (cc < 0xfc) + { + while (cc & 0x80) + { + if ((*s++ & 0xc0) != 0x80) + break; + cc <<= 1; + } + goto nocode; + } + else + goto nocode; + } + else + { + nocode: + code = 0xfffd; + } + uni_again: + code = x_to_out[uni_to_x[code >> 8U][code & 0xff]]; + code_again: + if (code < 0x100) + { + if (d >= de) + goto dend; + *d++ = code; + } + else + { + unsigned char *k = strings + code; + unsigned int len = *k++; + + if (d + len > de) + goto dend; + while (len--) + *d++ = *k++; + } + } + c->state = 0; +send_noreset: + c->source = s; + c->dest = d; + return CONV_SOURCE_END; + +dend: + c->state = ~0; + c->value = code; + c->source = s; + c->dest = d; + return CONV_DEST_END; + +go_slow: + code = c->value; + counter = c->state; + if (counter == ~0U) + goto code_again; + goto go_slow_2; + +go_slow_1: + if (cc < 0xe0) { code = cc & 0x1f; counter = 1; } + else if (cc < 0xf0) { code = cc & 0x0f; counter = 2; } + else + { + code = ~0; + if (cc < 0xf8) counter = 3; + else if (cc < 0xfc) counter = 4; + else if (cc < 0xfe) counter = 5; + else goto nocode; + } +go_slow_2: + while (counter) + { + if (s >= se) + { + c->state = counter; + c->value = code; + goto send_noreset; + } + if ((*s & 0xc0) != 0x80) + goto nocode; + code = (code << 6) | (*s++ & 0x3f); + counter--; + } + if (code >= 0x10000) + goto nocode; + goto uni_again; +} + +static int +conv_to_utf8(struct conv_context *c) +{ + unsigned short *in_to_x = c->in_to_x; + const unsigned char *s = c->source; + const unsigned char *se = c->source_end; + unsigned char *d = c->dest; + unsigned char *de = c->dest_end; + + while (s < se) + { + unsigned int code = x_to_uni[in_to_x[*s]]; + if (code < 0x80) + { + if (d >= de) + goto dend; + *d++ = code; + } + else if (code < 0x800) + { + if (d + 2 > de) + goto dend; + *d++ = 0xc0 | (code >> 6); + *d++ = 0x80 | (code & 0x3f); + } + else + { + if (d + 3 > de) + goto dend; + *d++ = 0xc0 | (code >> 12); + *d++ = 0x80 | ((code >> 6) & 0x3f); + *d++ = 0x80 | (code & 0x3f); + } + s++; + } + c->source = s; + c->dest = d; + return CONV_SOURCE_END; + +dend: + c->source = s; + c->dest = d; + return CONV_DEST_END; +} + +static int +conv_standard(struct conv_context *c) +{ + unsigned short *in_to_x = c->in_to_x; + unsigned short *x_to_out = c->x_to_out; + const unsigned char *s = c->source; + const unsigned char *se = c->source_end; + unsigned char *d = c->dest; + unsigned char *de = c->dest_end; + unsigned char *strings = string_table - 0x100; + + while (s < se) + { + unsigned int code = x_to_out[in_to_x[*s]]; + if (code < 0x100) + { + if (d >= de) + goto dend; + *d++ = code; + } + else + { + unsigned char *k = strings + code; + unsigned int len = *k++; + + if (d + len > de) + goto dend; + while (len--) + *d++ = *k++; + } + s++; + } + c->source = s; + c->dest = d; + return CONV_SOURCE_END; + +dend: + c->source = s; + c->dest = d; + return CONV_DEST_END; +} + +void +conv_set_charset(struct conv_context *c, int src, int dest) +{ + if (src == dest) + c->convert = conv_none; + else + { + c->convert = conv_standard; + if (src == CONV_CHARSET_UTF8) + c->convert = conv_from_utf8; + else + c->in_to_x = input_to_x[src]; + if (dest == CONV_CHARSET_UTF8) + c->convert = conv_to_utf8; + else + c->x_to_out = x_to_output[dest]; + } + c->state = 0; +} diff --git a/charset/charconv.h b/charset/charconv.h new file mode 100644 index 00000000..14fee079 --- /dev/null +++ b/charset/charconv.h @@ -0,0 +1,43 @@ +/* + * Character Set Conversion Library 1.0 + * + * (c) 1998 Martin Mares + * + * This software may be freely distributed and used according to the terms + * of the GNU General Public License. See file COPYING in any of the GNU packages. + */ + +struct conv_context { + + /* Parameters supplied by the caller */ + + const unsigned char *source; /* Current position in source buffer */ + const unsigned char *source_end; /* End of source buffer */ + unsigned char *dest; /* Current position in destination buffer */ + unsigned char *dest_start; /* First byte of destination buffer */ + unsigned char *dest_end; /* End of destination buffer */ + + /* Internal variables */ + + int (*convert)(struct conv_context *); + unsigned short int *in_to_x; + unsigned short int *x_to_out; + unsigned int state, value; +}; + +void conv_init(struct conv_context *); +void conv_set_charset(struct conv_context *, int, int); +#define conv_run(c) ((c)->convert(c)) + +#define CONV_SOURCE_END 1 +#define CONV_DEST_END 2 +#define CONV_SKIP 4 + +#define CONV_CHARSET_ASCII 0 +#define CONV_CHARSET_LATIN1 1 +#define CONV_CHARSET_LATIN2 2 +#define CONV_CHARSET_UTF8 8 +#define CONV_NUM_CHARSETS 9 + +int find_charset_by_name(char *); +char *charset_name(int); diff --git a/charset/chartable.h b/charset/chartable.h new file mode 100644 index 00000000..fc5b8f34 --- /dev/null +++ b/charset/chartable.h @@ -0,0 +1,804 @@ +/* Generated by tabgen 1.0, please don't edit manually. */ + +static unsigned short int input_to_x[8][256] = { + +/* set/ascii */ +{ +0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, +16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, +32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, +48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, +64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, +80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, +96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, +112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, +256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, +256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, +256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, +256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, +256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, +256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, +256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, +256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, +}, + +/* set/latin1 */ +{ +0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, +16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, +32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, +48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, +64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, +80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, +96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, +112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, +128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, +144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, +160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, +176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, +192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, +208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, +224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, +240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, +}, + +/* set/latin2 */ +{ +0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, +16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, +32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, +48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, +64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, +80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, +96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, +112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, +128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, +144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, +160, 257, 258, 259, 164, 260, 261, 167, 168, 262, 263, 264, 265, 173, 266, 267, +176, 268, 269, 270, 180, 271, 272, 273, 184, 274, 275, 276, 277, 278, 279, 280, +281, 193, 194, 282, 196, 283, 284, 199, 285, 201, 286, 203, 287, 205, 206, 288, +289, 290, 291, 211, 212, 292, 214, 215, 293, 294, 218, 295, 220, 221, 296, 223, +297, 225, 226, 298, 228, 299, 300, 231, 301, 233, 302, 235, 303, 237, 238, 304, +305, 306, 307, 243, 244, 308, 246, 247, 309, 310, 250, 311, 252, 253, 312, 313, +}, + +/* set/win-1250 */ +{ +0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, +16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, +32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, +48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, +64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, +80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, +96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, +112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, +256, 256, 314, 256, 315, 316, 317, 318, 256, 319, 262, 320, 261, 264, 266, 265, +256, 321, 322, 323, 324, 325, 326, 327, 256, 328, 274, 329, 272, 276, 279, 277, +160, 330, 331, 259, 164, 257, 166, 167, 332, 169, 263, 171, 172, 173, 174, 267, +176, 177, 333, 270, 180, 334, 256, 183, 335, 268, 275, 187, 260, 336, 271, 280, +281, 193, 194, 282, 196, 283, 284, 199, 285, 201, 286, 203, 287, 205, 206, 288, +208, 290, 291, 211, 212, 292, 214, 215, 293, 294, 218, 295, 220, 221, 296, 223, +297, 225, 226, 298, 228, 299, 300, 231, 301, 233, 302, 235, 303, 237, 238, 304, +240, 306, 307, 243, 244, 308, 246, 247, 309, 310, 250, 311, 252, 253, 312, 313, +}, + +/* set/kamen-ctrl */ +{ +0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, +16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, +32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, +48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, +64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, +80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, +96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, +112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 337, +285, 252, 233, 304, 228, 288, 264, 301, 303, 287, 283, 205, 271, 299, 196, 193, +201, 279, 266, 244, 246, 211, 310, 218, 253, 214, 220, 262, 260, 221, 293, 276, +225, 237, 243, 250, 307, 291, 294, 212, 274, 309, 297, 281, 188, 167, 187, 171, +338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, +354, 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, 369, +370, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, +386, 387, 388, 389, 390, 391, 334, 392, 393, 394, 395, 396, 397, 398, 399, 400, +401, 177, 402, 403, 404, 405, 247, 406, 176, 407, 183, 408, 409, 178, 410, 160, +}, + +/* set/koi8 */ +{ +0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, +16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, +32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, +48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, +64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, +80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, +96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, +112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, +256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, +256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, +256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, +256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, +256, 225, 256, 301, 304, 303, 297, 411, 252, 237, 310, 299, 271, 246, 307, 243, +244, 228, 309, 274, 276, 250, 256, 233, 224, 253, 279, 256, 330, 256, 412, 256, +180, 193, 256, 285, 288, 287, 281, 413, 220, 205, 294, 283, 260, 214, 291, 211, +212, 196, 293, 262, 264, 218, 256, 201, 282, 221, 266, 256, 256, 256, 176, 256, +}, + +/* set/pc-latin-2 */ +{ +0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, +16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, +32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, +48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, +64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, +80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, +96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, +112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 337, +199, 252, 233, 226, 228, 310, 300, 231, 270, 235, 292, 308, 238, 265, 196, 284, +201, 283, 299, 244, 246, 260, 271, 261, 272, 214, 220, 264, 276, 259, 215, 301, +225, 237, 243, 250, 257, 268, 266, 279, 286, 302, 172, 277, 285, 275, 187, 171, +338, 339, 340, 341, 342, 193, 194, 287, 263, 347, 348, 349, 350, 267, 280, 353, +354, 355, 356, 357, 358, 359, 282, 298, 362, 363, 364, 365, 366, 367, 368, 164, +240, 208, 288, 203, 304, 291, 205, 206, 303, 379, 380, 381, 382, 296, 294, 385, +211, 223, 212, 290, 306, 307, 262, 274, 281, 218, 297, 295, 253, 221, 312, 180, +414, 336, 333, 330, 331, 167, 247, 335, 256, 332, 313, 311, 293, 309, 410, 160, +}, + +/* set/macce */ +{ +0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, +16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, +32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, +48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, +64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, +80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, +96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, +112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, +196, 415, 416, 201, 257, 214, 220, 225, 268, 285, 228, 301, 284, 300, 233, 265, +277, 288, 237, 304, 417, 418, 419, 243, 420, 244, 246, 245, 250, 287, 303, 252, +317, 176, 286, 163, 167, 325, 182, 223, 174, 169, 328, 302, 332, 421, 422, 423, +424, 425, 403, 402, 426, 427, 428, 429, 270, 430, 431, 260, 271, 283, 299, 432, +433, 290, 172, 408, 306, 291, 434, 171, 187, 316, 160, 307, 292, 213, 308, 435, +327, 326, 323, 324, 321, 322, 247, 436, 437, 281, 297, 293, 320, 329, 309, 438, +439, 262, 314, 315, 274, 261, 272, 193, 264, 276, 205, 266, 279, 440, 211, 212, +441, 294, 218, 310, 295, 311, 442, 443, 221, 253, 444, 267, 259, 280, 445, 330, +}, +}; + +static unsigned short int x_to_uni[446] = { +0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, +16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, +32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, +48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, +64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, +80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, +96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, +112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, +128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, +144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, +160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, +176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, +192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, +208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, +224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, +240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, +65533, 260, 728, 321, 317, 346, 352, 350, 356, 377, 381, 379, 261, 731, 322, 318, +347, 711, 353, 351, 357, 378, 733, 382, 380, 340, 258, 313, 262, 268, 280, 282, +270, 272, 323, 327, 336, 344, 366, 368, 354, 341, 259, 314, 263, 269, 281, 283, +271, 273, 324, 328, 337, 345, 367, 369, 355, 729, 8218, 8222, 3759, 8224, 8225, 8240, +8249, 8216, 8217, 8220, 8221, 8226, 8211, 8212, 8482, 8250, 780, 774, 776, 808, 956, 807, +779, 8962, 9617, 9618, 9619, 9474, 9508, 9569, 9570, 9558, 9557, 9571, 9553, 9559, 9565, 9564, +9563, 9488, 9492, 9524, 9516, 9500, 9472, 9532, 9566, 9567, 9562, 9556, 9577, 9574, 9568, 9552, +9580, 9575, 9576, 9572, 9573, 9561, 9560, 9554, 9555, 9579, 9578, 9496, 9484, 9608, 9604, 9612, +9616, 9600, 945, 946, 404, 960, 931, 963, 964, 934, 920, 937, 948, 8734, 966, 8712, +8745, 8781, 8805, 8804, 8992, 8993, 8776, 8729, 8730, 8319, 9632, 61442, 770, 61440, 8801, 256, +257, 274, 275, 278, 279, 8800, 501, 302, 303, 298, 299, 310, 8706, 8721, 315, 316, +325, 326, 916, 332, 8900, 333, 342, 343, 362, 363, 370, 371, 311, 290, +}; + +static unsigned short int uni_to_x_0[256] = { +0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, +16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, +32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, +48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, +64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, +80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, +96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, +112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, +128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, +144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, +160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, +176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, +192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, +208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, +224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, +240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, +}; + +static unsigned short int uni_to_x_1[256] = { +415, 416, 282, 298, 257, 268, 284, 300, 256, 256, 256, 256, 285, 301, 288, 304, +289, 305, 417, 418, 256, 256, 419, 420, 286, 302, 287, 303, 256, 256, 256, 256, +256, 256, 445, 256, 256, 256, 256, 256, 256, 256, 425, 426, 256, 256, 423, 424, +256, 256, 256, 256, 256, 256, 427, 444, 256, 283, 299, 430, 431, 260, 271, 256, +256, 259, 270, 290, 306, 432, 433, 291, 307, 256, 256, 256, 435, 437, 256, 256, +292, 308, 256, 256, 281, 297, 438, 439, 293, 309, 261, 272, 256, 256, 263, 275, +262, 274, 296, 312, 264, 276, 256, 256, 256, 256, 440, 441, 256, 256, 294, 310, +295, 311, 442, 443, 256, 256, 256, 256, 256, 265, 277, 267, 280, 266, 279, 256, +256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, +256, 256, 256, 256, 388, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, +256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, +256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, +256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, +256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, +256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, +256, 256, 256, 256, 256, 422, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, +}; + +static unsigned short int uni_to_x_2[256] = { +256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, +256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, +256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, +256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, +256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, +256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, +256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, +256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, +256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, +256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, +256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, +256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, +256, 256, 256, 256, 256, 256, 256, 273, 256, 256, 256, 256, 256, 256, 256, 256, +256, 256, 256, 256, 256, 256, 256, 256, 258, 313, 256, 269, 256, 278, 256, 256, +256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, +256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, +}; + +static unsigned short int uni_to_x_3[256] = { +256, 256, 412, 256, 256, 256, 331, 256, 332, 256, 256, 336, 330, 256, 256, 256, +256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, +256, 256, 256, 256, 256, 256, 256, 335, 333, 256, 256, 256, 256, 256, 256, 256, +256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, +256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, +256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, +256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, +256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, +256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, +256, 256, 256, 256, 434, 256, 256, 256, 394, 256, 256, 256, 256, 256, 256, 256, +256, 256, 256, 390, 256, 256, 393, 256, 256, 395, 256, 256, 256, 256, 256, 256, +256, 386, 387, 256, 396, 256, 256, 256, 256, 256, 256, 256, 334, 256, 256, 256, +389, 256, 256, 391, 392, 256, 398, 256, 256, 256, 256, 256, 256, 256, 256, 256, +256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, +256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, +256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, +}; + +static unsigned short int uni_to_x_14[256] = { +256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, +256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, +256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, +256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, +256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, +256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, +256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, +256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, +256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, +256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, +256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 316, +256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, +256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, +256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, +256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, +256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, +}; + +static unsigned short int uni_to_x_32[256] = { +256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, +256, 256, 256, 326, 327, 256, 256, 256, 321, 322, 314, 256, 323, 324, 315, 256, +317, 318, 325, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, +319, 256, 256, 256, 256, 256, 256, 256, 256, 320, 329, 256, 256, 256, 256, 256, +256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, +256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, +256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, +256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 409, +256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, +256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, +256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, +256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, +256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, +256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, +256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, +256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, +}; + +static unsigned short int uni_to_x_33[256] = { +256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, +256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, +256, 256, 328, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, +256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, +256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, +256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, +256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, +256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, +256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, +256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, +256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, +256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, +256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, +256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, +256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, +256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, +}; + +static unsigned short int uni_to_x_34[256] = { +256, 256, 428, 256, 256, 256, 256, 256, 399, 256, 256, 256, 256, 256, 256, 256, +256, 429, 256, 256, 256, 256, 256, 256, 256, 407, 408, 256, 256, 256, 397, 256, +256, 256, 256, 256, 256, 256, 256, 256, 256, 400, 256, 256, 256, 256, 256, 256, +256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, +256, 256, 256, 256, 256, 256, 256, 256, 406, 256, 256, 256, 256, 401, 256, 256, +256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, +421, 414, 256, 256, 403, 402, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, +256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, +256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, +256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, +256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, +256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, +256, 256, 256, 256, 436, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, +256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, +256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, +256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, +}; + +static unsigned short int uni_to_x_35[256] = { +256, 256, 337, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, +256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, +404, 405, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, +256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, +256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, +256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, +256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, +256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, +256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, +256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, +256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, +256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, +256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, +256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, +256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, +256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, +}; + +static unsigned short int uni_to_x_37[256] = { +358, 256, 341, 256, 256, 256, 256, 256, 256, 256, 256, 256, 380, 256, 256, 256, +353, 256, 256, 256, 354, 256, 256, 256, 379, 256, 256, 256, 357, 256, 256, 256, +256, 256, 256, 256, 342, 256, 256, 256, 256, 256, 256, 256, 356, 256, 256, 256, +256, 256, 256, 256, 355, 256, 256, 256, 256, 256, 256, 256, 359, 256, 256, 256, +256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, +367, 348, 375, 376, 363, 346, 345, 349, 374, 373, 362, 352, 351, 350, 360, 361, +366, 343, 344, 347, 371, 372, 365, 369, 370, 364, 378, 377, 368, 256, 256, 256, +256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, +385, 256, 256, 256, 382, 256, 256, 256, 381, 256, 256, 256, 383, 256, 256, 256, +384, 338, 339, 340, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, +410, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, +256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, +256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, +256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, +256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, +256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, +}; + +static unsigned short int uni_to_x_240[256] = { +413, 256, 411, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, +256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, +256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, +256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, +256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, +256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, +256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, +256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, +256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, +256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, +256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, +256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, +256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, +256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, +256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, +256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, +}; + +static unsigned short int uni_to_x_255[256] = { +256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, +256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, +256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, +256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, +256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, +256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, +256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, +256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, +256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, +256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, +256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, +256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, +256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, +256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, +256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, +256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, +}; + +static unsigned short int *uni_to_x[256] = { +uni_to_x_0, uni_to_x_1, uni_to_x_2, uni_to_x_3, +uni_to_x_255, uni_to_x_255, uni_to_x_255, uni_to_x_255, +uni_to_x_255, uni_to_x_255, uni_to_x_255, uni_to_x_255, +uni_to_x_255, uni_to_x_255, uni_to_x_14, uni_to_x_255, +uni_to_x_255, uni_to_x_255, uni_to_x_255, uni_to_x_255, +uni_to_x_255, uni_to_x_255, uni_to_x_255, uni_to_x_255, +uni_to_x_255, uni_to_x_255, uni_to_x_255, uni_to_x_255, +uni_to_x_255, uni_to_x_255, uni_to_x_255, uni_to_x_255, +uni_to_x_32, uni_to_x_33, uni_to_x_34, uni_to_x_35, +uni_to_x_255, uni_to_x_37, uni_to_x_255, uni_to_x_255, +uni_to_x_255, uni_to_x_255, uni_to_x_255, uni_to_x_255, +uni_to_x_255, uni_to_x_255, uni_to_x_255, uni_to_x_255, +uni_to_x_255, uni_to_x_255, uni_to_x_255, uni_to_x_255, +uni_to_x_255, uni_to_x_255, uni_to_x_255, uni_to_x_255, +uni_to_x_255, uni_to_x_255, uni_to_x_255, uni_to_x_255, +uni_to_x_255, uni_to_x_255, uni_to_x_255, uni_to_x_255, +uni_to_x_255, uni_to_x_255, uni_to_x_255, uni_to_x_255, +uni_to_x_255, uni_to_x_255, uni_to_x_255, uni_to_x_255, +uni_to_x_255, uni_to_x_255, uni_to_x_255, uni_to_x_255, +uni_to_x_255, uni_to_x_255, uni_to_x_255, uni_to_x_255, +uni_to_x_255, uni_to_x_255, uni_to_x_255, uni_to_x_255, +uni_to_x_255, uni_to_x_255, uni_to_x_255, uni_to_x_255, +uni_to_x_255, uni_to_x_255, uni_to_x_255, uni_to_x_255, +uni_to_x_255, uni_to_x_255, uni_to_x_255, uni_to_x_255, +uni_to_x_255, uni_to_x_255, uni_to_x_255, uni_to_x_255, +uni_to_x_255, uni_to_x_255, uni_to_x_255, uni_to_x_255, +uni_to_x_255, uni_to_x_255, uni_to_x_255, uni_to_x_255, +uni_to_x_255, uni_to_x_255, uni_to_x_255, uni_to_x_255, +uni_to_x_255, uni_to_x_255, uni_to_x_255, uni_to_x_255, +uni_to_x_255, uni_to_x_255, uni_to_x_255, uni_to_x_255, +uni_to_x_255, uni_to_x_255, uni_to_x_255, uni_to_x_255, +uni_to_x_255, uni_to_x_255, uni_to_x_255, uni_to_x_255, +uni_to_x_255, uni_to_x_255, uni_to_x_255, uni_to_x_255, +uni_to_x_255, uni_to_x_255, uni_to_x_255, uni_to_x_255, +uni_to_x_255, uni_to_x_255, uni_to_x_255, uni_to_x_255, +uni_to_x_255, uni_to_x_255, uni_to_x_255, uni_to_x_255, +uni_to_x_255, uni_to_x_255, uni_to_x_255, uni_to_x_255, +uni_to_x_255, uni_to_x_255, uni_to_x_255, uni_to_x_255, +uni_to_x_255, uni_to_x_255, uni_to_x_255, uni_to_x_255, +uni_to_x_255, uni_to_x_255, uni_to_x_255, uni_to_x_255, +uni_to_x_255, uni_to_x_255, uni_to_x_255, uni_to_x_255, +uni_to_x_255, uni_to_x_255, uni_to_x_255, uni_to_x_255, +uni_to_x_255, uni_to_x_255, uni_to_x_255, uni_to_x_255, +uni_to_x_255, uni_to_x_255, uni_to_x_255, uni_to_x_255, +uni_to_x_255, uni_to_x_255, uni_to_x_255, uni_to_x_255, +uni_to_x_255, uni_to_x_255, uni_to_x_255, uni_to_x_255, +uni_to_x_255, uni_to_x_255, uni_to_x_255, uni_to_x_255, +uni_to_x_255, uni_to_x_255, uni_to_x_255, uni_to_x_255, +uni_to_x_255, uni_to_x_255, uni_to_x_255, uni_to_x_255, +uni_to_x_255, uni_to_x_255, uni_to_x_255, uni_to_x_255, +uni_to_x_255, uni_to_x_255, uni_to_x_255, uni_to_x_255, +uni_to_x_255, uni_to_x_255, uni_to_x_255, uni_to_x_255, +uni_to_x_255, uni_to_x_255, uni_to_x_255, uni_to_x_255, +uni_to_x_255, uni_to_x_255, uni_to_x_255, uni_to_x_255, +uni_to_x_255, uni_to_x_255, uni_to_x_255, uni_to_x_255, +uni_to_x_255, uni_to_x_255, uni_to_x_255, uni_to_x_255, +uni_to_x_255, uni_to_x_255, uni_to_x_255, uni_to_x_255, +uni_to_x_255, uni_to_x_255, uni_to_x_255, uni_to_x_255, +uni_to_x_255, uni_to_x_255, uni_to_x_255, uni_to_x_255, +uni_to_x_255, uni_to_x_255, uni_to_x_255, uni_to_x_255, +uni_to_x_240, uni_to_x_255, uni_to_x_255, uni_to_x_255, +uni_to_x_255, uni_to_x_255, uni_to_x_255, uni_to_x_255, +uni_to_x_255, uni_to_x_255, uni_to_x_255, uni_to_x_255, +uni_to_x_255, uni_to_x_255, uni_to_x_255, uni_to_x_255, +}; + +static unsigned short int x_to_output[8][446] = { + +/* set/ascii */ +{ +0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, +16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, +32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, +48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, +64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, +80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, +96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, +112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, +256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, +256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, +256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 97, 256, 256, 256, 256, 256, +256, 256, 50, 51, 256, 256, 256, 256, 256, 49, 111, 256, 257, 261, 265, 256, +65, 65, 65, 65, 65, 65, 269, 67, 69, 69, 69, 69, 73, 73, 73, 73, +256, 78, 79, 79, 79, 79, 79, 256, 256, 85, 85, 85, 85, 89, 256, 256, +97, 97, 97, 97, 97, 97, 272, 99, 101, 101, 101, 101, 105, 105, 105, 105, +256, 110, 111, 111, 111, 111, 111, 256, 256, 117, 117, 117, 117, 121, 256, 121, +256, 65, 256, 256, 76, 83, 83, 83, 84, 90, 90, 90, 97, 256, 256, 108, +115, 256, 115, 115, 116, 122, 256, 122, 122, 82, 65, 76, 67, 67, 69, 69, +68, 256, 78, 78, 79, 82, 85, 85, 84, 114, 97, 108, 99, 99, 101, 101, +100, 256, 110, 110, 111, 114, 117, 117, 116, 256, 256, 256, 256, 256, 256, 256, +256, 256, 256, 256, 256, 256, 256, 256, 275, 256, 256, 256, 256, 256, 256, 256, +256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, +256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, +256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, +256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, +256, 256, 256, 256, 256, 256, 256, 256, 256, 110, 256, 256, 256, 256, 256, 65, +97, 69, 101, 69, 101, 61, 103, 73, 105, 73, 105, 75, 256, 256, 76, 108, +78, 110, 256, 79, 256, 111, 82, 114, 85, 117, 85, 117, 107, 71, +}, + +/* set/latin1 */ +{ +0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, +16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, +32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, +48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, +64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, +80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, +96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, +112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, +128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, +144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, +160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, +176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, +192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, +208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, +224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, +240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, +256, 65, 256, 256, 76, 83, 83, 83, 84, 90, 90, 90, 97, 256, 256, 108, +115, 256, 115, 115, 116, 122, 256, 122, 122, 82, 65, 76, 67, 67, 69, 69, +68, 256, 78, 78, 79, 82, 85, 85, 84, 114, 97, 108, 99, 99, 101, 101, +100, 256, 110, 110, 111, 114, 117, 117, 116, 256, 256, 256, 256, 256, 256, 256, +256, 256, 256, 256, 256, 256, 256, 256, 275, 256, 256, 256, 256, 256, 256, 256, +256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, +256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, +256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, +256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, +256, 256, 256, 256, 256, 256, 256, 256, 256, 110, 256, 256, 256, 256, 256, 65, +97, 69, 101, 69, 101, 61, 103, 73, 105, 73, 105, 75, 256, 256, 76, 108, +78, 110, 256, 79, 256, 111, 82, 114, 85, 117, 85, 117, 107, 71, +}, + +/* set/latin2 */ +{ +0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, +16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, +32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, +48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, +64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, +80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, +96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, +112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, +128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, +144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, +160, 256, 256, 256, 164, 256, 256, 167, 168, 256, 97, 256, 256, 173, 256, 256, +176, 256, 50, 51, 180, 256, 256, 256, 184, 49, 111, 256, 257, 261, 265, 256, +65, 193, 194, 65, 196, 65, 269, 199, 69, 201, 69, 203, 73, 205, 206, 73, +256, 78, 79, 211, 212, 79, 214, 215, 256, 85, 218, 85, 220, 221, 256, 223, +97, 225, 226, 97, 228, 97, 272, 231, 101, 233, 101, 235, 105, 237, 238, 105, +256, 110, 111, 243, 244, 111, 246, 247, 256, 117, 250, 117, 252, 253, 256, 121, +256, 161, 162, 163, 165, 166, 169, 170, 171, 172, 174, 175, 177, 178, 179, 181, +182, 183, 185, 186, 187, 188, 189, 190, 191, 192, 195, 197, 198, 200, 202, 204, +207, 208, 209, 210, 213, 216, 217, 219, 222, 224, 227, 229, 230, 232, 234, 236, +239, 240, 241, 242, 245, 248, 249, 251, 254, 255, 256, 256, 256, 256, 256, 256, +256, 256, 256, 256, 256, 256, 256, 256, 275, 256, 256, 256, 256, 256, 256, 256, +256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, +256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, +256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, +256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, +256, 256, 256, 256, 256, 256, 256, 256, 256, 110, 256, 256, 256, 256, 256, 65, +97, 69, 101, 69, 101, 61, 103, 73, 105, 73, 105, 75, 256, 256, 76, 108, +78, 110, 256, 79, 256, 111, 82, 114, 85, 117, 85, 117, 107, 71, +}, + +/* set/win-1250 */ +{ +0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, +16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, +32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, +48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, +64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, +80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, +96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, +112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, +256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, +256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, +160, 256, 256, 256, 164, 256, 166, 167, 168, 169, 97, 171, 172, 173, 174, 256, +176, 177, 50, 51, 180, 181, 256, 183, 184, 49, 111, 187, 257, 261, 265, 256, +65, 193, 194, 65, 196, 65, 269, 199, 69, 201, 69, 203, 73, 205, 206, 278, +208, 78, 79, 211, 212, 79, 214, 215, 256, 85, 218, 85, 220, 221, 256, 223, +97, 225, 226, 97, 228, 97, 272, 231, 101, 233, 101, 235, 105, 237, 238, 281, +240, 110, 111, 243, 244, 111, 246, 247, 256, 117, 250, 117, 252, 253, 256, 284, +256, 165, 162, 163, 188, 140, 138, 170, 141, 143, 142, 175, 185, 178, 179, 190, +156, 256, 154, 186, 157, 159, 189, 158, 191, 192, 195, 197, 198, 200, 202, 204, +207, 256, 209, 210, 213, 216, 217, 219, 222, 224, 227, 229, 230, 232, 234, 236, +239, 256, 241, 242, 245, 248, 249, 251, 254, 255, 130, 132, 133, 134, 135, 137, +139, 145, 146, 147, 148, 149, 150, 151, 153, 155, 161, 162, 168, 178, 181, 184, +189, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, +256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, +256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, +256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, +256, 256, 256, 256, 256, 256, 256, 256, 256, 110, 256, 256, 256, 256, 256, 65, +97, 69, 101, 69, 101, 61, 103, 287, 290, 73, 105, 293, 256, 256, 296, 299, +302, 305, 256, 79, 256, 111, 308, 311, 85, 117, 314, 317, 320, 323, +}, + +/* set/kamen-ctrl */ +{ +0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, +16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, +32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, +48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, +64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, +80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, +96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, +112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 256, +256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, +256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, +255, 256, 256, 256, 256, 256, 256, 173, 256, 256, 97, 175, 256, 256, 256, 256, +248, 241, 253, 51, 256, 230, 256, 250, 256, 49, 111, 174, 172, 261, 265, 256, +65, 143, 65, 65, 142, 65, 269, 67, 69, 144, 69, 69, 73, 139, 73, 73, +256, 78, 79, 149, 167, 79, 153, 256, 256, 85, 151, 85, 154, 157, 256, 256, +97, 160, 97, 97, 132, 97, 272, 99, 101, 130, 101, 101, 105, 161, 105, 105, +256, 110, 111, 162, 147, 111, 148, 246, 256, 117, 163, 117, 129, 152, 256, 121, +256, 65, 256, 256, 156, 83, 155, 83, 134, 90, 146, 90, 97, 256, 256, 140, +115, 256, 168, 115, 159, 122, 256, 145, 122, 171, 65, 138, 67, 128, 69, 137, +133, 256, 78, 165, 79, 158, 166, 85, 84, 170, 97, 141, 99, 135, 101, 136, +131, 256, 110, 164, 111, 169, 150, 117, 116, 256, 256, 256, 256, 256, 256, 256, +256, 256, 256, 256, 256, 256, 256, 256, 275, 256, 256, 256, 256, 256, 230, 256, +256, 127, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, +190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, +206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, +222, 223, 224, 225, 226, 227, 228, 229, 231, 232, 233, 234, 235, 236, 237, 238, +239, 240, 242, 243, 244, 245, 247, 249, 251, 252, 254, 256, 256, 256, 256, 65, +97, 69, 101, 69, 101, 61, 103, 73, 105, 73, 105, 75, 256, 256, 76, 108, +78, 110, 256, 79, 256, 111, 82, 114, 85, 117, 85, 117, 107, 71, +}, + +/* set/koi8 */ +{ +0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, +16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, +32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, +48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, +64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, +80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, +96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, +112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, +256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, +256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, +256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 97, 256, 256, 256, 256, 256, +254, 256, 50, 51, 224, 256, 256, 256, 256, 49, 111, 256, 257, 261, 265, 256, +65, 225, 326, 65, 241, 65, 269, 67, 69, 247, 329, 69, 73, 233, 332, 73, +256, 78, 79, 239, 240, 79, 237, 256, 256, 85, 245, 335, 232, 249, 256, 256, +216, 193, 338, 97, 209, 97, 272, 99, 101, 215, 341, 101, 105, 201, 344, 105, +256, 110, 111, 207, 208, 111, 205, 256, 256, 117, 213, 347, 200, 217, 256, 121, +256, 65, 256, 256, 236, 83, 243, 83, 244, 90, 250, 90, 97, 256, 256, 204, +115, 256, 211, 115, 212, 122, 256, 218, 122, 230, 248, 235, 67, 227, 69, 229, +228, 256, 78, 238, 79, 242, 234, 85, 84, 198, 97, 203, 99, 195, 101, 197, +196, 256, 110, 206, 111, 210, 202, 117, 116, 256, 256, 256, 256, 256, 256, 256, +256, 256, 256, 256, 256, 256, 256, 256, 275, 256, 220, 256, 256, 256, 256, 256, +256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, +256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, +256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, +256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, +256, 256, 256, 256, 256, 256, 256, 256, 256, 110, 256, 199, 222, 231, 256, 65, +97, 69, 101, 69, 101, 61, 103, 73, 105, 73, 105, 75, 256, 256, 76, 108, +78, 110, 256, 79, 256, 111, 82, 114, 85, 117, 85, 117, 107, 71, +}, + +/* set/pc-latin-2 */ +{ +0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, +16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, +32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, +48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, +64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, +80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, +96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, +112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 256, +256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, +256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, +255, 256, 256, 256, 207, 256, 256, 245, 249, 256, 97, 175, 170, 256, 256, 256, +256, 256, 50, 51, 239, 256, 256, 256, 247, 49, 111, 174, 257, 261, 265, 256, +65, 181, 182, 65, 142, 65, 269, 128, 69, 144, 69, 211, 73, 214, 215, 350, +209, 78, 79, 224, 226, 79, 153, 158, 256, 85, 233, 85, 154, 237, 256, 225, +97, 160, 131, 97, 132, 97, 272, 135, 101, 130, 101, 137, 105, 161, 140, 353, +208, 110, 111, 162, 147, 111, 148, 246, 256, 117, 163, 117, 129, 236, 256, 356, +256, 164, 244, 157, 149, 151, 230, 184, 155, 141, 166, 189, 165, 242, 136, 150, +152, 256, 231, 173, 156, 171, 241, 167, 190, 232, 198, 145, 143, 172, 168, 183, +210, 256, 227, 213, 138, 252, 222, 235, 221, 234, 199, 146, 134, 159, 169, 216, +212, 256, 228, 229, 139, 253, 133, 251, 238, 250, 256, 256, 256, 256, 256, 256, +256, 256, 256, 256, 256, 256, 256, 256, 275, 256, 243, 244, 249, 242, 256, 247, +241, 127, 176, 177, 178, 179, 180, 256, 256, 256, 256, 185, 186, 187, 188, 256, +256, 191, 192, 193, 194, 195, 196, 197, 256, 256, 200, 201, 202, 203, 204, 205, +206, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 217, 218, 219, 220, 256, +256, 223, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, +256, 256, 256, 256, 256, 256, 256, 256, 256, 110, 254, 256, 256, 256, 240, 65, +97, 69, 101, 69, 101, 61, 103, 359, 362, 73, 105, 365, 256, 256, 368, 371, +374, 377, 256, 79, 256, 111, 380, 383, 85, 117, 386, 389, 392, 395, +}, + +/* set/macce */ +{ +0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, +16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, +32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, +48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, +64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, +80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, +96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, +112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, +256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, +256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, +202, 256, 256, 163, 256, 256, 256, 164, 172, 169, 97, 199, 194, 256, 168, 256, +161, 256, 50, 51, 256, 256, 166, 256, 256, 49, 111, 200, 257, 261, 265, 256, +65, 231, 65, 65, 128, 65, 269, 67, 69, 131, 69, 398, 73, 234, 73, 401, +256, 78, 79, 238, 239, 205, 133, 256, 256, 85, 242, 85, 134, 248, 256, 167, +97, 135, 97, 97, 138, 97, 272, 99, 101, 142, 101, 404, 105, 146, 105, 407, +256, 110, 111, 151, 153, 155, 154, 214, 256, 117, 156, 117, 159, 249, 256, 410, +256, 132, 256, 252, 187, 229, 225, 83, 232, 143, 235, 251, 136, 256, 184, 188, +230, 256, 228, 115, 233, 144, 256, 236, 253, 217, 65, 189, 140, 137, 162, 157, +145, 256, 193, 197, 204, 219, 241, 244, 84, 218, 97, 190, 141, 139, 171, 158, +147, 256, 196, 203, 206, 222, 243, 245, 116, 256, 226, 227, 201, 160, 256, 256, +220, 212, 213, 210, 211, 165, 209, 208, 170, 221, 255, 256, 172, 256, 256, 256, +256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, +256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, +256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, +256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, +256, 256, 179, 178, 256, 256, 256, 256, 195, 110, 256, 256, 256, 256, 256, 129, +130, 148, 149, 150, 152, 173, 174, 175, 176, 177, 180, 181, 182, 183, 185, 186, +191, 192, 198, 207, 215, 216, 223, 224, 237, 240, 246, 247, 250, 254, +}, +}; + +static unsigned char string_table[] = { +0, +3, 49, 47, 52, +3, 49, 47, 50, +3, 51, 47, 52, +2, 65, 69, +2, 97, 101, +2, 84, 77, +2, 73, 168, +2, 105, 168, +2, 121, 168, +2, 73, 178, +2, 105, 178, +2, 75, 184, +2, 76, 184, +2, 108, 184, +2, 78, 184, +2, 110, 184, +2, 82, 184, +2, 114, 184, +2, 85, 178, +2, 117, 178, +2, 107, 184, +2, 71, 184, +2, 65, 222, +2, 69, 222, +2, 73, 222, +2, 85, 222, +2, 97, 222, +2, 101, 222, +2, 105, 222, +2, 117, 222, +2, 73, 249, +2, 105, 249, +2, 121, 249, +2, 73, 242, +2, 105, 242, +2, 75, 247, +2, 76, 247, +2, 108, 247, +2, 78, 247, +2, 110, 247, +2, 82, 247, +2, 114, 247, +2, 85, 242, +2, 117, 242, +2, 107, 247, +2, 71, 247, +2, 69, 172, +2, 73, 172, +2, 101, 172, +2, 105, 172, +2, 121, 172, +}; diff --git a/charset/misc/chartable.in b/charset/misc/chartable.in new file mode 100644 index 00000000..4340fc7f --- /dev/null +++ b/charset/misc/chartable.in @@ -0,0 +1,14 @@ +# List of character set tables for tabgen +# Ordering defines internal charset numbers + +set/ascii +set/latin1 +set/latin2 +set/win-1250 +set/kamen-ctrl +set/koi8 +set/pc-latin-2 +set/macce +#set/cork +#set/ibm-ctrl +#set/mac diff --git a/charset/misc/tabgen b/charset/misc/tabgen new file mode 100755 index 00000000..076128a1 --- /dev/null +++ b/charset/misc/tabgen @@ -0,0 +1,181 @@ +#!/usr/bin/perl +# +# Character Set Table Generator 1.0 +# (c) 1998 Martin Mares +# +# This program can be freely distributed and used according to the terms +# of the GNU General Public License. +# + +# Internal codes 0..255 are mapped to UniCode 0..255 +# Internal code 256 is the replacement character (U#FFFD) + +$ncs = 0; + +print "/* Generated by tabgen 1.0, please don't edit manually. */\n\n"; + +print STDERR "Charset list...\n"; + +while (<>) { + chomp; + (/^\w*$/ || /^#/) && next; + $charsets[$ncs++] = $_; +} + +print STDERR "Found $ncs charsets, counting unique codes...\n"; + +for($unique=0; $unique<256; $unique++) { + $u2x{$unique} = $unique; + $x2u[$unique] = $unique; +} +$u2x{0xFFFD} = $unique; +$x2u[$unique++] = 0xFFFD; +print "static unsigned short int input_to_x[$ncs][256] = {\n"; +for($x=0; $x<$ncs; $x++) { + $a = $charsets[$x]; + print "\n/* $a */\n{\n"; + open (A, $a) || die "Error opening $a"; + while () { + chomp; + (/^\w*$/ || /^#/) && next; + ($i, $u, $c) = split /\t/; + $cc[$x][hex $i] = $u; + } + close A; + for($i=0; $i<256; $i++) { + $u = hex((defined $cc[$x][$i]) ? $cc[$x][$i] : "FFFD"); + if (!defined $u2x{$u}) { + $x2u[$unique] = $u; + $u2x{$u} = $unique++; + } + $o = $u2x{$u}; + print "$o,", ($i % 16 == 15) ? "\n" : " "; + $cc[$x][$i] = $o; + $cx[$x]{$o} = $i; + } + print "},\n"; +} +print "};\n\n"; + +print STDERR "$unique unique codes...\n"; + +print "static unsigned short int x_to_uni[$unique] = {\n"; +for($i=0; $i<$unique; $i++) { + print "$x2u[$i],", ($i % 16 == 15) ? "\n" : " "; +} +if ($i % 16) { print "\n"; } +print "};\n\n"; + +print STDERR "UNICODE table...\n"; +for($i=0; $i<$unique; $i++) { + $u = $x2u[$i]; + $p = $u / 256; + $pg[$p] = 1; +} +for($i=0; $i<256; $i++) { + if ($pg[$i]) { + print "static unsigned short int uni_to_x_$i\[256\] = {\n"; + for($j=0; $j<256; $j++) { + $u = 256*$i + $j; + $u = defined($u2x{$u}) ? $u2x{$u} : 256; + print "$u,", ($j % 16 == 15) ? "\n" : " "; + } + print "};\n\n"; + } +} +print "static unsigned short int *uni_to_x[256] = {\n"; +for($i=hex "FF00"; $i<=hex "FFFF"; $i++) { + if (defined $u2x{$i} && $i != 0xFFFD) { die "Invalid replacement strategy!"; } +} +for($i=0; $i<256; $i++) { + print "uni_to_x_", $pg[$i] ? $i : "255", ",", ($i % 4 == 3) ? "\n" : " "; +} +print "};\n\n"; + +print STDERR "UniData file...\n"; +open (U, "/tmp/unicode") || die "No UnicodeData file"; +while () { + chomp; + ($num,$name,$_,$_,$_,$exp) = split /;/; + if ($exp ne "") { + $exp =~ s/^<.*> *//g; + $a = ""; + foreach $x (split (/ /, $exp)) { + if ($x ne "0020") { + $a = $a . " " . hex $x; + } + } + ($expand{hex $num} = $a) =~ s/^ //; + } +} +close U; + +print STDERR "Character expansions\n"; +if (open(EXTRA, "misc/user_expand")) { + while () { + chomp; + (/^\s*$/ || /^#/) && next; + s/0x([0-9a-zA-Z]+)/hex($1)/ge; + (/^(\S+)\s+(.*)$/) || die "Syntax error in user expansions"; + $expand{$1} = $2; + } + close EXTRA; +} +print "static unsigned short int x_to_output[$ncs][$unique] = {\n"; +$pstr = 256; +for($c=0; $c<$ncs; $c++) { + print "\n/* $charsets[$c] */\n{\n"; + for($i=0; $i<$unique; $i++) { + $u = $x2u[$i]; + do { + $r = $u; + $u = ""; + foreach $x (split (/ /, $r)) { + if (defined($k = $u2x{$x}) && defined $cx[$c]{$k}) { + $u = "$u $x"; + } elsif (defined($k = $expand{$x})) { + $u = "$u $k"; + } + } + $u =~ s/^ //; + } while ($r ne $u); + $u = ""; + foreach $x (split (/ /, $r)) { + if (defined($k = $u2x{$x})) { + if ($k != 256 && defined ($k = $cx[$c]{$k})) { + $u = $u . pack("C", $k); + } + } + } + if (length($u) == 1) { + $z = unpack("C", $u); + } else { + if (!defined($string{$u})) { + $string{$u} = $pstr; + $strval{$pstr} = $u; + $pstr += 1 + length($u); + } + $z = $string{$u}; + } + print "$z,", ($i % 16 == 15) ? "\n" : " "; + } + if ($i % 16) { print "\n"; } + print "},\n"; +} +print "};\n\n"; + +print STDERR "And Tubular Bells...\n"; +print "static unsigned char string_table[] = {\n"; +$i = 256; +while ($i < $pstr) { + $w = $strval{$i}; + print length $w, ","; + foreach $x (unpack("C256", $w)) { + print " $x,"; + } + print "\n"; + $i += 1 + length $w; +} +print "};\n"; + +print STDERR "Done.\n"; diff --git a/charset/misc/user_expand b/charset/misc/user_expand new file mode 100644 index 00000000..c48aa8ae --- /dev/null +++ b/charset/misc/user_expand @@ -0,0 +1,8 @@ +# User-defined character expansions + +# Fraction slash +0x2044 0x002f + +# `ae' and `AE' +0x00c6 0x0041 0x0045 +0x00e6 0x0061 0x0065 diff --git a/charset/setnames.c b/charset/setnames.c new file mode 100644 index 00000000..2a36cde7 --- /dev/null +++ b/charset/setnames.c @@ -0,0 +1,46 @@ +/* + * Character Set Conversion Library 1.0 -- Character Set Names + * + * (c) 1998 Martin Mares + * + * This software may be freely distributed and used according to the terms + * of the GNU General Public License. + */ + +#include +#include +#include + +#include "charconv.h" + +char *cs_names[] = { + "US-ASCII", + "ISO-8859-1", + "ISO-8859-2", + "windows-1250", + "x-kam-cs", + "CSN_369103", + "cp852", + "x-mac-ce", + "utf-8" +}; + +int +find_charset_by_name(char *c) +{ + unsigned int i; + + for(i=0; i CONV_NUM_CHARSETS) + return "x-unknown"; + else + return cs_names[i]; +} -- 2.39.2