]> mj.ucw.cz Git - libucw.git/commitdiff
New character set conversion routines from CharConv Library.
authorMartin Mares <mj@ucw.cz>
Sat, 2 May 1998 08:54:22 +0000 (08:54 +0000)
committerMartin Mares <mj@ucw.cz>
Sat, 2 May 1998 08:54:22 +0000 (08:54 +0000)
I've left the old charset routines as-is for now.

charset/Makefile
charset/charconv.c [new file with mode: 0644]
charset/charconv.h [new file with mode: 0644]
charset/chartable.h [new file with mode: 0644]
charset/misc/chartable.in [new file with mode: 0644]
charset/misc/tabgen [new file with mode: 0755]
charset/misc/user_expand [new file with mode: 0644]
charset/setnames.c [new file with mode: 0644]

index fab75f42cf7e479bcc7967750ba0e7332f544eeb..ad9911cb359a48fc36d9470d8d95e432cc0eb739 100644 (file)
@@ -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 <misc/u-unacc >U-unacc.h
        misc/mksig >misc/u-sig
        misc/gentab _U_sig byte <misc/u-sig >U-sig.h
+       misc/tabgen <misc/chartable.in >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 (file)
index 0000000..8da42ff
--- /dev/null
@@ -0,0 +1,263 @@
+/*
+ *     Character Set Conversion Library 1.0
+ *
+ *     (c) 1998 Martin Mares <mj@atrey.karlin.mff.cuni.cz>
+ *
+ *     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 (file)
index 0000000..14fee07
--- /dev/null
@@ -0,0 +1,43 @@
+/*
+ *     Character Set Conversion Library 1.0
+ *
+ *     (c) 1998 Martin Mares <mj@atrey.karlin.mff.cuni.cz>
+ *
+ *     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 (file)
index 0000000..fc5b8f3
--- /dev/null
@@ -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 (file)
index 0000000..4340fc7
--- /dev/null
@@ -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 (executable)
index 0000000..076128a
--- /dev/null
@@ -0,0 +1,181 @@
+#!/usr/bin/perl
+#
+#      Character Set Table Generator 1.0
+#      (c) 1998 Martin Mares <mj@atrey.karlin.mff.cuni.cz>
+#
+#      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 (<A>) {
+               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 (<U>) {
+       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 (<EXTRA>) {
+               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 (file)
index 0000000..c48aa8a
--- /dev/null
@@ -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 (file)
index 0000000..2a36cde
--- /dev/null
@@ -0,0 +1,46 @@
+/*
+ *     Character Set Conversion Library 1.0 -- Character Set Names
+ *
+ *     (c) 1998 Martin Mares <mj@atrey.karlin.mff.cuni.cz>
+ *
+ *     This software may be freely distributed and used according to the terms
+ *     of the GNU General Public License.
+ */
+
+#include <stdio.h>
+#include <string.h>
+#include <lib/lib.h>
+
+#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; i++)
+               if (!strcasecmp(cs_names[i], c))
+                       return i;
+       return -1;
+}
+
+char *
+charset_name(int i)
+{
+  if (i < 0 || i > CONV_NUM_CHARSETS)
+    return "x-unknown";
+  else
+    return cs_names[i];
+}