Skip to content

Instantly share code, notes, and snippets.

@ma2shita
Created April 9, 2014 07:11
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save ma2shita/10234579 to your computer and use it in GitHub Desktop.
Save ma2shita/10234579 to your computer and use it in GitHub Desktop.
PHP 3.0.18-ja-3 patch for modern linux
--- i18n_ja_jp_filter.c.orig 2000-04-04 09:18:32.000000000 +0900
+++ i18n_ja_jp_filter.c 2014-04-08 18:07:28.723051000 +0900
@@ -97,5392 +97,7 @@
/* unicode support by */
#define UNDEFCHAR_JIS 0x2126
#define UNDEFCHAR_UNICODE 0x30FB
-extern const unsigned short u2jtable[];
-extern const unsigned short j2utable[];
-extern const int u2jtable_size;
-extern const int j2utable_size;
-
-
-/* language description structure */
-const char *mbfl_language_ja_jp_aliases[] = {"japanese", NULL};
-mbfl_language mbfl_language_unknown = {mbfl_no_language_unknown, "unknown", NULL};
-mbfl_language mbfl_language_universal = {mbfl_no_language_universal, "universal", NULL};
-mbfl_language mbfl_language_en_us = {mbfl_no_language_en_us, "en_US", NULL};
-mbfl_language mbfl_language_ja_jp = {mbfl_no_language_ja_jp, "ja_JP", &mbfl_language_ja_jp_aliases};
-
-mbfl_language_ptr mbfl_language_ptr_table[] = {
- &mbfl_language_unknown,
- &mbfl_language_universal,
- &mbfl_language_en_us,
- &mbfl_language_ja_jp,
- NULL
-};
-
-/* encoding description structure */
-const char *mbfl_encoding_auto_aliases[] = {"unknown", NULL};
-const char *mbfl_encoding_pass_aliases[] = {"none", NULL};
-const char *mbfl_encoding_qprint_aliases[] = {"qprint", NULL};
-const char *mbfl_encoding_ja_jp_euc_aliases[] = {"EUC", "EUC_JP", "eucJP", "x-euc-jp", NULL};
-const char *mbfl_encoding_ja_jp_sjis_aliases[] = {"x-sjis", "MS_Kanji", NULL};
-mbfl_encoding mbfl_encoding_auto = {mbfl_no_encoding_auto, "auto", &mbfl_encoding_auto_aliases, "", &mbfl_language_unknown};
-mbfl_encoding mbfl_encoding_pass = {mbfl_no_encoding_pass, "pass", &mbfl_encoding_pass_aliases, "", &mbfl_language_unknown};
-mbfl_encoding mbfl_encoding_wchar = {mbfl_no_encoding_wchar, "wchar", NULL, "", &mbfl_language_unknown};
-mbfl_encoding mbfl_encoding_base64 = {mbfl_no_encoding_base64, "BASE64", NULL, "", &mbfl_language_unknown};
-mbfl_encoding mbfl_encoding_qprint = {mbfl_no_encoding_qprint, "Quoted-Printable", &mbfl_encoding_qprint_aliases, "", &mbfl_language_unknown};
-mbfl_encoding mbfl_encoding_utf8 = {mbfl_no_encoding_utf8, "UTF-8", NULL, "UTF-8", &mbfl_language_universal};
-mbfl_encoding mbfl_encoding_ucs = {mbfl_no_encoding_ucs, "UCS", NULL, "", &mbfl_language_universal};
-mbfl_encoding mbfl_encoding_en_us_ascii = {mbfl_no_encoding_en_us_ascii, "ASCII", NULL, "US-ASCII", &mbfl_language_en_us};
-mbfl_encoding mbfl_encoding_ja_jp_euc = {mbfl_no_encoding_ja_jp_euc, "EUC-JP", &mbfl_encoding_ja_jp_euc_aliases, "EUC-JP", &mbfl_language_ja_jp};
-mbfl_encoding mbfl_encoding_ja_jp_sjis = {mbfl_no_encoding_ja_jp_sjis, "SJIS", &mbfl_encoding_ja_jp_sjis_aliases, "Shift_JIS", &mbfl_language_ja_jp};
-mbfl_encoding mbfl_encoding_ja_jp_jis = {mbfl_no_encoding_ja_jp_jis, "JIS", NULL, "ISO-2022-JP", &mbfl_language_ja_jp};
-
-mbfl_encoding_ptr mbfl_encoding_ptr_table[] = {
- &mbfl_encoding_auto,
- &mbfl_encoding_pass,
- &mbfl_encoding_wchar,
- &mbfl_encoding_base64,
- &mbfl_encoding_qprint,
- &mbfl_encoding_utf8,
- &mbfl_encoding_ucs,
- &mbfl_encoding_en_us_ascii,
- &mbfl_encoding_ja_jp_euc,
- &mbfl_encoding_ja_jp_sjis,
- &mbfl_encoding_ja_jp_jis,
- NULL
-};
-
-mbfl_encoding_ptr
-mbfl_name2encoding(const char *name)
-{
- mbfl_encoding_ptr penc;
- int i, j;
-
- if (name == NULL) {
- return NULL;
- }
-
- i = 0;
- while((penc = mbfl_encoding_ptr_table[i++]) != NULL){
- if(strcasecmp(penc->name, name) == 0) {
- return penc;
- }
- }
-
- /* serch MIME charset name */
- i = 0;
- while((penc = mbfl_encoding_ptr_table[i++]) != NULL){
- if(strcasecmp(penc->mime_name, name) == 0) {
- return penc;
- }
- }
-
- /* serch aliases */
- i = 0;
- while((penc = mbfl_encoding_ptr_table[i++]) != NULL){
- if(penc->aliases != NULL) {
- j = 0;
- while((*penc->aliases)[j] != NULL) {
- if(strcasecmp((*penc->aliases)[j], name) == 0)
- return penc;
- j++;
- }
- }
- }
-
- return NULL;
-}
-
-mbfl_encoding_ptr
-mbfl_no2encoding(int no_encoding)
-{
- mbfl_encoding_ptr penc;
- int i;
-
- i = 0;
- while((penc = mbfl_encoding_ptr_table[i++]) != NULL){
- if(penc->no_encoding == no_encoding) {
- return penc;
- }
- }
-
- return NULL;
-}
-
-
-
-/*
- * メモリに出力するoutput_function
- * あとで使用する。
- */
-int
-memory_device_output(int c, void* data)
-{
- if (((struct memory_device*)data)->pos >= ((struct memory_device*)data)->length) {
- /* バッファの長さを調節 */
- int newlen = ((struct memory_device*)data)->length + MBFL_MEMORY_DEVICE_ALLOC_SIZE;
- char *tmp = (char*)realloc((void*)((struct memory_device*)data)->buffer, newlen);
- if (tmp == NULL) {
- return -1;
- }
- ((struct memory_device*)data)->length = newlen;
- ((struct memory_device*)data)->buffer = tmp;
- }
-
- ((struct memory_device*)data)->buffer[((struct memory_device*)data)->pos++] = (char)c;
- return c;
-}
-
-int
-memory_device_cat(struct memory_device *pd, const char *psrc)
-{
- int len;
- const char *p;
-
- len = 0;
- p = psrc;
- while (*p) {
- p++;
- len++;
- }
-
- if ((pd->pos + len) >= pd->length) {
- /* バッファの長さを調節 */
- int newlen = pd->length + len + MBFL_MEMORY_DEVICE_ALLOC_SIZE;
- char *tmp = (char*)realloc((void*)pd->buffer, newlen);
- if (tmp == NULL) {
- return 0;
- }
- pd->length = newlen;
- pd->buffer = tmp;
- }
-
- p = psrc;
- while (*p) {
- pd->buffer[pd->pos++] = *p++;
- }
- return 1;
-}
-
-int
-memory_device_ncat(struct memory_device *pd, const char *psrc, int len)
-{
- if ((pd->pos + len) >= pd->length) {
- /* バッファの長さを調節 */
- int newlen = pd->length + len + MBFL_MEMORY_DEVICE_ALLOC_SIZE;
- char *tmp = (char*)realloc((void*)pd->buffer, newlen);
- if (tmp == NULL) {
- return 0;
- }
- pd->length = newlen;
- pd->buffer = tmp;
- }
-
- while (len > 0) {
- pd->buffer[pd->pos++] = *psrc++;
- len--;
- }
- return 1;
-}
-
-int
-wchar_device_output(int c, void* data)
-{
- if (((struct wchar_device*)data)->pos >= ((struct wchar_device*)data)->length) {
- /* バッファの長さを調節 */
- int newlen = ((struct wchar_device*)data)->length + MBFL_MEMORY_DEVICE_ALLOC_SIZE;
- int *tmp = (int*)realloc((void*)((struct wchar_device*)data)->buffer, newlen*sizeof(int));
- if (tmp == NULL) {
- return -1;
- }
- ((struct wchar_device*)data)->length = newlen;
- ((struct wchar_device*)data)->buffer = tmp;
- }
-
- ((struct wchar_device*)data)->buffer[((struct wchar_device*)data)->pos++] = c;
- return c;
-}
-
-/*
- *
- * kanji code filter
- *
- */
-struct mbfl_output_filter {
- const struct filter_vtbl* vptr;
- /* 行うべき変換によって異なるポインタを保持する。*/
-
- int (*output_function)(int c, void* data);
- /* 利用側が用意。エラーのときはマイナス値。*/
-
- int (*flush_function)(void* data);
- /* 利用側が用意。出力をフラッシュする。ヌルならば使用されない。*/
-
- void* data;
- /* 利用側が用意。(*output_function)()の1番目の引数に渡される。*/
-
- int status;
- /* vptr->filter_functionによって使用方法は異なる。*/
-
- int cache;
- /* vptr->filter_functionによって使用方法は異なる。*/
-
- enum mbfl_no_encoding from;
- enum mbfl_no_encoding to;
- /* 変換前と後の漢字コード */
-};
-
-struct filter_vtbl {
- void (*filter_ctor)(
- struct mbfl_output_filter* filter,
- enum mbfl_no_encoding from,
- enum mbfl_no_encoding to,
- int (*output_function)(int, void*),
- int (*flush_function)(void*),
- void* data);
- /* mbfl_output_filterの内容を初期化する。*/
-
- void (*filter_dtor)(struct mbfl_output_filter* filter);
- /* mbfl_output_filterの削除前処理を行う。*/
-
- int (*filter_function)(struct mbfl_output_filter* filter, int c);
- /* 変換を行う関数へのポインタ。エラーのときはマイナス値。*/
-
- int (*flush_function)(struct mbfl_output_filter* filter);
- /* フラッシュを行う関数へのポインタ。*/
-};
-
-#define CK(statement) do { if ((statement) < 0) return (-1); } while (0)
-
-
-/*
- * commonly used constructor and destructor
- */
-static void
-filt_common_ctor(
- struct mbfl_output_filter* filter,
- enum mbfl_no_encoding from, /* ignored */
- enum mbfl_no_encoding to, /* ignored */
- int (*output_function)(int, void*),
- int (*flush_function)(void*),
- void* data)
-{
- filter->output_function = output_function;
- filter->flush_function = flush_function;
- filter->data = data;
- filter->status = 0;
- filter->cache = 0;
- filter->from = from;
- filter->to = to;
-}
-
-static int
-filt_common_flush(struct mbfl_output_filter* filter)
-{
- /* flush */
- return (filter->flush_function ? (*filter->flush_function)(filter->data) : 0);
-}
-
-static void
-filt_common_dtor(struct mbfl_output_filter* filter)
-{
- /* flush */
- if (filter->flush_function) {
- (void)(*filter->flush_function)(filter->data);
- }
-
- /* destruct */
-}
-
-static int
-filt_pass(struct mbfl_output_filter* filter, int c)
-{
- return (*filter->output_function)(c, filter->data);
-}
-
-/*
- * EUC-JP => JIS
- */
-static int
-filt_eucjp_jis(struct mbfl_output_filter* filter, int c)
-{
- switch (filter->status) {
- case 0: /* roman */
- case 10: /* kana */
- case 20: /* kanji */
- if (c == 0x8e) { /* kana first char */
- filter->status++; /* 0->1, 10->11, 20->21 */
- break;
- } if (c >= 0x80) { /* kanji first char */
- filter->status += 2; /* 0->2, 10->12, 20->22 */
- filter->cache = c;
- break;
- }
- if (filter->status != 0) {
- CK((*filter->output_function)('\033', filter->data));
- CK((*filter->output_function)('(', filter->data));
- CK((*filter->output_function)('B', filter->data));
- filter->status = 0;
- }
- CK((*filter->output_function)(c, filter->data));
- break;
-
- case 1: /* roman got 0x8e */
- case 21: /* kanji got 0x8e */
- CK((*filter->output_function)('\033', filter->data));
- CK((*filter->output_function)('(', filter->data));
- CK((*filter->output_function)('I', filter->data));
- case 11: /* kana got 0x8e */
- filter->status = 10;
- CK((*filter->output_function)(c & 0x7f, filter->data));
- break;
-
- case 2: /* roman got first half */
- case 12: /* kana got first half */
- CK((*filter->output_function)('\033', filter->data));
- CK((*filter->output_function)('$', filter->data));
- CK((*filter->output_function)('B', filter->data));
- case 22: /* kanji got first half */
- filter->status = 20;
- if (c == '\0') {
- CK((*filter->output_function)(c, filter->data));
- } else {
- CK((*filter->output_function)(filter->cache & 0x7f, filter->data));
- CK((*filter->output_function)(c & 0x7f, filter->data));
- }
- break;
- }
-
- return c;
-}
-
-static int
-filt_eucjp_jis_flush(struct mbfl_output_filter* filter)
-{
- /* back to roman */
- if (filter->status / 10 != 0) { /* upper digit of the status */
- CK((*filter->output_function)('\033', filter->data));
- CK((*filter->output_function)('(', filter->data));
- CK((*filter->output_function)('B', filter->data));
- }
-
- /* flush */
- return (filter->flush_function ? (*filter->flush_function)(filter->data) : 0);
-}
-
-static void
-filt_eucjp_jis_dtor(struct mbfl_output_filter* filter)
-{
- (void)filt_eucjp_jis_flush(filter);
-}
-
-/*
- * EUC-JP => SJIS
- */
-static int
-filt_eucjp_sjis(struct mbfl_output_filter* filter, int c)
-{
- int c1;
-
- switch (filter->status) {
- case 0: /* roman */
- if (c == 0x8e) { /* kana first char */
- filter->status = 1;
- break;
- }
- if (c >= 0x80) { /* kanji first char */
- filter->status = 2;
- filter->cache = c;
- break;
- }
- CK((*filter->output_function)(c, filter->data));
- break;
-
- case 1: /* got 0x8e */
- filter->status = 0;
- CK((*filter->output_function)(c, filter->data));
- break;
-
- case 2: /* got first half */
- filter->status = 0;
- if (c == '\0') {
- CK((*filter->output_function)(c, filter->data));
- } else {
- c1 = filter->cache & 0x7f;
- c &= 0x7f;
- c += ((c1 % 2) ? (c > 0x5f ? 0x20 : 0x1f) : 0x7e);
- CK((*filter->output_function)(((c1 + 1) >> 1) + (c1 < 0x5f ? 0x70 : 0xb0), filter->data));
- CK((*filter->output_function)(c, filter->data));
- }
- break;
- }
-
- return c;
-}
-
-/*
- * SJIS => JIS
- */
-static int
-filt_sjis_jis(struct mbfl_output_filter* filter, int c)
-{
- int next; /* next status */
- int c1, row;
-
- if (filter->status >= 10) { /* kanji second char */
- filter->status %= 10;
- next = 2;
- } else if (c >= 0xa1 && c <= 0xdf) { /* kana */
- next = 1;
- } else if (c >= 0x80) { /* kanji first char */
- filter->status += 10;
- filter->cache = c;
- return c;
- } else { /* roman */
- next = 0;
- }
-
- switch (next) {
- case 0: /* roman */
- if (filter->status != 0) {
- CK((*filter->output_function)('\033', filter->data));
- CK((*filter->output_function)('(', filter->data));
- CK((*filter->output_function)('B', filter->data));
- filter->status = 0;
- }
- CK((*filter->output_function)(c, filter->data));
- break;
-
- case 1: /* kana */
- if (filter->status != 1) {
- CK((*filter->output_function)('\033', filter->data));
- CK((*filter->output_function)('(', filter->data));
- CK((*filter->output_function)('I', filter->data));
- filter->status = 1;
- }
- CK((*filter->output_function)(c & 0x7f, filter->data));
- break;
-
- case 2: /* kanji second char */
- if (c == '\0') {
- CK((*filter->output_function)(c, filter->data));
- } else {
- if (filter->status != 2) {
- CK((*filter->output_function)('\033', filter->data));
- CK((*filter->output_function)('$', filter->data));
- CK((*filter->output_function)('B', filter->data));
- filter->status = 2;
- }
- c1 = filter->cache;
- row = (c1 < 0xa0 ? 0x70 : 0xb0);
- if (c < 0x9f) {
- c1 = ((c1 - row) << 1) - 1;
- c -= (c > 0x7f ? 0x20 : 0x1f);
- } else {
- c1 = ((c1 - row) << 1);
- c -= 0x7e;
- }
- CK((*filter->output_function)(c1, filter->data));
- CK((*filter->output_function)(c, filter->data));
- }
- break;
- }
-
- return c;
-}
-
-static int
-filt_sjis_jis_flush(struct mbfl_output_filter* filter)
-{
- /* back to roman */
- if (filter->status != 0) {
- (*filter->output_function)('\033', filter->data);
- (*filter->output_function)('(', filter->data);
- (*filter->output_function)('B', filter->data);
- }
-
- /* flush */
- return (filter->flush_function ? (*filter->flush_function)(filter->data) : 0);
-}
-
-static void
-filt_sjis_jis_dtor(struct mbfl_output_filter* filter)
-{
- (void)filt_sjis_jis_flush(filter);
-}
-
-/*
- * SJIS => EUC-JP
- */
-static int
-filt_sjis_eucjp(struct mbfl_output_filter* filter, int c)
-{
- int c1, row;
-
- if (filter->status == 1) { /* kanji second char */
- filter->status = 0;
- if (c == '\0') {
- CK((*filter->output_function)(c, filter->data));
- } else {
- c1 = filter->cache;
- row = (c1 < 0xa0 ? 0x70 : 0xb0);
- if (c < 0x9f) {
- c1 = ((c1 - row) << 1) - 1;
- c -= (c > 0x7f ? 0x20 : 0x1f);
- } else {
- c1 = ((c1 - row) << 1);
- c -= 0x7e;
- }
- CK((*filter->output_function)(c1 | 0x80, filter->data));
- CK((*filter->output_function)(c | 0x80, filter->data));
- }
- } else if (c >= 0xa1 && c <= 0xdf) { /* kana */
- CK((*filter->output_function)(0x8e, filter->data));
- CK((*filter->output_function)(c, filter->data));
- } else if (c >= 0x80) { /* kanji first char */
- filter->status = 1;
- filter->cache = c;
- } else { /* roman */
- CK((*filter->output_function)(c, filter->data));
- }
-
- return c;
-}
-
-/*
- * JIS => EUC-JP
- */
-static int
-filt_jis_eucjp(struct mbfl_output_filter* filter, int c)
-{
-retry:
- switch (filter->status) {
- case 0: /* roman */
- case 10: /* kana */
- case 20: /* kanji */
- if (c == 0x1b) {
- filter->status++;
- } else if (c == 0x0e) { /* "kana in" */
- filter->status = 10;
- } else if (c == 0x0f) { /* "kana out" */
- filter->status = 0;
- } else if (c >= 0x21 && c <= 0x7e) {
- if (filter->status == 20) { /* kanji first char */
- filter->cache = c;
- filter->status = 25;
- } else if (filter->status == 10) { /* kana */
- CK((*filter->output_function)(0x8e, filter->data));
- CK((*filter->output_function)(c | 0x80, filter->data));
- } else { /* ascii */
- CK((*filter->output_function)(c, filter->data));
- }
- } else if (c >= 0xa1 && c <= 0xdf) { /* GR kana */
- CK((*filter->output_function)(0x8e, filter->data));
- CK((*filter->output_function)(c, filter->data));
- } else { /* CR, LF, CTLs */
- CK((*filter->output_function)(c, filter->data));
- }
- break;
-
- case 25: /* kanji second char */
- filter->status = 20;
- if (c == '\0') {
- CK((*filter->output_function)(c, filter->data));
- } else if (c == 0x1b) {
- goto retry;
- } else {
- CK((*filter->output_function)(filter->cache | 0x80, filter->data));
- CK((*filter->output_function)(c | 0x80, filter->data));
- }
- break;
-
- case 1: /* ESC */
- case 11: /* ESC */
- case 21: /* ESC */
- if (c == 0x24) {
- filter->status++;
- } else if (c == 0x28) {
- filter->status += 3;
- } else {
- filter->status--;
- CK((*filter->output_function)(0x1b, filter->data));
- goto retry;
- }
- break;
-
- case 2: /* ESC 0x24 */
- case 12: /* ESC 0x24 */
- case 22: /* ESC 0x24 */
- if (c == 0x40 || c == 0x42) {
- filter->status = 20;
- } else if (c == 0x28) {
- filter->status++;
- } else {
- filter->status -= 2;
- CK((*filter->output_function)(0x1b, filter->data));
- CK((*filter->output_function)(0x24, filter->data));
- goto retry;
- }
- break;
-
- case 3: /* ESC 0x24 0x28 */
- case 13: /* ESC 0x24 0x28 */
- case 23: /* ESC 0x24 0x28 */
- if (c == 0x44) {
- filter->status = 20;
- } else {
- filter->status -= 3;
- CK((*filter->output_function)(0x1b, filter->data));
- CK((*filter->output_function)(0x24, filter->data));
- CK((*filter->output_function)(0x28, filter->data));
- goto retry;
- }
- break;
-
- case 4: /* ESC 0x28 */
- case 14: /* ESC 0x28 */
- case 24: /* ESC 0x28 */
- switch (c) {
- case 0x42:
- case 0x48:
- case 0x4a:
- filter->status = 0;
- break;
-
- case 0x49:
- filter->status = 10;
- break;
-
- default:
- filter->status -= 4;
- CK((*filter->output_function)(0x1b, filter->data));
- CK((*filter->output_function)(0x28, filter->data));
- goto retry;
- break;
- }
- break;
- }
-
- return c;
-}
-
-/*
- * JIS => SJIS
- */
-static int
-filt_jis_sjis(struct mbfl_output_filter* filter, int c)
-{
- int c1;
-
-retry:
- switch (filter->status) {
- case 0: /* roman */
- case 10: /* kana */
- case 20: /* kanji */
- if (c == 0x1b) {
- filter->status++;
- } else if (c == 0x0e) { /* "kana in" */
- filter->status = 10;
- } else if (c == 0x0f) { /* "kana out" */
- filter->status = 0;
- } else if (c >= 0x21 && c <= 0x7e) {
- if (filter->status == 20) { /* kanji first char */
- filter->cache = c;
- filter->status = 25;
- } else if (filter->status == 10) { /* kana */
- CK((*filter->output_function)(c | 0x80, filter->data));
- } else { /* ascii */
- CK((*filter->output_function)(c, filter->data));
- }
- } else { /* CR, LF, CTLs or maybe GR kana */
- CK((*filter->output_function)(c, filter->data));
- }
- break;
-
- case 25: /* kanji second char */
- filter->status = 20;
- if (c == '\0') {
- CK((*filter->output_function)(c, filter->data));
- } else if (c == 0x1b) {
- goto retry;
- } else {
- c1 = filter->cache;
- c &= 0x7f;
- c += ((c1 % 2) ? (c > 0x5f ? 0x20 : 0x1f) : 0x7e);
- CK((*filter->output_function)(((c1 + 1) >> 1) + (c1 < 0x5f ? 0x70 : 0xb0), filter->data));
- CK((*filter->output_function)(c, filter->data));
- }
- break;
-
- case 1: /* ESC */
- case 11: /* ESC */
- case 21: /* ESC */
- if (c == 0x24) {
- filter->status++;
- } else if (c == 0x28) {
- filter->status += 3;
- } else {
- filter->status--;
- CK((*filter->output_function)(0x1b, filter->data));
- goto retry;
- }
- break;
-
- case 2: /* ESC 0x24 */
- case 12: /* ESC 0x24 */
- case 22: /* ESC 0x24 */
- if (c == 0x40 || c == 0x42) {
- filter->status = 20;
- } else if (c == 0x28) {
- filter->status++;
- } else {
- filter->status -= 2;
- CK((*filter->output_function)(0x1b, filter->data));
- CK((*filter->output_function)(0x24, filter->data));
- goto retry;
- }
- break;
-
- case 3: /* ESC 0x24 0x28 */
- case 13: /* ESC 0x24 0x28 */
- case 23: /* ESC 0x24 0x28 */
- if (c == 0x44) {
- filter->status = 20;
- } else {
- filter->status -= 3;
- CK((*filter->output_function)(0x1b, filter->data));
- CK((*filter->output_function)(0x24, filter->data));
- CK((*filter->output_function)(0x28, filter->data));
- goto retry;
- }
- break;
-
- case 4: /* ESC 0x28 */
- case 14: /* ESC 0x28 */
- case 24: /* ESC 0x28 */
- switch (c) {
- case 0x42:
- case 0x48:
- case 0x4a:
- filter->status = 0;
- break;
-
- case 0x49:
- filter->status = 10;
- break;
-
- default:
- filter->status -= 4;
- CK((*filter->output_function)(0x1b, filter->data));
- CK((*filter->output_function)(0x28, filter->data));
- goto retry;
- break;
- }
- break;
- }
-
- return c;
-}
-
-/*
- * EUC-JP => UTF-8
- */
-static int
-filt_eucjp_utf8(struct mbfl_output_filter* filter, int c)
-{
- int p, s;
-
- switch (filter->status) {
- case 0: /* roman */
- if (c == 0x8e) { /* kana first char */
- filter->status = 1;
- } else if (c >= 0x80) { /* kanji first char */
- filter->status = 2;
- filter->cache = c;
- } else {
- CK((*filter->output_function)(c, filter->data));
- }
- break;
-
- case 1: /* got 0x8e */
- filter->status = 0;
- if (c >= 0xa1 && c <= 0xdf) {
- s = 0xfec0 + c;
- CK((*filter->output_function)(((s >> 12) & 0x0f) | 0xe0, filter->data));
- CK((*filter->output_function)(((s >> 6) & 0x3f) | 0x80, filter->data));
- CK((*filter->output_function)((s & 0x3f) | 0x80, filter->data));
- } else if (c < 0x80) {
- CK((*filter->output_function)(c, filter->data));
- }
- break;
-
- case 2: /* got first half */
- filter->status = 0;
- if (c == '\0') {
- CK((*filter->output_function)(c, filter->data));
- } else {
- p = (filter->cache - 0xa1) * 94 + c - 0xa1;
- s = 0;
- if (p >= 0 && p < j2utable_size)
- s = j2utable[p];
- if (s == 0)
- s = UNDEFCHAR_UNICODE;
- if (s < 0x80) {
- CK((*filter->output_function)(s, filter->data));
- } else if (s < 0x800) {
- CK((*filter->output_function)(((s >> 6) & 0x1f) | 0xc0, filter->data));
- CK((*filter->output_function)((s & 0x3f) | 0x80, filter->data));
- } else {
- CK((*filter->output_function)(((s >> 12) & 0x0f) | 0xe0, filter->data));
- CK((*filter->output_function)(((s >> 6) & 0x3f) | 0x80, filter->data));
- CK((*filter->output_function)((s & 0x3f) | 0x80, filter->data));
- }
- }
- break;
- }
-
- return c;
-}
-
-/*
- * SJIS => UTF8
- */
-static int
-filt_sjis_utf8(struct mbfl_output_filter* filter, int c)
-{
- int p, s;
-
- if (filter->status == 1) { /* kanji second char */
- filter->status = 0;
- if (c == '\0') {
- CK((*filter->output_function)(c, filter->data));
- } else {
- p = filter->cache;
- if (p < 0xa0)
- p -= 0x81;
- else
- p -= 0xc1;
- p *= 188;
- if (c < 0x7f)
- p += c - 0x40;
- else
- p += c - 0x41;
- s = 0;
- if (p >= 0 && p < j2utable_size)
- s = j2utable[p];
- if (s == 0)
- s = UNDEFCHAR_UNICODE;
- if (s < 0x80) {
- CK((*filter->output_function)(s, filter->data));
- } else if (s < 0x800) {
- CK((*filter->output_function)(((s >> 6) & 0x1f) | 0xc0, filter->data));
- CK((*filter->output_function)((s & 0x3f) | 0x80, filter->data));
- } else {
- CK((*filter->output_function)(((s >> 12) & 0x0f) | 0xe0, filter->data));
- CK((*filter->output_function)(((s >> 6) & 0x3f) | 0x80, filter->data));
- CK((*filter->output_function)((s & 0x3f) | 0x80, filter->data));
- }
- }
- } else if (c >= 0xa1 && c <= 0xdf) { /* kana */
- filter->status = 0;
- s = 0xfec0 + c;
- CK((*filter->output_function)(((s >> 12) & 0x0f) | 0xe0, filter->data));
- CK((*filter->output_function)(((s >> 6) & 0x3f) | 0x80, filter->data));
- CK((*filter->output_function)((s & 0x3f) | 0x80, filter->data));
- } else if (c >= 0x80) { /* kanji first char */
- filter->status = 1;
- filter->cache = c;
- } else { /* roman */
- filter->status = 0;
- CK((*filter->output_function)(c, filter->data));
- }
-
- return c;
-}
-
-/*
- * JIS => UTF-8
- */
-static int
-filt_jis_utf8(struct mbfl_output_filter* filter, int c)
-{
- int p, s;
-
-retry:
- switch (filter->status) {
- case 0: /* roman */
- case 10: /* kana */
- case 20: /* kanji */
- if (c == 0x1b) {
- filter->status++;
- } else if (c == 0x0e) { /* "kana in" */
- filter->status = 10;
- } else if (c == 0x0f) { /* "kana out" */
- filter->status = 0;
- } else if (c >= 0x21 && c <= 0x7e) {
- if (filter->status == 20) { /* kanji first char */
- filter->cache = c;
- filter->status = 25;
- } else if (filter->status == 10) { /* kana */
- s = 0xff40 + c;
- CK((*filter->output_function)(((s >> 12) & 0x0f) | 0xe0, filter->data));
- CK((*filter->output_function)(((s >> 6) & 0x3f) | 0x80, filter->data));
- CK((*filter->output_function)((s & 0x3f) | 0x80, filter->data));
- } else { /* ascii */
- CK((*filter->output_function)(c, filter->data));
- }
- } else if (c >= 0xa1 && c <= 0xdf) { /* GR kana */
- s = 0xfec0 + c;
- CK((*filter->output_function)(((s >> 12) & 0x0f) | 0xe0, filter->data));
- CK((*filter->output_function)(((s >> 6) & 0x3f) | 0x80, filter->data));
- CK((*filter->output_function)((s & 0x3f) | 0x80, filter->data));
- } else { /* CR, LF, CTLs */
- CK((*filter->output_function)(c, filter->data));
- }
- break;
-
- case 25: /* kanji second char */
- filter->status = 20;
- if (c == '\0') {
- CK((*filter->output_function)(c, filter->data));
- } else if (c == 0x1b) {
- goto retry;
- } else {
- p = (filter->cache - 0x21) * 94 + c - 0x21;
- s = 0;
- if (p >= 0 && p < j2utable_size)
- s = j2utable[p];
- if (s == 0)
- s = UNDEFCHAR_UNICODE;
- if (s < 0x80) {
- CK((*filter->output_function)(s, filter->data));
- } else if (s < 0x800) {
- CK((*filter->output_function)(((s >> 6) & 0x1f) | 0xc0, filter->data));
- CK((*filter->output_function)((s & 0x3f) | 0x80, filter->data));
- } else {
- CK((*filter->output_function)(((s >> 12) & 0x0f) | 0xe0, filter->data));
- CK((*filter->output_function)(((s >> 6) & 0x3f) | 0x80, filter->data));
- CK((*filter->output_function)((s & 0x3f) | 0x80, filter->data));
- }
- }
- break;
-
- case 1: /* ESC */
- case 11: /* ESC */
- case 21: /* ESC */
- if (c == 0x24) {
- filter->status++;
- } else if (c == 0x28) {
- filter->status += 3;
- } else {
- filter->status--;
- CK((*filter->output_function)(0x1b, filter->data));
- goto retry;
- }
- break;
-
- case 2: /* ESC 0x24 */
- case 12: /* ESC 0x24 */
- case 22: /* ESC 0x24 */
- if (c == 0x40 || c == 0x42) {
- filter->status = 20;
- } else if (c == 0x28) {
- filter->status++;
- } else {
- filter->status -= 2;
- CK((*filter->output_function)(0x1b, filter->data));
- CK((*filter->output_function)(0x24, filter->data));
- goto retry;
- }
- break;
-
- case 3: /* ESC 0x24 0x28 */
- case 13: /* ESC 0x24 0x28 */
- case 23: /* ESC 0x24 0x28 */
- if (c == 0x44) {
- filter->status = 20;
- } else {
- filter->status -= 3;
- CK((*filter->output_function)(0x1b, filter->data));
- CK((*filter->output_function)(0x24, filter->data));
- CK((*filter->output_function)(0x28, filter->data));
- goto retry;
- }
- break;
-
- case 4: /* ESC 0x28 */
- case 14: /* ESC 0x28 */
- case 24: /* ESC 0x28 */
- switch (c) {
- case 0x42:
- case 0x48:
- case 0x4a:
- filter->status = 0;
- break;
- case 0x49:
- filter->status = 10;
- break;
- default:
- filter->status -= 4;
- CK((*filter->output_function)(0x1b, filter->data));
- CK((*filter->output_function)(0x28, filter->data));
- goto retry;
- }
- break;
- }
-
- return c;
-}
-
-
-/*
- * UTF-8 => EUC-JP
- */
-static int
-filt_utf8_euc(struct mbfl_output_filter* filter, int c)
-{
- int s;
-
- if (c < 0x80) {
- filter->status = 0;
- CK((*filter->output_function)(c, filter->data));
- } else if (c < 0xc0) {
- switch (filter->status) {
- case 0x20: /* 3 byte code second char */
- filter->cache += ((c & 0x3f) << 6);
- filter->status++;
- break;
-
- case 0x10: /* 2 byte code second char */
- case 0x21: /* 3 byte code third char */
- filter->status = 0;
- s = u2jtable[filter->cache + (c & 0x3f)];
- if (s == 0)
- s = UNDEFCHAR_JIS;
- if(s < 0x80) {
- CK((*filter->output_function)(s, filter->data));
- } else if (s < 0x100) {
- CK((*filter->output_function)(0x8e, filter->data));
- CK((*filter->output_function)(s, filter->data));
- } else {
- CK((*filter->output_function)(((s >> 8) & 0xff) | 0x80, filter->data));
- CK((*filter->output_function)((s & 0xff) | 0x80, filter->data));
- }
- break;
-
- default:
- filter->status = 0;
- break;
- }
- } else if (c < 0xe0) { /* 2 byte code first char */
- filter->status = 0x10;
- filter->cache = (c & 0x1f) << 6;
- } else if (c < 0xf0) { /* 3 byte code first char */
- filter->status = 0x20;
- filter->cache = (c & 0xf) << 12;
- } else { /* 4, 5 or 6 byte code first char */
- filter->status = 0;
- }
-
- return c;
-}
-
-/*
- * UTF-8 => SJIS
- */
-static int
-filt_utf8_sjis(struct mbfl_output_filter* filter, int c)
-{
- int c1, c2, s1, s2;
-
- if (c < 0x80) {
- filter->status = 0;
- CK((*filter->output_function)(c, filter->data));
- } else if (c < 0xc0) {
- switch (filter->status & 0xff) {
- case 0x20: /* 3 byte code second char */
- filter->cache += ((c & 0x3f) << 6);
- filter->status++;
- break;
-
- case 0x10: /* 2 byte code second char */
- case 0x21: /* 3 byte code third char */
- filter->status = 0;
- s1 = u2jtable[filter->cache + (c & 0x3f)];
- if (s1 == 0)
- s1 = UNDEFCHAR_JIS;
- if(s1 < 0x100) {
- CK((*filter->output_function)(s1, filter->data));
- } else {
- c1 = (s1 >> 8) & 0xff;
- c2 = s1 & 0xff;
- s1 = ((c1 + 1) >> 1) + (c1 < 0x5f ? 0x70 : 0xb0);
- s2 = c2 + (c1 & 1 ? (c2 > 0x5f ? 0x20 : 0x1f) : 0x7e);
- CK((*filter->output_function)(s1, filter->data));
- CK((*filter->output_function)(s2, filter->data));
- }
- break;
-
- default:
- filter->status = 0;
- break;
- }
- } else if (c < 0xe0) { /* 2 byte code first char */
- filter->status = 0x10;
- filter->cache = ((c & 0x1f) << 6);
- } else if (c < 0xf0) { /* 3 byte code first char */
- filter->status = 0x20;
- filter->cache = ((c & 0xf) << 12);
- } else { /* 4, 5 or 6 byte code first char */
- filter->status = 0;
- }
-
- return c;
-}
-
-/*
- * UTF-8 => JIS
- */
-static int
-filt_utf8_jis(struct mbfl_output_filter* filter, int c)
-{
- int s;
-
- if (c < 0x80) {
- if ((filter->status & 0xff00) != 0) {
- CK((*filter->output_function)('\033', filter->data));
- CK((*filter->output_function)('(', filter->data));
- CK((*filter->output_function)('B', filter->data));
- }
- filter->status = 0;
- CK((*filter->output_function)(c, filter->data));
- } else if (c < 0xc0) {
- switch(filter->status & 0xff) {
- case 0x20: /* 3 byte code second char */
- filter->cache += ((c & 0x3f) << 6);
- filter->status++;
- break;
-
- case 0x10: /* 2 byte code second char */
- case 0x21: /* 3 byte code third char */
- s = u2jtable[filter->cache + (c & 0x3f)];
- if(s == 0)
- s = UNDEFCHAR_JIS;
- if(s < 0x80) { /* roman */
- if((filter->status & 0xff00) != 0) {
- CK((*filter->output_function)('\033', filter->data));
- CK((*filter->output_function)('(', filter->data));
- CK((*filter->output_function)('B', filter->data));
- }
- filter->status = 0;
- CK((*filter->output_function)(s, filter->data));
- } else if(s < 0x100) { /* kana */
- if((filter->status & 0xff00) != 0x100){
- CK((*filter->output_function)('\033', filter->data));
- CK((*filter->output_function)('(', filter->data));
- CK((*filter->output_function)('I', filter->data));
- }
- filter->status = 0x30100;
- CK((*filter->output_function)(s & 0x7f, filter->data));
- } else { /* kanji */
- if((filter->status & 0xff00) != 0x200){
- CK((*filter->output_function)('\033', filter->data));
- CK((*filter->output_function)('$', filter->data));
- CK((*filter->output_function)('B', filter->data));
- }
- filter->status = 0x30200;
- CK((*filter->output_function)((s >> 8) & 0x7f, filter->data));
- CK((*filter->output_function)(s & 0x7f, filter->data));
- }
- break;
-
- default:
- filter->status &= ~0xff;
- break;
- }
- } else if (c < 0xe0) { /* 2 byte code first char */
- filter->status &= ~0xff;
- filter->status |= 0x10;
- filter->cache = (c & 0x1f) << 6;
- } else if (c < 0xf0) { /* 3 byte code first char */
- filter->status &= ~0xff;
- filter->status |= 0x20;
- filter->cache = (c & 0xf) << 12;
- } else { /* 4, 5 or 6 byte code first char */
- filter->status &= ~0xff;
- }
-
- return c;
-}
-
-static int
-filt_ucs_jis_flush(struct mbfl_output_filter* filter)
-{
- /* back to roman */
- if ((filter->status & 0xff00) != 0) {
- (*filter->output_function)('\033', filter->data);
- (*filter->output_function)('(', filter->data);
- (*filter->output_function)('B', filter->data);
- }
- filter->status &= 0xff;
-
- /* flush */
- return (filter->flush_function ? (*filter->flush_function)(filter->data) : 0);
-}
-
-static void
-filt_ucs_jis_dtor(struct mbfl_output_filter* filter)
-{
- (void)filt_ucs_jis_flush(filter);
-}
-
-/*
- * EUC-JP => UCS
- */
-static int
-filt_euc_ucs(struct mbfl_output_filter* filter, int c)
-{
- int s;
- switch (filter->status) {
- case 0: /* roman */
- if (c == 0x8e) { /* kana first char */
- filter->status = 1;
- } else if (c >= 0x80) { /* kanji first char */
- filter->status = 2;
- filter->cache = c;
- } else {
- CK((*filter->output_function)(c, filter->data));
- }
- break;
- case 1: /* got 0x8e */
- filter->status = 0;
- if(c >= 0xa1 && c <= 0xdf){
- CK((*filter->output_function)(0xfec0 + c, filter->data));
- } else if(c < 0x80) {
- CK((*filter->output_function)(c, filter->data));
- }
- break;
- case 2: /* got first half */
- filter->status = 0;
- if(c == '\0'){
- CK((*filter->output_function)(c, filter->data));
- } else {
- s = (filter->cache - 0xa1)*94 + c - 0xa1;
- if(s >= 0 && s < j2utable_size)
- s = j2utable[s];
- else
- s = 0;
- if(s == 0)
- s = UNDEFCHAR_UNICODE;
- CK((*filter->output_function)(s, filter->data));
- }
- break;
- }
-
- return c;
-}
-
-/*
- * UCS => EUC-JP
- */
-static int
-filt_ucs_euc(struct mbfl_output_filter* filter, int c)
-{
- int s = 0;
- if(c > 0 && c < u2jtable_size)
- s = u2jtable[c];
- if(s == 0 && c != 0)
- s = UNDEFCHAR_JIS;
-
- if(s < 0x80) { /* roman */
- CK((*filter->output_function)(s, filter->data));
- } else if(s < 0x100) { /* kana */
- CK((*filter->output_function)(0x8e, filter->data));
- CK((*filter->output_function)(s, filter->data));
- } else { /* kanji */
- CK((*filter->output_function)(((s >> 8) & 0xff) | 0x80, filter->data));
- CK((*filter->output_function)((s & 0xff) | 0x80, filter->data));
- }
-
- return c;
-}
-
-/*
- * EUC-JP => wchar
- */
-static int
-filt_euc_wchar(struct mbfl_output_filter* filter, int c)
-{
- switch (filter->status) {
- case 0: /* roman */
- if (c == 0x8e) { /* kana first char */
- filter->status = 1;
- } else if (c >= 0x80) { /* kanji first char */
- filter->status = 2;
- filter->cache = c;
- } else {
- CK((*filter->output_function)(c, filter->data));
- }
- break;
- case 1: /* got 0x8e */
- filter->status = 0;
- CK((*filter->output_function)(c, filter->data));
- break;
- case 2: /* got first half */
- filter->status = 0;
- if(c == '\0'){
- CK((*filter->output_function)(c, filter->data));
- } else {
- CK((*filter->output_function)((filter->cache << 8) + c, filter->data));
- }
- break;
- }
-
- return c;
-}
-
-/*
- * wchar => EUC-JP
- */
-static int
-filt_wchar_euc(struct mbfl_output_filter* filter, int c)
-{
- if(c < 0x80) { /* roman */
- CK((*filter->output_function)(c, filter->data));
- } else if(c < 0x100) { /* kana */
- CK((*filter->output_function)(0x8e, filter->data));
- CK((*filter->output_function)(c, filter->data));
- } else { /* kanji */
- CK((*filter->output_function)((c >> 8) & 0xff, filter->data));
- CK((*filter->output_function)(c & 0xff, filter->data));
- }
-
- return c;
-}
-
-/*
- * SJIS => UCS
- */
-static int
-filt_sjis_ucs(struct mbfl_output_filter* filter, int c)
-{
- int s;
- if (filter->status == 1) { /* kanji second char */
- filter->status = 0;
- if(c == '\0'){
- CK((*filter->output_function)(c, filter->data));
- } else {
- s = filter->cache;
- if(s < 0xa0)
- s -= 0x81;
- else
- s -= 0xc1;
- s *= 188;
- if(c < 0x7f)
- s += c - 0x40;
- else
- s += c - 0x41;
- if(s >= 0 && s < j2utable_size)
- s = j2utable[s];
- else
- s = 0;
- if(s == 0)
- s = UNDEFCHAR_UNICODE;
- CK((*filter->output_function)(s, filter->data));
- }
- } else if (c >= 0xa1 && c <= 0xdf) { /* kana */
- filter->status = 0;
- CK((*filter->output_function)(0xfec0 + c, filter->data));
- } else if (c >= 0x80) { /* kanji first char */
- filter->status = 1;
- filter->cache = c;
- } else { /* roman */
- filter->status = 0;
- CK((*filter->output_function)(c, filter->data));
- }
-
- return c;
-}
-
-/*
- * UCS => SJIS
- */
-static int
-filt_ucs_sjis(struct mbfl_output_filter* filter, int c)
-{
- int s1 = 0;
- int c1,c2,s2;
- if(c > 0 && c < u2jtable_size)
- s1 = u2jtable[c];
- if(s1 == 0 && c != 0)
- s1 = UNDEFCHAR_JIS;
-
- if(s1 < 0x100) { /* roman or kana */
- CK((*filter->output_function)(s1, filter->data));
- } else { /* kanji */
- c1 = (s1 >> 8) & 0xff;
- c2 = s1 & 0xff;
- s1 = ((c1 + 1) >> 1) + (c1 < 0x5f ? 0x70 : 0xb0);
- s2 = c2 + (c1 & 1 ? (c2 > 0x5f ? 0x20 : 0x1f) : 0x7e);
- CK((*filter->output_function)(s1, filter->data));
- CK((*filter->output_function)(s2, filter->data));
- }
-
- return c;
-}
-
-/*
- * SJIS => wchar
- */
-static int
-filt_sjis_wchar(struct mbfl_output_filter* filter, int c)
-{
- if (filter->status == 1) { /* kanji second char */
- filter->status = 0;
- if(c == '\0') {
- CK((*filter->output_function)(c, filter->data));
- } else {
- CK((*filter->output_function)((filter->cache << 8) + c, filter->data));
- }
- } else if (c >= 0xa1 && c <= 0xdf) { /* kana */
- filter->status = 0;
- CK((*filter->output_function)(c, filter->data));
- } else if (c >= 0x80) { /* kanji first char */
- filter->status = 1;
- filter->cache = c;
- } else { /* roman */
- filter->status = 0;
- CK((*filter->output_function)(c, filter->data));
- }
-
- return c;
-}
-
-/*
- * wchar => SJIS
- */
-static int
-filt_wchar_sjis(struct mbfl_output_filter* filter, int c)
-{
-
- if(c < 0x100) { /* roman or kana */
- CK((*filter->output_function)(c, filter->data));
- } else { /* kanji */
- CK((*filter->output_function)((c >> 8) & 0xff, filter->data));
- CK((*filter->output_function)(c & 0xff, filter->data));
- }
-
- return c;
-}
-
-/*
- * JIS => UCS
- */
-static int
-filt_jis_ucs(struct mbfl_output_filter* filter, int c)
-{
- int s;
-retry:
- switch (filter->status) {
- case 0: /* roman */
- case 10: /* kana */
- case 20: /* kanji */
- if (c == 0x1b) {
- filter->status++;
- } else if (c == 0x0e) { /* "kana in" */
- filter->status = 10;
- } else if (c == 0x0f) { /* "kana out" */
- filter->status = 0;
- } else if (c >= 0x21 && c <= 0x7e) {
- if (filter->status == 20) { /* kanji first char */
- filter->cache = c;
- filter->status = 25;
- } else if (filter->status == 10) { /* kana */
- CK((*filter->output_function)(0xff40 + c, filter->data));
- } else {
- CK((*filter->output_function)(c, filter->data));
- }
- } else if (c >= 0xa1 && c <= 0xdf) { /* GR kana */
- CK((*filter->output_function)(0xfec0 + c, filter->data));
- } else {
- CK((*filter->output_function)(c, filter->data));
- }
- break;
- case 25: /* kanji second char */
- filter->status = 20;
- if (c == '\0') {
- CK((*filter->output_function)(c, filter->data));
- } else if (c == 0x1b) {
- goto retry;
- } else {
- s = (filter->cache - 0x21)*94 + c - 0x21;
- if(s >= 0 && s < j2utable_size)
- s = j2utable[s];
- else
- s = 0;
- if(s == 0)
- s = UNDEFCHAR_UNICODE;
- CK((*filter->output_function)(s, filter->data));
- }
- break;
- case 1: /* ESC */
- case 11: /* ESC */
- case 21: /* ESC */
- if (c == 0x24) {
- filter->status++;
- } else if (c == 0x28) {
- filter->status += 3;
- } else {
- filter->status--;
- CK((*filter->output_function)(0x1b, filter->data));
- goto retry;
- }
- break;
- case 2: /* ESC 0x24 */
- case 12: /* ESC 0x24 */
- case 22: /* ESC 0x24 */
- if (c == 0x40 || c == 0x42) {
- filter->status = 20;
- } else if (c == 0x28) {
- filter->status++;
- }else {
- filter->status -= 2;
- CK((*filter->output_function)(0x1b, filter->data));
- CK((*filter->output_function)(0x24, filter->data));
- goto retry;
- }
- break;
- case 3: /* ESC 0x24 0x28 */
- case 13: /* ESC 0x24 0x28 */
- case 23: /* ESC 0x24 0x28 */
- if (c == 0x44) {
- filter->status = 20;
- } else {
- filter->status -= 3;
- CK((*filter->output_function)(0x1b, filter->data));
- CK((*filter->output_function)(0x24, filter->data));
- CK((*filter->output_function)(0x28, filter->data));
- goto retry;
- }
- break;
- case 4: /* ESC 0x28 */
- case 14: /* ESC 0x28 */
- case 24: /* ESC 0x28 */
- switch (c) {
- case 0x42:
- case 0x48:
- case 0x4a:
- filter->status = 0;
- break;
- case 0x49:
- filter->status = 10;
- break;
- default:
- filter->status -= 4;
- CK((*filter->output_function)(0x1b, filter->data));
- CK((*filter->output_function)(0x28, filter->data));
- goto retry;
- }
- break;
- }
-
- return c;
-}
-
-/*
- * UCS => JIS
- */
-static int
-filt_ucs_jis(struct mbfl_output_filter* filter, int c)
-{
- int s = 0;
-
- if(c > 0 && c < u2jtable_size)
- s = u2jtable[c];
- if(s == 0 && c != 0)
- s = UNDEFCHAR_JIS;
-
- if(s < 0x80) { /* roman */
- if((filter->status & 0xff00) != 0){
- CK((*filter->output_function)('\033', filter->data));
- CK((*filter->output_function)('(', filter->data));
- CK((*filter->output_function)('B', filter->data));
- }
- filter->status = 0;
- CK((*filter->output_function)(s, filter->data));
- } else if(s < 0x100) { /* kana */
- if((filter->status & 0xff00) != 0x100){
- CK((*filter->output_function)('\033', filter->data));
- CK((*filter->output_function)('(', filter->data));
- CK((*filter->output_function)('I', filter->data));
- }
- filter->status = 0x30100;
- CK((*filter->output_function)(s & 0x7f, filter->data));
- } else { /* kanji */
- if((filter->status & 0xff00) != 0x200){
- CK((*filter->output_function)('\033', filter->data));
- CK((*filter->output_function)('$', filter->data));
- CK((*filter->output_function)('B', filter->data));
- }
- filter->status = 0x30200;
- CK((*filter->output_function)((s >> 8) & 0x7f, filter->data));
- CK((*filter->output_function)(s & 0x7f, filter->data));
- }
-
- return c;
-}
-
-/*
- * JIS => wchar
- */
-static int
-filt_jis_wchar(struct mbfl_output_filter* filter, int c)
-{
-retry:
- switch (filter->status) {
- case 0: /* roman */
- case 10: /* kana */
- case 20: /* kanji */
- if (c == 0x1b) {
- filter->status++;
- } else if (c == 0x0e) { /* "kana in" */
- filter->status = 10;
- } else if (c == 0x0f) { /* "kana out" */
- filter->status = 0;
- } else if (c >= 0x21 && c <= 0x7e) {
- if (filter->status == 20) { /* kanji first char */
- filter->cache = c;
- filter->status = 25;
- } else if (filter->status == 10) { /* kana */
- CK((*filter->output_function)(c | 0x80, filter->data));
- } else {
- CK((*filter->output_function)(c, filter->data));
- }
- } else { /* CR, LF, CTLs, or maybe GR kana */
- CK((*filter->output_function)(c, filter->data));
- }
- break;
- case 25: /* kanji second char */
- filter->status = 20;
- if (c == '\0') {
- CK((*filter->output_function)(c, filter->data));
- } else if (c == 0x1b) {
- goto retry;
- } else {
- CK((*filter->output_function)((filter->cache << 8) + c, filter->data));
- }
- break;
- case 1: /* ESC */
- case 11: /* ESC */
- case 21: /* ESC */
- if (c == 0x24) {
- filter->status++;
- } else if (c == 0x28) {
- filter->status += 3;
- } else {
- CK((*filter->output_function)(0x1b, filter->data));
- filter->status--;
- goto retry;
- }
- break;
- case 2: /* ESC 0x24 */
- case 12: /* ESC 0x24 */
- case 22: /* ESC 0x24 */
- if (c == 0x40 || c == 0x42) {
- filter->status = 20;
- } else if (c == 0x28) {
- filter->status++;
- } else {
- filter->status -= 2;
- CK((*filter->output_function)(0x1b, filter->data));
- CK((*filter->output_function)(0x24, filter->data));
- goto retry;
- }
- break;
- case 3: /* ESC 0x24 0x28 */
- case 13: /* ESC 0x24 0x28 */
- case 23: /* ESC 0x24 0x28 */
- if (c == 0x44) {
- filter->status = 20;
- } else {
- filter->status -= 3;
- CK((*filter->output_function)(0x1b, filter->data));
- CK((*filter->output_function)(0x24, filter->data));
- CK((*filter->output_function)(0x28, filter->data));
- goto retry;
- }
- break;
- case 4: /* ESC 0x28 */
- case 14: /* ESC 0x28 */
- case 24: /* ESC 0x28 */
- switch (c) {
- case 0x42:
- case 0x48:
- case 0x4a:
- filter->status = 0;
- break;
- case 0x49:
- filter->status = 10;
- break;
- default:
- filter->status -= 4;
- CK((*filter->output_function)(0x1b, filter->data));
- CK((*filter->output_function)(0x28, filter->data));
- goto retry;
- }
- break;
- }
-
- return c;
-}
-
-/*
- * wchar => JIS
- */
-static int
-filt_wchar_jis(struct mbfl_output_filter* filter, int c)
-{
- if(c < 0x80) { /* roman */
- if((filter->status & 0xff00) != 0){
- CK((*filter->output_function)('\033', filter->data));
- CK((*filter->output_function)('(', filter->data));
- CK((*filter->output_function)('B', filter->data));
- }
- filter->status = 0;
- CK((*filter->output_function)(c, filter->data));
- } else if(c < 0x100) { /* kana */
- if((filter->status & 0xff00) != 0x100){
- CK((*filter->output_function)('\033', filter->data));
- CK((*filter->output_function)('(', filter->data));
- CK((*filter->output_function)('I', filter->data));
- }
- filter->status = 0x30100;
- CK((*filter->output_function)(c & 0x7f, filter->data));
- } else { /* kanji */
- if((filter->status & 0xff00) != 0x200){
- CK((*filter->output_function)('\033', filter->data));
- CK((*filter->output_function)('$', filter->data));
- CK((*filter->output_function)('B', filter->data));
- }
- filter->status = 0x30200;
- CK((*filter->output_function)((c >> 8) & 0x7f, filter->data));
- CK((*filter->output_function)(c & 0x7f, filter->data));
- }
-
- return c;
-}
-
-/*
- * UNKNOWN->(UTF-8|EUC-JP|SJIS|JIS)
- */
-struct unknown_data {
- enum mbfl_no_encoding to;
- /* 変換後のコード */
-
- void* data;
- /* 本来のvoid* data */
-
- struct memory_device device;
- /* 推定作業中にはここに出力しておく。*/
-
- enum mbfl_no_encoding from_default;
- /* 不定の場合のコード */
-};
-
-static void
-filt_unknown_ja_jp_ctor(
- struct mbfl_output_filter* filter,
- enum mbfl_no_encoding from, /* ignored */
- enum mbfl_no_encoding to,
- int (*output_function)(int, void*),
- int (*flush_function)(void*),
- void* data)
-{
- struct unknown_data* u = (struct unknown_data*)malloc(sizeof (struct unknown_data));
- u->to = to;
- u->from_default = mbfl_no_encoding_pass;
- u->data = data;
- u->device.buffer = (char*)0;
- u->device.length = 0;
- u->device.pos = 0;
-
- filter->output_function = output_function;
- filter->flush_function = flush_function;
- filter->data = (void*)u;
- filter->status = 0;
- filter->cache = 0;
- filter->from = from;
- filter->to = to;
-}
-
-/* forward */
-static int filt_unknown_ja_jp_identify(struct mbfl_output_filter* filter);
-
-static int
-filt_unknown_ja_jp(struct mbfl_output_filter* filter, int c)
-{
- int bad;
- struct memory_device* dev = &((struct unknown_data*)filter->data)->device;
-
- /* filter->cache holds "bad" scores for UTF-8 EUC-JP, SJIS, JIS */
- /* filter->status holds status for UTF-8 EUC-JP, SJIS, JIS */
- /* 0xWWXXYYZZ - WW for UTF-8, XX for EUC-JP, YY for SJIS, ZZ for JIS */
-#define S_UTF8(x) ((x) << 24)
-#define S_EUCJP(x) ((x) << 16)
-#define S_SJIS(x) ((x) << 8)
-#define S_JIS(x) ((x))
-#define M_UTF8 0xff000000
-#define M_EUCJP 0x00ff0000
-#define M_SJIS 0x0000ff00
-#define M_JIS 0x000000ff
-
- if (dev->pos == 0 && ((c >= 0x20 && c <= 0x7e) || c == '\t' || c == '\n' || c == '\r' || c == '\0')) {
- /* 先頭の連続するASCIIはそのまま出力する。*/
- return (*filter->output_function)(c, ((struct unknown_data*)filter->data)->data);
- }
-
- /*
- * UTF-8だとした場合。
- */
- if ((filter->cache & M_UTF8) == 0) {
- if (c < 0x80) {
- if (filter->status & M_UTF8) {
- filter->cache |= S_UTF8(1); /* bad */
- } else if (c == 0x1b || c == 0x0e || c == 0x0f) {
- filter->cache |= S_UTF8(1); /* bad */
- }
- filter->status &= ~M_UTF8;
- } else if (c < 0xc0) {
- switch(filter->status & M_UTF8) {
- case S_UTF8(0x20): /* 3 byte code 2nd char */
- case S_UTF8(0x30): /* 4 byte code 2nd char */
- case S_UTF8(0x31): /* 4 byte code 3rd char */
- case S_UTF8(0x40): /* 5 byte code 2nd char */
- case S_UTF8(0x41): /* 5 byte code 3rd char */
- case S_UTF8(0x42): /* 5 byte code 4th char */
- case S_UTF8(0x50): /* 6 byte code 2nd char */
- case S_UTF8(0x51): /* 6 byte code 3rd char */
- case S_UTF8(0x52): /* 6 byte code 4th char */
- case S_UTF8(0x53): /* 6 byte code 5th char */
- filter->status += S_UTF8(1);
- break;
- case S_UTF8(0x10): /* 2 byte code 2nd char */
- case S_UTF8(0x21): /* 3 byte code 3rd char */
- case S_UTF8(0x32): /* 4 byte code 4th char */
- case S_UTF8(0x43): /* 5 byte code 5th char */
- case S_UTF8(0x54): /* 6 byte code 6th char */
- filter->status &= ~M_UTF8;
- break;
- default:
- filter->cache |= S_UTF8(1); /* bad */
- filter->status &= ~M_UTF8;
- break;
- }
- } else {
- if (filter->status & M_UTF8) {
- filter->cache |= S_UTF8(1); /* bad */
- }
- filter->status &= ~M_UTF8;
- if (c < 0xe0) { /* 2 byte code first char */
- filter->status |= S_UTF8(0x10);
- } else if (c < 0xf0) { /* 3 byte code 1st char */
- filter->status |= S_UTF8(0x20);
- } else if (c < 0xf8) { /* 4 byte code 1st char */
- filter->status |= S_UTF8(0x30);
- } else if (c < 0xfc) { /* 5 byte code 1st char */
- filter->status |= S_UTF8(0x40);
- } else { /* 6 byte code 1st char */
- filter->status |= S_UTF8(0x50);
- }
- }
- }
-
- /*
- * EUC-JPだとした場合。
- */
- if ((filter->cache & M_EUCJP) == 0) {
- switch ((filter->status & M_EUCJP)) {
- case S_EUCJP(0): /* roman */
- if (c == 0x1b || c == 0x0e || c == 0x0f) { /* bad */
- filter->cache |= S_EUCJP(1);
- } else if (c >= 0 && c <= 0x7e) { /* ok */
- ;
- } else if (c == 0x8e) { /* kana first char */
- filter->status += S_EUCJP(1);
- } else if (c >= 0xa1 && c <= 0xfe) { /* kanji first char */
- filter->status += S_EUCJP(2);
- } else { /* bad */
- filter->cache |= S_EUCJP(1);
- }
- break;
-
- case S_EUCJP(1): /* got 0x8e */
- if (c < 0xa1 || c > 0xdf) { /* bad */
- filter->cache |= S_EUCJP(1);
- }
- filter->status -= S_EUCJP(1);
- break;
-
- case S_EUCJP(2): /* got first half */
- if (c < 0xa1 || c > 0xfe) { /* bad */
- filter->cache |= S_EUCJP(1);
- }
- filter->status -= S_EUCJP(2);
- break;
- }
- }
-
- /*
- * SJISだとした場合。
- */
- if ((filter->cache & M_SJIS) == 0) {
- if ((filter->status & M_SJIS)) { /* kanji second char */
- if (c < 0x40 || c > 0xfc || c == 0x7f) { /* bad */
- filter->cache |= S_SJIS(1);
- }
- filter->status &= ~M_SJIS; /* 0にもどす。*/
- } else if (c == 0x1b || c == 0x0e || c == 0x0f) { /* bad */
- filter->cache |= S_SJIS(1);
- } else if (c >= 0 && c <= 0x7e) { /* roman ok */
- ;
- } else if (c >= 0xa1 && c <= 0xdf) { /* kana ok */
- ;
- } else if (c >= 0x81 && c <= 0xef) { /* kanji first char */
- filter->status += S_SJIS(1);
- } else { /* bad */
- filter->cache |= S_SJIS(1);
- }
- }
-
- /*
- * JISだとした場合。
- */
- if ((filter->cache & M_JIS) == 0) {
-retry:
- switch ((filter->status & M_JIS)) {
- case S_JIS(0): /* roman */
- case S_JIS(10): /* kana */
- case S_JIS(20): /* kanji */
- if (c == 0x1b) {
- filter->status += S_JIS(1);
- } else if (c == 0x0e) { /* "kana in" */
- filter->status = (filter->status & ~M_JIS) + 10;
- } else if (c == 0x0f) { /* "kana out" */
- filter->status &= ~M_JIS;
- } else if (c >= 0 && c <= 0x20) { /* CTLs ok */
- ;
- } else if (c >= 0x21 && c <= 0x7e) {
- if ((filter->status & M_JIS) == 20) { /* kanji first char */
- filter->status += S_JIS(5);
- }
- } else {
- filter->cache |= S_JIS(1); /* bad */
- }
- break;
-
- case S_JIS(25): /* kanji second char */
- filter->status -= S_JIS(5);
- if (c < 0x21 || c > 0x7e) { /* bad */
- filter->cache |= S_JIS(1);
- }
- if (c == 0x1b) {
- goto retry;
- }
- break;
-
- case S_JIS(1): /* ESC */
- case S_JIS(11): /* ESC */
- case S_JIS(21): /* ESC */
- if (c == 0x24) {
- filter->status += S_JIS(1);
- } else if (c == 0x28) {
- filter->status += S_JIS(3);
- } else {
- filter->cache |= S_JIS(1); /* bad */
- filter->status -= S_JIS(1);
- goto retry;
- }
- break;
-
- case S_JIS(2): /* ESC 0x24 */
- case S_JIS(12): /* ESC 0x24 */
- case S_JIS(22): /* ESC 0x24 */
- if (c == 0x40 || c == 0x42) {
- filter->status = (filter->status & ~M_JIS) + 20;
- } else if (c == 0x28) {
- filter->status += S_JIS(1);
- } else {
- filter->cache |= S_JIS(1); /* bad */
- filter->status -= S_JIS(2);
- goto retry;
- }
- break;
-
- case S_JIS(3): /* ESC 0x24 0x28 */
- case S_JIS(13): /* ESC 0x24 0x28 */
- case S_JIS(23): /* ESC 0x24 0x28 */
- if (c == 0x44) {
- filter->status = (filter->status & ~M_JIS) + 20;
- } else {
- filter->cache |= S_JIS(1); /* bad */
- filter->status -= S_JIS(3);
- goto retry;
- }
- break;
-
- case S_JIS(4): /* ESC 0x28 */
- case S_JIS(14): /* ESC 0x28 */
- case S_JIS(24): /* ESC 0x28 */
- switch (c) {
- case 0x42:
- case 0x48:
- case 0x4a:
- filter->status &= ~M_JIS;
- break;
-
- case 0x49:
- filter->status = (filter->status & ~M_JIS) + 10;
- break;
-
- default:
- filter->cache |= S_JIS(1); /* bad */
- filter->status -= S_JIS(4);
- goto retry;
- break;
- }
- break;
- }
- }
-
- /*
- * おしまい。
- */
- (void)memory_device_output(c, dev); /* 覚えておく */
-
- bad = 0;
- if (filter->cache & M_UTF8) {
- bad++;
- }
- if (filter->cache & M_EUCJP) {
- bad++;
- }
- if (filter->cache & M_SJIS) {
- bad++;
- }
- if (filter->cache & M_JIS) {
- bad++;
- }
- if (bad >= 3 /* 3つ以上のエンコーディングでない (一つ以下に確定) */
- || dev->pos >= 8192) { /* もう8192文字溜まっている */
- if (filt_unknown_ja_jp_identify(filter) < 0) { /* 漢字コードの判定を行う */
- c = -1;
- }
- }
-
- return c;
-}
-
-/*
- * 漢字コードを判定し、vptrを切りかえ、溜まっているデータを出力する。
- */
-
-/* forward */
-static struct filter_vtbl*
-select_vtbl(enum mbfl_no_encoding from, enum mbfl_no_encoding to);
-
-static int
-filt_unknown_ja_jp_identify(struct mbfl_output_filter* filter)
-{
- int n;
- char *p;
- struct unknown_data* u;
- enum mbfl_no_encoding code = mbfl_no_encoding_pass;
-
- /* saved data */
- u = (struct unknown_data*)filter->data;
-
- /* 判定 */
- n = 0;
- if ((filter->cache & M_UTF8) == 0) {
- n++;
- code = mbfl_no_encoding_utf8;
- }
- if ((filter->cache & M_EUCJP) == 0) {
- n++;
- code = mbfl_no_encoding_ja_jp_euc;
- }
- if ((filter->cache & M_SJIS) == 0) {
- n++;
- code = mbfl_no_encoding_ja_jp_sjis;
- }
- if ((filter->cache & M_JIS) == 0) {
- n++;
- code = mbfl_no_encoding_ja_jp_jis;
- }
- if (n != 1) {
- code = u->from_default;
- }
-
- /* 漢字らしきものが見つからなかった、
- そして、たぶんデストラクタが呼ばれた。*/
- if (u->device.pos == 0) {
- code = mbfl_no_encoding_en_us_ascii;
- }
-
- /* select the vtbl */
- filter->vptr = select_vtbl(code, u->to);
-
- /* constructor */
- (*filter->vptr->filter_ctor)(filter, code, u->to,
- filter->output_function, filter->flush_function, u->data);
-
- /* 溜まっているデータを吐き出す */
- for (p = u->device.buffer, n = u->device.pos; n > 0; n--) {
- if ((*filter->vptr->filter_function)(filter, *p++ & 0xff) < 0) {
- n = -1;
- break;
- }
- }
- /* 正常に終わった場合はnは0であるはず。*/
-
- /* free */
- if (u->device.buffer) {
- free((void*)u->device.buffer);
- }
- free((void*)u);
-
- return n; /* 正常ならば0、エラーならば-1 */
-}
-
-static int
-filt_unknown_ja_jp_flush(struct mbfl_output_filter* filter)
-{
- if (filt_unknown_ja_jp_identify(filter) < 0)
- return -1;
-
- /* flush */
- return (filter->flush_function ? (*filter->flush_function)(filter->data) : 0);
-}
-
-static void
-filt_unknown_ja_jp_dtor(struct mbfl_output_filter* filter)
-{
- /* flush */
- (void)filt_unknown_ja_jp_flush(filter);
-
- /* destruct */
- (*filter->vptr->filter_dtor)(filter);
-}
-
-
-/*
- * UTF8 => wchar
- */
-static int
-filt_utf8_wchar(struct mbfl_output_filter* filter, int c)
-{
- int s;
- if(c < 0x80) {
- CK((*filter->output_function)(c, filter->data));
- filter->status = 0;
- } else if(c < 0xc0) {
- switch (filter->status & 0xff) {
- case 0x10: /* 2byte code 2nd char */
- case 0x21: /* 3byte code 3rd char */
- case 0x32: /* 4byte code 4th char */
- case 0x43: /* 5byte code 5th char */
- case 0x54: /* 6byte code 6th char */
- filter->status = 0;
- s = filter->cache + (c & 0x3f);
- if(s == 0) {
- s = UNDEFCHAR_UNICODE;
- }
- CK((*filter->output_function)(s, filter->data));
- break;
- case 0x20: /* 3byte code 2nd char */
- case 0x31: /* 4byte code 3rd char */
- case 0x42: /* 5byte code 4th char */
- case 0x53: /* 6byte code 5th char */
- filter->cache += ((c & 0x3f) << 6);
- filter->status++;
- break;
- case 0x30: /* 4byte code 2nd char */
- case 0x41: /* 5byte code 3rd char */
- case 0x52: /* 6byte code 4th char */
- filter->cache += ((c & 0x3f) << 12);
- filter->status++;
- break;
- case 0x40: /* 5byte code 2nd char */
- case 0x51: /* 6byte code 3rd char */
- filter->cache += ((c & 0x3f) << 18);
- filter->status++;
- break;
- case 0x50: /* 6byte code 2nd char */
- filter->cache += ((c & 0x3f) << 24);
- filter->status++;
- break;
- default:
- filter->status = 0;
- break;
- }
- } else if(c < 0xe0) { /* 2byte code first char */
- filter->status = 0x10;
- filter->cache = (c & 0x1f) << 6;
- } else if(c < 0xf0) { /* 3byte code first char */
- filter->status = 0x20;
- filter->cache = (c & 0xf) << 12;
- } else if(c < 0xf8) { /* 4byte code first char */
- filter->status = 0x30;
- filter->cache = (c & 0x7) << 18;
- } else if(c < 0xfc) { /* 5byte code first char */
- filter->status = 0x40;
- filter->cache = (c & 0x3) << 24;
- } else { /* 6 byte code first char */
- filter->status = 0x50;
- filter->cache = (c & 0x1) << 30;
- }
-
- return c;
-}
-
-/*
- * wchar => UTF-8
- */
-static int
-filt_wchar_utf8(struct mbfl_output_filter* filter, int c)
-{
- if(c < 0x80){
- CK((*filter->output_function)(c, filter->data));
- } else if(c < 0x800) {
- CK((*filter->output_function)(((c >> 6) & 0x1f) | 0xc0, filter->data));
- CK((*filter->output_function)((c & 0x3f) | 0x80, filter->data));
- } else if(c < 0x10000) {
- CK((*filter->output_function)(((c >> 12) & 0x0f) | 0xe0, filter->data));
- CK((*filter->output_function)(((c >> 6) & 0x3f) | 0x80, filter->data));
- CK((*filter->output_function)((c & 0x3f) | 0x80, filter->data));
- } else if(c < 0x200000) {
- CK((*filter->output_function)(((c >> 18) & 0x07) | 0xf0, filter->data));
- CK((*filter->output_function)(((c >> 12) & 0x3f) | 0x80, filter->data));
- CK((*filter->output_function)(((c >> 6) & 0x3f) | 0x80, filter->data));
- CK((*filter->output_function)((c & 0x3f) | 0x80, filter->data));
- } else if(c < 0x4000000) {
- CK((*filter->output_function)(((c >> 24) & 0x03) | 0xf8, filter->data));
- CK((*filter->output_function)(((c >> 18) & 0x3f) | 0x80, filter->data));
- CK((*filter->output_function)(((c >> 12) & 0x3f) | 0x80, filter->data));
- CK((*filter->output_function)(((c >> 6) & 0x3f) | 0x80, filter->data));
- CK((*filter->output_function)((c & 0x3f) | 0x80, filter->data));
- } else {
- CK((*filter->output_function)(((c >> 30) & 0x01) | 0xfc, filter->data));
- CK((*filter->output_function)(((c >> 24) & 0x3f) | 0x80, filter->data));
- CK((*filter->output_function)(((c >> 18) & 0x3f) | 0x80, filter->data));
- CK((*filter->output_function)(((c >> 12) & 0x3f) | 0x80, filter->data));
- CK((*filter->output_function)(((c >> 6) & 0x3f) | 0x80, filter->data));
- CK((*filter->output_function)((c & 0x3f) | 0x80, filter->data));
- }
-
- return c;
-}
-
-/*
- * any => BASE64
- */
-static const char mbfl_b64_table[] =
-{ 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M',
- 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z',
- 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm',
- 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z',
- '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '+', '/', '\0'
-};
-
-static int
-filt_b64enc(struct mbfl_output_filter* filter, int c)
-{
- if (filter->status == 0) {
- filter->cache = (c & 0xff) << 16;
- filter->status++;
- } else if (filter->status == 1) {
- filter->cache |= (c & 0xff) << 8;
- filter->status++;
- } else {
- int s = filter->cache | (c & 0xff);
- filter->cache = 0;
- filter->status = 0;
- CK((*filter->output_function)(mbfl_b64_table[(s >> 18) & 0x3f], filter->data));
- CK((*filter->output_function)(mbfl_b64_table[(s >> 12) & 0x3f], filter->data));
- CK((*filter->output_function)(mbfl_b64_table[(s >> 6) & 0x3f], filter->data));
- CK((*filter->output_function)(mbfl_b64_table[s & 0x3f], filter->data));
- }
-
- return c;
-}
-
-static int
-filt_b64enc_flush(struct mbfl_output_filter* filter)
-{
- /* flush fragments */
- if (filter->status >= 1) {
- CK((*filter->output_function)(mbfl_b64_table[(filter->cache >> 18) & 0x3f], filter->data));
- CK((*filter->output_function)(mbfl_b64_table[(filter->cache >> 12) & 0x3f], filter->data));
- if (filter->status == 1) {
- CK((*filter->output_function)('=', filter->data));
- CK((*filter->output_function)('=', filter->data));
- } else {
- CK((*filter->output_function)(mbfl_b64_table[(filter->cache >> 6) & 0x3f], filter->data));
- CK((*filter->output_function)('=', filter->data));
- }
- }
- filter->status = 0;
- filter->cache = 0;
-
- /* flush */
- return (filter->flush_function ? (*filter->flush_function)(filter->data) : 0);
-}
-
-static void
-filt_b64enc_dtor(struct mbfl_output_filter* filter)
-{
- (void)filt_b64enc_flush(filter);
-}
-
-/*
- * BASE64 => any
- */
-static int
-filt_b64dec(struct mbfl_output_filter* filter, int c)
-{
- int n = 0;
- char a;
-
- if(c == '=')
- return -1;
-
- if(c == '\r' || c == '\n' || c == ' ' || c == '\t')
- return c;
-
- while((a = mbfl_b64_table[n]) != '\0') {
- if(a == (char)c)
- break;
- n++;
- }
- n &= 0x3f;
-
- switch(filter->status) {
- case 0:
- filter->cache = n << 18;
- filter->status++;
- break;
- case 1:
- filter->cache |= n << 12;
- filter->status++;
- break;
- case 2:
- filter->cache |= n << 6;
- filter->status++;
- break;
- default:
- n |= filter->cache;
- filter->cache = 0;
- filter->status = 0;
- CK((*filter->output_function)((n >> 16) & 0xff, filter->data));
- CK((*filter->output_function)((n >> 8) & 0xff, filter->data));
- CK((*filter->output_function)(n & 0xff, filter->data));
- break;
- }
-
- return c;
-}
-
-static int
-filt_b64dec_flush(struct mbfl_output_filter* filter)
-{
- /* flush fragments */
- if (filter->status >= 2) {
- CK((*filter->output_function)((filter->cache >> 16) & 0xff, filter->data));
- if (filter->status == 3) {
- CK((*filter->output_function)((filter->cache >> 8) & 0xff, filter->data));
- }
- }
- filter->status = 0;
- filter->cache = 0;
-
- /* flush */
- return (filter->flush_function ? (*filter->flush_function)(filter->data) : 0);
-}
-
-static void
-filt_b64dec_dtor(struct mbfl_output_filter* filter)
-{
- (void)filt_b64dec_flush(filter);
-}
-
-/*
- * any => Quoted-Printable
- */
-static int
-filt_qprintenc(struct mbfl_output_filter* filter, int c)
-{
- int s, n, m;
-
- switch(filter->status & 0xff) {
- case 0:
- filter->cache = c;
- filter->status &= ~0xffffff;
- filter->status |= 1;
- break;
- default:
- s = filter->cache;
- filter->cache = c;
- n = (filter->status & 0xffffff) >> 8;
- if (s == '=' ||s >= 0x80) {
- if(n >= 73)
- m = 2;
- else
- m = 3;
- } else if (filter->status & 0x1000000 &&
- (s == ' ' || s == '\t' || s == '?' || s == '_' || s == '(' || s == ')' || s == '\"')) {
- if(n >= 73)
- m = 2;
- else
- m = 3;
- } else if ((s == ' ' || s == '\t') && (c == '\r' || c == '\n')) {
- m = 3;
- } else if ((s == ' ' || s == '\t') && n >= 72) {
- m = 4;
- } else if (s == '\r' || s == '\n') {
- m = 5;
- } else if(n >= 75) {
- m = 1;
- } else {
- m = 0;
- }
-
- if (m == 1 || m == 2) {
- CK((*filter->output_function)('=', filter->data));
- }
- if (m == 1 || m == 2 || m == 5) {
- CK((*filter->output_function)('\r', filter->data));
- CK((*filter->output_function)('\n', filter->data));
- if((m == 5) && (c == '\r' || c == '\n')) {
- filter->status &= ~0xffffff;
- } else {
- filter->status &= ~0xffffff;
- filter->status |= 1;
- }
- }
- if(m <= 1) {
- CK((*filter->output_function)(s, filter->data));
- filter->status += 0x100;
- } else if(m == 2 || m == 3 || m == 4) {
- CK((*filter->output_function)('=', filter->data));
- n = (s >> 4) & 0xf;
- if(n < 10)
- n += '0';
- else
- n += 'A' - 10;
- CK((*filter->output_function)(n, filter->data));
- n = s & 0xf;
- if(n < 10)
- n += '0';
- else
- n += 'A' - 10;
- CK((*filter->output_function)(n, filter->data));
- filter->status += 0x300;
- }
- if(m == 4) {
- CK((*filter->output_function)('=', filter->data));
- CK((*filter->output_function)('\r', filter->data));
- CK((*filter->output_function)('\n', filter->data));
- filter->status = 1;
- }
- break;
- }
-
- return c;
-}
-
-static int
-filt_qprintenc_flush(struct mbfl_output_filter* filter)
-{
- /* flush filter cache */
- (*filter->vptr->filter_function)(filter, '\r');
- filter->status = 0;
- filter->cache = 0;
-
- /* flush */
- return (filter->flush_function ? (*filter->flush_function)(filter->data) : 0);
-}
-
-static void
-filt_qprintenc_dtor(struct mbfl_output_filter* filter)
-{
- (void)filt_qprintenc_flush(filter);
-}
-
-/*
- * Quoted-Printable => any
- */
-static int
-filt_qprintdec(struct mbfl_output_filter* filter, int c)
-{
- int n;
- switch(filter->status) {
- case 1:
- if((c >= '0' && c <= '9') || (c >= 'A' && c <= 'F')) {
- filter->cache = c;
- filter->status = 2;
- } else if(c == '\r' || c == '\n') {
- filter->status = 3;
- } else {
- CK((*filter->output_function)('=', filter->data));
- CK((*filter->output_function)(c, filter->data));
- filter->status = 0;
- }
- break;
- case 2:
- n = filter->cache;
- if(n >= '0' && n <= '9') {
- n -= '0';
- } else {
- n -= ('A' + 10);
- }
- n <<= 4;
- if(c >= '0' && c <= '9') {
- n += (c - '0');
- } else if(c >= 'A' && c <= 'F') {
- n += (c - 'A') + 10;
- } else {
- CK((*filter->output_function)('=', filter->data));
- CK((*filter->output_function)(filter->cache, filter->data));
- n = c;
- }
- CK((*filter->output_function)(n, filter->data));
- filter->status = 0;
- break;
- case 3:
- if(c != '\n' && c != '\r') {
- CK((*filter->output_function)(c, filter->data));
- }
- filter->status = 0;
- break;
- default:
- if(c == '=') {
- filter->status = 1;
- } else {
- CK((*filter->output_function)(c, filter->data));
- }
- break;
- }
-
- return c;
-}
-
-static int
-filt_qprintdec_flush(struct mbfl_output_filter* filter)
-{
- /* flush fragments */
- if (filter->status == 1) {
- CK((*filter->output_function)('=', filter->data));
- } else if (filter->status == 2) {
- CK((*filter->output_function)('=', filter->data));
- CK((*filter->output_function)(filter->cache, filter->data));
- }
- filter->status = 0;
- filter->cache = 0;
-
- /* flush */
- return (filter->flush_function ? (*filter->flush_function)(filter->data) : 0);
-}
-
-static void
-filt_qprintdec_dtor(struct mbfl_output_filter* filter)
-{
- (void)filt_qprintdec_flush(filter);
-}
-
-
-/*
- *
- * kanji code filter for output stream
- *
- */
-static struct filter_vtbl vtbl_pass = {
- filt_common_ctor,
- filt_common_dtor,
- filt_pass,
- filt_common_flush };
-
-static struct filter_vtbl vtbl_eucjp_jis = {
- filt_common_ctor,
- filt_eucjp_jis_dtor,
- filt_eucjp_jis,
- filt_eucjp_jis_flush };
-
-static struct filter_vtbl vtbl_eucjp_sjis = {
- filt_common_ctor,
- filt_common_dtor,
- filt_eucjp_sjis,
- filt_common_flush };
-
-static struct filter_vtbl vtbl_sjis_jis = {
- filt_common_ctor,
- filt_sjis_jis_dtor,
- filt_sjis_jis,
- filt_sjis_jis_flush };
-
-static struct filter_vtbl vtbl_sjis_eucjp = {
- filt_common_ctor,
- filt_common_dtor,
- filt_sjis_eucjp,
- filt_common_flush };
-
-static struct filter_vtbl vtbl_jis_eucjp = {
- filt_common_ctor,
- filt_common_dtor,
- filt_jis_eucjp,
- filt_common_flush };
-
-static struct filter_vtbl vtbl_jis_sjis = {
- filt_common_ctor,
- filt_common_dtor,
- filt_jis_sjis,
- filt_common_flush };
-
-static struct filter_vtbl vtbl_eucjp_utf8 = {
- filt_common_ctor,
- filt_common_dtor,
- filt_eucjp_utf8,
- filt_common_flush };
-
-static struct filter_vtbl vtbl_sjis_utf8 = {
- filt_common_ctor,
- filt_common_dtor,
- filt_sjis_utf8,
- filt_common_flush };
-
-static struct filter_vtbl vtbl_jis_utf8 = {
- filt_common_ctor,
- filt_common_dtor,
- filt_jis_utf8,
- filt_common_flush };
-
-static struct filter_vtbl vtbl_utf8_euc = {
- filt_common_ctor,
- filt_common_dtor,
- filt_utf8_euc,
- filt_common_flush };
-
-static struct filter_vtbl vtbl_utf8_sjis = {
- filt_common_ctor,
- filt_common_dtor,
- filt_utf8_sjis,
- filt_common_flush };
-
-static struct filter_vtbl vtbl_utf8_jis = {
- filt_common_ctor,
- filt_ucs_jis_dtor,
- filt_utf8_jis,
- filt_ucs_jis_flush };
-
-static struct filter_vtbl vtbl_euc_ucs = {
- filt_common_ctor,
- filt_common_dtor,
- filt_euc_ucs,
- filt_common_flush };
-
-static struct filter_vtbl vtbl_ucs_euc = {
- filt_common_ctor,
- filt_common_dtor,
- filt_ucs_euc,
- filt_common_flush };
-
-static struct filter_vtbl vtbl_euc_wchar = {
- filt_common_ctor,
- filt_common_dtor,
- filt_euc_wchar,
- filt_common_flush };
-
-static struct filter_vtbl vtbl_wchar_euc = {
- filt_common_ctor,
- filt_common_dtor,
- filt_wchar_euc,
- filt_common_flush };
-
-static struct filter_vtbl vtbl_sjis_ucs = {
- filt_common_ctor,
- filt_common_dtor,
- filt_sjis_ucs,
- filt_common_flush };
-
-static struct filter_vtbl vtbl_ucs_sjis = {
- filt_common_ctor,
- filt_common_dtor,
- filt_ucs_sjis,
- filt_common_flush };
-
-static struct filter_vtbl vtbl_sjis_wchar = {
- filt_common_ctor,
- filt_common_dtor,
- filt_sjis_wchar,
- filt_common_flush };
-
-static struct filter_vtbl vtbl_wchar_sjis = {
- filt_common_ctor,
- filt_common_dtor,
- filt_wchar_sjis,
- filt_common_flush };
-
-static struct filter_vtbl vtbl_jis_ucs = {
- filt_common_ctor,
- filt_common_dtor,
- filt_jis_ucs,
- filt_common_flush };
-
-static struct filter_vtbl vtbl_ucs_jis = {
- filt_common_ctor,
- filt_ucs_jis_dtor,
- filt_ucs_jis,
- filt_ucs_jis_flush };
-
-static struct filter_vtbl vtbl_jis_wchar = {
- filt_common_ctor,
- filt_common_dtor,
- filt_jis_wchar,
- filt_common_flush };
-
-static struct filter_vtbl vtbl_wchar_jis = {
- filt_common_ctor,
- filt_ucs_jis_dtor,
- filt_wchar_jis,
- filt_ucs_jis_flush };
-
-static struct filter_vtbl vtbl_unknown_ja_jp = {
- filt_unknown_ja_jp_ctor,
- filt_unknown_ja_jp_dtor,
- filt_unknown_ja_jp,
- filt_unknown_ja_jp_flush };
-
-static struct filter_vtbl vtbl_utf8_wchar = {
- filt_common_ctor,
- filt_common_dtor,
- filt_utf8_wchar,
- filt_common_flush };
-
-static struct filter_vtbl vtbl_wchar_utf8 = {
- filt_common_ctor,
- filt_common_dtor,
- filt_wchar_utf8,
- filt_common_flush };
-
-static struct filter_vtbl vtbl_b64enc = {
- filt_common_ctor,
- filt_b64enc_dtor,
- filt_b64enc,
- filt_b64enc_flush };
-
-static struct filter_vtbl vtbl_b64dec = {
- filt_common_ctor,
- filt_b64dec_dtor,
- filt_b64dec,
- filt_b64dec_flush };
-
-static struct filter_vtbl vtbl_qprintenc = {
- filt_common_ctor,
- filt_qprintenc_dtor,
- filt_qprintenc,
- filt_qprintenc_flush };
-
-static struct filter_vtbl vtbl_qprintdec = {
- filt_common_ctor,
- filt_qprintdec_dtor,
- filt_qprintdec,
- filt_qprintdec_flush };
-
-
-static struct filter_vtbl*
-select_vtbl(enum mbfl_no_encoding from, enum mbfl_no_encoding to)
-{
- struct filter_vtbl* pvtbl = &vtbl_pass;
-
- if (to == mbfl_no_encoding_base64)
- return &vtbl_b64enc;
-
- if (to == mbfl_no_encoding_qprint)
- return &vtbl_qprintenc;
-
- if (from == mbfl_no_encoding_auto) {
- pvtbl = &vtbl_unknown_ja_jp;
- } else if (from == mbfl_no_encoding_base64) {
- pvtbl = &vtbl_b64dec;
- } else if (from == mbfl_no_encoding_qprint) {
- pvtbl = &vtbl_qprintdec;
- } else if (from == mbfl_no_encoding_wchar) {
- if (to == mbfl_no_encoding_utf8) {
- pvtbl = &vtbl_wchar_utf8;
- } else if (to == mbfl_no_encoding_ja_jp_euc) {
- pvtbl = &vtbl_wchar_euc;
- } else if (to == mbfl_no_encoding_ja_jp_sjis) {
- pvtbl = &vtbl_wchar_sjis;
- } else if (to == mbfl_no_encoding_ja_jp_jis) {
- pvtbl = &vtbl_wchar_jis;
- }
- } else if (from == mbfl_no_encoding_utf8) {
- if (to == mbfl_no_encoding_ja_jp_euc) {
- pvtbl = &vtbl_utf8_euc;
- } else if (to == mbfl_no_encoding_ja_jp_sjis) {
- pvtbl = &vtbl_utf8_sjis;
- } else if (to == mbfl_no_encoding_ja_jp_jis) {
- pvtbl = &vtbl_utf8_jis;
- } else if (to == mbfl_no_encoding_wchar
- || to == mbfl_no_encoding_ucs) {
- pvtbl = &vtbl_utf8_wchar;
- }
- } else if (from == mbfl_no_encoding_ucs) {
- if (to == mbfl_no_encoding_utf8) {
- pvtbl = &vtbl_wchar_utf8;
- } else if (to == mbfl_no_encoding_ja_jp_euc) {
- pvtbl = &vtbl_ucs_euc;
- } else if (to == mbfl_no_encoding_ja_jp_sjis) {
- pvtbl = &vtbl_ucs_sjis;
- } else if (to == mbfl_no_encoding_ja_jp_jis) {
- pvtbl = &vtbl_ucs_jis;
- }
- } else if (from == mbfl_no_encoding_ja_jp_euc) {
- if (to == mbfl_no_encoding_ja_jp_jis) {
- pvtbl = &vtbl_eucjp_jis;
- } else if (to == mbfl_no_encoding_ja_jp_sjis) {
- pvtbl = &vtbl_eucjp_sjis;
- } else if (to == mbfl_no_encoding_utf8) {
- pvtbl = &vtbl_eucjp_utf8;
- } else if (to == mbfl_no_encoding_ucs) {
- pvtbl = &vtbl_euc_ucs;
- } else if (to == mbfl_no_encoding_wchar) {
- pvtbl = &vtbl_euc_wchar;
- }
- } else if (from == mbfl_no_encoding_ja_jp_sjis) {
- if (to == mbfl_no_encoding_ja_jp_jis) {
- pvtbl = &vtbl_sjis_jis;
- } else if (to == mbfl_no_encoding_ja_jp_euc) {
- pvtbl = &vtbl_sjis_eucjp;
- } else if (to == mbfl_no_encoding_utf8) {
- pvtbl = &vtbl_sjis_utf8;
- } else if (to == mbfl_no_encoding_ucs) {
- pvtbl = &vtbl_sjis_ucs;
- } else if (to == mbfl_no_encoding_wchar) {
- pvtbl = &vtbl_sjis_wchar;
- }
- } else if (from == mbfl_no_encoding_ja_jp_jis) {
- if (to == mbfl_no_encoding_ja_jp_euc) {
- pvtbl = &vtbl_jis_eucjp;
- } else if (to == mbfl_no_encoding_ja_jp_sjis) {
- pvtbl = &vtbl_jis_sjis;
- } else if (to == mbfl_no_encoding_utf8) {
- pvtbl = &vtbl_jis_utf8;
- } else if (to == mbfl_no_encoding_ucs) {
- pvtbl = &vtbl_jis_ucs;
- } else if (to == mbfl_no_encoding_wchar) {
- pvtbl = &vtbl_jis_wchar;
- }
- }
-
- return pvtbl;
-}
-
-
-struct mbfl_output_filter*
-mbfl_output_filter_new(
- enum mbfl_no_encoding from,
- enum mbfl_no_encoding to,
- int (*output_function)(int, void*),
- int (*flush_function)(void*),
- void* data)
-{
- /* allocate */
- struct mbfl_output_filter* filter = (struct mbfl_output_filter*)malloc(sizeof(struct mbfl_output_filter));
-
- /* select the vtbl */
- filter->vptr = select_vtbl(from, to);
-
- /* constructor */
- (*filter->vptr->filter_ctor)(filter, from, to, output_function, flush_function, data);
-
- return filter;
-}
-
-void
-mbfl_output_filter_delete(struct mbfl_output_filter* filter)
-{
- (*filter->vptr->filter_dtor)(filter);
- free((void*)filter);
-}
-
-int
-mbfl_output_filter_feed(struct mbfl_output_filter* filter, int c)
-{
- return (*filter->vptr->filter_function)(filter, c);
-}
-
-int
-mbfl_output_filter_flush(struct mbfl_output_filter* filter)
-{
- return (*filter->vptr->flush_function)(filter);
-}
-
-enum mbfl_no_encoding
-mbfl_output_filter_encoding(struct mbfl_output_filter* filter)
-{
- return filter->from;
-}
-
-void
-mbfl_output_filter_reset(
- struct mbfl_output_filter* filter,
- enum mbfl_no_encoding from,
- enum mbfl_no_encoding to)
-{
- /* escape filter member */
- int (*output_function)(int, void*) = filter->output_function;
- int (*flush_function)(void*) = filter->flush_function;
- void* data = filter->data;
-
- /* destruct old filter */
- (*filter->vptr->filter_dtor)(filter);
-
- /* select the vtbl */
- filter->vptr = select_vtbl(from, to);
-
- /* construct new filter */
- (*filter->vptr->filter_ctor)(filter, from, to,
- output_function, flush_function, data);
-}
-
-void
-mbfl_output_filter_copy(
- struct mbfl_output_filter* src,
- struct mbfl_output_filter* dist)
-{
- dist->vptr = src->vptr;
- dist->output_function = src->output_function;
- dist->flush_function = src->flush_function;
- dist->data = src->data;
- dist->status = src->status;
- dist->cache = src->cache;
- dist->from = src->from;
- dist->to = src->to;
-}
-
-int
-mbfl_output_filter_unknown_default(struct mbfl_output_filter* filter, enum mbfl_no_encoding dfl)
-{
- if (filter->from != mbfl_no_encoding_auto || dfl == mbfl_no_encoding_auto) {
- return 0;
- }
- ((struct unknown_data*)filter->data)->from_default = dfl;
- return 1;
-}
-
-
-/*
- * filter pipe
- */
-static int
-filter_pipe_output(int c, void* data)
-{
- struct mbfl_output_filter *filter = (struct mbfl_output_filter*)data;
- return (*filter->vptr->filter_function)(filter, c);
-}
-
-
-/*
- *
- * output to memory
- *
- */
-struct mbfl_output_filter*
-mbfl_output_to_memory_new(
- enum mbfl_no_encoding from,
- enum mbfl_no_encoding to)
-{
- /* メモリーデバイス */
- struct memory_device* device = (struct memory_device*)malloc(sizeof (struct memory_device));
- device->buffer = (char*)0;
- device->length = 0;
- device->pos = 0;
-
- /* フィルタを作成 */
- return mbfl_output_filter_new(from, to, memory_device_output, 0, device);
-}
-
-void
-mbfl_output_to_memory_delete(struct mbfl_output_filter* filter)
-{
- void* device;
- mbfl_output_filter_flush(filter);
- /* This flushes it and makes filter->data as I specified for ..._new(). */
- device = filter->data;
- mbfl_output_filter_delete(filter);
- free(device);
-}
-
-char*
-mbfl_output_to_memory_result(struct mbfl_output_filter* filter)
-{
- char* result;
- struct memory_device* device;
-
- mbfl_output_filter_flush(filter);
- device = (struct memory_device*)filter->data;
- memory_device_output('\0', device);
- result = device->buffer;
- device->buffer = (char*)0;
- device->length = 0;
- device->pos = 0;
-
- return result; /* free()は呼び出し側の責任 */
-}
-
-
-/*
- *
- * multi byte code filter for input stream
- *
- */
-struct mbfl_input_filter {
- int (*input_function)(void* data);
- void* data;
- struct mbfl_output_filter* encoder;
- struct memory_device device;
- int pos;
- enum mbfl_no_encoding from; /* encoder->fromのコピー */
-};
-
-struct mbfl_input_filter*
-mbfl_input_filter_new(
- enum mbfl_no_encoding from,
- enum mbfl_no_encoding to,
- int (*input_function)(void*),
- void* data)
-{
- struct mbfl_input_filter* filter = (struct mbfl_input_filter*)malloc(sizeof (struct mbfl_input_filter));
-
- filter->input_function = input_function;
- filter->data = data;
- filter->device.buffer = (char*)0;
- filter->device.length = 0;
- filter->device.pos = 0; /* writing position */
- filter->pos = 0; /* reading position */
- filter->from = from;
- filter->encoder = mbfl_output_filter_new(from, to, memory_device_output, 0, (void*)&filter->device);
- return filter;
-}
-
-void
-mbfl_input_filter_delete(struct mbfl_input_filter* filter)
-{
- if (filter->encoder) {
- /* XXX mbfl_output_filter_delete()の中身のコピー */
- (*filter->encoder->vptr->filter_dtor)(filter->encoder);
- filter->from = filter->encoder->from; /* 判定結果 */
- free((void*)filter->encoder);
- }
-
- if (filter->device.buffer) {
- free((void*)filter->device.buffer);
- }
- free((void*)filter);
-}
-
-int
-mbfl_input_filter_retrieve(struct mbfl_input_filter* filter)
-{
- int c;
- struct memory_device* device = &filter->device;
-
- for (;;) {
- if (device->pos > filter->pos) {
- /* have some char in a buffer */
- c = device->buffer[filter->pos++] & 0xff;
- if (filter->pos >= device->pos) {
- filter->pos = device->pos = 0;
- }
- return c;
- } else if (filter->input_function == 0) {
- /* already hit an EOF */
- return -1; /* EOF */
- } else if ((c = (*filter->input_function)(filter->data)) < 0) {
- /* EOF */
- /* XXX mbfl_output_filter_delete()の中身のコピー */
- (*filter->encoder->vptr->filter_dtor)(filter->encoder);
- filter->from = filter->encoder->from; /* 判定結果 */
- free((void*)filter->encoder);
- filter->encoder = 0;
- filter->input_function = 0; /* mark it */
- } else {
- /* got a char from the input function */
- (void)mbfl_output_filter_feed(filter->encoder, c);
- /* never returns an error */
- }
- }
-}
-
-enum mbfl_no_encoding
-mbfl_input_filter_encoding(struct mbfl_input_filter* filter)
-{
- return (filter->encoder ? filter->encoder->from : filter->from);
-}
-
-
-/*
- *
- * multi byte code converter for C string
- *
- */
-char*
-mbfl_encoding_convert(
- enum mbfl_no_encoding from,
- enum mbfl_no_encoding to,
- const char* s)
-{
- /* 準備 */
- struct memory_device device = { (char*)0, 0, 0 };
- struct mbfl_output_filter* filter =
- mbfl_output_filter_new(from, to, memory_device_output, 0, &device);
-
- /* 流す */
- while (*s)
- (void)mbfl_output_filter_feed(filter, *s++ & 0xff);
-
- /* 端末処理 */
- mbfl_output_filter_delete(filter);
- memory_device_output('\0', &device);
- /* これにより、device.bufferが0でないことが保証される。*/
-
- /* 終わり */
- return device.buffer; /* free()は呼び出し側の責任 */
-}
-
-
-/*
- *
- * identify kanji code
- *
- */
-static int
-null_device_output(int c, void* data)
-{
- return 0;
-}
-
-enum mbfl_no_encoding
-mbfl_identify_encoding(const char* s)
-{
- enum mbfl_no_encoding code;
-
- /* 準備 */
- struct mbfl_output_filter* filter = mbfl_output_filter_new(
- mbfl_no_encoding_auto,
- mbfl_no_encoding_auto,
- null_device_output, 0, 0);
-
- /* 流す */
- while (*s) {
- (void)mbfl_output_filter_feed(filter, *s++ & 0xff);
- if (mbfl_output_filter_encoding(filter) != mbfl_no_encoding_auto)
- break;
- }
-
- mbfl_output_filter_flush(filter);
- code = mbfl_output_filter_encoding(filter);
- mbfl_output_filter_delete(filter);
-
- /* 終わり */
- return code;
-}
-
-
-/*
- * strlen
- */
-static int
-filter_count_output(int c, void* data)
-{
- (*(int *)data)++;
- return c;
-}
-
-int
-mbfl_strlen(
- const char* s,
- enum mbfl_no_encoding code)
-{
- /* 文字数を記憶する */
- int len = 0;
-
- /* マルチバイト文字からワイド文字に変換するフィルタ */
- struct mbfl_output_filter* filter = mbfl_output_filter_new(
- code, mbfl_no_encoding_wchar,
- filter_count_output, 0, &len);
-
- /* 流す */
- while (*s)
- (void)mbfl_output_filter_feed(filter, *s++ & 0xff);
-
- mbfl_output_filter_delete(filter);
-
- /* 終わり */
- return len;
-}
-
-
-/*
- * collector
- */
-struct collector_data {
- struct mbfl_output_filter *next_filter;
- struct memory_device bytedev;
- struct wchar_device wcdev;
- int start;
- int stop;
- int input;
- int output;
- int pos;
- int length;
- int count;
-};
-
-static struct collector_data*
-collector_data_new()
-{
- struct collector_data *pc = (struct collector_data*)malloc(sizeof(struct collector_data));
- if (pc == NULL)
- return NULL;
-
- pc->next_filter = (struct mbfl_output_filter *)0;
- pc->bytedev.buffer = (char*)0;
- pc->bytedev.length = 0;
- pc->bytedev.pos = 0;
- pc->wcdev.buffer = (int*)0;
- pc->wcdev.length = 0;
- pc->wcdev.pos = 0;
- pc->start = 0;
- pc->stop = 0;
- pc->input = 0;
- pc->output = 0;
- pc->pos = 0;
- pc->length = 0;
- pc->count = 0;
-
- return pc;
-}
-
-static void
-collector_data_delete(struct collector_data *pc)
-{
- if(pc->bytedev.buffer)
- free((void*)pc->bytedev.buffer);
- if(pc->wcdev.buffer)
- free((void*)pc->wcdev.buffer);
- free((void*)pc);
-}
-
-
-/*
- * strpos
- */
-static int
-collector_strpos(int c, void* data)
-{
- int *p, *h, *m, n;
- struct collector_data *pc = (struct collector_data*)data;
- if (pc->output >= pc->start) {
- if (c == pc->wcdev.buffer[pc->length]) {
- if (pc->length == 0)
- pc->pos = pc->output; /* found position */
- pc->length++; /* needle pointer */
- if (pc->wcdev.buffer[pc->length] == '\0') {
- pc->stop = pc->pos; /* matchd position */
- pc->count = 1; /* matchd flag */
- pc->length--;
- goto retry;
- }
- } else if (pc->length != 0) {
-retry:
- h = pc->wcdev.buffer;
- h++;
- for (;;) {
- pc->pos++;
- p = h;
- m = pc->wcdev.buffer;
- n = pc->length - 1;
- while (n > 0 && *p == *m) {
- n--;
- p++;
- m++;
- }
- if (n <= 0) {
- if (*m != c)
- pc->length = 0;
- break;
- } else {
- h++;
- pc->length--;
- }
- }
- }
- }
-
- pc->output++;
- return c;
-}
-
-int
-mbfl_strpos(
- const char* haystack,
- const char* needle,
- int offset,
- enum mbfl_no_encoding code,
- int reverse)
-{
- int pos;
- const char *s;
- struct collector_data *pc;
- struct mbfl_output_filter* filter;
-
- pc = collector_data_new();
- if (pc == NULL)
- return -4;
-
- pc->start = offset;
-
- /* needleをワイド文字に変換 */
- filter = mbfl_output_filter_new(code, mbfl_no_encoding_wchar, wchar_device_output, 0, &(pc->wcdev));
- s = needle;
- while (*s)
- (void)mbfl_output_filter_feed(filter, *s++ & 0xff);
-
- mbfl_output_filter_delete(filter);
- wchar_device_output('\0', &(pc->wcdev));
-
- if(pc->wcdev.buffer[0] == '\0') {
- collector_data_delete(pc);
- return -2;
- }
-
- /* haystackをワイド文字に変換するフィルタ */
- filter = mbfl_output_filter_new(code, mbfl_no_encoding_wchar, collector_strpos, 0, pc);
- /* collector_strposで文字の比較を行う */
-
- /* 流す */
- s = haystack;
- while (*s) {
- (void)mbfl_output_filter_feed(filter, *s++ & 0xff);
- if (pc->count != 0 && !reverse)
- break;
- }
-
- mbfl_output_filter_delete(filter);
-
- if(pc->count == 0)
- pos = -1;
- else
- pos = pc->stop;
-
- collector_data_delete(pc);
-
- /* 終わり */
- return pos;
-}
-
-
-/*
- * substr
- */
-static int
-collector_substr(int c, void* data)
-{
- struct collector_data *pc = (struct collector_data*)data;
-
- if(pc->output >= pc->stop)
- return -1;
-
- if(pc->output >= pc->start)
- (*pc->next_filter->vptr->filter_function)(pc->next_filter, c);
-
- pc->output++;
-
- return c;
-}
-
-char*
-mbfl_substr(
- const char* s,
- int from,
- int length,
- enum mbfl_no_encoding code)
-{
- char *result;
- struct collector_data *pc;
- struct mbfl_output_filter* decoder;
- struct mbfl_output_filter* encoder;
-
- pc = collector_data_new();
- if (pc == NULL)
- return NULL;
-
- /* ワイド文字からもとのコードに戻しメモリデバイスに出力するフィルタ */
- decoder = mbfl_output_filter_new(mbfl_no_encoding_wchar, code, memory_device_output, 0, &(pc->bytedev));
- pc->next_filter = decoder;
-
- pc->start = from;
- pc->stop = from + length;
-
- /* sをワイド文字に変換するフィルタ */
- encoder = mbfl_output_filter_new(code, mbfl_no_encoding_wchar, collector_substr, 0, pc);
- /* collector_substrで切り出す文字位置を判定 */
-
- /* 流す */
- while (*s) {
- if (mbfl_output_filter_feed(encoder, *s++ & 0xff) < 0)
- break;
- }
-
- mbfl_output_filter_delete(encoder);
- mbfl_output_filter_delete(decoder);
-
- /* 端末処理 */
- memory_device_output('\0', &(pc->bytedev));
- /* これにより、device.bufferが0でないことが保証される。*/
-
- result = pc->bytedev.buffer;
- pc->bytedev.buffer = (char*)0;
- collector_data_delete(pc);
-
- /* 終わり */
- return result; /* free()は呼び出し側の責任 */
-}
-
-
-/*
- * strcut
- */
-static int
-collector_strcut(int c, void* data)
-{
- int n;
- struct collector_data *pc = (struct collector_data*)data;
-
- pc->pos = pc->bytedev.pos;
- if(pc->input >= pc->start) {
- (*pc->next_filter->vptr->filter_function)(pc->next_filter, c);
- }
-
- n = pc->bytedev.pos + ((pc->next_filter->status >> 16) & 0xff);
- if(n > pc->stop) {
- pc->bytedev.pos = pc->pos;
- c = -1;
- }
-
- return c;
-}
-
-char*
-mbfl_strcut(
- const char* s,
- int from,
- int length,
- enum mbfl_no_encoding code)
-{
- char *result;
- struct collector_data *pc;
- struct mbfl_output_filter* decoder;
- struct mbfl_output_filter* encoder;
-
- pc = collector_data_new();
- if (pc == NULL)
- return NULL;
-
- /* ワイド文字からもとのコードに戻しメモリデバイスに出力するフィルタ */
- decoder = mbfl_output_filter_new(mbfl_no_encoding_wchar, code, memory_device_output, 0, &(pc->bytedev));
- pc->next_filter = decoder;
-
- pc->start = from;
- pc->stop = length;
-
- /* sをワイド文字に変換するフィルタ */
- encoder = mbfl_output_filter_new(code, mbfl_no_encoding_wchar, collector_strcut, 0, pc);
- /* collector_strcutで切り出す文字位置を判定 */
-
- /* 流す */
- while (*s) {
- if (mbfl_output_filter_feed(encoder, *s++ & 0xff) < 0)
- break;
- pc->input++;
- }
-
- mbfl_output_filter_delete(encoder);
- mbfl_output_filter_delete(decoder);
-
- /* 端末処理 */
- memory_device_output('\0', &(pc->bytedev));
- /* これにより、device.bufferが0でないことが保証される。*/
-
- result = pc->bytedev.buffer;
- pc->bytedev.buffer = (char*)0;
- collector_data_delete(pc);
-
- /* 終わり */
- return result; /* free()は呼び出し側の責任 */
-}
-
-
-/*
- * convert Hankaku and Zenkaku
- */
-static const unsigned char hankana2zenkata_table[64] = {
- 0x00,0x02,0x0C,0x0D,0x01,0xFB,0xF2,0xA1,0xA3,0xA5,
- 0xA7,0xA9,0xE3,0xE5,0xE7,0xC3,0xFC,0xA2,0xA4,0xA6,
- 0xA8,0xAA,0xAB,0xAD,0xAF,0xB1,0xB3,0xB5,0xB7,0xB9,
- 0xBB,0xBD,0xBF,0xC1,0xC4,0xC6,0xC8,0xCA,0xCB,0xCC,
- 0xCD,0xCE,0xCF,0xD2,0xD5,0xD8,0xDB,0xDE,0xDF,0xE0,
- 0xE1,0xE2,0xE4,0xE6,0xE8,0xE9,0xEA,0xEB,0xEC,0xED,
- 0xEF,0xF3,0x9B,0x9C
-};
-static const unsigned char hankana2zenhira_table[64] = {
- 0x00,0x02,0x0C,0x0D,0x01,0xFB,0x92,0x41,0x43,0x45,
- 0x47,0x49,0x83,0x85,0x87,0x63,0xFC,0x42,0x44,0x46,
- 0x48,0x4A,0x4B,0x4D,0x4F,0x51,0x53,0x55,0x57,0x59,
- 0x5B,0x5D,0x5F,0x61,0x64,0x66,0x68,0x6A,0x6B,0x6C,
- 0x6D,0x6E,0x6F,0x72,0x75,0x78,0x7B,0x7E,0x7F,0x80,
- 0x81,0x82,0x84,0x86,0x88,0x89,0x8A,0x8B,0x8C,0x8D,
- 0x8F,0x93,0x9B,0x9C
-};
-static const unsigned char zenkana2hankana_table[84][2] = {
- {0x67,0x00},{0x71,0x00},{0x68,0x00},{0x72,0x00},{0x69,0x00},
- {0x73,0x00},{0x6A,0x00},{0x74,0x00},{0x6B,0x00},{0x75,0x00},
- {0x76,0x00},{0x76,0x9E},{0x77,0x00},{0x77,0x9E},{0x78,0x00},
- {0x78,0x9E},{0x79,0x00},{0x79,0x9E},{0x7A,0x00},{0x7A,0x9E},
- {0x7B,0x00},{0x7B,0x9E},{0x7C,0x00},{0x7C,0x9E},{0x7D,0x00},
- {0x7D,0x9E},{0x7E,0x00},{0x7E,0x9E},{0x7F,0x00},{0x7F,0x9E},
- {0x80,0x00},{0x80,0x9E},{0x81,0x00},{0x81,0x9E},{0x6F,0x00},
- {0x82,0x00},{0x82,0x9E},{0x83,0x00},{0x83,0x9E},{0x84,0x00},
- {0x84,0x9E},{0x85,0x00},{0x86,0x00},{0x87,0x00},{0x88,0x00},
- {0x89,0x00},{0x8A,0x00},{0x8A,0x9E},{0x8A,0x9F},{0x8B,0x00},
- {0x8B,0x9E},{0x8B,0x9F},{0x8C,0x00},{0x8C,0x9E},{0x8C,0x9F},
- {0x8D,0x00},{0x8D,0x9E},{0x8D,0x9F},{0x8E,0x00},{0x8E,0x9E},
- {0x8E,0x9F},{0x8F,0x00},{0x90,0x00},{0x91,0x00},{0x92,0x00},
- {0x93,0x00},{0x6C,0x00},{0x94,0x00},{0x6D,0x00},{0x95,0x00},
- {0x6E,0x00},{0x96,0x00},{0x97,0x00},{0x98,0x00},{0x99,0x00},
- {0x9A,0x00},{0x9B,0x00},{0x9C,0x00},{0x9C,0x00},{0x72,0x00},
- {0x74,0x00},{0x66,0x00},{0x9D,0x00},{0x73,0x9E}
-};
-
-static int
-collector_hantozen(int c, void* data)
-{
- int s, mode, n;
- struct collector_data *pc = (struct collector_data*)data;
- s = c;
- mode = pc->start;
-
- if(mode & 0x7) { /* hankaku to zenkaku */
- if((mode & 0x1) && c >= 0x21 && c <= 0x7e) { /* all */
- s = c + 0xfee0;
- } else if((mode & 0x2) && ((c >= 0x41 && c <= 0x5a) || (c >= 0x61 && c <= 0x7a))) { /* alpha */
- s = c + 0xfee0;
- } else if((mode & 0x4) && c >= 0x30 && c <= 0x39) { /* num */
- s = c + 0xfee0;
- }
- }
-
- if(mode & 0x70) { /* zenkaku to hankaku */
- if((mode & 0x10) && c >= 0xff01 && c <= 0xff5e) { /* all */
- s = c - 0xfee0;
- } else if((mode & 0x20) && ((c >= 0xff21 && c <= 0xff3a) || (c >= 0xff41 && c <= 0xff5a))) { /* alpha */
- s = c - 0xfee0;
- } else if((mode & 0x40) && (c >= 0xff10 && c <= 0xff19)) { /* num */
- s = c - 0xfee0;
- }
- }
-
- if(mode & 0x300) { /* hankaku kana to zenkaku kana */
- if((mode & 0x100) && (mode & 0x800)) { /* hankaku kana to zenkaku katakana and glue voice soundmark */
- if(c >= 0xff61 && c <= 0xff9f) {
- if(pc->pos) {
- n = (pc->output - 0xff60) & 0x3f;
- if(c == 0xff9e && ((n >= 22 && n <= 36) || (n >= 42 && n <= 46))) {
- pc->pos = 0;
- s = 0x3001 + hankana2zenkata_table[n];
- } else if(c == 0xff9e && n == 19) {
- pc->pos = 0;
- s = 0x30f4;
- } else if(c == 0xff9f && (n >= 42 && n <= 46)) {
- pc->pos = 0;
- s = 0x3002 + hankana2zenkata_table[n];
- } else {
- pc->pos = 1;
- pc->output = c;
- s = 0x3000 + hankana2zenkata_table[n];
- }
- } else {
- pc->pos = 1;
- pc->output = c;
- return c;
- }
- } else {
- if(pc->pos) {
- n = (pc->output - 0xff60) & 0x3f;
- pc->pos = 0;
- (*pc->next_filter->vptr->filter_function)(pc->next_filter, 0x3000 + hankana2zenkata_table[n]);
- }
- }
- } else if((mode & 0x200) && (mode & 0x800)) { /* hankaku kana to zenkaku hirangana and glue voice soundmark */
- if(c >= 0xff61 && c <= 0xff9f) {
- if(pc->pos) {
- n = (pc->output - 0xff60) & 0x3f;
- if(c == 0xff9e && ((n >= 22 && n <= 36) || (n >= 42 && n <= 46))) {
- pc->pos = 0;
- s = 0x3001 + hankana2zenhira_table[n];
- } else if(c == 0xff9f && (n >= 42 && n <= 46)) {
- pc->pos = 0;
- s = 0x3002 + hankana2zenhira_table[n];
- } else {
- pc->pos = 1;
- pc->output = c;
- s = 0x3000 + hankana2zenhira_table[n];
- }
- } else {
- pc->pos = 1;
- pc->output = c;
- return c;
- }
- } else {
- if(pc->pos) {
- n = (pc->output - 0xff60) & 0x3f;
- pc->pos = 0;
- (*pc->next_filter->vptr->filter_function)(pc->next_filter, 0x3000 + hankana2zenhira_table[n]);
- }
- }
- } else if((mode & 0x100) && c >= 0xff61 && c <= 0xff9f) { /* hankaku kana to zenkaku katakana */
- s = 0x3000 + hankana2zenkata_table[c - 0xff60];
- } else if((mode & 0x200) && c >= 0xff61 && c <= 0xff9f) { /* hankaku kana to zenkaku hirangana */
- s = 0x3000 + hankana2zenhira_table[c - 0xff60];
- }
- }
-
- if(mode & 0x3000) { /* Zenkaku kana to hankaku kana */
- if((mode & 0x1000) && c >= 0x30a1 && c <= 0x30f4) { /* Zenkaku katakana to hankaku kana */
- n = c - 0x30a1;
- if(zenkana2hankana_table[n][1] != 0) {
- (*pc->next_filter->vptr->filter_function)(pc->next_filter, 0xff00 + zenkana2hankana_table[n][0]);
- s = 0xff00 + zenkana2hankana_table[n][1];
- } else {
- s = 0xff00 + zenkana2hankana_table[n][0];
- }
- } else if((mode & 0x2000) && c >= 0x3041 && c <= 0x3093) { /* Zenkaku hirangana to hankaku kana */
- n = c - 0x3041;
- if(zenkana2hankana_table[n][1] != 0) {
- (*pc->next_filter->vptr->filter_function)(pc->next_filter, 0xff00 + zenkana2hankana_table[n][0]);
- s = 0xff00 + zenkana2hankana_table[n][1];
- } else {
- s = 0xff00 + zenkana2hankana_table[n][0];
- }
- } else if(c == 0x3001) {
- s = 0xff64;
- } else if(c == 0x3002) {
- s = 0xff61;
- } else if(c == 0x309b) {
- s = 0xff9e;
- } else if(c == 0x309c) {
- s = 0xff9f;
- } else if(c == 0x30fc) {
- s = 0xff70;
- }
- } else if(mode & 0x30000) {
- if((mode & 0x10000) && c >= 0x3041 && c <= 0x3093) { /* Zenkaku hirangana to Zenkaku katakana */
- s = c + 0x60;
- } else if((mode & 0x20000) && c >= 0x30a1 && c <= 0x30f3) { /* Zenkaku katakana to Zenkaku hirangana */
- s = c - 0x60;
- }
- }
-
- return (*pc->next_filter->vptr->filter_function)(pc->next_filter, s);
-}
-
-char*
-mbfl_ja_jp_hantozen(
- const char* s,
- int mode,
- enum mbfl_no_encoding code)
-{
- char *result;
- struct collector_data *pc;
- struct mbfl_output_filter* decoder;
- struct mbfl_output_filter* encoder;
-
- pc = collector_data_new();
- if (pc == NULL)
- return NULL;
-
- /* 変換結果をUCSからもとのコードに戻しメモリデバイスに出力するフィルタ */
- decoder = mbfl_output_filter_new(mbfl_no_encoding_ucs, code, memory_device_output, 0, &(pc->bytedev));
- pc->next_filter = decoder;
- pc->start = mode;
-
- /* sのエンコードをUCSに変換するフィルタ */
- encoder = mbfl_output_filter_new(code, mbfl_no_encoding_ucs, collector_hantozen, 0, pc);
- /* collector_hantozenで半角と全角の変換 */
-
- /* 流す */
- while (*s)
- (void)mbfl_output_filter_feed(encoder, *s++ & 0xff);
-
- (void)mbfl_output_filter_feed(encoder, '\0');
- mbfl_output_filter_delete(encoder);
- mbfl_output_filter_delete(decoder);
-
- result = pc->bytedev.buffer;
- pc->bytedev.buffer = (char*)0;
- collector_data_delete(pc);
-
- /* 終わり */
- return result; /* free()は呼び出し側の責任 */
-}
-
-
-/*
- * MIME header encode
- */
-struct mime_header_encoder_data {
- struct mbfl_output_filter *toucs_filter;
- struct mbfl_output_filter *tomb_filter;
- struct mbfl_output_filter *tomb_tmp_filter;
- struct mbfl_output_filter *enc_filter;
- struct mbfl_output_filter *enc_tmp_filter;
- struct memory_device device;
- struct memory_device tmpdev;
- int prevpos;
- int status;
- int linehead;
- int encnamelen;
- char encname[64];
- char linefeed[8];
-};
-
-static int
-mime_header_encoder_collector(int c, void* data)
-{
- int n,p;
- struct mime_header_encoder_data *pe = (struct mime_header_encoder_data*)data;
-
- if (c != '\r' && c != '\n') {
- switch(pe->status) {
- case 10: /* Quoted-Printable encoding mode: initial state */
- pe->status = 11;
- memory_device_ncat(&(pe->device), pe->encname, pe->encnamelen);
- c = (*pe->tomb_filter->vptr->filter_function)(pe->tomb_filter, c);
- pe->prevpos = pe->device.pos;
- mbfl_output_filter_copy(pe->tomb_filter, pe->tomb_tmp_filter);
- mbfl_output_filter_copy(pe->enc_filter, pe->enc_tmp_filter);
- break;
- case 11: /* Quoted-Printable encoding mode: normal state */
- (*pe->tomb_filter->vptr->filter_function)(pe->tomb_filter, c);
- (*pe->tomb_filter->vptr->flush_function)(pe->tomb_filter);
- (*pe->enc_filter->vptr->flush_function)(pe->enc_filter);
- n = pe->device.pos - pe->linehead;
- if(n > 70) {
- memory_device_ncat(&(pe->device), "?=", 2);
- memory_device_cat(&(pe->device), pe->linefeed);
- pe->linehead = pe->device.pos;
- memory_device_output(' ', &(pe->device));
- memory_device_ncat(&(pe->device), pe->encname, pe->encnamelen);
- c = (*pe->tomb_filter->vptr->filter_function)(pe->tomb_filter, c);
- } else {
- pe->device.pos = pe->prevpos;
- mbfl_output_filter_copy(pe->tomb_tmp_filter, pe->tomb_filter);
- mbfl_output_filter_copy(pe->enc_tmp_filter, pe->enc_filter);
- c = (*pe->tomb_filter->vptr->filter_function)(pe->tomb_filter, c);
- }
- pe->prevpos = pe->device.pos;
- mbfl_output_filter_copy(pe->tomb_filter, pe->tomb_tmp_filter);
- mbfl_output_filter_copy(pe->enc_filter, pe->enc_tmp_filter);
- break;
-
- case 2: /* nonASCII for BASE64 encoding mode w/LWSP sequence */
- case 3: /* nonASCII for BASE64 encoding mode w/LWSP+ASCII sequence */
- if(c == ' ' || c == '\t') {
- memory_device_output(c, &(pe->tmpdev));
- if (pe->status == 3) {
- (*pe->tomb_filter->vptr->flush_function)(pe->tomb_filter);
- (*pe->enc_filter->vptr->flush_function)(pe->enc_filter);
- memory_device_ncat(&(pe->device), "?=", 2);
-
- if (pe->device.pos + pe->tmpdev.pos - pe->linehead >= 73) {
- memory_device_cat(&(pe->device), pe->linefeed);
- pe->linehead = pe->device.pos;
- }
- p = 0;
- while (p < pe->tmpdev.pos) {
- if (pe->device.pos - pe->linehead >= 74) {
- memory_device_cat(&(pe->device), pe->linefeed);
- pe->linehead = pe->device.pos;
- memory_device_output(' ', &(pe->device));
- }
- memory_device_output(pe->tmpdev.buffer[p++], &(pe->device));
- }
- pe->tmpdev.pos = 0;
- pe->status = 0;
- }
- break;
- } else if (c < 0x80) {
- memory_device_output(c, &(pe->tmpdev));
- pe->status = 3;
- break;
- }
- pe->status = 1;
-
- p = 0;
- while (p < pe->tmpdev.pos) {
- (*pe->tomb_filter->vptr->filter_function)(pe->tomb_filter, pe->tmpdev.buffer[p]);
- (*pe->tomb_filter->vptr->flush_function)(pe->tomb_filter);
- (*pe->enc_filter->vptr->flush_function)(pe->enc_filter);
- n = pe->device.pos - pe->linehead;
- pe->device.pos = pe->prevpos;
- mbfl_output_filter_copy(pe->tomb_tmp_filter, pe->tomb_filter);
- mbfl_output_filter_copy(pe->enc_tmp_filter, pe->enc_filter);
-
- if(n >= 73) {
- (*pe->tomb_filter->vptr->flush_function)(pe->tomb_filter);
- (*pe->enc_filter->vptr->flush_function)(pe->enc_filter);
- memory_device_ncat(&(pe->device), "?=", 2);
- memory_device_cat(&(pe->device), pe->linefeed);
- pe->linehead = pe->device.pos;
- memory_device_output(' ', &(pe->device));
- memory_device_ncat(&(pe->device), pe->encname, pe->encnamelen);
- }
- (*pe->tomb_filter->vptr->filter_function)(pe->tomb_filter, pe->tmpdev.buffer[p++]);
- pe->prevpos = pe->device.pos;
- mbfl_output_filter_copy(pe->tomb_filter, pe->tomb_tmp_filter);
- mbfl_output_filter_copy(pe->enc_filter, pe->enc_tmp_filter);
- }
- pe->tmpdev.pos = 0;
- case 1: /* nonASCII for BASE64 encoding mode */
- (*pe->tomb_filter->vptr->filter_function)(pe->tomb_filter, c);
- (*pe->tomb_filter->vptr->flush_function)(pe->tomb_filter);
- (*pe->enc_filter->vptr->flush_function)(pe->enc_filter);
- n = pe->device.pos - pe->linehead;
-
- pe->device.pos = pe->prevpos;
- mbfl_output_filter_copy(pe->tomb_tmp_filter, pe->tomb_filter);
- mbfl_output_filter_copy(pe->enc_tmp_filter, pe->enc_filter);
-
- if(c == ' ' || c == '\t') {
- memory_device_output(c, &(pe->tmpdev));
- pe->status = 2;
- } else {
- if(n >= 73) {
- (*pe->tomb_filter->vptr->flush_function)(pe->tomb_filter);
- (*pe->enc_filter->vptr->flush_function)(pe->enc_filter);
- memory_device_ncat(&(pe->device), "?=", 2);
- memory_device_cat(&(pe->device), pe->linefeed);
- pe->linehead = pe->device.pos;
- memory_device_output(' ', &(pe->device));
- memory_device_ncat(&(pe->device), pe->encname, pe->encnamelen);
- }
- c = (*pe->tomb_filter->vptr->filter_function)(pe->tomb_filter, c);
- }
- pe->prevpos = pe->device.pos;
- mbfl_output_filter_copy(pe->tomb_filter, pe->tomb_tmp_filter);
- mbfl_output_filter_copy(pe->enc_filter, pe->enc_tmp_filter);
- break;
- default: /* ASCII for BASE64 encoding mode */
- if(c == ' ' || c == '\t') {
- memory_device_output(c, &(pe->tmpdev));
- if (pe->device.pos + pe->tmpdev.pos - pe->linehead >= 73) {
- if(pe->device.buffer[pe->device.pos-1] == '\t'
- || pe->device.buffer[pe->device.pos-1] == ' ') {
- pe->device.pos--;
- }
- memory_device_cat(&(pe->device), pe->linefeed);
- pe->linehead = pe->device.pos;
- memory_device_output(' ', &(pe->device));
- }
- p = 0;
- while (p < pe->tmpdev.pos) {
- if (pe->device.pos - pe->linehead >= 74) {
- memory_device_cat(&(pe->device), pe->linefeed);
- pe->linehead = pe->device.pos;
- memory_device_output(' ', &(pe->device));
- }
- memory_device_output(pe->tmpdev.buffer[p++], &(pe->device));
- }
- pe->tmpdev.pos = 0;
- } else if (c < 0x80) {
- memory_device_output(c, &(pe->tmpdev));
- } else {
- if((pe->device.pos - pe->linehead + pe->encnamelen) >= 60) {
- if(pe->device.buffer[pe->device.pos-1] == '\t'
- || pe->device.buffer[pe->device.pos-1] == ' ') {
- pe->device.pos--;
- }
- memory_device_cat(&(pe->device), pe->linefeed);
- pe->linehead = pe->device.pos;
- memory_device_output(' ', &(pe->device));
- }
- memory_device_ncat(&(pe->device), pe->encname, pe->encnamelen);
- pe->prevpos = pe->device.pos;
-
- p = 0;
- while (p < pe->tmpdev.pos) {
- (*pe->tomb_filter->vptr->filter_function)(pe->tomb_filter, pe->tmpdev.buffer[p]);
- (*pe->tomb_filter->vptr->flush_function)(pe->tomb_filter);
- (*pe->enc_filter->vptr->flush_function)(pe->enc_filter);
- n = pe->device.pos - pe->linehead;
- pe->device.pos = pe->prevpos;
- mbfl_output_filter_copy(pe->tomb_tmp_filter, pe->tomb_filter);
- mbfl_output_filter_copy(pe->enc_tmp_filter, pe->enc_filter);
-
- if(n >= 73) {
- (*pe->tomb_filter->vptr->flush_function)(pe->tomb_filter);
- (*pe->enc_filter->vptr->flush_function)(pe->enc_filter);
- memory_device_ncat(&(pe->device), "?=", 2);
- memory_device_cat(&(pe->device), pe->linefeed);
- pe->linehead = pe->device.pos;
- memory_device_output(' ', &(pe->device));
- memory_device_ncat(&(pe->device), pe->encname, pe->encnamelen);
- }
- (*pe->tomb_filter->vptr->filter_function)(pe->tomb_filter, pe->tmpdev.buffer[p++]);
- pe->prevpos = pe->device.pos;
- mbfl_output_filter_copy(pe->tomb_filter, pe->tomb_tmp_filter);
- mbfl_output_filter_copy(pe->enc_filter, pe->enc_tmp_filter);
- }
- pe->tmpdev.pos = 0;
- pe->status = 1;
-
- c = (*pe->tomb_filter->vptr->filter_function)(pe->tomb_filter, c);
- pe->prevpos = pe->device.pos;
- mbfl_output_filter_copy(pe->tomb_filter, pe->tomb_tmp_filter);
- mbfl_output_filter_copy(pe->enc_filter, pe->enc_tmp_filter);
- }
- break;
- }
- }
-
- return c;
-}
-
-struct mime_header_encoder_data*
-mime_header_encoder_new(
- enum mbfl_no_encoding incode,
- enum mbfl_no_encoding outcode,
- enum mbfl_no_encoding encoding)
-{
- int n;
- const char *s;
- mbfl_encoding_ptr poutenc;
- struct mime_header_encoder_data *pe;
-
- /* get output encoding and check MIME charset name */
- poutenc = mbfl_no2encoding(outcode);
- if (poutenc == NULL || poutenc->mime_name == NULL || *poutenc->mime_name == '\0')
- return NULL;
-
- pe = (struct mime_header_encoder_data*)malloc(sizeof(struct mime_header_encoder_data));
- if (pe == NULL)
- return NULL;
-
- pe->device.buffer = (char*)0;
- pe->device.length = 0;
- pe->device.pos = 0;
- pe->tmpdev.buffer = (char*)0;
- pe->tmpdev.length = 0;
- pe->tmpdev.pos = 0;
- pe->prevpos = 0;
- pe->linehead = 0;
-
- /* make encoding description string ie."=?ISO-2022-JP?B?" */
- n = 0;
- pe->encname[n++] = '=';
- pe->encname[n++] = '?';
- s = poutenc->mime_name;
- while(*s)
- pe->encname[n++] = *s++;
- pe->encname[n++] = '?';
- if(encoding == mbfl_no_encoding_qprint) {
- pe->status = 10;
- pe->encname[n++] = 'Q';
- } else {
- pe->status = 0;
- pe->encname[n++] = 'B';
- encoding = mbfl_no_encoding_base64;
- }
- pe->encname[n++] = '?';
- pe->encname[n] = '\0';
- pe->encnamelen = n;
-
- pe->linefeed[0] = '\r';
- pe->linefeed[1] = '\n';
- pe->linefeed[2] = '\0';
-
- /* encode filter */
- pe->enc_filter = mbfl_output_filter_new(outcode, encoding, memory_device_output, 0, &(pe->device));
- pe->enc_tmp_filter = mbfl_output_filter_new(outcode, encoding, memory_device_output, 0, &(pe->device));
-
- /* UCS to Output code filter */
- pe->tomb_filter = mbfl_output_filter_new(mbfl_no_encoding_ucs, outcode, filter_pipe_output, 0, pe->enc_filter);
- pe->tomb_tmp_filter = mbfl_output_filter_new(mbfl_no_encoding_ucs, outcode, filter_pipe_output, 0, pe->enc_filter);
-
- /* Input code to UCS filter */
- pe->toucs_filter = mbfl_output_filter_new(incode, mbfl_no_encoding_ucs, mime_header_encoder_collector, 0, pe);
-
- if (pe->enc_filter == NULL ||
- pe->enc_tmp_filter == NULL ||
- pe->tomb_filter == NULL ||
- pe->tomb_tmp_filter == NULL ||
- pe->toucs_filter == NULL) {
- mime_header_encoder_delete(pe);
- return NULL;
- }
-
- return pe;
-}
-
-void
-mime_header_encoder_delete(struct mime_header_encoder_data *pe)
-{
- if (pe->toucs_filter)
- mbfl_output_filter_delete(pe->toucs_filter);
- if (pe->tomb_filter)
- mbfl_output_filter_delete(pe->tomb_filter);
- if (pe->tomb_tmp_filter)
- mbfl_output_filter_delete(pe->tomb_tmp_filter);
- if (pe->enc_filter)
- mbfl_output_filter_delete(pe->enc_filter);
- if (pe->enc_tmp_filter)
- mbfl_output_filter_delete(pe->enc_tmp_filter);
- if (pe->device.buffer)
- free((void*)pe->device.buffer);
- if (pe->tmpdev.buffer)
- free((void*)pe->tmpdev.buffer);
- free((void*)pe);
-}
-
-int
-mime_header_encoder_feed(int c, struct mime_header_encoder_data *pe)
-{
- return (*pe->toucs_filter->vptr->filter_function)(pe->toucs_filter, c);
-}
-
-char*
-mime_header_encoder_result(struct mime_header_encoder_data *pe)
-{
- char* result;
- int n,p;
-
- switch(pe->status) {
- case 2: /* nonASCII for BASE64 encoding mode w/LWSP sequence */
- case 1: /* nonASCII for BASE64 encoding mode */
- p = 0;
- while (p < pe->tmpdev.pos) {
- (*pe->tomb_filter->vptr->filter_function)(pe->tomb_filter, pe->tmpdev.buffer[p]);
- (*pe->tomb_filter->vptr->flush_function)(pe->tomb_filter);
- (*pe->enc_filter->vptr->flush_function)(pe->enc_filter);
- n = pe->device.pos - pe->linehead;
- pe->device.pos = pe->prevpos;
- mbfl_output_filter_copy(pe->tomb_tmp_filter, pe->tomb_filter);
- mbfl_output_filter_copy(pe->enc_tmp_filter, pe->enc_filter);
-
- if(n >= 73) {
- (*pe->tomb_filter->vptr->flush_function)(pe->tomb_filter);
- (*pe->enc_filter->vptr->flush_function)(pe->enc_filter);
- memory_device_ncat(&(pe->device), "?=", 2);
- memory_device_cat(&(pe->device), pe->linefeed);
- pe->linehead = pe->device.pos;
- memory_device_output(' ', &(pe->device));
- memory_device_ncat(&(pe->device), pe->encname, pe->encnamelen);
- }
- (*pe->tomb_filter->vptr->filter_function)(pe->tomb_filter, pe->tmpdev.buffer[p++]);
- pe->prevpos = pe->device.pos;
- mbfl_output_filter_copy(pe->tomb_filter, pe->tomb_tmp_filter);
- mbfl_output_filter_copy(pe->enc_filter, pe->enc_tmp_filter);
- }
-
- (*pe->tomb_filter->vptr->flush_function)(pe->tomb_filter);
- (*pe->enc_filter->vptr->flush_function)(pe->enc_filter);
- memory_device_output('?', &(pe->device));
- memory_device_output('=', &(pe->device));
- break;
-
- case 3: /* nonASCII for BASE64 encoding mode w/LWSP+ASCII sequence */
- (*pe->tomb_filter->vptr->flush_function)(pe->tomb_filter);
- (*pe->enc_filter->vptr->flush_function)(pe->enc_filter);
- memory_device_ncat(&(pe->device), "?=", 2);
- default: /* ASCII for BASE64 encoding mode */
- if (pe->device.pos + pe->tmpdev.pos - pe->linehead >= 73) {
- if(pe->device.buffer[pe->device.pos-1] == '\t'
- || pe->device.buffer[pe->device.pos-1] == ' ') {
- pe->device.pos--;
- }
- memory_device_cat(&(pe->device), pe->linefeed);
- pe->linehead = pe->device.pos;
- memory_device_output(' ', &(pe->device));
- }
- p = 0;
- while (p < pe->tmpdev.pos) {
- if (pe->device.pos - pe->linehead >= 74) {
- memory_device_cat(&(pe->device), pe->linefeed);
- pe->linehead = pe->device.pos;
- memory_device_output(' ', &(pe->device));
- }
- memory_device_output(pe->tmpdev.buffer[p++], &(pe->device));
- }
- break;
- }
-
- pe->tmpdev.pos = 0;
- pe->status = 0;
-
- memory_device_output('\0', &(pe->device));
- result = pe->device.buffer;
- pe->device.buffer = (char*)0;
- pe->device.length = 0;
- pe->device.pos = 0;
-
- return result; /* free()は呼び出し側の責任 */
-}
-
-char*
-mbfl_mime_header_encode(
- enum mbfl_no_encoding incode,
- enum mbfl_no_encoding outcode,
- enum mbfl_no_encoding encoding,
- const char *s,
- const char *linefeed)
-{
- int n;
- char *p;
- struct mime_header_encoder_data *pe = mime_header_encoder_new(incode, outcode, encoding);
- if (pe == NULL)
- return NULL;
-
- if (linefeed != NULL) {
- p = pe->linefeed; /* buffer pointer */
- n = 8; /* buffer length */
- while(*linefeed && --n > 0)
- *p++ = *linefeed++;
- *p = '\0';
- }
-
- /* 流す */
- while (*s)
- (void)(*pe->toucs_filter->vptr->filter_function)(pe->toucs_filter, *s++ & 0xff);
-
- p = mime_header_encoder_result(pe);
- mime_header_encoder_delete(pe);
-
- /* 終わり */
- return p; /* free()は呼び出し側の責任 */
-}
-
-
-/*
- * MIME header decode
- */
-struct mime_header_decoder_data {
- struct mbfl_output_filter *deco_filter;
- struct mbfl_output_filter *conv_filter;
- struct memory_device outdev;
- struct memory_device tmpdev;
- struct memory_device lwspdev;
- int cspos;
- int status;
- int outputstatus;
- enum mbfl_no_encoding encoding;
- enum mbfl_no_encoding incode;
- enum mbfl_no_encoding outcode;
-};
-
-static int
-mime_header_decoder_collector(int c, void* data)
-{
- mbfl_encoding_ptr penc;
- struct mime_header_decoder_data *pd = (struct mime_header_decoder_data*)data;
-
- switch(pd->status) {
- case 1:
- if(c == '?') {
- memory_device_output(c, &(pd->tmpdev));
- pd->cspos = pd->tmpdev.pos;
- pd->status = 2;
- } else {
- if (pd->outputstatus != 1) {
- memory_device_ncat(&(pd->outdev), pd->lwspdev.buffer, pd->lwspdev.pos);
- }
- pd->lwspdev.pos = 0;
- pd->outputstatus = 1;
- memory_device_ncat(&(pd->outdev), pd->tmpdev.buffer, pd->tmpdev.pos);
- pd->tmpdev.pos = 0;
- if (c == '=') {
- memory_device_output(c, &(pd->tmpdev));
- } else if (c == '\r' || c == '\n') {
- pd->status = 8;
- } else {
- memory_device_output(c, &(pd->outdev));
- pd->status = 0;
- }
- }
- break;
- case 2: /* store charset string */
- if (c == '?') { /* identify charset */
- memory_device_output('\0', &(pd->tmpdev));
- penc = mbfl_name2encoding(&(pd->tmpdev.buffer[pd->cspos]));
- if (penc != NULL) {
- pd->incode = penc->no_encoding;
- pd->status = 3;
- }
- pd->tmpdev.pos--;
- memory_device_output(c, &(pd->tmpdev));
- } else {
- memory_device_output(c, &(pd->tmpdev));
- if (pd->tmpdev.pos > 100) { /* too long charset string */
- pd->status = 0;
- } else if (c == '\r' || c == '\n'){
- pd->tmpdev.pos--;
- pd->status = 8;
- }
- if (pd->status != 2) {
- if (pd->outputstatus != 1) {
- memory_device_ncat(&(pd->outdev), pd->lwspdev.buffer, pd->lwspdev.pos);
- }
- pd->lwspdev.pos = 0;
- pd->outputstatus = 1;
- memory_device_ncat(&(pd->outdev), pd->tmpdev.buffer, pd->tmpdev.pos);
- pd->tmpdev.pos = 0;
- }
- }
- break;
- case 3: /* identify encoding */
- memory_device_output(c, &(pd->tmpdev));
- if(c == 'b' || c == 'B') {
- pd->encoding = mbfl_no_encoding_base64;
- pd->status = 4;
- } else if(c == 'q' || c == 'Q') {
- pd->encoding = mbfl_no_encoding_qprint;
- pd->status = 4;
- } else {
- if (c == '\r' || c == '\n'){
- pd->tmpdev.pos--;
- pd->status = 8;
- } else {
- pd->status = 0;
- }
- if (pd->outputstatus != 1) {
- memory_device_ncat(&(pd->outdev), pd->lwspdev.buffer, pd->lwspdev.pos);
- }
- pd->lwspdev.pos = 0;
- pd->outputstatus = 1;
- memory_device_ncat(&(pd->outdev), pd->tmpdev.buffer, pd->tmpdev.pos);
- pd->tmpdev.pos = 0;
- }
- break;
- case 4: /* reset filter */
- memory_device_output(c, &(pd->tmpdev));
- if(c == '?') {
- /* charset convert filter */
- mbfl_output_filter_reset(pd->conv_filter, pd->incode, pd->outcode);
- /* decode filter */
- mbfl_output_filter_reset(pd->deco_filter, pd->encoding, pd->incode);
- pd->status = 5;
- if (pd->outputstatus != 2) {
- memory_device_ncat(&(pd->outdev), pd->lwspdev.buffer, pd->lwspdev.pos);
- }
- pd->lwspdev.pos = 0;
- pd->outputstatus = 2;
- } else {
- if (c == '\r' || c == '\n'){
- pd->tmpdev.pos--;
- pd->status = 8;
- } else {
- pd->status = 0;
- }
- if (pd->outputstatus != 1) {
- memory_device_ncat(&(pd->outdev), pd->lwspdev.buffer, pd->lwspdev.pos);
- }
- pd->lwspdev.pos = 0;
- pd->outputstatus = 1;
- memory_device_ncat(&(pd->outdev), pd->tmpdev.buffer, pd->tmpdev.pos);
- }
- pd->tmpdev.pos = 0;
- break;
- case 5: /* encoded block */
- if(c == '?') {
- pd->status = 6;
- } else {
- (*pd->deco_filter->vptr->filter_function)(pd->deco_filter, c);
- }
- break;
- case 6: /* identify end position */
- if (c == '=') {
- (*pd->deco_filter->vptr->flush_function)(pd->deco_filter);
- (*pd->conv_filter->vptr->flush_function)(pd->conv_filter);
- pd->status = 7;
- } else {
- (*pd->deco_filter->vptr->filter_function)(pd->deco_filter, '?');
- if (c != '?') {
- (*pd->deco_filter->vptr->filter_function)(pd->deco_filter, c);
- pd->status = 5;
- }
- }
- break;
- case 7: /* after encoded block */
- memory_device_output(c, &(pd->tmpdev));
- if (c == '=') {
- pd->status = 1;
- } else if (c == '\r' || c == '\n') {
- pd->tmpdev.pos = 0;
- pd->status = 8;
- } else if (c != ' ' && c != '\t') {
- memory_device_ncat(&(pd->outdev), pd->tmpdev.buffer, pd->tmpdev.pos);
- pd->tmpdev.pos = 0;
- pd->status = 0;
- }
- break;
- case 8: /* folding */
- if (c != '\r' && c != '\n' && c != ' ' && c != ' ') {
- if (c == '=') {
- memory_device_output(c, &(pd->tmpdev));
- pd->status = 1;
- } else {
- memory_device_ncat(&(pd->outdev), pd->lwspdev.buffer, pd->lwspdev.pos);
- pd->outputstatus = 1;
- pd->lwspdev.pos = 0;
- memory_device_output(c, &(pd->outdev));
- pd->status = 0;
- }
- } else if (c == ' ' || c == '\t') {
- memory_device_output(c, &(pd->lwspdev));
- }
- break;
- default: /* non encoded block */
- if (c == '=') {
- memory_device_output(c, &(pd->tmpdev));
- pd->status = 1;
- } else if (c == '\r' || c == '\n') {
- pd->status = 8;
- pd->lwspdev.pos = 0;
- } else {
- memory_device_output(c, &(pd->outdev));
- pd->outputstatus = 1;
- }
- break;
- }
-
- return c;
-}
-
-struct mime_header_decoder_data*
-mime_header_decoder_new(enum mbfl_no_encoding outcode)
-{
- struct mime_header_decoder_data *pd = (struct mime_header_decoder_data*)malloc(sizeof(struct mime_header_decoder_data));
- if (pd == NULL)
- return NULL;
-
- pd->outdev.buffer = (char*)0;
- pd->outdev.length = 0;
- pd->outdev.pos = 0;
- pd->tmpdev.buffer = (char*)0;
- pd->tmpdev.length = 0;
- pd->tmpdev.pos = 0;
- pd->lwspdev.buffer = (char*)0;
- pd->lwspdev.length = 0;
- pd->lwspdev.pos = 0;
- pd->cspos = 0;
- pd->status = 0;
- pd->outputstatus = 0;
- pd->encoding = mbfl_no_encoding_pass;
- pd->incode = mbfl_no_encoding_pass;
- pd->outcode = outcode;
- /* charset convert filter */
- pd->conv_filter = mbfl_output_filter_new(pd->incode, pd->outcode, memory_device_output, 0, &(pd->outdev));
- /* decode filter */
- pd->deco_filter = mbfl_output_filter_new(pd->encoding, pd->incode, filter_pipe_output, 0, pd->conv_filter);
-
- if (pd->conv_filter == NULL ||
- pd->deco_filter == NULL) {
- mime_header_decoder_delete(pd);
- return NULL;
- }
-
- return pd;
-}
-
-void
-mime_header_decoder_delete(struct mime_header_decoder_data *pd)
-{
- if (pd->deco_filter)
- mbfl_output_filter_delete(pd->deco_filter);
- if (pd->conv_filter)
- mbfl_output_filter_delete(pd->conv_filter);
- if (pd->outdev.buffer)
- free((void*)pd->outdev.buffer);
- if (pd->tmpdev.buffer)
- free((void*)pd->tmpdev.buffer);
- if (pd->lwspdev.buffer)
- free((void*)pd->lwspdev.buffer);
- free((void*)pd);
-}
-
-int
-mime_header_decoder_feed(int c, struct mime_header_decoder_data *pd)
-{
- return mime_header_decoder_collector(c, pd);
-}
-
-char*
-mime_header_decoder_result(struct mime_header_decoder_data *pd)
-{
- char* s;
-
- switch (pd->status) {
- case 1:
- case 2:
- case 3:
- case 4:
- memory_device_ncat(&(pd->outdev), pd->tmpdev.buffer, pd->tmpdev.pos);
- break;
- case 5:
- case 6:
- (*pd->deco_filter->vptr->flush_function)(pd->deco_filter);
- (*pd->conv_filter->vptr->flush_function)(pd->conv_filter);
- break;
- }
- pd->status = 0;
- pd->tmpdev.pos = 0;
- pd->lwspdev.pos = 0;
-
- memory_device_output('\0', &(pd->outdev));
- s = pd->outdev.buffer;
- pd->outdev.buffer = (char*)0;
- pd->outdev.length = 0;
- pd->outdev.pos = 0;
-
- return s; /* free()は呼び出し側の責任 */
-}
-
-char*
-mbfl_mime_header_decode(
- enum mbfl_no_encoding outcode,
- const char *s)
-{
- char *p;
- struct mime_header_decoder_data *pd = mime_header_decoder_new(outcode);
- if (pd == NULL)
- return NULL;
-
- /* 流す */
- while (*s)
- (void)mime_header_decoder_collector(*s++ & 0xff, pd);
-
- p = mime_header_decoder_result(pd);
- mime_header_decoder_delete(pd);
-
- /* 終わり */
- return p; /* free()は呼び出し側の責任 */
-}
-
-
-
-
-
-
-/*
- * Unicode table
- */
-static const unsigned short j2utable[] = {
- 0x3000,0x3001,0x3002,0xFF0C,0xFF0E,0x30FB,0xFF1A,0xFF1B,0xFF1F,0xFF01,
- 0x309B,0x309C,0x00B4,0xFF40,0x00A8,0xFF3E,0xFFE3,0xFF3F,0x30FD,0x30FE,
- 0x309D,0x309E,0x3003,0x4EDD,0x3005,0x3006,0x3007,0x30FC,0x2015,0x2010,
- 0xFF0F,0xFF3C,0xFF5E,0x2225,0xFF5C,0x2026,0x2025,0x2018,0x2019,0x201C,
- 0x201D,0xFF08,0xFF09,0x3014,0x3015,0xFF3B,0xFF3D,0xFF5B,0xFF5D,0x3008,
- 0x3009,0x300A,0x300B,0x300C,0x300D,0x300E,0x300F,0x3010,0x3011,0xFF0B,
- 0xFF0D,0x00B1,0x00D7,0x00F7,0xFF1D,0x2260,0xFF1C,0xFF1E,0x2266,0x2267,
- 0x221E,0x2234,0x2642,0x2640,0x00B0,0x2032,0x2033,0x2103,0xFFE5,0xFF04,
- 0xFFE0,0xFFE1,0xFF05,0xFF03,0xFF06,0xFF0A,0xFF20,0x00A7,0x2606,0x2605,
- 0x25CB,0x25CF,0x25CE,0x25C7,0x25C6,0x25A1,0x25A0,0x25B3,0x25B2,0x25BD,
- 0x25BC,0x203B,0x3012,0x2192,0x2190,0x2191,0x2193,0x3013,0x0000,0x0000,
- 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2208,
- 0x220B,0x2286,0x2287,0x2282,0x2283,0x222A,0x2229,0x0000,0x0000,0x0000,
- 0x0000,0x0000,0x0000,0x0000,0x0000,0x2227,0x2228,0xFFE2,0x21D2,0x21D4,
- 0x2200,0x2203,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
- 0x0000,0x0000,0x0000,0x2220,0x22A5,0x2312,0x2202,0x2207,0x2261,0x2252,
- 0x226A,0x226B,0x221A,0x223D,0x221D,0x2235,0x222B,0x222C,0x0000,0x0000,
- 0x0000,0x0000,0x0000,0x0000,0x0000,0x212B,0x2030,0x266F,0x266D,0x266A,
- 0x2020,0x2021,0x00B6,0x0000,0x0000,0x0000,0x0000,0x25EF,0x0000,0x0000,
- 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
- 0x0000,0x0000,0x0000,0xFF10,0xFF11,0xFF12,0xFF13,0xFF14,0xFF15,0xFF16,
- 0xFF17,0xFF18,0xFF19,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
- 0xFF21,0xFF22,0xFF23,0xFF24,0xFF25,0xFF26,0xFF27,0xFF28,0xFF29,0xFF2A,
- 0xFF2B,0xFF2C,0xFF2D,0xFF2E,0xFF2F,0xFF30,0xFF31,0xFF32,0xFF33,0xFF34,
- 0xFF35,0xFF36,0xFF37,0xFF38,0xFF39,0xFF3A,0x0000,0x0000,0x0000,0x0000,
- 0x0000,0x0000,0xFF41,0xFF42,0xFF43,0xFF44,0xFF45,0xFF46,0xFF47,0xFF48,
- 0xFF49,0xFF4A,0xFF4B,0xFF4C,0xFF4D,0xFF4E,0xFF4F,0xFF50,0xFF51,0xFF52,
- 0xFF53,0xFF54,0xFF55,0xFF56,0xFF57,0xFF58,0xFF59,0xFF5A,0x0000,0x0000,
- 0x0000,0x0000,0x3041,0x3042,0x3043,0x3044,0x3045,0x3046,0x3047,0x3048,
- 0x3049,0x304A,0x304B,0x304C,0x304D,0x304E,0x304F,0x3050,0x3051,0x3052,
- 0x3053,0x3054,0x3055,0x3056,0x3057,0x3058,0x3059,0x305A,0x305B,0x305C,
- 0x305D,0x305E,0x305F,0x3060,0x3061,0x3062,0x3063,0x3064,0x3065,0x3066,
- 0x3067,0x3068,0x3069,0x306A,0x306B,0x306C,0x306D,0x306E,0x306F,0x3070,
- 0x3071,0x3072,0x3073,0x3074,0x3075,0x3076,0x3077,0x3078,0x3079,0x307A,
- 0x307B,0x307C,0x307D,0x307E,0x307F,0x3080,0x3081,0x3082,0x3083,0x3084,
- 0x3085,0x3086,0x3087,0x3088,0x3089,0x308A,0x308B,0x308C,0x308D,0x308E,
- 0x308F,0x3090,0x3091,0x3092,0x3093,0x0000,0x0000,0x0000,0x0000,0x0000,
- 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x30A1,0x30A2,0x30A3,0x30A4,
- 0x30A5,0x30A6,0x30A7,0x30A8,0x30A9,0x30AA,0x30AB,0x30AC,0x30AD,0x30AE,
- 0x30AF,0x30B0,0x30B1,0x30B2,0x30B3,0x30B4,0x30B5,0x30B6,0x30B7,0x30B8,
- 0x30B9,0x30BA,0x30BB,0x30BC,0x30BD,0x30BE,0x30BF,0x30C0,0x30C1,0x30C2,
- 0x30C3,0x30C4,0x30C5,0x30C6,0x30C7,0x30C8,0x30C9,0x30CA,0x30CB,0x30CC,
- 0x30CD,0x30CE,0x30CF,0x30D0,0x30D1,0x30D2,0x30D3,0x30D4,0x30D5,0x30D6,
- 0x30D7,0x30D8,0x30D9,0x30DA,0x30DB,0x30DC,0x30DD,0x30DE,0x30DF,0x30E0,
- 0x30E1,0x30E2,0x30E3,0x30E4,0x30E5,0x30E6,0x30E7,0x30E8,0x30E9,0x30EA,
- 0x30EB,0x30EC,0x30ED,0x30EE,0x30EF,0x30F0,0x30F1,0x30F2,0x30F3,0x30F4,
- 0x30F5,0x30F6,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
- 0x0391,0x0392,0x0393,0x0394,0x0395,0x0396,0x0397,0x0398,0x0399,0x039A,
- 0x039B,0x039C,0x039D,0x039E,0x039F,0x03A0,0x03A1,0x03A3,0x03A4,0x03A5,
- 0x03A6,0x03A7,0x03A8,0x03A9,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
- 0x0000,0x0000,0x03B1,0x03B2,0x03B3,0x03B4,0x03B5,0x03B6,0x03B7,0x03B8,
- 0x03B9,0x03BA,0x03BB,0x03BC,0x03BD,0x03BE,0x03BF,0x03C0,0x03C1,0x03C3,
- 0x03C4,0x03C5,0x03C6,0x03C7,0x03C8,0x03C9,0x0000,0x0000,0x0000,0x0000,
- 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
- 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
- 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
- 0x0000,0x0000,0x0000,0x0000,0x0410,0x0411,0x0412,0x0413,0x0414,0x0415,
- 0x0401,0x0416,0x0417,0x0418,0x0419,0x041A,0x041B,0x041C,0x041D,0x041E,
- 0x041F,0x0420,0x0421,0x0422,0x0423,0x0424,0x0425,0x0426,0x0427,0x0428,
- 0x0429,0x042A,0x042B,0x042C,0x042D,0x042E,0x042F,0x0000,0x0000,0x0000,
- 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
- 0x0000,0x0000,0x0430,0x0431,0x0432,0x0433,0x0434,0x0435,0x0451,0x0436,
- 0x0437,0x0438,0x0439,0x043A,0x043B,0x043C,0x043D,0x043E,0x043F,0x0440,
- 0x0441,0x0442,0x0443,0x0444,0x0445,0x0446,0x0447,0x0448,0x0449,0x044A,
- 0x044B,0x044C,0x044D,0x044E,0x044F,0x0000,0x0000,0x0000,0x0000,0x0000,
- 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2500,0x2502,
- 0x250C,0x2510,0x2518,0x2514,0x251C,0x252C,0x2524,0x2534,0x253C,0x2501,
- 0x2503,0x250F,0x2513,0x251B,0x2517,0x2523,0x2533,0x252B,0x253B,0x254B,
- 0x2520,0x252F,0x2528,0x2537,0x253F,0x251D,0x2530,0x2525,0x2538,0x2542,
- 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
- 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
- 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
- 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
- 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
- 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
- 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
- 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
- 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
- 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
- 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
- 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
- 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
- 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
- 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
- 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
- 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
- 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
- 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
- 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
- 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
- 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
- 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
- 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
- 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
- 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
- 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
- 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
- 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
- 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
- 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
- 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
- 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
- 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
- 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
- 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
- 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
- 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
- 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
- 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
- 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
- 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
- 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
- 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2460,0x2461,
- 0x2462,0x2463,0x2464,0x2465,0x2466,0x2467,0x2468,0x2469,0x246A,0x246B,
- 0x246C,0x246D,0x246E,0x246F,0x2470,0x2471,0x2472,0x2473,0x2160,0x2161,
- 0x2162,0x2163,0x2164,0x2165,0x2166,0x2167,0x2168,0x2169,0x0000,0x3349,
- 0x3314,0x3322,0x334D,0x3318,0x3327,0x3303,0x3336,0x3351,0x3357,0x330D,
- 0x3326,0x3323,0x332B,0x334A,0x333B,0x339C,0x339D,0x339E,0x338E,0x338F,
- 0x33C4,0x33A1,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
- 0x337B,0x301D,0x301F,0x2116,0x33CD,0x2121,0x32A4,0x32A5,0x32A6,0x32A7,
- 0x32A8,0x3231,0x3232,0x3239,0x337E,0x337D,0x337C,0x0000,0x0000,0x0000,
- 0x222E,0x2211,0x0000,0x0000,0x0000,0x221F,0x22BF,0x0000,0x0000,0x0000,
- 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
- 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
- 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
- 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
- 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
- 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
- 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
- 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
- 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
- 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
- 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
- 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
- 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
- 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
- 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
- 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
- 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
- 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
- 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
- 0x4E9C,0x5516,0x5A03,0x963F,0x54C0,0x611B,0x6328,0x59F6,0x9022,0x8475,
- 0x831C,0x7A50,0x60AA,0x63E1,0x6E25,0x65ED,0x8466,0x82A6,0x9BF5,0x6893,
- 0x5727,0x65A1,0x6271,0x5B9B,0x59D0,0x867B,0x98F4,0x7D62,0x7DBE,0x9B8E,
- 0x6216,0x7C9F,0x88B7,0x5B89,0x5EB5,0x6309,0x6697,0x6848,0x95C7,0x978D,
- 0x674F,0x4EE5,0x4F0A,0x4F4D,0x4F9D,0x5049,0x56F2,0x5937,0x59D4,0x5A01,
- 0x5C09,0x60DF,0x610F,0x6170,0x6613,0x6905,0x70BA,0x754F,0x7570,0x79FB,
- 0x7DAD,0x7DEF,0x80C3,0x840E,0x8863,0x8B02,0x9055,0x907A,0x533B,0x4E95,
- 0x4EA5,0x57DF,0x80B2,0x90C1,0x78EF,0x4E00,0x58F1,0x6EA2,0x9038,0x7A32,
- 0x8328,0x828B,0x9C2F,0x5141,0x5370,0x54BD,0x54E1,0x56E0,0x59FB,0x5F15,
- 0x98F2,0x6DEB,0x80E4,0x852D,0x9662,0x9670,0x96A0,0x97FB,0x540B,0x53F3,
- 0x5B87,0x70CF,0x7FBD,0x8FC2,0x96E8,0x536F,0x9D5C,0x7ABA,0x4E11,0x7893,
- 0x81FC,0x6E26,0x5618,0x5504,0x6B1D,0x851A,0x9C3B,0x59E5,0x53A9,0x6D66,
- 0x74DC,0x958F,0x5642,0x4E91,0x904B,0x96F2,0x834F,0x990C,0x53E1,0x55B6,
- 0x5B30,0x5F71,0x6620,0x66F3,0x6804,0x6C38,0x6CF3,0x6D29,0x745B,0x76C8,
- 0x7A4E,0x9834,0x82F1,0x885B,0x8A60,0x92ED,0x6DB2,0x75AB,0x76CA,0x99C5,
- 0x60A6,0x8B01,0x8D8A,0x95B2,0x698E,0x53AD,0x5186,0x5712,0x5830,0x5944,
- 0x5BB4,0x5EF6,0x6028,0x63A9,0x63F4,0x6CBF,0x6F14,0x708E,0x7114,0x7159,
- 0x71D5,0x733F,0x7E01,0x8276,0x82D1,0x8597,0x9060,0x925B,0x9D1B,0x5869,
- 0x65BC,0x6C5A,0x7525,0x51F9,0x592E,0x5965,0x5F80,0x5FDC,0x62BC,0x65FA,
- 0x6A2A,0x6B27,0x6BB4,0x738B,0x7FC1,0x8956,0x9D2C,0x9D0E,0x9EC4,0x5CA1,
- 0x6C96,0x837B,0x5104,0x5C4B,0x61B6,0x81C6,0x6876,0x7261,0x4E59,0x4FFA,
- 0x5378,0x6069,0x6E29,0x7A4F,0x97F3,0x4E0B,0x5316,0x4EEE,0x4F55,0x4F3D,
- 0x4FA1,0x4F73,0x52A0,0x53EF,0x5609,0x590F,0x5AC1,0x5BB6,0x5BE1,0x79D1,
- 0x6687,0x679C,0x67B6,0x6B4C,0x6CB3,0x706B,0x73C2,0x798D,0x79BE,0x7A3C,
- 0x7B87,0x82B1,0x82DB,0x8304,0x8377,0x83EF,0x83D3,0x8766,0x8AB2,0x5629,
- 0x8CA8,0x8FE6,0x904E,0x971E,0x868A,0x4FC4,0x5CE8,0x6211,0x7259,0x753B,
- 0x81E5,0x82BD,0x86FE,0x8CC0,0x96C5,0x9913,0x99D5,0x4ECB,0x4F1A,0x89E3,
- 0x56DE,0x584A,0x58CA,0x5EFB,0x5FEB,0x602A,0x6094,0x6062,0x61D0,0x6212,
- 0x62D0,0x6539,0x9B41,0x6666,0x68B0,0x6D77,0x7070,0x754C,0x7686,0x7D75,
- 0x82A5,0x87F9,0x958B,0x968E,0x8C9D,0x51F1,0x52BE,0x5916,0x54B3,0x5BB3,
- 0x5D16,0x6168,0x6982,0x6DAF,0x788D,0x84CB,0x8857,0x8A72,0x93A7,0x9AB8,
- 0x6D6C,0x99A8,0x86D9,0x57A3,0x67FF,0x86CE,0x920E,0x5283,0x5687,0x5404,
- 0x5ED3,0x62E1,0x64B9,0x683C,0x6838,0x6BBB,0x7372,0x78BA,0x7A6B,0x899A,
- 0x89D2,0x8D6B,0x8F03,0x90ED,0x95A3,0x9694,0x9769,0x5B66,0x5CB3,0x697D,
- 0x984D,0x984E,0x639B,0x7B20,0x6A2B,0x6A7F,0x68B6,0x9C0D,0x6F5F,0x5272,
- 0x559D,0x6070,0x62EC,0x6D3B,0x6E07,0x6ED1,0x845B,0x8910,0x8F44,0x4E14,
- 0x9C39,0x53F6,0x691B,0x6A3A,0x9784,0x682A,0x515C,0x7AC3,0x84B2,0x91DC,
- 0x938C,0x565B,0x9D28,0x6822,0x8305,0x8431,0x7CA5,0x5208,0x82C5,0x74E6,
- 0x4E7E,0x4F83,0x51A0,0x5BD2,0x520A,0x52D8,0x52E7,0x5DFB,0x559A,0x582A,
- 0x59E6,0x5B8C,0x5B98,0x5BDB,0x5E72,0x5E79,0x60A3,0x611F,0x6163,0x61BE,
- 0x63DB,0x6562,0x67D1,0x6853,0x68FA,0x6B3E,0x6B53,0x6C57,0x6F22,0x6F97,
- 0x6F45,0x74B0,0x7518,0x76E3,0x770B,0x7AFF,0x7BA1,0x7C21,0x7DE9,0x7F36,
- 0x7FF0,0x809D,0x8266,0x839E,0x89B3,0x8ACC,0x8CAB,0x9084,0x9451,0x9593,
- 0x9591,0x95A2,0x9665,0x97D3,0x9928,0x8218,0x4E38,0x542B,0x5CB8,0x5DCC,
- 0x73A9,0x764C,0x773C,0x5CA9,0x7FEB,0x8D0B,0x96C1,0x9811,0x9854,0x9858,
- 0x4F01,0x4F0E,0x5371,0x559C,0x5668,0x57FA,0x5947,0x5B09,0x5BC4,0x5C90,
- 0x5E0C,0x5E7E,0x5FCC,0x63EE,0x673A,0x65D7,0x65E2,0x671F,0x68CB,0x68C4,
- 0x6A5F,0x5E30,0x6BC5,0x6C17,0x6C7D,0x757F,0x7948,0x5B63,0x7A00,0x7D00,
- 0x5FBD,0x898F,0x8A18,0x8CB4,0x8D77,0x8ECC,0x8F1D,0x98E2,0x9A0E,0x9B3C,
- 0x4E80,0x507D,0x5100,0x5993,0x5B9C,0x622F,0x6280,0x64EC,0x6B3A,0x72A0,
- 0x7591,0x7947,0x7FA9,0x87FB,0x8ABC,0x8B70,0x63AC,0x83CA,0x97A0,0x5409,
- 0x5403,0x55AB,0x6854,0x6A58,0x8A70,0x7827,0x6775,0x9ECD,0x5374,0x5BA2,
- 0x811A,0x8650,0x9006,0x4E18,0x4E45,0x4EC7,0x4F11,0x53CA,0x5438,0x5BAE,
- 0x5F13,0x6025,0x6551,0x673D,0x6C42,0x6C72,0x6CE3,0x7078,0x7403,0x7A76,
- 0x7AAE,0x7B08,0x7D1A,0x7CFE,0x7D66,0x65E7,0x725B,0x53BB,0x5C45,0x5DE8,
- 0x62D2,0x62E0,0x6319,0x6E20,0x865A,0x8A31,0x8DDD,0x92F8,0x6F01,0x79A6,
- 0x9B5A,0x4EA8,0x4EAB,0x4EAC,0x4F9B,0x4FA0,0x50D1,0x5147,0x7AF6,0x5171,
- 0x51F6,0x5354,0x5321,0x537F,0x53EB,0x55AC,0x5883,0x5CE1,0x5F37,0x5F4A,
- 0x602F,0x6050,0x606D,0x631F,0x6559,0x6A4B,0x6CC1,0x72C2,0x72ED,0x77EF,
- 0x80F8,0x8105,0x8208,0x854E,0x90F7,0x93E1,0x97FF,0x9957,0x9A5A,0x4EF0,
- 0x51DD,0x5C2D,0x6681,0x696D,0x5C40,0x66F2,0x6975,0x7389,0x6850,0x7C81,
- 0x50C5,0x52E4,0x5747,0x5DFE,0x9326,0x65A4,0x6B23,0x6B3D,0x7434,0x7981,
- 0x79BD,0x7B4B,0x7DCA,0x82B9,0x83CC,0x887F,0x895F,0x8B39,0x8FD1,0x91D1,
- 0x541F,0x9280,0x4E5D,0x5036,0x53E5,0x533A,0x72D7,0x7396,0x77E9,0x82E6,
- 0x8EAF,0x99C6,0x99C8,0x99D2,0x5177,0x611A,0x865E,0x55B0,0x7A7A,0x5076,
- 0x5BD3,0x9047,0x9685,0x4E32,0x6ADB,0x91E7,0x5C51,0x5C48,0x6398,0x7A9F,
- 0x6C93,0x9774,0x8F61,0x7AAA,0x718A,0x9688,0x7C82,0x6817,0x7E70,0x6851,
- 0x936C,0x52F2,0x541B,0x85AB,0x8A13,0x7FA4,0x8ECD,0x90E1,0x5366,0x8888,
- 0x7941,0x4FC2,0x50BE,0x5211,0x5144,0x5553,0x572D,0x73EA,0x578B,0x5951,
- 0x5F62,0x5F84,0x6075,0x6176,0x6167,0x61A9,0x63B2,0x643A,0x656C,0x666F,
- 0x6842,0x6E13,0x7566,0x7A3D,0x7CFB,0x7D4C,0x7D99,0x7E4B,0x7F6B,0x830E,
- 0x834A,0x86CD,0x8A08,0x8A63,0x8B66,0x8EFD,0x981A,0x9D8F,0x82B8,0x8FCE,
- 0x9BE8,0x5287,0x621F,0x6483,0x6FC0,0x9699,0x6841,0x5091,0x6B20,0x6C7A,
- 0x6F54,0x7A74,0x7D50,0x8840,0x8A23,0x6708,0x4EF6,0x5039,0x5026,0x5065,
- 0x517C,0x5238,0x5263,0x55A7,0x570F,0x5805,0x5ACC,0x5EFA,0x61B2,0x61F8,
- 0x62F3,0x6372,0x691C,0x6A29,0x727D,0x72AC,0x732E,0x7814,0x786F,0x7D79,
- 0x770C,0x80A9,0x898B,0x8B19,0x8CE2,0x8ED2,0x9063,0x9375,0x967A,0x9855,
- 0x9A13,0x9E78,0x5143,0x539F,0x53B3,0x5E7B,0x5F26,0x6E1B,0x6E90,0x7384,
- 0x73FE,0x7D43,0x8237,0x8A00,0x8AFA,0x9650,0x4E4E,0x500B,0x53E4,0x547C,
- 0x56FA,0x59D1,0x5B64,0x5DF1,0x5EAB,0x5F27,0x6238,0x6545,0x67AF,0x6E56,
- 0x72D0,0x7CCA,0x88B4,0x80A1,0x80E1,0x83F0,0x864E,0x8A87,0x8DE8,0x9237,
- 0x96C7,0x9867,0x9F13,0x4E94,0x4E92,0x4F0D,0x5348,0x5449,0x543E,0x5A2F,
- 0x5F8C,0x5FA1,0x609F,0x68A7,0x6A8E,0x745A,0x7881,0x8A9E,0x8AA4,0x8B77,
- 0x9190,0x4E5E,0x9BC9,0x4EA4,0x4F7C,0x4FAF,0x5019,0x5016,0x5149,0x516C,
- 0x529F,0x52B9,0x52FE,0x539A,0x53E3,0x5411,0x540E,0x5589,0x5751,0x57A2,
- 0x597D,0x5B54,0x5B5D,0x5B8F,0x5DE5,0x5DE7,0x5DF7,0x5E78,0x5E83,0x5E9A,
- 0x5EB7,0x5F18,0x6052,0x614C,0x6297,0x62D8,0x63A7,0x653B,0x6602,0x6643,
- 0x66F4,0x676D,0x6821,0x6897,0x69CB,0x6C5F,0x6D2A,0x6D69,0x6E2F,0x6E9D,
- 0x7532,0x7687,0x786C,0x7A3F,0x7CE0,0x7D05,0x7D18,0x7D5E,0x7DB1,0x8015,
- 0x8003,0x80AF,0x80B1,0x8154,0x818F,0x822A,0x8352,0x884C,0x8861,0x8B1B,
- 0x8CA2,0x8CFC,0x90CA,0x9175,0x9271,0x783F,0x92FC,0x95A4,0x964D,0x9805,
- 0x9999,0x9AD8,0x9D3B,0x525B,0x52AB,0x53F7,0x5408,0x58D5,0x62F7,0x6FE0,
- 0x8C6A,0x8F5F,0x9EB9,0x514B,0x523B,0x544A,0x56FD,0x7A40,0x9177,0x9D60,
- 0x9ED2,0x7344,0x6F09,0x8170,0x7511,0x5FFD,0x60DA,0x9AA8,0x72DB,0x8FBC,
- 0x6B64,0x9803,0x4ECA,0x56F0,0x5764,0x58BE,0x5A5A,0x6068,0x61C7,0x660F,
- 0x6606,0x6839,0x68B1,0x6DF7,0x75D5,0x7D3A,0x826E,0x9B42,0x4E9B,0x4F50,
- 0x53C9,0x5506,0x5D6F,0x5DE6,0x5DEE,0x67FB,0x6C99,0x7473,0x7802,0x8A50,
- 0x9396,0x88DF,0x5750,0x5EA7,0x632B,0x50B5,0x50AC,0x518D,0x6700,0x54C9,
- 0x585E,0x59BB,0x5BB0,0x5F69,0x624D,0x63A1,0x683D,0x6B73,0x6E08,0x707D,
- 0x91C7,0x7280,0x7815,0x7826,0x796D,0x658E,0x7D30,0x83DC,0x88C1,0x8F09,
- 0x969B,0x5264,0x5728,0x6750,0x7F6A,0x8CA1,0x51B4,0x5742,0x962A,0x583A,
- 0x698A,0x80B4,0x54B2,0x5D0E,0x57FC,0x7895,0x9DFA,0x4F5C,0x524A,0x548B,
- 0x643E,0x6628,0x6714,0x67F5,0x7A84,0x7B56,0x7D22,0x932F,0x685C,0x9BAD,
- 0x7B39,0x5319,0x518A,0x5237,0x5BDF,0x62F6,0x64AE,0x64E6,0x672D,0x6BBA,
- 0x85A9,0x96D1,0x7690,0x9BD6,0x634C,0x9306,0x9BAB,0x76BF,0x6652,0x4E09,
- 0x5098,0x53C2,0x5C71,0x60E8,0x6492,0x6563,0x685F,0x71E6,0x73CA,0x7523,
- 0x7B97,0x7E82,0x8695,0x8B83,0x8CDB,0x9178,0x9910,0x65AC,0x66AB,0x6B8B,
- 0x4ED5,0x4ED4,0x4F3A,0x4F7F,0x523A,0x53F8,0x53F2,0x55E3,0x56DB,0x58EB,
- 0x59CB,0x59C9,0x59FF,0x5B50,0x5C4D,0x5E02,0x5E2B,0x5FD7,0x601D,0x6307,
- 0x652F,0x5B5C,0x65AF,0x65BD,0x65E8,0x679D,0x6B62,0x6B7B,0x6C0F,0x7345,
- 0x7949,0x79C1,0x7CF8,0x7D19,0x7D2B,0x80A2,0x8102,0x81F3,0x8996,0x8A5E,
- 0x8A69,0x8A66,0x8A8C,0x8AEE,0x8CC7,0x8CDC,0x96CC,0x98FC,0x6B6F,0x4E8B,
- 0x4F3C,0x4F8D,0x5150,0x5B57,0x5BFA,0x6148,0x6301,0x6642,0x6B21,0x6ECB,
- 0x6CBB,0x723E,0x74BD,0x75D4,0x78C1,0x793A,0x800C,0x8033,0x81EA,0x8494,
- 0x8F9E,0x6C50,0x9E7F,0x5F0F,0x8B58,0x9D2B,0x7AFA,0x8EF8,0x5B8D,0x96EB,
- 0x4E03,0x53F1,0x57F7,0x5931,0x5AC9,0x5BA4,0x6089,0x6E7F,0x6F06,0x75BE,
- 0x8CEA,0x5B9F,0x8500,0x7BE0,0x5072,0x67F4,0x829D,0x5C61,0x854A,0x7E1E,
- 0x820E,0x5199,0x5C04,0x6368,0x8D66,0x659C,0x716E,0x793E,0x7D17,0x8005,
- 0x8B1D,0x8ECA,0x906E,0x86C7,0x90AA,0x501F,0x52FA,0x5C3A,0x6753,0x707C,
- 0x7235,0x914C,0x91C8,0x932B,0x82E5,0x5BC2,0x5F31,0x60F9,0x4E3B,0x53D6,
- 0x5B88,0x624B,0x6731,0x6B8A,0x72E9,0x73E0,0x7A2E,0x816B,0x8DA3,0x9152,
- 0x9996,0x5112,0x53D7,0x546A,0x5BFF,0x6388,0x6A39,0x7DAC,0x9700,0x56DA,
- 0x53CE,0x5468,0x5B97,0x5C31,0x5DDE,0x4FEE,0x6101,0x62FE,0x6D32,0x79C0,
- 0x79CB,0x7D42,0x7E4D,0x7FD2,0x81ED,0x821F,0x8490,0x8846,0x8972,0x8B90,
- 0x8E74,0x8F2F,0x9031,0x914B,0x916C,0x96C6,0x919C,0x4EC0,0x4F4F,0x5145,
- 0x5341,0x5F93,0x620E,0x67D4,0x6C41,0x6E0B,0x7363,0x7E26,0x91CD,0x9283,
- 0x53D4,0x5919,0x5BBF,0x6DD1,0x795D,0x7E2E,0x7C9B,0x587E,0x719F,0x51FA,
- 0x8853,0x8FF0,0x4FCA,0x5CFB,0x6625,0x77AC,0x7AE3,0x821C,0x99FF,0x51C6,
- 0x5FAA,0x65EC,0x696F,0x6B89,0x6DF3,0x6E96,0x6F64,0x76FE,0x7D14,0x5DE1,
- 0x9075,0x9187,0x9806,0x51E6,0x521D,0x6240,0x6691,0x66D9,0x6E1A,0x5EB6,
- 0x7DD2,0x7F72,0x66F8,0x85AF,0x85F7,0x8AF8,0x52A9,0x53D9,0x5973,0x5E8F,
- 0x5F90,0x6055,0x92E4,0x9664,0x50B7,0x511F,0x52DD,0x5320,0x5347,0x53EC,
- 0x54E8,0x5546,0x5531,0x5617,0x5968,0x59BE,0x5A3C,0x5BB5,0x5C06,0x5C0F,
- 0x5C11,0x5C1A,0x5E84,0x5E8A,0x5EE0,0x5F70,0x627F,0x6284,0x62DB,0x638C,
- 0x6377,0x6607,0x660C,0x662D,0x6676,0x677E,0x68A2,0x6A1F,0x6A35,0x6CBC,
- 0x6D88,0x6E09,0x6E58,0x713C,0x7126,0x7167,0x75C7,0x7701,0x785D,0x7901,
- 0x7965,0x79F0,0x7AE0,0x7B11,0x7CA7,0x7D39,0x8096,0x83D6,0x848B,0x8549,
- 0x885D,0x88F3,0x8A1F,0x8A3C,0x8A54,0x8A73,0x8C61,0x8CDE,0x91A4,0x9266,
- 0x937E,0x9418,0x969C,0x9798,0x4E0A,0x4E08,0x4E1E,0x4E57,0x5197,0x5270,
- 0x57CE,0x5834,0x58CC,0x5B22,0x5E38,0x60C5,0x64FE,0x6761,0x6756,0x6D44,
- 0x72B6,0x7573,0x7A63,0x84B8,0x8B72,0x91B8,0x9320,0x5631,0x57F4,0x98FE,
- 0x62ED,0x690D,0x6B96,0x71ED,0x7E54,0x8077,0x8272,0x89E6,0x98DF,0x8755,
- 0x8FB1,0x5C3B,0x4F38,0x4FE1,0x4FB5,0x5507,0x5A20,0x5BDD,0x5BE9,0x5FC3,
- 0x614E,0x632F,0x65B0,0x664B,0x68EE,0x699B,0x6D78,0x6DF1,0x7533,0x75B9,
- 0x771F,0x795E,0x79E6,0x7D33,0x81E3,0x82AF,0x85AA,0x89AA,0x8A3A,0x8EAB,
- 0x8F9B,0x9032,0x91DD,0x9707,0x4EBA,0x4EC1,0x5203,0x5875,0x58EC,0x5C0B,
- 0x751A,0x5C3D,0x814E,0x8A0A,0x8FC5,0x9663,0x976D,0x7B25,0x8ACF,0x9808,
- 0x9162,0x56F3,0x53A8,0x9017,0x5439,0x5782,0x5E25,0x63A8,0x6C34,0x708A,
- 0x7761,0x7C8B,0x7FE0,0x8870,0x9042,0x9154,0x9310,0x9318,0x968F,0x745E,
- 0x9AC4,0x5D07,0x5D69,0x6570,0x67A2,0x8DA8,0x96DB,0x636E,0x6749,0x6919,
- 0x83C5,0x9817,0x96C0,0x88FE,0x6F84,0x647A,0x5BF8,0x4E16,0x702C,0x755D,
- 0x662F,0x51C4,0x5236,0x52E2,0x59D3,0x5F81,0x6027,0x6210,0x653F,0x6574,
- 0x661F,0x6674,0x68F2,0x6816,0x6B63,0x6E05,0x7272,0x751F,0x76DB,0x7CBE,
- 0x8056,0x58F0,0x88FD,0x897F,0x8AA0,0x8A93,0x8ACB,0x901D,0x9192,0x9752,
- 0x9759,0x6589,0x7A0E,0x8106,0x96BB,0x5E2D,0x60DC,0x621A,0x65A5,0x6614,
- 0x6790,0x77F3,0x7A4D,0x7C4D,0x7E3E,0x810A,0x8CAC,0x8D64,0x8DE1,0x8E5F,
- 0x78A9,0x5207,0x62D9,0x63A5,0x6442,0x6298,0x8A2D,0x7A83,0x7BC0,0x8AAC,
- 0x96EA,0x7D76,0x820C,0x8749,0x4ED9,0x5148,0x5343,0x5360,0x5BA3,0x5C02,
- 0x5C16,0x5DDD,0x6226,0x6247,0x64B0,0x6813,0x6834,0x6CC9,0x6D45,0x6D17,
- 0x67D3,0x6F5C,0x714E,0x717D,0x65CB,0x7A7F,0x7BAD,0x7DDA,0x7E4A,0x7FA8,
- 0x817A,0x821B,0x8239,0x85A6,0x8A6E,0x8CCE,0x8DF5,0x9078,0x9077,0x92AD,
- 0x9291,0x9583,0x9BAE,0x524D,0x5584,0x6F38,0x7136,0x5168,0x7985,0x7E55,
- 0x81B3,0x7CCE,0x564C,0x5851,0x5CA8,0x63AA,0x66FE,0x66FD,0x695A,0x72D9,
- 0x758F,0x758E,0x790E,0x7956,0x79DF,0x7C97,0x7D20,0x7D44,0x8607,0x8A34,
- 0x963B,0x9061,0x9F20,0x50E7,0x5275,0x53CC,0x53E2,0x5009,0x55AA,0x58EE,
- 0x594F,0x723D,0x5B8B,0x5C64,0x531D,0x60E3,0x60F3,0x635C,0x6383,0x633F,
- 0x63BB,0x64CD,0x65E9,0x66F9,0x5DE3,0x69CD,0x69FD,0x6F15,0x71E5,0x4E89,
- 0x75E9,0x76F8,0x7A93,0x7CDF,0x7DCF,0x7D9C,0x8061,0x8349,0x8358,0x846C,
- 0x84BC,0x85FB,0x88C5,0x8D70,0x9001,0x906D,0x9397,0x971C,0x9A12,0x50CF,
- 0x5897,0x618E,0x81D3,0x8535,0x8D08,0x9020,0x4FC3,0x5074,0x5247,0x5373,
- 0x606F,0x6349,0x675F,0x6E2C,0x8DB3,0x901F,0x4FD7,0x5C5E,0x8CCA,0x65CF,
- 0x7D9A,0x5352,0x8896,0x5176,0x63C3,0x5B58,0x5B6B,0x5C0A,0x640D,0x6751,
- 0x905C,0x4ED6,0x591A,0x592A,0x6C70,0x8A51,0x553E,0x5815,0x59A5,0x60F0,
- 0x6253,0x67C1,0x8235,0x6955,0x9640,0x99C4,0x9A28,0x4F53,0x5806,0x5BFE,
- 0x8010,0x5CB1,0x5E2F,0x5F85,0x6020,0x614B,0x6234,0x66FF,0x6CF0,0x6EDE,
- 0x80CE,0x817F,0x82D4,0x888B,0x8CB8,0x9000,0x902E,0x968A,0x9EDB,0x9BDB,
- 0x4EE3,0x53F0,0x5927,0x7B2C,0x918D,0x984C,0x9DF9,0x6EDD,0x7027,0x5353,
- 0x5544,0x5B85,0x6258,0x629E,0x62D3,0x6CA2,0x6FEF,0x7422,0x8A17,0x9438,
- 0x6FC1,0x8AFE,0x8338,0x51E7,0x86F8,0x53EA,0x53E9,0x4F46,0x9054,0x8FB0,
- 0x596A,0x8131,0x5DFD,0x7AEA,0x8FBF,0x68DA,0x8C37,0x72F8,0x9C48,0x6A3D,
- 0x8AB0,0x4E39,0x5358,0x5606,0x5766,0x62C5,0x63A2,0x65E6,0x6B4E,0x6DE1,
- 0x6E5B,0x70AD,0x77ED,0x7AEF,0x7BAA,0x7DBB,0x803D,0x80C6,0x86CB,0x8A95,
- 0x935B,0x56E3,0x58C7,0x5F3E,0x65AD,0x6696,0x6A80,0x6BB5,0x7537,0x8AC7,
- 0x5024,0x77E5,0x5730,0x5F1B,0x6065,0x667A,0x6C60,0x75F4,0x7A1A,0x7F6E,
- 0x81F4,0x8718,0x9045,0x99B3,0x7BC9,0x755C,0x7AF9,0x7B51,0x84C4,0x9010,
- 0x79E9,0x7A92,0x8336,0x5AE1,0x7740,0x4E2D,0x4EF2,0x5B99,0x5FE0,0x62BD,
- 0x663C,0x67F1,0x6CE8,0x866B,0x8877,0x8A3B,0x914E,0x92F3,0x99D0,0x6A17,
- 0x7026,0x732A,0x82E7,0x8457,0x8CAF,0x4E01,0x5146,0x51CB,0x558B,0x5BF5,
- 0x5E16,0x5E33,0x5E81,0x5F14,0x5F35,0x5F6B,0x5FB4,0x61F2,0x6311,0x66A2,
- 0x671D,0x6F6E,0x7252,0x753A,0x773A,0x8074,0x8139,0x8178,0x8776,0x8ABF,
- 0x8ADC,0x8D85,0x8DF3,0x929A,0x9577,0x9802,0x9CE5,0x52C5,0x6357,0x76F4,
- 0x6715,0x6C88,0x73CD,0x8CC3,0x93AE,0x9673,0x6D25,0x589C,0x690E,0x69CC,
- 0x8FFD,0x939A,0x75DB,0x901A,0x585A,0x6802,0x63B4,0x69FB,0x4F43,0x6F2C,
- 0x67D8,0x8FBB,0x8526,0x7DB4,0x9354,0x693F,0x6F70,0x576A,0x58F7,0x5B2C,
- 0x7D2C,0x722A,0x540A,0x91E3,0x9DB4,0x4EAD,0x4F4E,0x505C,0x5075,0x5243,
- 0x8C9E,0x5448,0x5824,0x5B9A,0x5E1D,0x5E95,0x5EAD,0x5EF7,0x5F1F,0x608C,
- 0x62B5,0x633A,0x63D0,0x68AF,0x6C40,0x7887,0x798E,0x7A0B,0x7DE0,0x8247,
- 0x8A02,0x8AE6,0x8E44,0x9013,0x90B8,0x912D,0x91D8,0x9F0E,0x6CE5,0x6458,
- 0x64E2,0x6575,0x6EF4,0x7684,0x7B1B,0x9069,0x93D1,0x6EBA,0x54F2,0x5FB9,
- 0x64A4,0x8F4D,0x8FED,0x9244,0x5178,0x586B,0x5929,0x5C55,0x5E97,0x6DFB,
- 0x7E8F,0x751C,0x8CBC,0x8EE2,0x985B,0x70B9,0x4F1D,0x6BBF,0x6FB1,0x7530,
- 0x96FB,0x514E,0x5410,0x5835,0x5857,0x59AC,0x5C60,0x5F92,0x6597,0x675C,
- 0x6E21,0x767B,0x83DF,0x8CED,0x9014,0x90FD,0x934D,0x7825,0x783A,0x52AA,
- 0x5EA6,0x571F,0x5974,0x6012,0x5012,0x515A,0x51AC,0x51CD,0x5200,0x5510,
- 0x5854,0x5858,0x5957,0x5B95,0x5CF6,0x5D8B,0x60BC,0x6295,0x642D,0x6771,
- 0x6843,0x68BC,0x68DF,0x76D7,0x6DD8,0x6E6F,0x6D9B,0x706F,0x71C8,0x5F53,
- 0x75D8,0x7977,0x7B49,0x7B54,0x7B52,0x7CD6,0x7D71,0x5230,0x8463,0x8569,
- 0x85E4,0x8A0E,0x8B04,0x8C46,0x8E0F,0x9003,0x900F,0x9419,0x9676,0x982D,
- 0x9A30,0x95D8,0x50CD,0x52D5,0x540C,0x5802,0x5C0E,0x61A7,0x649E,0x6D1E,
- 0x77B3,0x7AE5,0x80F4,0x8404,0x9053,0x9285,0x5CE0,0x9D07,0x533F,0x5F97,
- 0x5FB3,0x6D9C,0x7279,0x7763,0x79BF,0x7BE4,0x6BD2,0x72EC,0x8AAD,0x6803,
- 0x6A61,0x51F8,0x7A81,0x6934,0x5C4A,0x9CF6,0x82EB,0x5BC5,0x9149,0x701E,
- 0x5678,0x5C6F,0x60C7,0x6566,0x6C8C,0x8C5A,0x9041,0x9813,0x5451,0x66C7,
- 0x920D,0x5948,0x90A3,0x5185,0x4E4D,0x51EA,0x8599,0x8B0E,0x7058,0x637A,
- 0x934B,0x6962,0x99B4,0x7E04,0x7577,0x5357,0x6960,0x8EDF,0x96E3,0x6C5D,
- 0x4E8C,0x5C3C,0x5F10,0x8FE9,0x5302,0x8CD1,0x8089,0x8679,0x5EFF,0x65E5,
- 0x4E73,0x5165,0x5982,0x5C3F,0x97EE,0x4EFB,0x598A,0x5FCD,0x8A8D,0x6FE1,
- 0x79B0,0x7962,0x5BE7,0x8471,0x732B,0x71B1,0x5E74,0x5FF5,0x637B,0x649A,
- 0x71C3,0x7C98,0x4E43,0x5EFC,0x4E4B,0x57DC,0x56A2,0x60A9,0x6FC3,0x7D0D,
- 0x80FD,0x8133,0x81BF,0x8FB2,0x8997,0x86A4,0x5DF4,0x628A,0x64AD,0x8987,
- 0x6777,0x6CE2,0x6D3E,0x7436,0x7834,0x5A46,0x7F75,0x82AD,0x99AC,0x4FF3,
- 0x5EC3,0x62DD,0x6392,0x6557,0x676F,0x76C3,0x724C,0x80CC,0x80BA,0x8F29,
- 0x914D,0x500D,0x57F9,0x5A92,0x6885,0x6973,0x7164,0x72FD,0x8CB7,0x58F2,
- 0x8CE0,0x966A,0x9019,0x877F,0x79E4,0x77E7,0x8429,0x4F2F,0x5265,0x535A,
- 0x62CD,0x67CF,0x6CCA,0x767D,0x7B94,0x7C95,0x8236,0x8584,0x8FEB,0x66DD,
- 0x6F20,0x7206,0x7E1B,0x83AB,0x99C1,0x9EA6,0x51FD,0x7BB1,0x7872,0x7BB8,
- 0x8087,0x7B48,0x6AE8,0x5E61,0x808C,0x7551,0x7560,0x516B,0x9262,0x6E8C,
- 0x767A,0x9197,0x9AEA,0x4F10,0x7F70,0x629C,0x7B4F,0x95A5,0x9CE9,0x567A,
- 0x5859,0x86E4,0x96BC,0x4F34,0x5224,0x534A,0x53CD,0x53DB,0x5E06,0x642C,
- 0x6591,0x677F,0x6C3E,0x6C4E,0x7248,0x72AF,0x73ED,0x7554,0x7E41,0x822C,
- 0x85E9,0x8CA9,0x7BC4,0x91C6,0x7169,0x9812,0x98EF,0x633D,0x6669,0x756A,
- 0x76E4,0x78D0,0x8543,0x86EE,0x532A,0x5351,0x5426,0x5983,0x5E87,0x5F7C,
- 0x60B2,0x6249,0x6279,0x62AB,0x6590,0x6BD4,0x6CCC,0x75B2,0x76AE,0x7891,
- 0x79D8,0x7DCB,0x7F77,0x80A5,0x88AB,0x8AB9,0x8CBB,0x907F,0x975E,0x98DB,
- 0x6A0B,0x7C38,0x5099,0x5C3E,0x5FAE,0x6787,0x6BD8,0x7435,0x7709,0x7F8E,
- 0x9F3B,0x67CA,0x7A17,0x5339,0x758B,0x9AED,0x5F66,0x819D,0x83F1,0x8098,
- 0x5F3C,0x5FC5,0x7562,0x7B46,0x903C,0x6867,0x59EB,0x5A9B,0x7D10,0x767E,
- 0x8B2C,0x4FF5,0x5F6A,0x6A19,0x6C37,0x6F02,0x74E2,0x7968,0x8868,0x8A55,
- 0x8C79,0x5EDF,0x63CF,0x75C5,0x79D2,0x82D7,0x9328,0x92F2,0x849C,0x86ED,
- 0x9C2D,0x54C1,0x5F6C,0x658C,0x6D5C,0x7015,0x8CA7,0x8CD3,0x983B,0x654F,
- 0x74F6,0x4E0D,0x4ED8,0x57E0,0x592B,0x5A66,0x5BCC,0x51A8,0x5E03,0x5E9C,
- 0x6016,0x6276,0x6577,0x65A7,0x666E,0x6D6E,0x7236,0x7B26,0x8150,0x819A,
- 0x8299,0x8B5C,0x8CA0,0x8CE6,0x8D74,0x961C,0x9644,0x4FAE,0x64AB,0x6B66,
- 0x821E,0x8461,0x856A,0x90E8,0x5C01,0x6953,0x98A8,0x847A,0x8557,0x4F0F,
- 0x526F,0x5FA9,0x5E45,0x670D,0x798F,0x8179,0x8907,0x8986,0x6DF5,0x5F17,
- 0x6255,0x6CB8,0x4ECF,0x7269,0x9B92,0x5206,0x543B,0x5674,0x58B3,0x61A4,
- 0x626E,0x711A,0x596E,0x7C89,0x7CDE,0x7D1B,0x96F0,0x6587,0x805E,0x4E19,
- 0x4F75,0x5175,0x5840,0x5E63,0x5E73,0x5F0A,0x67C4,0x4E26,0x853D,0x9589,
- 0x965B,0x7C73,0x9801,0x50FB,0x58C1,0x7656,0x78A7,0x5225,0x77A5,0x8511,
- 0x7B86,0x504F,0x5909,0x7247,0x7BC7,0x7DE8,0x8FBA,0x8FD4,0x904D,0x4FBF,
- 0x52C9,0x5A29,0x5F01,0x97AD,0x4FDD,0x8217,0x92EA,0x5703,0x6355,0x6B69,
- 0x752B,0x88DC,0x8F14,0x7A42,0x52DF,0x5893,0x6155,0x620A,0x66AE,0x6BCD,
- 0x7C3F,0x83E9,0x5023,0x4FF8,0x5305,0x5446,0x5831,0x5949,0x5B9D,0x5CF0,
- 0x5CEF,0x5D29,0x5E96,0x62B1,0x6367,0x653E,0x65B9,0x670B,0x6CD5,0x6CE1,
- 0x70F9,0x7832,0x7E2B,0x80DE,0x82B3,0x840C,0x84EC,0x8702,0x8912,0x8A2A,
- 0x8C4A,0x90A6,0x92D2,0x98FD,0x9CF3,0x9D6C,0x4E4F,0x4EA1,0x508D,0x5256,
- 0x574A,0x59A8,0x5E3D,0x5FD8,0x5FD9,0x623F,0x66B4,0x671B,0x67D0,0x68D2,
- 0x5192,0x7D21,0x80AA,0x81A8,0x8B00,0x8C8C,0x8CBF,0x927E,0x9632,0x5420,
- 0x982C,0x5317,0x50D5,0x535C,0x58A8,0x64B2,0x6734,0x7267,0x7766,0x7A46,
- 0x91E6,0x52C3,0x6CA1,0x6B86,0x5800,0x5E4C,0x5954,0x672C,0x7FFB,0x51E1,
- 0x76C6,0x6469,0x78E8,0x9B54,0x9EBB,0x57CB,0x59B9,0x6627,0x679A,0x6BCE,
- 0x54E9,0x69D9,0x5E55,0x819C,0x6795,0x9BAA,0x67FE,0x9C52,0x685D,0x4EA6,
- 0x4FE3,0x53C8,0x62B9,0x672B,0x6CAB,0x8FC4,0x4FAD,0x7E6D,0x9EBF,0x4E07,
- 0x6162,0x6E80,0x6F2B,0x8513,0x5473,0x672A,0x9B45,0x5DF3,0x7B95,0x5CAC,
- 0x5BC6,0x871C,0x6E4A,0x84D1,0x7A14,0x8108,0x5999,0x7C8D,0x6C11,0x7720,
- 0x52D9,0x5922,0x7121,0x725F,0x77DB,0x9727,0x9D61,0x690B,0x5A7F,0x5A18,
- 0x51A5,0x540D,0x547D,0x660E,0x76DF,0x8FF7,0x9298,0x9CF4,0x59EA,0x725D,
- 0x6EC5,0x514D,0x68C9,0x7DBF,0x7DEC,0x9762,0x9EBA,0x6478,0x6A21,0x8302,
- 0x5984,0x5B5F,0x6BDB,0x731B,0x76F2,0x7DB2,0x8017,0x8499,0x5132,0x6728,
- 0x9ED9,0x76EE,0x6762,0x52FF,0x9905,0x5C24,0x623B,0x7C7E,0x8CB0,0x554F,
- 0x60B6,0x7D0B,0x9580,0x5301,0x4E5F,0x51B6,0x591C,0x723A,0x8036,0x91CE,
- 0x5F25,0x77E2,0x5384,0x5F79,0x7D04,0x85AC,0x8A33,0x8E8D,0x9756,0x67F3,
- 0x85AE,0x9453,0x6109,0x6108,0x6CB9,0x7652,0x8AED,0x8F38,0x552F,0x4F51,
- 0x512A,0x52C7,0x53CB,0x5BA5,0x5E7D,0x60A0,0x6182,0x63D6,0x6709,0x67DA,
- 0x6E67,0x6D8C,0x7336,0x7337,0x7531,0x7950,0x88D5,0x8A98,0x904A,0x9091,
- 0x90F5,0x96C4,0x878D,0x5915,0x4E88,0x4F59,0x4E0E,0x8A89,0x8F3F,0x9810,
- 0x50AD,0x5E7C,0x5996,0x5BB9,0x5EB8,0x63DA,0x63FA,0x64C1,0x66DC,0x694A,
- 0x69D8,0x6D0B,0x6EB6,0x7194,0x7528,0x7AAF,0x7F8A,0x8000,0x8449,0x84C9,
- 0x8981,0x8B21,0x8E0A,0x9065,0x967D,0x990A,0x617E,0x6291,0x6B32,0x6C83,
- 0x6D74,0x7FCC,0x7FFC,0x6DC0,0x7F85,0x87BA,0x88F8,0x6765,0x83B1,0x983C,
- 0x96F7,0x6D1B,0x7D61,0x843D,0x916A,0x4E71,0x5375,0x5D50,0x6B04,0x6FEB,
- 0x85CD,0x862D,0x89A7,0x5229,0x540F,0x5C65,0x674E,0x68A8,0x7406,0x7483,
- 0x75E2,0x88CF,0x88E1,0x91CC,0x96E2,0x9678,0x5F8B,0x7387,0x7ACB,0x844E,
- 0x63A0,0x7565,0x5289,0x6D41,0x6E9C,0x7409,0x7559,0x786B,0x7C92,0x9686,
- 0x7ADC,0x9F8D,0x4FB6,0x616E,0x65C5,0x865C,0x4E86,0x4EAE,0x50DA,0x4E21,
- 0x51CC,0x5BEE,0x6599,0x6881,0x6DBC,0x731F,0x7642,0x77AD,0x7A1C,0x7CE7,
- 0x826F,0x8AD2,0x907C,0x91CF,0x9675,0x9818,0x529B,0x7DD1,0x502B,0x5398,
- 0x6797,0x6DCB,0x71D0,0x7433,0x81E8,0x8F2A,0x96A3,0x9C57,0x9E9F,0x7460,
- 0x5841,0x6D99,0x7D2F,0x985E,0x4EE4,0x4F36,0x4F8B,0x51B7,0x52B1,0x5DBA,
- 0x601C,0x73B2,0x793C,0x82D3,0x9234,0x96B7,0x96F6,0x970A,0x9E97,0x9F62,
- 0x66A6,0x6B74,0x5217,0x52A3,0x70C8,0x88C2,0x5EC9,0x604B,0x6190,0x6F23,
- 0x7149,0x7C3E,0x7DF4,0x806F,0x84EE,0x9023,0x932C,0x5442,0x9B6F,0x6AD3,
- 0x7089,0x8CC2,0x8DEF,0x9732,0x52B4,0x5A41,0x5ECA,0x5F04,0x6717,0x697C,
- 0x6994,0x6D6A,0x6F0F,0x7262,0x72FC,0x7BED,0x8001,0x807E,0x874B,0x90CE,
- 0x516D,0x9E93,0x7984,0x808B,0x9332,0x8AD6,0x502D,0x548C,0x8A71,0x6B6A,
- 0x8CC4,0x8107,0x60D1,0x67A0,0x9DF2,0x4E99,0x4E98,0x9C10,0x8A6B,0x85C1,
- 0x8568,0x6900,0x6E7E,0x7897,0x8155,0x0000,0x0000,0x0000,0x0000,0x0000,
- 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
- 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
- 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
- 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x5F0C,0x4E10,
- 0x4E15,0x4E2A,0x4E31,0x4E36,0x4E3C,0x4E3F,0x4E42,0x4E56,0x4E58,0x4E82,
- 0x4E85,0x8C6B,0x4E8A,0x8212,0x5F0D,0x4E8E,0x4E9E,0x4E9F,0x4EA0,0x4EA2,
- 0x4EB0,0x4EB3,0x4EB6,0x4ECE,0x4ECD,0x4EC4,0x4EC6,0x4EC2,0x4ED7,0x4EDE,
- 0x4EED,0x4EDF,0x4EF7,0x4F09,0x4F5A,0x4F30,0x4F5B,0x4F5D,0x4F57,0x4F47,
- 0x4F76,0x4F88,0x4F8F,0x4F98,0x4F7B,0x4F69,0x4F70,0x4F91,0x4F6F,0x4F86,
- 0x4F96,0x5118,0x4FD4,0x4FDF,0x4FCE,0x4FD8,0x4FDB,0x4FD1,0x4FDA,0x4FD0,
- 0x4FE4,0x4FE5,0x501A,0x5028,0x5014,0x502A,0x5025,0x5005,0x4F1C,0x4FF6,
- 0x5021,0x5029,0x502C,0x4FFE,0x4FEF,0x5011,0x5006,0x5043,0x5047,0x6703,
- 0x5055,0x5050,0x5048,0x505A,0x5056,0x506C,0x5078,0x5080,0x509A,0x5085,
- 0x50B4,0x50B2,0x50C9,0x50CA,0x50B3,0x50C2,0x50D6,0x50DE,0x50E5,0x50ED,
- 0x50E3,0x50EE,0x50F9,0x50F5,0x5109,0x5101,0x5102,0x5116,0x5115,0x5114,
- 0x511A,0x5121,0x513A,0x5137,0x513C,0x513B,0x513F,0x5140,0x5152,0x514C,
- 0x5154,0x5162,0x7AF8,0x5169,0x516A,0x516E,0x5180,0x5182,0x56D8,0x518C,
- 0x5189,0x518F,0x5191,0x5193,0x5195,0x5196,0x51A4,0x51A6,0x51A2,0x51A9,
- 0x51AA,0x51AB,0x51B3,0x51B1,0x51B2,0x51B0,0x51B5,0x51BD,0x51C5,0x51C9,
- 0x51DB,0x51E0,0x8655,0x51E9,0x51ED,0x51F0,0x51F5,0x51FE,0x5204,0x520B,
- 0x5214,0x520E,0x5227,0x522A,0x522E,0x5233,0x5239,0x524F,0x5244,0x524B,
- 0x524C,0x525E,0x5254,0x526A,0x5274,0x5269,0x5273,0x527F,0x527D,0x528D,
- 0x5294,0x5292,0x5271,0x5288,0x5291,0x8FA8,0x8FA7,0x52AC,0x52AD,0x52BC,
- 0x52B5,0x52C1,0x52CD,0x52D7,0x52DE,0x52E3,0x52E6,0x98ED,0x52E0,0x52F3,
- 0x52F5,0x52F8,0x52F9,0x5306,0x5308,0x7538,0x530D,0x5310,0x530F,0x5315,
- 0x531A,0x5323,0x532F,0x5331,0x5333,0x5338,0x5340,0x5346,0x5345,0x4E17,
- 0x5349,0x534D,0x51D6,0x535E,0x5369,0x536E,0x5918,0x537B,0x5377,0x5382,
- 0x5396,0x53A0,0x53A6,0x53A5,0x53AE,0x53B0,0x53B6,0x53C3,0x7C12,0x96D9,
- 0x53DF,0x66FC,0x71EE,0x53EE,0x53E8,0x53ED,0x53FA,0x5401,0x543D,0x5440,
- 0x542C,0x542D,0x543C,0x542E,0x5436,0x5429,0x541D,0x544E,0x548F,0x5475,
- 0x548E,0x545F,0x5471,0x5477,0x5470,0x5492,0x547B,0x5480,0x5476,0x5484,
- 0x5490,0x5486,0x54C7,0x54A2,0x54B8,0x54A5,0x54AC,0x54C4,0x54C8,0x54A8,
- 0x54AB,0x54C2,0x54A4,0x54BE,0x54BC,0x54D8,0x54E5,0x54E6,0x550F,0x5514,
- 0x54FD,0x54EE,0x54ED,0x54FA,0x54E2,0x5539,0x5540,0x5563,0x554C,0x552E,
- 0x555C,0x5545,0x5556,0x5557,0x5538,0x5533,0x555D,0x5599,0x5580,0x54AF,
- 0x558A,0x559F,0x557B,0x557E,0x5598,0x559E,0x55AE,0x557C,0x5583,0x55A9,
- 0x5587,0x55A8,0x55DA,0x55C5,0x55DF,0x55C4,0x55DC,0x55E4,0x55D4,0x5614,
- 0x55F7,0x5616,0x55FE,0x55FD,0x561B,0x55F9,0x564E,0x5650,0x71DF,0x5634,
- 0x5636,0x5632,0x5638,0x566B,0x5664,0x562F,0x566C,0x566A,0x5686,0x5680,
- 0x568A,0x56A0,0x5694,0x568F,0x56A5,0x56AE,0x56B6,0x56B4,0x56C2,0x56BC,
- 0x56C1,0x56C3,0x56C0,0x56C8,0x56CE,0x56D1,0x56D3,0x56D7,0x56EE,0x56F9,
- 0x5700,0x56FF,0x5704,0x5709,0x5708,0x570B,0x570D,0x5713,0x5718,0x5716,
- 0x55C7,0x571C,0x5726,0x5737,0x5738,0x574E,0x573B,0x5740,0x574F,0x5769,
- 0x57C0,0x5788,0x5761,0x577F,0x5789,0x5793,0x57A0,0x57B3,0x57A4,0x57AA,
- 0x57B0,0x57C3,0x57C6,0x57D4,0x57D2,0x57D3,0x580A,0x57D6,0x57E3,0x580B,
- 0x5819,0x581D,0x5872,0x5821,0x5862,0x584B,0x5870,0x6BC0,0x5852,0x583D,
- 0x5879,0x5885,0x58B9,0x589F,0x58AB,0x58BA,0x58DE,0x58BB,0x58B8,0x58AE,
- 0x58C5,0x58D3,0x58D1,0x58D7,0x58D9,0x58D8,0x58E5,0x58DC,0x58E4,0x58DF,
- 0x58EF,0x58FA,0x58F9,0x58FB,0x58FC,0x58FD,0x5902,0x590A,0x5910,0x591B,
- 0x68A6,0x5925,0x592C,0x592D,0x5932,0x5938,0x593E,0x7AD2,0x5955,0x5950,
- 0x594E,0x595A,0x5958,0x5962,0x5960,0x5967,0x596C,0x5969,0x5978,0x5981,
- 0x599D,0x4F5E,0x4FAB,0x59A3,0x59B2,0x59C6,0x59E8,0x59DC,0x598D,0x59D9,
- 0x59DA,0x5A25,0x5A1F,0x5A11,0x5A1C,0x5A09,0x5A1A,0x5A40,0x5A6C,0x5A49,
- 0x5A35,0x5A36,0x5A62,0x5A6A,0x5A9A,0x5ABC,0x5ABE,0x5ACB,0x5AC2,0x5ABD,
- 0x5AE3,0x5AD7,0x5AE6,0x5AE9,0x5AD6,0x5AFA,0x5AFB,0x5B0C,0x5B0B,0x5B16,
- 0x5B32,0x5AD0,0x5B2A,0x5B36,0x5B3E,0x5B43,0x5B45,0x5B40,0x5B51,0x5B55,
- 0x5B5A,0x5B5B,0x5B65,0x5B69,0x5B70,0x5B73,0x5B75,0x5B78,0x6588,0x5B7A,
- 0x5B80,0x5B83,0x5BA6,0x5BB8,0x5BC3,0x5BC7,0x5BC9,0x5BD4,0x5BD0,0x5BE4,
- 0x5BE6,0x5BE2,0x5BDE,0x5BE5,0x5BEB,0x5BF0,0x5BF6,0x5BF3,0x5C05,0x5C07,
- 0x5C08,0x5C0D,0x5C13,0x5C20,0x5C22,0x5C28,0x5C38,0x5C39,0x5C41,0x5C46,
- 0x5C4E,0x5C53,0x5C50,0x5C4F,0x5B71,0x5C6C,0x5C6E,0x4E62,0x5C76,0x5C79,
- 0x5C8C,0x5C91,0x5C94,0x599B,0x5CAB,0x5CBB,0x5CB6,0x5CBC,0x5CB7,0x5CC5,
- 0x5CBE,0x5CC7,0x5CD9,0x5CE9,0x5CFD,0x5CFA,0x5CED,0x5D8C,0x5CEA,0x5D0B,
- 0x5D15,0x5D17,0x5D5C,0x5D1F,0x5D1B,0x5D11,0x5D14,0x5D22,0x5D1A,0x5D19,
- 0x5D18,0x5D4C,0x5D52,0x5D4E,0x5D4B,0x5D6C,0x5D73,0x5D76,0x5D87,0x5D84,
- 0x5D82,0x5DA2,0x5D9D,0x5DAC,0x5DAE,0x5DBD,0x5D90,0x5DB7,0x5DBC,0x5DC9,
- 0x5DCD,0x5DD3,0x5DD2,0x5DD6,0x5DDB,0x5DEB,0x5DF2,0x5DF5,0x5E0B,0x5E1A,
- 0x5E19,0x5E11,0x5E1B,0x5E36,0x5E37,0x5E44,0x5E43,0x5E40,0x5E4E,0x5E57,
- 0x5E54,0x5E5F,0x5E62,0x5E64,0x5E47,0x5E75,0x5E76,0x5E7A,0x9EBC,0x5E7F,
- 0x5EA0,0x5EC1,0x5EC2,0x5EC8,0x5ED0,0x5ECF,0x5ED6,0x5EE3,0x5EDD,0x5EDA,
- 0x5EDB,0x5EE2,0x5EE1,0x5EE8,0x5EE9,0x5EEC,0x5EF1,0x5EF3,0x5EF0,0x5EF4,
- 0x5EF8,0x5EFE,0x5F03,0x5F09,0x5F5D,0x5F5C,0x5F0B,0x5F11,0x5F16,0x5F29,
- 0x5F2D,0x5F38,0x5F41,0x5F48,0x5F4C,0x5F4E,0x5F2F,0x5F51,0x5F56,0x5F57,
- 0x5F59,0x5F61,0x5F6D,0x5F73,0x5F77,0x5F83,0x5F82,0x5F7F,0x5F8A,0x5F88,
- 0x5F91,0x5F87,0x5F9E,0x5F99,0x5F98,0x5FA0,0x5FA8,0x5FAD,0x5FBC,0x5FD6,
- 0x5FFB,0x5FE4,0x5FF8,0x5FF1,0x5FDD,0x60B3,0x5FFF,0x6021,0x6060,0x6019,
- 0x6010,0x6029,0x600E,0x6031,0x601B,0x6015,0x602B,0x6026,0x600F,0x603A,
- 0x605A,0x6041,0x606A,0x6077,0x605F,0x604A,0x6046,0x604D,0x6063,0x6043,
- 0x6064,0x6042,0x606C,0x606B,0x6059,0x6081,0x608D,0x60E7,0x6083,0x609A,
- 0x6084,0x609B,0x6096,0x6097,0x6092,0x60A7,0x608B,0x60E1,0x60B8,0x60E0,
- 0x60D3,0x60B4,0x5FF0,0x60BD,0x60C6,0x60B5,0x60D8,0x614D,0x6115,0x6106,
- 0x60F6,0x60F7,0x6100,0x60F4,0x60FA,0x6103,0x6121,0x60FB,0x60F1,0x610D,
- 0x610E,0x6147,0x613E,0x6128,0x6127,0x614A,0x613F,0x613C,0x612C,0x6134,
- 0x613D,0x6142,0x6144,0x6173,0x6177,0x6158,0x6159,0x615A,0x616B,0x6174,
- 0x616F,0x6165,0x6171,0x615F,0x615D,0x6153,0x6175,0x6199,0x6196,0x6187,
- 0x61AC,0x6194,0x619A,0x618A,0x6191,0x61AB,0x61AE,0x61CC,0x61CA,0x61C9,
- 0x61F7,0x61C8,0x61C3,0x61C6,0x61BA,0x61CB,0x7F79,0x61CD,0x61E6,0x61E3,
- 0x61F6,0x61FA,0x61F4,0x61FF,0x61FD,0x61FC,0x61FE,0x6200,0x6208,0x6209,
- 0x620D,0x620C,0x6214,0x621B,0x621E,0x6221,0x622A,0x622E,0x6230,0x6232,
- 0x6233,0x6241,0x624E,0x625E,0x6263,0x625B,0x6260,0x6268,0x627C,0x6282,
- 0x6289,0x627E,0x6292,0x6293,0x6296,0x62D4,0x6283,0x6294,0x62D7,0x62D1,
- 0x62BB,0x62CF,0x62FF,0x62C6,0x64D4,0x62C8,0x62DC,0x62CC,0x62CA,0x62C2,
- 0x62C7,0x629B,0x62C9,0x630C,0x62EE,0x62F1,0x6327,0x6302,0x6308,0x62EF,
- 0x62F5,0x6350,0x633E,0x634D,0x641C,0x634F,0x6396,0x638E,0x6380,0x63AB,
- 0x6376,0x63A3,0x638F,0x6389,0x639F,0x63B5,0x636B,0x6369,0x63BE,0x63E9,
- 0x63C0,0x63C6,0x63E3,0x63C9,0x63D2,0x63F6,0x63C4,0x6416,0x6434,0x6406,
- 0x6413,0x6426,0x6436,0x651D,0x6417,0x6428,0x640F,0x6467,0x646F,0x6476,
- 0x644E,0x652A,0x6495,0x6493,0x64A5,0x64A9,0x6488,0x64BC,0x64DA,0x64D2,
- 0x64C5,0x64C7,0x64BB,0x64D8,0x64C2,0x64F1,0x64E7,0x8209,0x64E0,0x64E1,
- 0x62AC,0x64E3,0x64EF,0x652C,0x64F6,0x64F4,0x64F2,0x64FA,0x6500,0x64FD,
- 0x6518,0x651C,0x6505,0x6524,0x6523,0x652B,0x6534,0x6535,0x6537,0x6536,
- 0x6538,0x754B,0x6548,0x6556,0x6555,0x654D,0x6558,0x655E,0x655D,0x6572,
- 0x6578,0x6582,0x6583,0x8B8A,0x659B,0x659F,0x65AB,0x65B7,0x65C3,0x65C6,
- 0x65C1,0x65C4,0x65CC,0x65D2,0x65DB,0x65D9,0x65E0,0x65E1,0x65F1,0x6772,
- 0x660A,0x6603,0x65FB,0x6773,0x6635,0x6636,0x6634,0x661C,0x664F,0x6644,
- 0x6649,0x6641,0x665E,0x665D,0x6664,0x6667,0x6668,0x665F,0x6662,0x6670,
- 0x6683,0x6688,0x668E,0x6689,0x6684,0x6698,0x669D,0x66C1,0x66B9,0x66C9,
- 0x66BE,0x66BC,0x66C4,0x66B8,0x66D6,0x66DA,0x66E0,0x663F,0x66E6,0x66E9,
- 0x66F0,0x66F5,0x66F7,0x670F,0x6716,0x671E,0x6726,0x6727,0x9738,0x672E,
- 0x673F,0x6736,0x6741,0x6738,0x6737,0x6746,0x675E,0x6760,0x6759,0x6763,
- 0x6764,0x6789,0x6770,0x67A9,0x677C,0x676A,0x678C,0x678B,0x67A6,0x67A1,
- 0x6785,0x67B7,0x67EF,0x67B4,0x67EC,0x67B3,0x67E9,0x67B8,0x67E4,0x67DE,
- 0x67DD,0x67E2,0x67EE,0x67B9,0x67CE,0x67C6,0x67E7,0x6A9C,0x681E,0x6846,
- 0x6829,0x6840,0x684D,0x6832,0x684E,0x68B3,0x682B,0x6859,0x6863,0x6877,
- 0x687F,0x689F,0x688F,0x68AD,0x6894,0x689D,0x689B,0x6883,0x6AAE,0x68B9,
- 0x6874,0x68B5,0x68A0,0x68BA,0x690F,0x688D,0x687E,0x6901,0x68CA,0x6908,
- 0x68D8,0x6922,0x6926,0x68E1,0x690C,0x68CD,0x68D4,0x68E7,0x68D5,0x6936,
- 0x6912,0x6904,0x68D7,0x68E3,0x6925,0x68F9,0x68E0,0x68EF,0x6928,0x692A,
- 0x691A,0x6923,0x6921,0x68C6,0x6979,0x6977,0x695C,0x6978,0x696B,0x6954,
- 0x697E,0x696E,0x6939,0x6974,0x693D,0x6959,0x6930,0x6961,0x695E,0x695D,
- 0x6981,0x696A,0x69B2,0x69AE,0x69D0,0x69BF,0x69C1,0x69D3,0x69BE,0x69CE,
- 0x5BE8,0x69CA,0x69DD,0x69BB,0x69C3,0x69A7,0x6A2E,0x6991,0x69A0,0x699C,
- 0x6995,0x69B4,0x69DE,0x69E8,0x6A02,0x6A1B,0x69FF,0x6B0A,0x69F9,0x69F2,
- 0x69E7,0x6A05,0x69B1,0x6A1E,0x69ED,0x6A14,0x69EB,0x6A0A,0x6A12,0x6AC1,
- 0x6A23,0x6A13,0x6A44,0x6A0C,0x6A72,0x6A36,0x6A78,0x6A47,0x6A62,0x6A59,
- 0x6A66,0x6A48,0x6A38,0x6A22,0x6A90,0x6A8D,0x6AA0,0x6A84,0x6AA2,0x6AA3,
- 0x6A97,0x8617,0x6ABB,0x6AC3,0x6AC2,0x6AB8,0x6AB3,0x6AAC,0x6ADE,0x6AD1,
- 0x6ADF,0x6AAA,0x6ADA,0x6AEA,0x6AFB,0x6B05,0x8616,0x6AFA,0x6B12,0x6B16,
- 0x9B31,0x6B1F,0x6B38,0x6B37,0x76DC,0x6B39,0x98EE,0x6B47,0x6B43,0x6B49,
- 0x6B50,0x6B59,0x6B54,0x6B5B,0x6B5F,0x6B61,0x6B78,0x6B79,0x6B7F,0x6B80,
- 0x6B84,0x6B83,0x6B8D,0x6B98,0x6B95,0x6B9E,0x6BA4,0x6BAA,0x6BAB,0x6BAF,
- 0x6BB2,0x6BB1,0x6BB3,0x6BB7,0x6BBC,0x6BC6,0x6BCB,0x6BD3,0x6BDF,0x6BEC,
- 0x6BEB,0x6BF3,0x6BEF,0x9EBE,0x6C08,0x6C13,0x6C14,0x6C1B,0x6C24,0x6C23,
- 0x6C5E,0x6C55,0x6C62,0x6C6A,0x6C82,0x6C8D,0x6C9A,0x6C81,0x6C9B,0x6C7E,
- 0x6C68,0x6C73,0x6C92,0x6C90,0x6CC4,0x6CF1,0x6CD3,0x6CBD,0x6CD7,0x6CC5,
- 0x6CDD,0x6CAE,0x6CB1,0x6CBE,0x6CBA,0x6CDB,0x6CEF,0x6CD9,0x6CEA,0x6D1F,
- 0x884D,0x6D36,0x6D2B,0x6D3D,0x6D38,0x6D19,0x6D35,0x6D33,0x6D12,0x6D0C,
- 0x6D63,0x6D93,0x6D64,0x6D5A,0x6D79,0x6D59,0x6D8E,0x6D95,0x6FE4,0x6D85,
- 0x6DF9,0x6E15,0x6E0A,0x6DB5,0x6DC7,0x6DE6,0x6DB8,0x6DC6,0x6DEC,0x6DDE,
- 0x6DCC,0x6DE8,0x6DD2,0x6DC5,0x6DFA,0x6DD9,0x6DE4,0x6DD5,0x6DEA,0x6DEE,
- 0x6E2D,0x6E6E,0x6E2E,0x6E19,0x6E72,0x6E5F,0x6E3E,0x6E23,0x6E6B,0x6E2B,
- 0x6E76,0x6E4D,0x6E1F,0x6E43,0x6E3A,0x6E4E,0x6E24,0x6EFF,0x6E1D,0x6E38,
- 0x6E82,0x6EAA,0x6E98,0x6EC9,0x6EB7,0x6ED3,0x6EBD,0x6EAF,0x6EC4,0x6EB2,
- 0x6ED4,0x6ED5,0x6E8F,0x6EA5,0x6EC2,0x6E9F,0x6F41,0x6F11,0x704C,0x6EEC,
- 0x6EF8,0x6EFE,0x6F3F,0x6EF2,0x6F31,0x6EEF,0x6F32,0x6ECC,0x6F3E,0x6F13,
- 0x6EF7,0x6F86,0x6F7A,0x6F78,0x6F81,0x6F80,0x6F6F,0x6F5B,0x6FF3,0x6F6D,
- 0x6F82,0x6F7C,0x6F58,0x6F8E,0x6F91,0x6FC2,0x6F66,0x6FB3,0x6FA3,0x6FA1,
- 0x6FA4,0x6FB9,0x6FC6,0x6FAA,0x6FDF,0x6FD5,0x6FEC,0x6FD4,0x6FD8,0x6FF1,
- 0x6FEE,0x6FDB,0x7009,0x700B,0x6FFA,0x7011,0x7001,0x700F,0x6FFE,0x701B,
- 0x701A,0x6F74,0x701D,0x7018,0x701F,0x7030,0x703E,0x7032,0x7051,0x7063,
- 0x7099,0x7092,0x70AF,0x70F1,0x70AC,0x70B8,0x70B3,0x70AE,0x70DF,0x70CB,
- 0x70DD,0x70D9,0x7109,0x70FD,0x711C,0x7119,0x7165,0x7155,0x7188,0x7166,
- 0x7162,0x714C,0x7156,0x716C,0x718F,0x71FB,0x7184,0x7195,0x71A8,0x71AC,
- 0x71D7,0x71B9,0x71BE,0x71D2,0x71C9,0x71D4,0x71CE,0x71E0,0x71EC,0x71E7,
- 0x71F5,0x71FC,0x71F9,0x71FF,0x720D,0x7210,0x721B,0x7228,0x722D,0x722C,
- 0x7230,0x7232,0x723B,0x723C,0x723F,0x7240,0x7246,0x724B,0x7258,0x7274,
- 0x727E,0x7282,0x7281,0x7287,0x7292,0x7296,0x72A2,0x72A7,0x72B9,0x72B2,
- 0x72C3,0x72C6,0x72C4,0x72CE,0x72D2,0x72E2,0x72E0,0x72E1,0x72F9,0x72F7,
- 0x500F,0x7317,0x730A,0x731C,0x7316,0x731D,0x7334,0x732F,0x7329,0x7325,
- 0x733E,0x734E,0x734F,0x9ED8,0x7357,0x736A,0x7368,0x7370,0x7378,0x7375,
- 0x737B,0x737A,0x73C8,0x73B3,0x73CE,0x73BB,0x73C0,0x73E5,0x73EE,0x73DE,
- 0x74A2,0x7405,0x746F,0x7425,0x73F8,0x7432,0x743A,0x7455,0x743F,0x745F,
- 0x7459,0x7441,0x745C,0x7469,0x7470,0x7463,0x746A,0x7476,0x747E,0x748B,
- 0x749E,0x74A7,0x74CA,0x74CF,0x74D4,0x73F1,0x74E0,0x74E3,0x74E7,0x74E9,
- 0x74EE,0x74F2,0x74F0,0x74F1,0x74F8,0x74F7,0x7504,0x7503,0x7505,0x750C,
- 0x750E,0x750D,0x7515,0x7513,0x751E,0x7526,0x752C,0x753C,0x7544,0x754D,
- 0x754A,0x7549,0x755B,0x7546,0x755A,0x7569,0x7564,0x7567,0x756B,0x756D,
- 0x7578,0x7576,0x7586,0x7587,0x7574,0x758A,0x7589,0x7582,0x7594,0x759A,
- 0x759D,0x75A5,0x75A3,0x75C2,0x75B3,0x75C3,0x75B5,0x75BD,0x75B8,0x75BC,
- 0x75B1,0x75CD,0x75CA,0x75D2,0x75D9,0x75E3,0x75DE,0x75FE,0x75FF,0x75FC,
- 0x7601,0x75F0,0x75FA,0x75F2,0x75F3,0x760B,0x760D,0x7609,0x761F,0x7627,
- 0x7620,0x7621,0x7622,0x7624,0x7634,0x7630,0x763B,0x7647,0x7648,0x7646,
- 0x765C,0x7658,0x7661,0x7662,0x7668,0x7669,0x766A,0x7667,0x766C,0x7670,
- 0x7672,0x7676,0x7678,0x767C,0x7680,0x7683,0x7688,0x768B,0x768E,0x7696,
- 0x7693,0x7699,0x769A,0x76B0,0x76B4,0x76B8,0x76B9,0x76BA,0x76C2,0x76CD,
- 0x76D6,0x76D2,0x76DE,0x76E1,0x76E5,0x76E7,0x76EA,0x862F,0x76FB,0x7708,
- 0x7707,0x7704,0x7729,0x7724,0x771E,0x7725,0x7726,0x771B,0x7737,0x7738,
- 0x7747,0x775A,0x7768,0x776B,0x775B,0x7765,0x777F,0x777E,0x7779,0x778E,
- 0x778B,0x7791,0x77A0,0x779E,0x77B0,0x77B6,0x77B9,0x77BF,0x77BC,0x77BD,
- 0x77BB,0x77C7,0x77CD,0x77D7,0x77DA,0x77DC,0x77E3,0x77EE,0x77FC,0x780C,
- 0x7812,0x7926,0x7820,0x792A,0x7845,0x788E,0x7874,0x7886,0x787C,0x789A,
- 0x788C,0x78A3,0x78B5,0x78AA,0x78AF,0x78D1,0x78C6,0x78CB,0x78D4,0x78BE,
- 0x78BC,0x78C5,0x78CA,0x78EC,0x78E7,0x78DA,0x78FD,0x78F4,0x7907,0x7912,
- 0x7911,0x7919,0x792C,0x792B,0x7940,0x7960,0x7957,0x795F,0x795A,0x7955,
- 0x7953,0x797A,0x797F,0x798A,0x799D,0x79A7,0x9F4B,0x79AA,0x79AE,0x79B3,
- 0x79B9,0x79BA,0x79C9,0x79D5,0x79E7,0x79EC,0x79E1,0x79E3,0x7A08,0x7A0D,
- 0x7A18,0x7A19,0x7A20,0x7A1F,0x7980,0x7A31,0x7A3B,0x7A3E,0x7A37,0x7A43,
- 0x7A57,0x7A49,0x7A61,0x7A62,0x7A69,0x9F9D,0x7A70,0x7A79,0x7A7D,0x7A88,
- 0x7A97,0x7A95,0x7A98,0x7A96,0x7AA9,0x7AC8,0x7AB0,0x7AB6,0x7AC5,0x7AC4,
- 0x7ABF,0x9083,0x7AC7,0x7ACA,0x7ACD,0x7ACF,0x7AD5,0x7AD3,0x7AD9,0x7ADA,
- 0x7ADD,0x7AE1,0x7AE2,0x7AE6,0x7AED,0x7AF0,0x7B02,0x7B0F,0x7B0A,0x7B06,
- 0x7B33,0x7B18,0x7B19,0x7B1E,0x7B35,0x7B28,0x7B36,0x7B50,0x7B7A,0x7B04,
- 0x7B4D,0x7B0B,0x7B4C,0x7B45,0x7B75,0x7B65,0x7B74,0x7B67,0x7B70,0x7B71,
- 0x7B6C,0x7B6E,0x7B9D,0x7B98,0x7B9F,0x7B8D,0x7B9C,0x7B9A,0x7B8B,0x7B92,
- 0x7B8F,0x7B5D,0x7B99,0x7BCB,0x7BC1,0x7BCC,0x7BCF,0x7BB4,0x7BC6,0x7BDD,
- 0x7BE9,0x7C11,0x7C14,0x7BE6,0x7BE5,0x7C60,0x7C00,0x7C07,0x7C13,0x7BF3,
- 0x7BF7,0x7C17,0x7C0D,0x7BF6,0x7C23,0x7C27,0x7C2A,0x7C1F,0x7C37,0x7C2B,
- 0x7C3D,0x7C4C,0x7C43,0x7C54,0x7C4F,0x7C40,0x7C50,0x7C58,0x7C5F,0x7C64,
- 0x7C56,0x7C65,0x7C6C,0x7C75,0x7C83,0x7C90,0x7CA4,0x7CAD,0x7CA2,0x7CAB,
- 0x7CA1,0x7CA8,0x7CB3,0x7CB2,0x7CB1,0x7CAE,0x7CB9,0x7CBD,0x7CC0,0x7CC5,
- 0x7CC2,0x7CD8,0x7CD2,0x7CDC,0x7CE2,0x9B3B,0x7CEF,0x7CF2,0x7CF4,0x7CF6,
- 0x7CFA,0x7D06,0x7D02,0x7D1C,0x7D15,0x7D0A,0x7D45,0x7D4B,0x7D2E,0x7D32,
- 0x7D3F,0x7D35,0x7D46,0x7D73,0x7D56,0x7D4E,0x7D72,0x7D68,0x7D6E,0x7D4F,
- 0x7D63,0x7D93,0x7D89,0x7D5B,0x7D8F,0x7D7D,0x7D9B,0x7DBA,0x7DAE,0x7DA3,
- 0x7DB5,0x7DC7,0x7DBD,0x7DAB,0x7E3D,0x7DA2,0x7DAF,0x7DDC,0x7DB8,0x7D9F,
- 0x7DB0,0x7DD8,0x7DDD,0x7DE4,0x7DDE,0x7DFB,0x7DF2,0x7DE1,0x7E05,0x7E0A,
- 0x7E23,0x7E21,0x7E12,0x7E31,0x7E1F,0x7E09,0x7E0B,0x7E22,0x7E46,0x7E66,
- 0x7E3B,0x7E35,0x7E39,0x7E43,0x7E37,0x7E32,0x7E3A,0x7E67,0x7E5D,0x7E56,
- 0x7E5E,0x7E59,0x7E5A,0x7E79,0x7E6A,0x7E69,0x7E7C,0x7E7B,0x7E83,0x7DD5,
- 0x7E7D,0x8FAE,0x7E7F,0x7E88,0x7E89,0x7E8C,0x7E92,0x7E90,0x7E93,0x7E94,
- 0x7E96,0x7E8E,0x7E9B,0x7E9C,0x7F38,0x7F3A,0x7F45,0x7F4C,0x7F4D,0x7F4E,
- 0x7F50,0x7F51,0x7F55,0x7F54,0x7F58,0x7F5F,0x7F60,0x7F68,0x7F69,0x7F67,
- 0x7F78,0x7F82,0x7F86,0x7F83,0x7F88,0x7F87,0x7F8C,0x7F94,0x7F9E,0x7F9D,
- 0x7F9A,0x7FA3,0x7FAF,0x7FB2,0x7FB9,0x7FAE,0x7FB6,0x7FB8,0x8B71,0x7FC5,
- 0x7FC6,0x7FCA,0x7FD5,0x7FD4,0x7FE1,0x7FE6,0x7FE9,0x7FF3,0x7FF9,0x98DC,
- 0x8006,0x8004,0x800B,0x8012,0x8018,0x8019,0x801C,0x8021,0x8028,0x803F,
- 0x803B,0x804A,0x8046,0x8052,0x8058,0x805A,0x805F,0x8062,0x8068,0x8073,
- 0x8072,0x8070,0x8076,0x8079,0x807D,0x807F,0x8084,0x8086,0x8085,0x809B,
- 0x8093,0x809A,0x80AD,0x5190,0x80AC,0x80DB,0x80E5,0x80D9,0x80DD,0x80C4,
- 0x80DA,0x80D6,0x8109,0x80EF,0x80F1,0x811B,0x8129,0x8123,0x812F,0x814B,
- 0x968B,0x8146,0x813E,0x8153,0x8151,0x80FC,0x8171,0x816E,0x8165,0x8166,
- 0x8174,0x8183,0x8188,0x818A,0x8180,0x8182,0x81A0,0x8195,0x81A4,0x81A3,
- 0x815F,0x8193,0x81A9,0x81B0,0x81B5,0x81BE,0x81B8,0x81BD,0x81C0,0x81C2,
- 0x81BA,0x81C9,0x81CD,0x81D1,0x81D9,0x81D8,0x81C8,0x81DA,0x81DF,0x81E0,
- 0x81E7,0x81FA,0x81FB,0x81FE,0x8201,0x8202,0x8205,0x8207,0x820A,0x820D,
- 0x8210,0x8216,0x8229,0x822B,0x8238,0x8233,0x8240,0x8259,0x8258,0x825D,
- 0x825A,0x825F,0x8264,0x8262,0x8268,0x826A,0x826B,0x822E,0x8271,0x8277,
- 0x8278,0x827E,0x828D,0x8292,0x82AB,0x829F,0x82BB,0x82AC,0x82E1,0x82E3,
- 0x82DF,0x82D2,0x82F4,0x82F3,0x82FA,0x8393,0x8303,0x82FB,0x82F9,0x82DE,
- 0x8306,0x82DC,0x8309,0x82D9,0x8335,0x8334,0x8316,0x8332,0x8331,0x8340,
- 0x8339,0x8350,0x8345,0x832F,0x832B,0x8317,0x8318,0x8385,0x839A,0x83AA,
- 0x839F,0x83A2,0x8396,0x8323,0x838E,0x8387,0x838A,0x837C,0x83B5,0x8373,
- 0x8375,0x83A0,0x8389,0x83A8,0x83F4,0x8413,0x83EB,0x83CE,0x83FD,0x8403,
- 0x83D8,0x840B,0x83C1,0x83F7,0x8407,0x83E0,0x83F2,0x840D,0x8422,0x8420,
- 0x83BD,0x8438,0x8506,0x83FB,0x846D,0x842A,0x843C,0x855A,0x8484,0x8477,
- 0x846B,0x84AD,0x846E,0x8482,0x8469,0x8446,0x842C,0x846F,0x8479,0x8435,
- 0x84CA,0x8462,0x84B9,0x84BF,0x849F,0x84D9,0x84CD,0x84BB,0x84DA,0x84D0,
- 0x84C1,0x84C6,0x84D6,0x84A1,0x8521,0x84FF,0x84F4,0x8517,0x8518,0x852C,
- 0x851F,0x8515,0x8514,0x84FC,0x8540,0x8563,0x8558,0x8548,0x8541,0x8602,
- 0x854B,0x8555,0x8580,0x85A4,0x8588,0x8591,0x858A,0x85A8,0x856D,0x8594,
- 0x859B,0x85EA,0x8587,0x859C,0x8577,0x857E,0x8590,0x85C9,0x85BA,0x85CF,
- 0x85B9,0x85D0,0x85D5,0x85DD,0x85E5,0x85DC,0x85F9,0x860A,0x8613,0x860B,
- 0x85FE,0x85FA,0x8606,0x8622,0x861A,0x8630,0x863F,0x864D,0x4E55,0x8654,
- 0x865F,0x8667,0x8671,0x8693,0x86A3,0x86A9,0x86AA,0x868B,0x868C,0x86B6,
- 0x86AF,0x86C4,0x86C6,0x86B0,0x86C9,0x8823,0x86AB,0x86D4,0x86DE,0x86E9,
- 0x86EC,0x86DF,0x86DB,0x86EF,0x8712,0x8706,0x8708,0x8700,0x8703,0x86FB,
- 0x8711,0x8709,0x870D,0x86F9,0x870A,0x8734,0x873F,0x8737,0x873B,0x8725,
- 0x8729,0x871A,0x8760,0x875F,0x8778,0x874C,0x874E,0x8774,0x8757,0x8768,
- 0x876E,0x8759,0x8753,0x8763,0x876A,0x8805,0x87A2,0x879F,0x8782,0x87AF,
- 0x87CB,0x87BD,0x87C0,0x87D0,0x96D6,0x87AB,0x87C4,0x87B3,0x87C7,0x87C6,
- 0x87BB,0x87EF,0x87F2,0x87E0,0x880F,0x880D,0x87FE,0x87F6,0x87F7,0x880E,
- 0x87D2,0x8811,0x8816,0x8815,0x8822,0x8821,0x8831,0x8836,0x8839,0x8827,
- 0x883B,0x8844,0x8842,0x8852,0x8859,0x885E,0x8862,0x886B,0x8881,0x887E,
- 0x889E,0x8875,0x887D,0x88B5,0x8872,0x8882,0x8897,0x8892,0x88AE,0x8899,
- 0x88A2,0x888D,0x88A4,0x88B0,0x88BF,0x88B1,0x88C3,0x88C4,0x88D4,0x88D8,
- 0x88D9,0x88DD,0x88F9,0x8902,0x88FC,0x88F4,0x88E8,0x88F2,0x8904,0x890C,
- 0x890A,0x8913,0x8943,0x891E,0x8925,0x892A,0x892B,0x8941,0x8944,0x893B,
- 0x8936,0x8938,0x894C,0x891D,0x8960,0x895E,0x8966,0x8964,0x896D,0x896A,
- 0x896F,0x8974,0x8977,0x897E,0x8983,0x8988,0x898A,0x8993,0x8998,0x89A1,
- 0x89A9,0x89A6,0x89AC,0x89AF,0x89B2,0x89BA,0x89BD,0x89BF,0x89C0,0x89DA,
- 0x89DC,0x89DD,0x89E7,0x89F4,0x89F8,0x8A03,0x8A16,0x8A10,0x8A0C,0x8A1B,
- 0x8A1D,0x8A25,0x8A36,0x8A41,0x8A5B,0x8A52,0x8A46,0x8A48,0x8A7C,0x8A6D,
- 0x8A6C,0x8A62,0x8A85,0x8A82,0x8A84,0x8AA8,0x8AA1,0x8A91,0x8AA5,0x8AA6,
- 0x8A9A,0x8AA3,0x8AC4,0x8ACD,0x8AC2,0x8ADA,0x8AEB,0x8AF3,0x8AE7,0x8AE4,
- 0x8AF1,0x8B14,0x8AE0,0x8AE2,0x8AF7,0x8ADE,0x8ADB,0x8B0C,0x8B07,0x8B1A,
- 0x8AE1,0x8B16,0x8B10,0x8B17,0x8B20,0x8B33,0x97AB,0x8B26,0x8B2B,0x8B3E,
- 0x8B28,0x8B41,0x8B4C,0x8B4F,0x8B4E,0x8B49,0x8B56,0x8B5B,0x8B5A,0x8B6B,
- 0x8B5F,0x8B6C,0x8B6F,0x8B74,0x8B7D,0x8B80,0x8B8C,0x8B8E,0x8B92,0x8B93,
- 0x8B96,0x8B99,0x8B9A,0x8C3A,0x8C41,0x8C3F,0x8C48,0x8C4C,0x8C4E,0x8C50,
- 0x8C55,0x8C62,0x8C6C,0x8C78,0x8C7A,0x8C82,0x8C89,0x8C85,0x8C8A,0x8C8D,
- 0x8C8E,0x8C94,0x8C7C,0x8C98,0x621D,0x8CAD,0x8CAA,0x8CBD,0x8CB2,0x8CB3,
- 0x8CAE,0x8CB6,0x8CC8,0x8CC1,0x8CE4,0x8CE3,0x8CDA,0x8CFD,0x8CFA,0x8CFB,
- 0x8D04,0x8D05,0x8D0A,0x8D07,0x8D0F,0x8D0D,0x8D10,0x9F4E,0x8D13,0x8CCD,
- 0x8D14,0x8D16,0x8D67,0x8D6D,0x8D71,0x8D73,0x8D81,0x8D99,0x8DC2,0x8DBE,
- 0x8DBA,0x8DCF,0x8DDA,0x8DD6,0x8DCC,0x8DDB,0x8DCB,0x8DEA,0x8DEB,0x8DDF,
- 0x8DE3,0x8DFC,0x8E08,0x8E09,0x8DFF,0x8E1D,0x8E1E,0x8E10,0x8E1F,0x8E42,
- 0x8E35,0x8E30,0x8E34,0x8E4A,0x8E47,0x8E49,0x8E4C,0x8E50,0x8E48,0x8E59,
- 0x8E64,0x8E60,0x8E2A,0x8E63,0x8E55,0x8E76,0x8E72,0x8E7C,0x8E81,0x8E87,
- 0x8E85,0x8E84,0x8E8B,0x8E8A,0x8E93,0x8E91,0x8E94,0x8E99,0x8EAA,0x8EA1,
- 0x8EAC,0x8EB0,0x8EC6,0x8EB1,0x8EBE,0x8EC5,0x8EC8,0x8ECB,0x8EDB,0x8EE3,
- 0x8EFC,0x8EFB,0x8EEB,0x8EFE,0x8F0A,0x8F05,0x8F15,0x8F12,0x8F19,0x8F13,
- 0x8F1C,0x8F1F,0x8F1B,0x8F0C,0x8F26,0x8F33,0x8F3B,0x8F39,0x8F45,0x8F42,
- 0x8F3E,0x8F4C,0x8F49,0x8F46,0x8F4E,0x8F57,0x8F5C,0x8F62,0x8F63,0x8F64,
- 0x8F9C,0x8F9F,0x8FA3,0x8FAD,0x8FAF,0x8FB7,0x8FDA,0x8FE5,0x8FE2,0x8FEA,
- 0x8FEF,0x9087,0x8FF4,0x9005,0x8FF9,0x8FFA,0x9011,0x9015,0x9021,0x900D,
- 0x901E,0x9016,0x900B,0x9027,0x9036,0x9035,0x9039,0x8FF8,0x904F,0x9050,
- 0x9051,0x9052,0x900E,0x9049,0x903E,0x9056,0x9058,0x905E,0x9068,0x906F,
- 0x9076,0x96A8,0x9072,0x9082,0x907D,0x9081,0x9080,0x908A,0x9089,0x908F,
- 0x90A8,0x90AF,0x90B1,0x90B5,0x90E2,0x90E4,0x6248,0x90DB,0x9102,0x9112,
- 0x9119,0x9132,0x9130,0x914A,0x9156,0x9158,0x9163,0x9165,0x9169,0x9173,
- 0x9172,0x918B,0x9189,0x9182,0x91A2,0x91AB,0x91AF,0x91AA,0x91B5,0x91B4,
- 0x91BA,0x91C0,0x91C1,0x91C9,0x91CB,0x91D0,0x91D6,0x91DF,0x91E1,0x91DB,
- 0x91FC,0x91F5,0x91F6,0x921E,0x91FF,0x9214,0x922C,0x9215,0x9211,0x925E,
- 0x9257,0x9245,0x9249,0x9264,0x9248,0x9295,0x923F,0x924B,0x9250,0x929C,
- 0x9296,0x9293,0x929B,0x925A,0x92CF,0x92B9,0x92B7,0x92E9,0x930F,0x92FA,
- 0x9344,0x932E,0x9319,0x9322,0x931A,0x9323,0x933A,0x9335,0x933B,0x935C,
- 0x9360,0x937C,0x936E,0x9356,0x93B0,0x93AC,0x93AD,0x9394,0x93B9,0x93D6,
- 0x93D7,0x93E8,0x93E5,0x93D8,0x93C3,0x93DD,0x93D0,0x93C8,0x93E4,0x941A,
- 0x9414,0x9413,0x9403,0x9407,0x9410,0x9436,0x942B,0x9435,0x9421,0x943A,
- 0x9441,0x9452,0x9444,0x945B,0x9460,0x9462,0x945E,0x946A,0x9229,0x9470,
- 0x9475,0x9477,0x947D,0x945A,0x947C,0x947E,0x9481,0x947F,0x9582,0x9587,
- 0x958A,0x9594,0x9596,0x9598,0x9599,0x95A0,0x95A8,0x95A7,0x95AD,0x95BC,
- 0x95BB,0x95B9,0x95BE,0x95CA,0x6FF6,0x95C3,0x95CD,0x95CC,0x95D5,0x95D4,
- 0x95D6,0x95DC,0x95E1,0x95E5,0x95E2,0x9621,0x9628,0x962E,0x962F,0x9642,
- 0x964C,0x964F,0x964B,0x9677,0x965C,0x965E,0x965D,0x965F,0x9666,0x9672,
- 0x966C,0x968D,0x9698,0x9695,0x9697,0x96AA,0x96A7,0x96B1,0x96B2,0x96B0,
- 0x96B4,0x96B6,0x96B8,0x96B9,0x96CE,0x96CB,0x96C9,0x96CD,0x894D,0x96DC,
- 0x970D,0x96D5,0x96F9,0x9704,0x9706,0x9708,0x9713,0x970E,0x9711,0x970F,
- 0x9716,0x9719,0x9724,0x972A,0x9730,0x9739,0x973D,0x973E,0x9744,0x9746,
- 0x9748,0x9742,0x9749,0x975C,0x9760,0x9764,0x9766,0x9768,0x52D2,0x976B,
- 0x9771,0x9779,0x9785,0x977C,0x9781,0x977A,0x9786,0x978B,0x978F,0x9790,
- 0x979C,0x97A8,0x97A6,0x97A3,0x97B3,0x97B4,0x97C3,0x97C6,0x97C8,0x97CB,
- 0x97DC,0x97ED,0x9F4F,0x97F2,0x7ADF,0x97F6,0x97F5,0x980F,0x980C,0x9838,
- 0x9824,0x9821,0x9837,0x983D,0x9846,0x984F,0x984B,0x986B,0x986F,0x9870,
- 0x9871,0x9874,0x9873,0x98AA,0x98AF,0x98B1,0x98B6,0x98C4,0x98C3,0x98C6,
- 0x98E9,0x98EB,0x9903,0x9909,0x9912,0x9914,0x9918,0x9921,0x991D,0x991E,
- 0x9924,0x9920,0x992C,0x992E,0x993D,0x993E,0x9942,0x9949,0x9945,0x9950,
- 0x994B,0x9951,0x9952,0x994C,0x9955,0x9997,0x9998,0x99A5,0x99AD,0x99AE,
- 0x99BC,0x99DF,0x99DB,0x99DD,0x99D8,0x99D1,0x99ED,0x99EE,0x99F1,0x99F2,
- 0x99FB,0x99F8,0x9A01,0x9A0F,0x9A05,0x99E2,0x9A19,0x9A2B,0x9A37,0x9A45,
- 0x9A42,0x9A40,0x9A43,0x9A3E,0x9A55,0x9A4D,0x9A5B,0x9A57,0x9A5F,0x9A62,
- 0x9A65,0x9A64,0x9A69,0x9A6B,0x9A6A,0x9AAD,0x9AB0,0x9ABC,0x9AC0,0x9ACF,
- 0x9AD1,0x9AD3,0x9AD4,0x9ADE,0x9ADF,0x9AE2,0x9AE3,0x9AE6,0x9AEF,0x9AEB,
- 0x9AEE,0x9AF4,0x9AF1,0x9AF7,0x9AFB,0x9B06,0x9B18,0x9B1A,0x9B1F,0x9B22,
- 0x9B23,0x9B25,0x9B27,0x9B28,0x9B29,0x9B2A,0x9B2E,0x9B2F,0x9B32,0x9B44,
- 0x9B43,0x9B4F,0x9B4D,0x9B4E,0x9B51,0x9B58,0x9B74,0x9B93,0x9B83,0x9B91,
- 0x9B96,0x9B97,0x9B9F,0x9BA0,0x9BA8,0x9BB4,0x9BC0,0x9BCA,0x9BB9,0x9BC6,
- 0x9BCF,0x9BD1,0x9BD2,0x9BE3,0x9BE2,0x9BE4,0x9BD4,0x9BE1,0x9C3A,0x9BF2,
- 0x9BF1,0x9BF0,0x9C15,0x9C14,0x9C09,0x9C13,0x9C0C,0x9C06,0x9C08,0x9C12,
- 0x9C0A,0x9C04,0x9C2E,0x9C1B,0x9C25,0x9C24,0x9C21,0x9C30,0x9C47,0x9C32,
- 0x9C46,0x9C3E,0x9C5A,0x9C60,0x9C67,0x9C76,0x9C78,0x9CE7,0x9CEC,0x9CF0,
- 0x9D09,0x9D08,0x9CEB,0x9D03,0x9D06,0x9D2A,0x9D26,0x9DAF,0x9D23,0x9D1F,
- 0x9D44,0x9D15,0x9D12,0x9D41,0x9D3F,0x9D3E,0x9D46,0x9D48,0x9D5D,0x9D5E,
- 0x9D64,0x9D51,0x9D50,0x9D59,0x9D72,0x9D89,0x9D87,0x9DAB,0x9D6F,0x9D7A,
- 0x9D9A,0x9DA4,0x9DA9,0x9DB2,0x9DC4,0x9DC1,0x9DBB,0x9DB8,0x9DBA,0x9DC6,
- 0x9DCF,0x9DC2,0x9DD9,0x9DD3,0x9DF8,0x9DE6,0x9DED,0x9DEF,0x9DFD,0x9E1A,
- 0x9E1B,0x9E1E,0x9E75,0x9E79,0x9E7D,0x9E81,0x9E88,0x9E8B,0x9E8C,0x9E92,
- 0x9E95,0x9E91,0x9E9D,0x9EA5,0x9EA9,0x9EB8,0x9EAA,0x9EAD,0x9761,0x9ECC,
- 0x9ECE,0x9ECF,0x9ED0,0x9ED4,0x9EDC,0x9EDE,0x9EDD,0x9EE0,0x9EE5,0x9EE8,
- 0x9EEF,0x9EF4,0x9EF6,0x9EF7,0x9EF9,0x9EFB,0x9EFC,0x9EFD,0x9F07,0x9F08,
- 0x76B7,0x9F15,0x9F21,0x9F2C,0x9F3E,0x9F4A,0x9F52,0x9F54,0x9F63,0x9F5F,
- 0x9F60,0x9F61,0x9F66,0x9F67,0x9F6C,0x9F6A,0x9F77,0x9F72,0x9F76,0x9F95,
- 0x9F9C,0x9FA0,0x582F,0x69C7,0x9059,0x7464,0x51DC,0x7199,0x0000,0x0000,
- 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
- 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
- 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
- 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
- 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
- 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
- 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
- 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
- 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
- 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
- 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
- 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
- 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
- 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
- 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
- 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
- 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
- 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
- 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
- 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
- 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
- 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
- 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
- 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
- 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
- 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
- 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
- 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
- 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
- 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
- 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
- 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
- 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
- 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
- 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
- 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
- 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
- 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
- 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
- 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
- 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
- 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
- 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
- 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
- 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
- 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
- 0x0000,0x0000,0x7E8A,0x891C,0x9348,0x9288,0x84DC,0x4FC9,0x70BB,0x6631,
- 0x68C8,0x92F9,0x66FB,0x5F45,0x4E28,0x4EE1,0x4EFC,0x4F00,0x4F03,0x4F39,
- 0x4F56,0x4F92,0x4F8A,0x4F9A,0x4F94,0x4FCD,0x5040,0x5022,0x4FFF,0x501E,
- 0x5046,0x5070,0x5042,0x5094,0x50F4,0x50D8,0x514A,0x5164,0x519D,0x51BE,
- 0x51EC,0x5215,0x529C,0x52A6,0x52C0,0x52DB,0x5300,0x5307,0x5324,0x5372,
- 0x5393,0x53B2,0x53DD,0xFA0E,0x549C,0x548A,0x54A9,0x54FF,0x5586,0x5759,
- 0x5765,0x57AC,0x57C8,0x57C7,0xFA0F,0xFA10,0x589E,0x58B2,0x590B,0x5953,
- 0x595B,0x595D,0x5963,0x59A4,0x59BA,0x5B56,0x5BC0,0x752F,0x5BD8,0x5BEC,
- 0x5C1E,0x5CA6,0x5CBA,0x5CF5,0x5D27,0x5D53,0xFA11,0x5D42,0x5D6D,0x5DB8,
- 0x5DB9,0x5DD0,0x5F21,0x5F34,0x5F67,0x5FB7,0x5FDE,0x605D,0x6085,0x608A,
- 0x60DE,0x60D5,0x6120,0x60F2,0x6111,0x6137,0x6130,0x6198,0x6213,0x62A6,
- 0x63F5,0x6460,0x649D,0x64CE,0x654E,0x6600,0x6615,0x663B,0x6609,0x662E,
- 0x661E,0x6624,0x6665,0x6657,0x6659,0xFA12,0x6673,0x6699,0x66A0,0x66B2,
- 0x66BF,0x66FA,0x670E,0xF929,0x6766,0x67BB,0x6852,0x67C0,0x6801,0x6844,
- 0x68CF,0xFA13,0x6968,0xFA14,0x6998,0x69E2,0x6A30,0x6A6B,0x6A46,0x6A73,
- 0x6A7E,0x6AE2,0x6AE4,0x6BD6,0x6C3F,0x6C5C,0x6C86,0x6C6F,0x6CDA,0x6D04,
- 0x6D87,0x6D6F,0x6D96,0x6DAC,0x6DCF,0x6DF8,0x6DF2,0x6DFC,0x6E39,0x6E5C,
- 0x6E27,0x6E3C,0x6EBF,0x6F88,0x6FB5,0x6FF5,0x7005,0x7007,0x7028,0x7085,
- 0x70AB,0x710F,0x7104,0x715C,0x7146,0x7147,0xFA15,0x71C1,0x71FE,0x72B1,
- 0x72BE,0x7324,0xFA16,0x7377,0x73BD,0x73C9,0x73D6,0x73E3,0x73D2,0x7407,
- 0x73F5,0x7426,0x742A,0x7429,0x742E,0x7462,0x7489,0x749F,0x7501,0x756F,
- 0x7682,0x769C,0x769E,0x769B,0x76A6,0xFA17,0x7746,0x52AF,0x7821,0x784E,
- 0x7864,0x787A,0x7930,0xFA18,0xFA19,0xFA1A,0x7994,0xFA1B,0x799B,0x7AD1,
- 0x7AE7,0xFA1C,0x7AEB,0x7B9E,0xFA1D,0x7D48,0x7D5C,0x7DB7,0x7DA0,0x7DD6,
- 0x7E52,0x7F47,0x7FA1,0xFA1E,0x8301,0x8362,0x837F,0x83C7,0x83F6,0x8448,
- 0x84B4,0x8553,0x8559,0x856B,0xFA1F,0x85B0,0xFA20,0xFA21,0x8807,0x88F5,
- 0x8A12,0x8A37,0x8A79,0x8AA7,0x8ABE,0x8ADF,0xFA22,0x8AF6,0x8B53,0x8B7F,
- 0x8CF0,0x8CF4,0x8D12,0x8D76,0xFA23,0x8ECF,0xFA24,0xFA25,0x9067,0x90DE,
- 0xFA26,0x9115,0x9127,0x91DA,0x91D7,0x91DE,0x91ED,0x91EE,0x91E4,0x91E5,
- 0x9206,0x9210,0x920A,0x923A,0x9240,0x923C,0x924E,0x9259,0x9251,0x9239,
- 0x9267,0x92A7,0x9277,0x9278,0x92E7,0x92D7,0x92D9,0x92D0,0xFA27,0x92D5,
- 0x92E0,0x92D3,0x9325,0x9321,0x92FB,0xFA28,0x931E,0x92FF,0x931D,0x9302,
- 0x9370,0x9357,0x93A4,0x93C6,0x93DE,0x93F8,0x9431,0x9445,0x9448,0x9592,
- 0xF9DC,0xFA29,0x969D,0x96AF,0x9733,0x973B,0x9743,0x974D,0x974F,0x9751,
- 0x9755,0x9857,0x9865,0xFA2A,0xFA2B,0x9927,0xFA2C,0x999E,0x9A4E,0x9AD9,
- 0x9ADC,0x9B75,0x9B72,0x9B8F,0x9BB1,0x9BBB,0x9C00,0x9D70,0x9D6B,0xFA2D,
- 0x9E19,0x9ED1,0x0000,0x0000,0x2170,0x2171,0x2172,0x2173,0x2174,0x2175,
- 0x2176,0x2177,0x2178,0x2179,0x0000,0xFFE4,0xFF07,0xFF02,0x0000,0x0000,
- 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
- 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
- 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
- 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
- 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
- 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
- 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
- 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
- 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
- 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
- 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
- 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
- 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
- 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
- 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
- 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
- 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
- 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
- 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000
-};
-static const int j2utable_size = (sizeof (j2utable) / sizeof (unsigned short));
-
+/*extern const unsigned short u2jtable[];*/
static const unsigned short u2jtable[] = {
0x0000,0x0001,0x0002,0x0003,0x0004,0x0005,0x0006,0x0007,0x0008,0x0009,
0x000A,0x000B,0x000C,0x000D,0x000E,0x000F,0x0010,0x0011,0x0012,0x0013,
@@ -9465,31 +4080,222 @@
0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
0x0000,0x4F25,0x0000,0x0000,0x7C65,0x0000,0x7237,0x7C64,0x0000,0x0000,
0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
- 0x0000,0x7239,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
- 0x0000,0x0000,0x303E,0x7C66,0x0000,0x723A,0x4A2B,0x7238,0x0000,0x0000,
- 0x723B,0x723C,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x723D,
- 0x723E,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x723F,0x0000,
- 0x4B6E,0x3B2D,0x0000,0x3A7A,0x412F,0x0000,0x0000,0x7C67,0x0000,0x0000,
- 0x7240,0x0000,0x0000,0x0000,0x0000,0x7243,0x0000,0x7C68,0x0000,0x0000,
- 0x0000,0x0000,0x7241,0x0000,0x0000,0x0000,0x0000,0x0000,0x7244,0x0000,
- 0x0000,0x3871,0x7242,0x0000,0x0000,0x0000,0x0000,0x7245,0x0000,0x7246,
- 0x7247,0x0000,0x724B,0x0000,0x3B2A,0x0000,0x0000,0x0000,0x0000,0x4264,
- 0x0000,0x0000,0x0000,0x0000,0x0000,0x724C,0x7249,0x7248,0x724A,0x0000,
- 0x0000,0x0000,0x375F,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
- 0x7250,0x724F,0x724E,0x0000,0x0000,0x3033,0x0000,0x0000,0x0000,0x0000,
- 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7C69,0x0000,0x0000,0x0000,
- 0x725A,0x0000,0x7256,0x0000,0x7257,0x7253,0x7259,0x0000,0x7255,0x3362,
- 0x0000,0x0000,0x4F4C,0x0000,0x7258,0x7254,0x7252,0x7251,0x0000,0x0000,
- 0x0000,0x0000,0x0000,0x725C,0x0000,0x0000,0x0000,0x0000,0x0000,0x725F,
- 0x0000,0x0000,0x725E,0x725D,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
- 0x0000,0x4949,0x725B,0x3073,0x7260,0x0000,0x7262,0x0000,0x0000,0x0000,
- 0x0000,0x0000,0x0000,0x336F,0x724D,0x3137,0x0000,0x0000,0x7264,0x0000,
- 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7263,0x7261,0x432D,0x0000,
- 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4B70,0x0000,
- 0x0000,0x0000,0x0000,0x4E5A,0x0000,0x0000,0x7265,0x0000,0x0000,0x0000,
- 0x0000,0x0000,0x7266,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7267,
+ 0x0000,0x7239,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
+ 0x0000,0x0000,0x303E,0x7C66,0x0000,0x723A,0x4A2B,0x7238,0x0000,0x0000,
+ 0x723B,0x723C,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x723D,
+ 0x723E,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x723F,0x0000,
+ 0x4B6E,0x3B2D,0x0000,0x3A7A,0x412F,0x0000,0x0000,0x7C67,0x0000,0x0000,
+ 0x7240,0x0000,0x0000,0x0000,0x0000,0x7243,0x0000,0x7C68,0x0000,0x0000,
+ 0x0000,0x0000,0x7241,0x0000,0x0000,0x0000,0x0000,0x0000,0x7244,0x0000,
+ 0x0000,0x3871,0x7242,0x0000,0x0000,0x0000,0x0000,0x7245,0x0000,0x7246,
+ 0x7247,0x0000,0x724B,0x0000,0x3B2A,0x0000,0x0000,0x0000,0x0000,0x4264,
+ 0x0000,0x0000,0x0000,0x0000,0x0000,0x724C,0x7249,0x7248,0x724A,0x0000,
+ 0x0000,0x0000,0x375F,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
+ 0x7250,0x724F,0x724E,0x0000,0x0000,0x3033,0x0000,0x0000,0x0000,0x0000,
+ 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7C69,0x0000,0x0000,0x0000,
+ 0x725A,0x0000,0x7256,0x0000,0x7257,0x7253,0x7259,0x0000,0x7255,0x3362,
+ 0x0000,0x0000,0x4F4C,0x0000,0x7258,0x7254,0x7252,0x7251,0x0000,0x0000,
+ 0x0000,0x0000,0x0000,0x725C,0x0000,0x0000,0x0000,0x0000,0x0000,0x725F,
+ 0x0000,0x0000,0x725E,0x725D,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
+ 0x0000,0x4949,0x725B,0x3073,0x7260,0x0000,0x7262,0x0000,0x0000,0x0000,
+ 0x0000,0x0000,0x0000,0x336F,0x724D,0x3137,0x0000,0x0000,0x7264,0x0000,
+ 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7263,0x7261,0x432D,0x0000,
+ 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4B70,0x0000,
+ 0x0000,0x0000,0x0000,0x4E5A,0x0000,0x0000,0x7265,0x0000,0x0000,0x0000,
+ 0x0000,0x0000,0x7266,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7267,
+ 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
+ 0x0000,0x0000,0x0000,0x0000,0x7268,0x0000,0x7269,0x0000,0x0000,0x0000,
+ 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
+ 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
+ 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
+ 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
+ 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
+ 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
+ 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
+ 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
+ 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
+ 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
+ 0x0000,0x0000,0x0000,0x0000,0x0000,0x443B,0x0000,0x726A,0x0000,0x4837,
+ 0x0000,0x726F,0x726B,0x0000,0x0000,0x0000,0x726C,0x0000,0x0000,0x4B31,
+ 0x4C44,0x0000,0x4650,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
+ 0x0000,0x0000,0x0000,0x0000,0x0000,0x7270,0x0000,0x0000,0x7271,0x463E,
+ 0x726E,0x726D,0x0000,0x0000,0x0000,0x0000,0x322A,0x0000,0x0000,0x0000,
+ 0x7279,0x0000,0x0000,0x7278,0x0000,0x0000,0x0000,0x0000,0x0000,0x3175,
+ 0x0000,0x0000,0x0000,0x7276,0x0000,0x0000,0x0000,0x7275,0x0000,0x0000,
+ 0x7273,0x0000,0x337B,0x0000,0x7272,0x3C32,0x3229,0x0000,0x0000,0x0000,
+ 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
+ 0x0000,0x3963,0x0000,0x0000,0x727C,0x727B,0x0000,0x727A,0x0000,0x0000,
+ 0x7277,0x0000,0x727D,0x0000,0x727E,0x0000,0x0000,0x0000,0x0000,0x0000,
+ 0x0000,0x0000,0x7325,0x7324,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
+ 0x0000,0x7326,0x0000,0x0000,0x312D,0x7321,0x7322,0x0000,0x3974,0x4C39,
+ 0x0000,0x0000,0x7323,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7C6B,
+ 0x4B32,0x0000,0x0000,0x732B,0x7C6A,0x0000,0x7327,0x0000,0x0000,0x0000,
+ 0x0000,0x0000,0x0000,0x0000,0x732C,0x0000,0x0000,0x0000,0x0000,0x0000,
+ 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7329,0x0000,0x7328,
+ 0x0000,0x0000,0x0000,0x0000,0x0000,0x375C,0x0000,0x0000,0x0000,0x0000,
+ 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x732D,0x0000,0x0000,0x0000,
+ 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x732E,0x0000,0x0000,0x0000,
+ 0x0000,0x732F,0x0000,0x732A,0x0000,0x0000,0x0000,0x7274,0x0000,0x0000,
+ 0x7330,0x0000,0x4461,0x0000,0x0000,0x0000,0x7334,0x0000,0x7335,0x7333,
+ 0x0000,0x0000,0x0000,0x0000,0x0000,0x7332,0x7338,0x0000,0x7331,0x0000,
+ 0x7336,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7337,
+ 0x0000,0x0000,0x0000,0x733A,0x0000,0x0000,0x0000,0x0000,0x0000,0x7339,
+ 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
+ 0x0000,0x0000,0x733C,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x733D,
+ 0x0000,0x733E,0x0000,0x0000,0x4F49,0x0000,0x0000,0x0000,0x0000,0x0000,
+ 0x733B,0x426B,0x3A6D,0x0000,0x0000,0x733F,0x0000,0x0000,0x0000,0x0000,
+ 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
+ 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
+ 0x0000,0x0000,0x0000,0x7C6D,0x7340,0x7341,0x0000,0x0000,0x7342,0x0000,
+ 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
+ 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
+ 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
+ 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
+ 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
+ 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
+ 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
+ 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
+ 0x0000,0x0000,0x0000,0x0000,0x0000,0x7343,0x0000,0x0000,0x3834,0x7344,
+ 0x0000,0x0000,0x0000,0x7345,0x0000,0x3C2F,0x0000,0x7346,0x0000,0x0000,
+ 0x0000,0x0000,0x0000,0x0000,0x7347,0x0000,0x0000,0x7348,0x7349,0x0000,
+ 0x0000,0x0000,0x0000,0x734C,0x734A,0x4F3C,0x0000,0x734B,0x0000,0x4E6F,
+ 0x0000,0x0000,0x0000,0x0000,0x0000,0x734D,0x0000,0x4E5B,0x0000,0x0000,
+ 0x0000,0x0000,0x0000,0x734E,0x477E,0x0000,0x0000,0x734F,0x7351,0x0000,
+ 0x0000,0x7352,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
+ 0x0000,0x0000,0x7350,0x396D,0x4C4D,0x4B63,0x5677,0x0000,0x5D60,0x4B7B,
+ 0x0000,0x0000,0x0000,0x0000,0x322B,0x0000,0x0000,0x0000,0x0000,0x0000,
+ 0x0000,0x0000,0x7354,0x3550,0x7355,0x7356,0x7357,0x7C6E,0x3975,0x0000,
+ 0x7358,0x0000,0x0000,0x0000,0x6054,0x4C5B,0x0000,0x4263,0x7359,0x735B,
+ 0x735A,0x0000,0x735C,0x0000,0x0000,0x0000,0x0000,0x735D,0x0000,0x0000,
+ 0x735E,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x735F,0x0000,0x0000,
+ 0x0000,0x0000,0x7360,0x0000,0x7361,0x7362,0x0000,0x7363,0x0000,0x7364,
+ 0x7365,0x7366,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
+ 0x0000,0x7367,0x7368,0x0000,0x0000,0x0000,0x0000,0x0000,0x4524,0x0000,
+ 0x0000,0x0000,0x0000,0x385D,0x0000,0x736A,0x0000,0x0000,0x0000,0x0000,
+ 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x414D,0x736B,0x0000,0x0000,
+ 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x736C,0x0000,
+ 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
+ 0x0000,0x0000,0x0000,0x4921,0x0000,0x0000,0x736D,0x0000,0x0000,0x0000,
+ 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x736E,0x6337,
+ 0x0000,0x0000,0x6C5A,0x706D,0x0000,0x0000,0x736F,0x0000,0x7370,0x0000,
+ 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7372,
+ 0x7373,0x7374,0x4E70,0x7371,0x0000,0x0000,0x7375,0x7376,0x0000,0x0000,
+ 0x7378,0x0000,0x7377,0x0000,0x0000,0x0000,0x0000,0x0000,0x737A,0x0000,
+ 0x0000,0x0000,0x737B,0x7379,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
+ 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
+ 0x0000,0x0000,0x0000,0x0000,0x0000,0x4E36,0x0000,0x0000,0x0000,0x0000,
+ 0x0000,0x0000,0x0000,0x737C,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
+ 0x737D,0x6354,0x0000,0x0000,0x737E,0x0000,0x0000,0x0000,0x0000,0x0000,
+ 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
+ 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
+ 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
+ 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
+ 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
+ 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
+ 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
+ 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
+ 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
+ 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
+ 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
+ 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
+ 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
+ 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
+ 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
+ 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
+ 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
+ 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
+ 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
+ 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
+ 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
+ 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
+ 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
+ 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
+ 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
+ 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
+ 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
+ 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
+ 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
+ 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
+ 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
+ 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
+ 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
+ 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
+ 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
+ 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
+ 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
+ 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
+ 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
+ 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
+ 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
+ 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
+ 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
+ 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
+ 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
+ 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
+ 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
+ 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
+ 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
+ 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
+ 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
+ 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
+ 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
+ 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
+ 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
+ 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
+ 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
+ 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
+ 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
+ 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
+ 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
+ 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
+ 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
+ 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
+ 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
+ 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
+ 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
+ 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
+ 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
+ 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
+ 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
+ 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
+ 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
+ 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
+ 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
+ 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
+ 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
+ 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
+ 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
+ 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
+ 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
+ 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
+ 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
+ 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
+ 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
+ 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
+ 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
+ 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
+ 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
+ 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
+ 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
+ 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
+ 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
+ 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
+ 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
+ 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
+ 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
+ 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
+ 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
+ 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
+ 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
+ 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
+ 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
+ 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
+ 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
+ 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
+ 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
+ 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
+ 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
- 0x0000,0x0000,0x0000,0x0000,0x7268,0x0000,0x7269,0x0000,0x0000,0x0000,
0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
@@ -9500,38 +4306,10 @@
0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
- 0x0000,0x0000,0x0000,0x0000,0x0000,0x443B,0x0000,0x726A,0x0000,0x4837,
- 0x0000,0x726F,0x726B,0x0000,0x0000,0x0000,0x726C,0x0000,0x0000,0x4B31,
- 0x4C44,0x0000,0x4650,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
- 0x0000,0x0000,0x0000,0x0000,0x0000,0x7270,0x0000,0x0000,0x7271,0x463E,
- 0x726E,0x726D,0x0000,0x0000,0x0000,0x0000,0x322A,0x0000,0x0000,0x0000,
- 0x7279,0x0000,0x0000,0x7278,0x0000,0x0000,0x0000,0x0000,0x0000,0x3175,
- 0x0000,0x0000,0x0000,0x7276,0x0000,0x0000,0x0000,0x7275,0x0000,0x0000,
- 0x7273,0x0000,0x337B,0x0000,0x7272,0x3C32,0x3229,0x0000,0x0000,0x0000,
0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
- 0x0000,0x3963,0x0000,0x0000,0x727C,0x727B,0x0000,0x727A,0x0000,0x0000,
- 0x7277,0x0000,0x727D,0x0000,0x727E,0x0000,0x0000,0x0000,0x0000,0x0000,
- 0x0000,0x0000,0x7325,0x7324,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
- 0x0000,0x7326,0x0000,0x0000,0x312D,0x7321,0x7322,0x0000,0x3974,0x4C39,
- 0x0000,0x0000,0x7323,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7C6B,
- 0x4B32,0x0000,0x0000,0x732B,0x7C6A,0x0000,0x7327,0x0000,0x0000,0x0000,
- 0x0000,0x0000,0x0000,0x0000,0x732C,0x0000,0x0000,0x0000,0x0000,0x0000,
- 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7329,0x0000,0x7328,
- 0x0000,0x0000,0x0000,0x0000,0x0000,0x375C,0x0000,0x0000,0x0000,0x0000,
- 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x732D,0x0000,0x0000,0x0000,
- 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x732E,0x0000,0x0000,0x0000,
- 0x0000,0x732F,0x0000,0x732A,0x0000,0x0000,0x0000,0x7274,0x0000,0x0000,
- 0x7330,0x0000,0x4461,0x0000,0x0000,0x0000,0x7334,0x0000,0x7335,0x7333,
- 0x0000,0x0000,0x0000,0x0000,0x0000,0x7332,0x7338,0x0000,0x7331,0x0000,
- 0x7336,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7337,
- 0x0000,0x0000,0x0000,0x733A,0x0000,0x0000,0x0000,0x0000,0x0000,0x7339,
0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
- 0x0000,0x0000,0x733C,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x733D,
- 0x0000,0x733E,0x0000,0x0000,0x4F49,0x0000,0x0000,0x0000,0x0000,0x0000,
- 0x733B,0x426B,0x3A6D,0x0000,0x0000,0x733F,0x0000,0x0000,0x0000,0x0000,
0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
- 0x0000,0x0000,0x0000,0x7C6D,0x7340,0x7341,0x0000,0x0000,0x7342,0x0000,
0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
@@ -9540,37 +4318,8 @@
0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
- 0x0000,0x0000,0x0000,0x0000,0x0000,0x7343,0x0000,0x0000,0x3834,0x7344,
- 0x0000,0x0000,0x0000,0x7345,0x0000,0x3C2F,0x0000,0x7346,0x0000,0x0000,
- 0x0000,0x0000,0x0000,0x0000,0x7347,0x0000,0x0000,0x7348,0x7349,0x0000,
- 0x0000,0x0000,0x0000,0x734C,0x734A,0x4F3C,0x0000,0x734B,0x0000,0x4E6F,
- 0x0000,0x0000,0x0000,0x0000,0x0000,0x734D,0x0000,0x4E5B,0x0000,0x0000,
- 0x0000,0x0000,0x0000,0x734E,0x477E,0x0000,0x0000,0x734F,0x7351,0x0000,
- 0x0000,0x7352,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
- 0x0000,0x0000,0x7350,0x396D,0x4C4D,0x4B63,0x5677,0x0000,0x5D60,0x4B7B,
- 0x0000,0x0000,0x0000,0x0000,0x322B,0x0000,0x0000,0x0000,0x0000,0x0000,
- 0x0000,0x0000,0x7354,0x3550,0x7355,0x7356,0x7357,0x7C6E,0x3975,0x0000,
- 0x7358,0x0000,0x0000,0x0000,0x6054,0x4C5B,0x0000,0x4263,0x7359,0x735B,
- 0x735A,0x0000,0x735C,0x0000,0x0000,0x0000,0x0000,0x735D,0x0000,0x0000,
- 0x735E,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x735F,0x0000,0x0000,
- 0x0000,0x0000,0x7360,0x0000,0x7361,0x7362,0x0000,0x7363,0x0000,0x7364,
- 0x7365,0x7366,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
- 0x0000,0x7367,0x7368,0x0000,0x0000,0x0000,0x0000,0x0000,0x4524,0x0000,
- 0x0000,0x0000,0x0000,0x385D,0x0000,0x736A,0x0000,0x0000,0x0000,0x0000,
- 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x414D,0x736B,0x0000,0x0000,
- 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x736C,0x0000,
0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
- 0x0000,0x0000,0x0000,0x4921,0x0000,0x0000,0x736D,0x0000,0x0000,0x0000,
- 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x736E,0x6337,
- 0x0000,0x0000,0x6C5A,0x706D,0x0000,0x0000,0x736F,0x0000,0x7370,0x0000,
- 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7372,
- 0x7373,0x7374,0x4E70,0x7371,0x0000,0x0000,0x7375,0x7376,0x0000,0x0000,
- 0x7378,0x0000,0x7377,0x0000,0x0000,0x0000,0x0000,0x0000,0x737A,0x0000,
- 0x0000,0x0000,0x737B,0x7379,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
- 0x0000,0x0000,0x0000,0x0000,0x0000,0x4E36,0x0000,0x0000,0x0000,0x0000,
- 0x0000,0x0000,0x0000,0x737C,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
- 0x737D,0x6354,0x0000,0x0000,0x737E,0x0000,0x0000,0x0000,0x0000,0x0000,
0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
@@ -11728,6 +6477,7 @@
0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
+ 0x0000,0x0000,0x0000,0x0000,0x0000,0x7A46,0x0000,0x0000,0x0000,0x0000,
0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
@@ -11745,10 +6495,15 @@
0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
+ 0x0000,0x0000,0x0000,0x0000,0x7C4F,0x0000,0x0000,0x0000,0x0000,0x0000,
0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
+ 0x0000,0x0000,0x0000,0x0000,0x7954,0x795F,0x7960,0x7975,0x7A3E,0x7A4E,
+ 0x7A50,0x7A7B,0x7B23,0x7B3A,0x7B42,0x7B43,0x7B44,0x7B46,0x7B4A,0x7B4D,
+ 0x7B56,0x7B61,0x7B63,0x7B64,0x7B6D,0x7B75,0x7B77,0x7B78,0x7B7B,0x7C39,
+ 0x7C40,0x7C50,0x7C5C,0x7C5D,0x7C5F,0x7C6C,0x0000,0x0000,0x0000,0x0000,
0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
@@ -11862,7 +6617,6 @@
0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
- 0x0000,0x0000,0x0000,0x0000,0x0000,0x7A46,0x0000,0x0000,0x0000,0x0000,
0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
@@ -11873,24 +6627,104 @@
0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
+ 0x0000,0x212A,0x7C7E,0x2174,0x2170,0x2173,0x2175,0x7C7D,0x214A,0x214B,
+ 0x2176,0x215C,0x2124,0x215D,0x2125,0x213F,0x2330,0x2331,0x2332,0x2333,
+ 0x2334,0x2335,0x2336,0x2337,0x2338,0x2339,0x2127,0x2128,0x2163,0x2161,
+ 0x2164,0x2129,0x2177,0x2341,0x2342,0x2343,0x2344,0x2345,0x2346,0x2347,
+ 0x2348,0x2349,0x234A,0x234B,0x234C,0x234D,0x234E,0x234F,0x2350,0x2351,
+ 0x2352,0x2353,0x2354,0x2355,0x2356,0x2357,0x2358,0x2359,0x235A,0x214E,
+ 0x2140,0x214F,0x2130,0x2132,0x212E,0x2361,0x2362,0x2363,0x2364,0x2365,
+ 0x2366,0x2367,0x2368,0x2369,0x236A,0x236B,0x236C,0x236D,0x236E,0x236F,
+ 0x2370,0x2371,0x2372,0x2373,0x2374,0x2375,0x2376,0x2377,0x2378,0x2379,
+ 0x237A,0x2150,0x2143,0x2151,0x2141,0x0000,0x0000,0x00A1,0x00A2,0x00A3,
+ 0x00A4,0x00A5,0x00A6,0x00A7,0x00A8,0x00A9,0x00AA,0x00AB,0x00AC,0x00AD,
+ 0x00AE,0x00AF,0x00B0,0x00B1,0x00B2,0x00B3,0x00B4,0x00B5,0x00B6,0x00B7,
+ 0x00B8,0x00B9,0x00BA,0x00BB,0x00BC,0x00BD,0x00BE,0x00BF,0x00C0,0x00C1,
+ 0x00C2,0x00C3,0x00C4,0x00C5,0x00C6,0x00C7,0x00C8,0x00C9,0x00CA,0x00CB,
+ 0x00CC,0x00CD,0x00CE,0x00CF,0x00D0,0x00D1,0x00D2,0x00D3,0x00D4,0x00D5,
+ 0x00D6,0x00D7,0x00D8,0x00D9,0x00DA,0x00DB,0x00DC,0x00DD,0x00DE,0x00DF,
0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
+ 0x0000,0x0000,0x0000,0x0000,0x2171,0x2172,0x224C,0x2131,0x7C7C,0x216F,
0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
- 0x0000,0x0000,0x0000,0x0000,0x7C4F,0x0000,0x0000,0x0000,0x0000,0x0000,
0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
+ 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000
+};
+/*extern const unsigned short j2utable[];*/
+static const unsigned short j2utable[] = {
+ 0x3000,0x3001,0x3002,0xFF0C,0xFF0E,0x30FB,0xFF1A,0xFF1B,0xFF1F,0xFF01,
+ 0x309B,0x309C,0x00B4,0xFF40,0x00A8,0xFF3E,0xFFE3,0xFF3F,0x30FD,0x30FE,
+ 0x309D,0x309E,0x3003,0x4EDD,0x3005,0x3006,0x3007,0x30FC,0x2015,0x2010,
+ 0xFF0F,0xFF3C,0xFF5E,0x2225,0xFF5C,0x2026,0x2025,0x2018,0x2019,0x201C,
+ 0x201D,0xFF08,0xFF09,0x3014,0x3015,0xFF3B,0xFF3D,0xFF5B,0xFF5D,0x3008,
+ 0x3009,0x300A,0x300B,0x300C,0x300D,0x300E,0x300F,0x3010,0x3011,0xFF0B,
+ 0xFF0D,0x00B1,0x00D7,0x00F7,0xFF1D,0x2260,0xFF1C,0xFF1E,0x2266,0x2267,
+ 0x221E,0x2234,0x2642,0x2640,0x00B0,0x2032,0x2033,0x2103,0xFFE5,0xFF04,
+ 0xFFE0,0xFFE1,0xFF05,0xFF03,0xFF06,0xFF0A,0xFF20,0x00A7,0x2606,0x2605,
+ 0x25CB,0x25CF,0x25CE,0x25C7,0x25C6,0x25A1,0x25A0,0x25B3,0x25B2,0x25BD,
+ 0x25BC,0x203B,0x3012,0x2192,0x2190,0x2191,0x2193,0x3013,0x0000,0x0000,
+ 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2208,
+ 0x220B,0x2286,0x2287,0x2282,0x2283,0x222A,0x2229,0x0000,0x0000,0x0000,
+ 0x0000,0x0000,0x0000,0x0000,0x0000,0x2227,0x2228,0xFFE2,0x21D2,0x21D4,
+ 0x2200,0x2203,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
+ 0x0000,0x0000,0x0000,0x2220,0x22A5,0x2312,0x2202,0x2207,0x2261,0x2252,
+ 0x226A,0x226B,0x221A,0x223D,0x221D,0x2235,0x222B,0x222C,0x0000,0x0000,
+ 0x0000,0x0000,0x0000,0x0000,0x0000,0x212B,0x2030,0x266F,0x266D,0x266A,
+ 0x2020,0x2021,0x00B6,0x0000,0x0000,0x0000,0x0000,0x25EF,0x0000,0x0000,
0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
+ 0x0000,0x0000,0x0000,0xFF10,0xFF11,0xFF12,0xFF13,0xFF14,0xFF15,0xFF16,
+ 0xFF17,0xFF18,0xFF19,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
+ 0xFF21,0xFF22,0xFF23,0xFF24,0xFF25,0xFF26,0xFF27,0xFF28,0xFF29,0xFF2A,
+ 0xFF2B,0xFF2C,0xFF2D,0xFF2E,0xFF2F,0xFF30,0xFF31,0xFF32,0xFF33,0xFF34,
+ 0xFF35,0xFF36,0xFF37,0xFF38,0xFF39,0xFF3A,0x0000,0x0000,0x0000,0x0000,
+ 0x0000,0x0000,0xFF41,0xFF42,0xFF43,0xFF44,0xFF45,0xFF46,0xFF47,0xFF48,
+ 0xFF49,0xFF4A,0xFF4B,0xFF4C,0xFF4D,0xFF4E,0xFF4F,0xFF50,0xFF51,0xFF52,
+ 0xFF53,0xFF54,0xFF55,0xFF56,0xFF57,0xFF58,0xFF59,0xFF5A,0x0000,0x0000,
+ 0x0000,0x0000,0x3041,0x3042,0x3043,0x3044,0x3045,0x3046,0x3047,0x3048,
+ 0x3049,0x304A,0x304B,0x304C,0x304D,0x304E,0x304F,0x3050,0x3051,0x3052,
+ 0x3053,0x3054,0x3055,0x3056,0x3057,0x3058,0x3059,0x305A,0x305B,0x305C,
+ 0x305D,0x305E,0x305F,0x3060,0x3061,0x3062,0x3063,0x3064,0x3065,0x3066,
+ 0x3067,0x3068,0x3069,0x306A,0x306B,0x306C,0x306D,0x306E,0x306F,0x3070,
+ 0x3071,0x3072,0x3073,0x3074,0x3075,0x3076,0x3077,0x3078,0x3079,0x307A,
+ 0x307B,0x307C,0x307D,0x307E,0x307F,0x3080,0x3081,0x3082,0x3083,0x3084,
+ 0x3085,0x3086,0x3087,0x3088,0x3089,0x308A,0x308B,0x308C,0x308D,0x308E,
+ 0x308F,0x3090,0x3091,0x3092,0x3093,0x0000,0x0000,0x0000,0x0000,0x0000,
+ 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x30A1,0x30A2,0x30A3,0x30A4,
+ 0x30A5,0x30A6,0x30A7,0x30A8,0x30A9,0x30AA,0x30AB,0x30AC,0x30AD,0x30AE,
+ 0x30AF,0x30B0,0x30B1,0x30B2,0x30B3,0x30B4,0x30B5,0x30B6,0x30B7,0x30B8,
+ 0x30B9,0x30BA,0x30BB,0x30BC,0x30BD,0x30BE,0x30BF,0x30C0,0x30C1,0x30C2,
+ 0x30C3,0x30C4,0x30C5,0x30C6,0x30C7,0x30C8,0x30C9,0x30CA,0x30CB,0x30CC,
+ 0x30CD,0x30CE,0x30CF,0x30D0,0x30D1,0x30D2,0x30D3,0x30D4,0x30D5,0x30D6,
+ 0x30D7,0x30D8,0x30D9,0x30DA,0x30DB,0x30DC,0x30DD,0x30DE,0x30DF,0x30E0,
+ 0x30E1,0x30E2,0x30E3,0x30E4,0x30E5,0x30E6,0x30E7,0x30E8,0x30E9,0x30EA,
+ 0x30EB,0x30EC,0x30ED,0x30EE,0x30EF,0x30F0,0x30F1,0x30F2,0x30F3,0x30F4,
+ 0x30F5,0x30F6,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
+ 0x0391,0x0392,0x0393,0x0394,0x0395,0x0396,0x0397,0x0398,0x0399,0x039A,
+ 0x039B,0x039C,0x039D,0x039E,0x039F,0x03A0,0x03A1,0x03A3,0x03A4,0x03A5,
+ 0x03A6,0x03A7,0x03A8,0x03A9,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
+ 0x0000,0x0000,0x03B1,0x03B2,0x03B3,0x03B4,0x03B5,0x03B6,0x03B7,0x03B8,
+ 0x03B9,0x03BA,0x03BB,0x03BC,0x03BD,0x03BE,0x03BF,0x03C0,0x03C1,0x03C3,
+ 0x03C4,0x03C5,0x03C6,0x03C7,0x03C8,0x03C9,0x0000,0x0000,0x0000,0x0000,
0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
- 0x0000,0x0000,0x0000,0x0000,0x7954,0x795F,0x7960,0x7975,0x7A3E,0x7A4E,
- 0x7A50,0x7A7B,0x7B23,0x7B3A,0x7B42,0x7B43,0x7B44,0x7B46,0x7B4A,0x7B4D,
- 0x7B56,0x7B61,0x7B63,0x7B64,0x7B6D,0x7B75,0x7B77,0x7B78,0x7B7B,0x7C39,
- 0x7C40,0x7C50,0x7C5C,0x7C5D,0x7C5F,0x7C6C,0x0000,0x0000,0x0000,0x0000,
0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
+ 0x0000,0x0000,0x0000,0x0000,0x0410,0x0411,0x0412,0x0413,0x0414,0x0415,
+ 0x0401,0x0416,0x0417,0x0418,0x0419,0x041A,0x041B,0x041C,0x041D,0x041E,
+ 0x041F,0x0420,0x0421,0x0422,0x0423,0x0424,0x0425,0x0426,0x0427,0x0428,
+ 0x0429,0x042A,0x042B,0x042C,0x042D,0x042E,0x042F,0x0000,0x0000,0x0000,
0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
+ 0x0000,0x0000,0x0430,0x0431,0x0432,0x0433,0x0434,0x0435,0x0451,0x0436,
+ 0x0437,0x0438,0x0439,0x043A,0x043B,0x043C,0x043D,0x043E,0x043F,0x0440,
+ 0x0441,0x0442,0x0443,0x0444,0x0445,0x0446,0x0447,0x0448,0x0449,0x044A,
+ 0x044B,0x044C,0x044D,0x044E,0x044F,0x0000,0x0000,0x0000,0x0000,0x0000,
+ 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2500,0x2502,
+ 0x250C,0x2510,0x2518,0x2514,0x251C,0x252C,0x2524,0x2534,0x253C,0x2501,
+ 0x2503,0x250F,0x2513,0x251B,0x2517,0x2523,0x2533,0x252B,0x253B,0x254B,
+ 0x2520,0x252F,0x2528,0x2537,0x253F,0x251D,0x2530,0x2525,0x2538,0x2542,
0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
@@ -11934,6 +6768,16 @@
0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
+ 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2460,0x2461,
+ 0x2462,0x2463,0x2464,0x2465,0x2466,0x2467,0x2468,0x2469,0x246A,0x246B,
+ 0x246C,0x246D,0x246E,0x246F,0x2470,0x2471,0x2472,0x2473,0x2160,0x2161,
+ 0x2162,0x2163,0x2164,0x2165,0x2166,0x2167,0x2168,0x2169,0x0000,0x3349,
+ 0x3314,0x3322,0x334D,0x3318,0x3327,0x3303,0x3336,0x3351,0x3357,0x330D,
+ 0x3326,0x3323,0x332B,0x334A,0x333B,0x339C,0x339D,0x339E,0x338E,0x338F,
+ 0x33C4,0x33A1,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
+ 0x337B,0x301D,0x301F,0x2116,0x33CD,0x2121,0x32A4,0x32A5,0x32A6,0x32A7,
+ 0x32A8,0x3231,0x3232,0x3239,0x337E,0x337D,0x337C,0x0000,0x0000,0x0000,
+ 0x222E,0x2211,0x0000,0x0000,0x0000,0x221F,0x22BF,0x0000,0x0000,0x0000,
0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
@@ -11953,9 +6797,646 @@
0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
+ 0x4E9C,0x5516,0x5A03,0x963F,0x54C0,0x611B,0x6328,0x59F6,0x9022,0x8475,
+ 0x831C,0x7A50,0x60AA,0x63E1,0x6E25,0x65ED,0x8466,0x82A6,0x9BF5,0x6893,
+ 0x5727,0x65A1,0x6271,0x5B9B,0x59D0,0x867B,0x98F4,0x7D62,0x7DBE,0x9B8E,
+ 0x6216,0x7C9F,0x88B7,0x5B89,0x5EB5,0x6309,0x6697,0x6848,0x95C7,0x978D,
+ 0x674F,0x4EE5,0x4F0A,0x4F4D,0x4F9D,0x5049,0x56F2,0x5937,0x59D4,0x5A01,
+ 0x5C09,0x60DF,0x610F,0x6170,0x6613,0x6905,0x70BA,0x754F,0x7570,0x79FB,
+ 0x7DAD,0x7DEF,0x80C3,0x840E,0x8863,0x8B02,0x9055,0x907A,0x533B,0x4E95,
+ 0x4EA5,0x57DF,0x80B2,0x90C1,0x78EF,0x4E00,0x58F1,0x6EA2,0x9038,0x7A32,
+ 0x8328,0x828B,0x9C2F,0x5141,0x5370,0x54BD,0x54E1,0x56E0,0x59FB,0x5F15,
+ 0x98F2,0x6DEB,0x80E4,0x852D,0x9662,0x9670,0x96A0,0x97FB,0x540B,0x53F3,
+ 0x5B87,0x70CF,0x7FBD,0x8FC2,0x96E8,0x536F,0x9D5C,0x7ABA,0x4E11,0x7893,
+ 0x81FC,0x6E26,0x5618,0x5504,0x6B1D,0x851A,0x9C3B,0x59E5,0x53A9,0x6D66,
+ 0x74DC,0x958F,0x5642,0x4E91,0x904B,0x96F2,0x834F,0x990C,0x53E1,0x55B6,
+ 0x5B30,0x5F71,0x6620,0x66F3,0x6804,0x6C38,0x6CF3,0x6D29,0x745B,0x76C8,
+ 0x7A4E,0x9834,0x82F1,0x885B,0x8A60,0x92ED,0x6DB2,0x75AB,0x76CA,0x99C5,
+ 0x60A6,0x8B01,0x8D8A,0x95B2,0x698E,0x53AD,0x5186,0x5712,0x5830,0x5944,
+ 0x5BB4,0x5EF6,0x6028,0x63A9,0x63F4,0x6CBF,0x6F14,0x708E,0x7114,0x7159,
+ 0x71D5,0x733F,0x7E01,0x8276,0x82D1,0x8597,0x9060,0x925B,0x9D1B,0x5869,
+ 0x65BC,0x6C5A,0x7525,0x51F9,0x592E,0x5965,0x5F80,0x5FDC,0x62BC,0x65FA,
+ 0x6A2A,0x6B27,0x6BB4,0x738B,0x7FC1,0x8956,0x9D2C,0x9D0E,0x9EC4,0x5CA1,
+ 0x6C96,0x837B,0x5104,0x5C4B,0x61B6,0x81C6,0x6876,0x7261,0x4E59,0x4FFA,
+ 0x5378,0x6069,0x6E29,0x7A4F,0x97F3,0x4E0B,0x5316,0x4EEE,0x4F55,0x4F3D,
+ 0x4FA1,0x4F73,0x52A0,0x53EF,0x5609,0x590F,0x5AC1,0x5BB6,0x5BE1,0x79D1,
+ 0x6687,0x679C,0x67B6,0x6B4C,0x6CB3,0x706B,0x73C2,0x798D,0x79BE,0x7A3C,
+ 0x7B87,0x82B1,0x82DB,0x8304,0x8377,0x83EF,0x83D3,0x8766,0x8AB2,0x5629,
+ 0x8CA8,0x8FE6,0x904E,0x971E,0x868A,0x4FC4,0x5CE8,0x6211,0x7259,0x753B,
+ 0x81E5,0x82BD,0x86FE,0x8CC0,0x96C5,0x9913,0x99D5,0x4ECB,0x4F1A,0x89E3,
+ 0x56DE,0x584A,0x58CA,0x5EFB,0x5FEB,0x602A,0x6094,0x6062,0x61D0,0x6212,
+ 0x62D0,0x6539,0x9B41,0x6666,0x68B0,0x6D77,0x7070,0x754C,0x7686,0x7D75,
+ 0x82A5,0x87F9,0x958B,0x968E,0x8C9D,0x51F1,0x52BE,0x5916,0x54B3,0x5BB3,
+ 0x5D16,0x6168,0x6982,0x6DAF,0x788D,0x84CB,0x8857,0x8A72,0x93A7,0x9AB8,
+ 0x6D6C,0x99A8,0x86D9,0x57A3,0x67FF,0x86CE,0x920E,0x5283,0x5687,0x5404,
+ 0x5ED3,0x62E1,0x64B9,0x683C,0x6838,0x6BBB,0x7372,0x78BA,0x7A6B,0x899A,
+ 0x89D2,0x8D6B,0x8F03,0x90ED,0x95A3,0x9694,0x9769,0x5B66,0x5CB3,0x697D,
+ 0x984D,0x984E,0x639B,0x7B20,0x6A2B,0x6A7F,0x68B6,0x9C0D,0x6F5F,0x5272,
+ 0x559D,0x6070,0x62EC,0x6D3B,0x6E07,0x6ED1,0x845B,0x8910,0x8F44,0x4E14,
+ 0x9C39,0x53F6,0x691B,0x6A3A,0x9784,0x682A,0x515C,0x7AC3,0x84B2,0x91DC,
+ 0x938C,0x565B,0x9D28,0x6822,0x8305,0x8431,0x7CA5,0x5208,0x82C5,0x74E6,
+ 0x4E7E,0x4F83,0x51A0,0x5BD2,0x520A,0x52D8,0x52E7,0x5DFB,0x559A,0x582A,
+ 0x59E6,0x5B8C,0x5B98,0x5BDB,0x5E72,0x5E79,0x60A3,0x611F,0x6163,0x61BE,
+ 0x63DB,0x6562,0x67D1,0x6853,0x68FA,0x6B3E,0x6B53,0x6C57,0x6F22,0x6F97,
+ 0x6F45,0x74B0,0x7518,0x76E3,0x770B,0x7AFF,0x7BA1,0x7C21,0x7DE9,0x7F36,
+ 0x7FF0,0x809D,0x8266,0x839E,0x89B3,0x8ACC,0x8CAB,0x9084,0x9451,0x9593,
+ 0x9591,0x95A2,0x9665,0x97D3,0x9928,0x8218,0x4E38,0x542B,0x5CB8,0x5DCC,
+ 0x73A9,0x764C,0x773C,0x5CA9,0x7FEB,0x8D0B,0x96C1,0x9811,0x9854,0x9858,
+ 0x4F01,0x4F0E,0x5371,0x559C,0x5668,0x57FA,0x5947,0x5B09,0x5BC4,0x5C90,
+ 0x5E0C,0x5E7E,0x5FCC,0x63EE,0x673A,0x65D7,0x65E2,0x671F,0x68CB,0x68C4,
+ 0x6A5F,0x5E30,0x6BC5,0x6C17,0x6C7D,0x757F,0x7948,0x5B63,0x7A00,0x7D00,
+ 0x5FBD,0x898F,0x8A18,0x8CB4,0x8D77,0x8ECC,0x8F1D,0x98E2,0x9A0E,0x9B3C,
+ 0x4E80,0x507D,0x5100,0x5993,0x5B9C,0x622F,0x6280,0x64EC,0x6B3A,0x72A0,
+ 0x7591,0x7947,0x7FA9,0x87FB,0x8ABC,0x8B70,0x63AC,0x83CA,0x97A0,0x5409,
+ 0x5403,0x55AB,0x6854,0x6A58,0x8A70,0x7827,0x6775,0x9ECD,0x5374,0x5BA2,
+ 0x811A,0x8650,0x9006,0x4E18,0x4E45,0x4EC7,0x4F11,0x53CA,0x5438,0x5BAE,
+ 0x5F13,0x6025,0x6551,0x673D,0x6C42,0x6C72,0x6CE3,0x7078,0x7403,0x7A76,
+ 0x7AAE,0x7B08,0x7D1A,0x7CFE,0x7D66,0x65E7,0x725B,0x53BB,0x5C45,0x5DE8,
+ 0x62D2,0x62E0,0x6319,0x6E20,0x865A,0x8A31,0x8DDD,0x92F8,0x6F01,0x79A6,
+ 0x9B5A,0x4EA8,0x4EAB,0x4EAC,0x4F9B,0x4FA0,0x50D1,0x5147,0x7AF6,0x5171,
+ 0x51F6,0x5354,0x5321,0x537F,0x53EB,0x55AC,0x5883,0x5CE1,0x5F37,0x5F4A,
+ 0x602F,0x6050,0x606D,0x631F,0x6559,0x6A4B,0x6CC1,0x72C2,0x72ED,0x77EF,
+ 0x80F8,0x8105,0x8208,0x854E,0x90F7,0x93E1,0x97FF,0x9957,0x9A5A,0x4EF0,
+ 0x51DD,0x5C2D,0x6681,0x696D,0x5C40,0x66F2,0x6975,0x7389,0x6850,0x7C81,
+ 0x50C5,0x52E4,0x5747,0x5DFE,0x9326,0x65A4,0x6B23,0x6B3D,0x7434,0x7981,
+ 0x79BD,0x7B4B,0x7DCA,0x82B9,0x83CC,0x887F,0x895F,0x8B39,0x8FD1,0x91D1,
+ 0x541F,0x9280,0x4E5D,0x5036,0x53E5,0x533A,0x72D7,0x7396,0x77E9,0x82E6,
+ 0x8EAF,0x99C6,0x99C8,0x99D2,0x5177,0x611A,0x865E,0x55B0,0x7A7A,0x5076,
+ 0x5BD3,0x9047,0x9685,0x4E32,0x6ADB,0x91E7,0x5C51,0x5C48,0x6398,0x7A9F,
+ 0x6C93,0x9774,0x8F61,0x7AAA,0x718A,0x9688,0x7C82,0x6817,0x7E70,0x6851,
+ 0x936C,0x52F2,0x541B,0x85AB,0x8A13,0x7FA4,0x8ECD,0x90E1,0x5366,0x8888,
+ 0x7941,0x4FC2,0x50BE,0x5211,0x5144,0x5553,0x572D,0x73EA,0x578B,0x5951,
+ 0x5F62,0x5F84,0x6075,0x6176,0x6167,0x61A9,0x63B2,0x643A,0x656C,0x666F,
+ 0x6842,0x6E13,0x7566,0x7A3D,0x7CFB,0x7D4C,0x7D99,0x7E4B,0x7F6B,0x830E,
+ 0x834A,0x86CD,0x8A08,0x8A63,0x8B66,0x8EFD,0x981A,0x9D8F,0x82B8,0x8FCE,
+ 0x9BE8,0x5287,0x621F,0x6483,0x6FC0,0x9699,0x6841,0x5091,0x6B20,0x6C7A,
+ 0x6F54,0x7A74,0x7D50,0x8840,0x8A23,0x6708,0x4EF6,0x5039,0x5026,0x5065,
+ 0x517C,0x5238,0x5263,0x55A7,0x570F,0x5805,0x5ACC,0x5EFA,0x61B2,0x61F8,
+ 0x62F3,0x6372,0x691C,0x6A29,0x727D,0x72AC,0x732E,0x7814,0x786F,0x7D79,
+ 0x770C,0x80A9,0x898B,0x8B19,0x8CE2,0x8ED2,0x9063,0x9375,0x967A,0x9855,
+ 0x9A13,0x9E78,0x5143,0x539F,0x53B3,0x5E7B,0x5F26,0x6E1B,0x6E90,0x7384,
+ 0x73FE,0x7D43,0x8237,0x8A00,0x8AFA,0x9650,0x4E4E,0x500B,0x53E4,0x547C,
+ 0x56FA,0x59D1,0x5B64,0x5DF1,0x5EAB,0x5F27,0x6238,0x6545,0x67AF,0x6E56,
+ 0x72D0,0x7CCA,0x88B4,0x80A1,0x80E1,0x83F0,0x864E,0x8A87,0x8DE8,0x9237,
+ 0x96C7,0x9867,0x9F13,0x4E94,0x4E92,0x4F0D,0x5348,0x5449,0x543E,0x5A2F,
+ 0x5F8C,0x5FA1,0x609F,0x68A7,0x6A8E,0x745A,0x7881,0x8A9E,0x8AA4,0x8B77,
+ 0x9190,0x4E5E,0x9BC9,0x4EA4,0x4F7C,0x4FAF,0x5019,0x5016,0x5149,0x516C,
+ 0x529F,0x52B9,0x52FE,0x539A,0x53E3,0x5411,0x540E,0x5589,0x5751,0x57A2,
+ 0x597D,0x5B54,0x5B5D,0x5B8F,0x5DE5,0x5DE7,0x5DF7,0x5E78,0x5E83,0x5E9A,
+ 0x5EB7,0x5F18,0x6052,0x614C,0x6297,0x62D8,0x63A7,0x653B,0x6602,0x6643,
+ 0x66F4,0x676D,0x6821,0x6897,0x69CB,0x6C5F,0x6D2A,0x6D69,0x6E2F,0x6E9D,
+ 0x7532,0x7687,0x786C,0x7A3F,0x7CE0,0x7D05,0x7D18,0x7D5E,0x7DB1,0x8015,
+ 0x8003,0x80AF,0x80B1,0x8154,0x818F,0x822A,0x8352,0x884C,0x8861,0x8B1B,
+ 0x8CA2,0x8CFC,0x90CA,0x9175,0x9271,0x783F,0x92FC,0x95A4,0x964D,0x9805,
+ 0x9999,0x9AD8,0x9D3B,0x525B,0x52AB,0x53F7,0x5408,0x58D5,0x62F7,0x6FE0,
+ 0x8C6A,0x8F5F,0x9EB9,0x514B,0x523B,0x544A,0x56FD,0x7A40,0x9177,0x9D60,
+ 0x9ED2,0x7344,0x6F09,0x8170,0x7511,0x5FFD,0x60DA,0x9AA8,0x72DB,0x8FBC,
+ 0x6B64,0x9803,0x4ECA,0x56F0,0x5764,0x58BE,0x5A5A,0x6068,0x61C7,0x660F,
+ 0x6606,0x6839,0x68B1,0x6DF7,0x75D5,0x7D3A,0x826E,0x9B42,0x4E9B,0x4F50,
+ 0x53C9,0x5506,0x5D6F,0x5DE6,0x5DEE,0x67FB,0x6C99,0x7473,0x7802,0x8A50,
+ 0x9396,0x88DF,0x5750,0x5EA7,0x632B,0x50B5,0x50AC,0x518D,0x6700,0x54C9,
+ 0x585E,0x59BB,0x5BB0,0x5F69,0x624D,0x63A1,0x683D,0x6B73,0x6E08,0x707D,
+ 0x91C7,0x7280,0x7815,0x7826,0x796D,0x658E,0x7D30,0x83DC,0x88C1,0x8F09,
+ 0x969B,0x5264,0x5728,0x6750,0x7F6A,0x8CA1,0x51B4,0x5742,0x962A,0x583A,
+ 0x698A,0x80B4,0x54B2,0x5D0E,0x57FC,0x7895,0x9DFA,0x4F5C,0x524A,0x548B,
+ 0x643E,0x6628,0x6714,0x67F5,0x7A84,0x7B56,0x7D22,0x932F,0x685C,0x9BAD,
+ 0x7B39,0x5319,0x518A,0x5237,0x5BDF,0x62F6,0x64AE,0x64E6,0x672D,0x6BBA,
+ 0x85A9,0x96D1,0x7690,0x9BD6,0x634C,0x9306,0x9BAB,0x76BF,0x6652,0x4E09,
+ 0x5098,0x53C2,0x5C71,0x60E8,0x6492,0x6563,0x685F,0x71E6,0x73CA,0x7523,
+ 0x7B97,0x7E82,0x8695,0x8B83,0x8CDB,0x9178,0x9910,0x65AC,0x66AB,0x6B8B,
+ 0x4ED5,0x4ED4,0x4F3A,0x4F7F,0x523A,0x53F8,0x53F2,0x55E3,0x56DB,0x58EB,
+ 0x59CB,0x59C9,0x59FF,0x5B50,0x5C4D,0x5E02,0x5E2B,0x5FD7,0x601D,0x6307,
+ 0x652F,0x5B5C,0x65AF,0x65BD,0x65E8,0x679D,0x6B62,0x6B7B,0x6C0F,0x7345,
+ 0x7949,0x79C1,0x7CF8,0x7D19,0x7D2B,0x80A2,0x8102,0x81F3,0x8996,0x8A5E,
+ 0x8A69,0x8A66,0x8A8C,0x8AEE,0x8CC7,0x8CDC,0x96CC,0x98FC,0x6B6F,0x4E8B,
+ 0x4F3C,0x4F8D,0x5150,0x5B57,0x5BFA,0x6148,0x6301,0x6642,0x6B21,0x6ECB,
+ 0x6CBB,0x723E,0x74BD,0x75D4,0x78C1,0x793A,0x800C,0x8033,0x81EA,0x8494,
+ 0x8F9E,0x6C50,0x9E7F,0x5F0F,0x8B58,0x9D2B,0x7AFA,0x8EF8,0x5B8D,0x96EB,
+ 0x4E03,0x53F1,0x57F7,0x5931,0x5AC9,0x5BA4,0x6089,0x6E7F,0x6F06,0x75BE,
+ 0x8CEA,0x5B9F,0x8500,0x7BE0,0x5072,0x67F4,0x829D,0x5C61,0x854A,0x7E1E,
+ 0x820E,0x5199,0x5C04,0x6368,0x8D66,0x659C,0x716E,0x793E,0x7D17,0x8005,
+ 0x8B1D,0x8ECA,0x906E,0x86C7,0x90AA,0x501F,0x52FA,0x5C3A,0x6753,0x707C,
+ 0x7235,0x914C,0x91C8,0x932B,0x82E5,0x5BC2,0x5F31,0x60F9,0x4E3B,0x53D6,
+ 0x5B88,0x624B,0x6731,0x6B8A,0x72E9,0x73E0,0x7A2E,0x816B,0x8DA3,0x9152,
+ 0x9996,0x5112,0x53D7,0x546A,0x5BFF,0x6388,0x6A39,0x7DAC,0x9700,0x56DA,
+ 0x53CE,0x5468,0x5B97,0x5C31,0x5DDE,0x4FEE,0x6101,0x62FE,0x6D32,0x79C0,
+ 0x79CB,0x7D42,0x7E4D,0x7FD2,0x81ED,0x821F,0x8490,0x8846,0x8972,0x8B90,
+ 0x8E74,0x8F2F,0x9031,0x914B,0x916C,0x96C6,0x919C,0x4EC0,0x4F4F,0x5145,
+ 0x5341,0x5F93,0x620E,0x67D4,0x6C41,0x6E0B,0x7363,0x7E26,0x91CD,0x9283,
+ 0x53D4,0x5919,0x5BBF,0x6DD1,0x795D,0x7E2E,0x7C9B,0x587E,0x719F,0x51FA,
+ 0x8853,0x8FF0,0x4FCA,0x5CFB,0x6625,0x77AC,0x7AE3,0x821C,0x99FF,0x51C6,
+ 0x5FAA,0x65EC,0x696F,0x6B89,0x6DF3,0x6E96,0x6F64,0x76FE,0x7D14,0x5DE1,
+ 0x9075,0x9187,0x9806,0x51E6,0x521D,0x6240,0x6691,0x66D9,0x6E1A,0x5EB6,
+ 0x7DD2,0x7F72,0x66F8,0x85AF,0x85F7,0x8AF8,0x52A9,0x53D9,0x5973,0x5E8F,
+ 0x5F90,0x6055,0x92E4,0x9664,0x50B7,0x511F,0x52DD,0x5320,0x5347,0x53EC,
+ 0x54E8,0x5546,0x5531,0x5617,0x5968,0x59BE,0x5A3C,0x5BB5,0x5C06,0x5C0F,
+ 0x5C11,0x5C1A,0x5E84,0x5E8A,0x5EE0,0x5F70,0x627F,0x6284,0x62DB,0x638C,
+ 0x6377,0x6607,0x660C,0x662D,0x6676,0x677E,0x68A2,0x6A1F,0x6A35,0x6CBC,
+ 0x6D88,0x6E09,0x6E58,0x713C,0x7126,0x7167,0x75C7,0x7701,0x785D,0x7901,
+ 0x7965,0x79F0,0x7AE0,0x7B11,0x7CA7,0x7D39,0x8096,0x83D6,0x848B,0x8549,
+ 0x885D,0x88F3,0x8A1F,0x8A3C,0x8A54,0x8A73,0x8C61,0x8CDE,0x91A4,0x9266,
+ 0x937E,0x9418,0x969C,0x9798,0x4E0A,0x4E08,0x4E1E,0x4E57,0x5197,0x5270,
+ 0x57CE,0x5834,0x58CC,0x5B22,0x5E38,0x60C5,0x64FE,0x6761,0x6756,0x6D44,
+ 0x72B6,0x7573,0x7A63,0x84B8,0x8B72,0x91B8,0x9320,0x5631,0x57F4,0x98FE,
+ 0x62ED,0x690D,0x6B96,0x71ED,0x7E54,0x8077,0x8272,0x89E6,0x98DF,0x8755,
+ 0x8FB1,0x5C3B,0x4F38,0x4FE1,0x4FB5,0x5507,0x5A20,0x5BDD,0x5BE9,0x5FC3,
+ 0x614E,0x632F,0x65B0,0x664B,0x68EE,0x699B,0x6D78,0x6DF1,0x7533,0x75B9,
+ 0x771F,0x795E,0x79E6,0x7D33,0x81E3,0x82AF,0x85AA,0x89AA,0x8A3A,0x8EAB,
+ 0x8F9B,0x9032,0x91DD,0x9707,0x4EBA,0x4EC1,0x5203,0x5875,0x58EC,0x5C0B,
+ 0x751A,0x5C3D,0x814E,0x8A0A,0x8FC5,0x9663,0x976D,0x7B25,0x8ACF,0x9808,
+ 0x9162,0x56F3,0x53A8,0x9017,0x5439,0x5782,0x5E25,0x63A8,0x6C34,0x708A,
+ 0x7761,0x7C8B,0x7FE0,0x8870,0x9042,0x9154,0x9310,0x9318,0x968F,0x745E,
+ 0x9AC4,0x5D07,0x5D69,0x6570,0x67A2,0x8DA8,0x96DB,0x636E,0x6749,0x6919,
+ 0x83C5,0x9817,0x96C0,0x88FE,0x6F84,0x647A,0x5BF8,0x4E16,0x702C,0x755D,
+ 0x662F,0x51C4,0x5236,0x52E2,0x59D3,0x5F81,0x6027,0x6210,0x653F,0x6574,
+ 0x661F,0x6674,0x68F2,0x6816,0x6B63,0x6E05,0x7272,0x751F,0x76DB,0x7CBE,
+ 0x8056,0x58F0,0x88FD,0x897F,0x8AA0,0x8A93,0x8ACB,0x901D,0x9192,0x9752,
+ 0x9759,0x6589,0x7A0E,0x8106,0x96BB,0x5E2D,0x60DC,0x621A,0x65A5,0x6614,
+ 0x6790,0x77F3,0x7A4D,0x7C4D,0x7E3E,0x810A,0x8CAC,0x8D64,0x8DE1,0x8E5F,
+ 0x78A9,0x5207,0x62D9,0x63A5,0x6442,0x6298,0x8A2D,0x7A83,0x7BC0,0x8AAC,
+ 0x96EA,0x7D76,0x820C,0x8749,0x4ED9,0x5148,0x5343,0x5360,0x5BA3,0x5C02,
+ 0x5C16,0x5DDD,0x6226,0x6247,0x64B0,0x6813,0x6834,0x6CC9,0x6D45,0x6D17,
+ 0x67D3,0x6F5C,0x714E,0x717D,0x65CB,0x7A7F,0x7BAD,0x7DDA,0x7E4A,0x7FA8,
+ 0x817A,0x821B,0x8239,0x85A6,0x8A6E,0x8CCE,0x8DF5,0x9078,0x9077,0x92AD,
+ 0x9291,0x9583,0x9BAE,0x524D,0x5584,0x6F38,0x7136,0x5168,0x7985,0x7E55,
+ 0x81B3,0x7CCE,0x564C,0x5851,0x5CA8,0x63AA,0x66FE,0x66FD,0x695A,0x72D9,
+ 0x758F,0x758E,0x790E,0x7956,0x79DF,0x7C97,0x7D20,0x7D44,0x8607,0x8A34,
+ 0x963B,0x9061,0x9F20,0x50E7,0x5275,0x53CC,0x53E2,0x5009,0x55AA,0x58EE,
+ 0x594F,0x723D,0x5B8B,0x5C64,0x531D,0x60E3,0x60F3,0x635C,0x6383,0x633F,
+ 0x63BB,0x64CD,0x65E9,0x66F9,0x5DE3,0x69CD,0x69FD,0x6F15,0x71E5,0x4E89,
+ 0x75E9,0x76F8,0x7A93,0x7CDF,0x7DCF,0x7D9C,0x8061,0x8349,0x8358,0x846C,
+ 0x84BC,0x85FB,0x88C5,0x8D70,0x9001,0x906D,0x9397,0x971C,0x9A12,0x50CF,
+ 0x5897,0x618E,0x81D3,0x8535,0x8D08,0x9020,0x4FC3,0x5074,0x5247,0x5373,
+ 0x606F,0x6349,0x675F,0x6E2C,0x8DB3,0x901F,0x4FD7,0x5C5E,0x8CCA,0x65CF,
+ 0x7D9A,0x5352,0x8896,0x5176,0x63C3,0x5B58,0x5B6B,0x5C0A,0x640D,0x6751,
+ 0x905C,0x4ED6,0x591A,0x592A,0x6C70,0x8A51,0x553E,0x5815,0x59A5,0x60F0,
+ 0x6253,0x67C1,0x8235,0x6955,0x9640,0x99C4,0x9A28,0x4F53,0x5806,0x5BFE,
+ 0x8010,0x5CB1,0x5E2F,0x5F85,0x6020,0x614B,0x6234,0x66FF,0x6CF0,0x6EDE,
+ 0x80CE,0x817F,0x82D4,0x888B,0x8CB8,0x9000,0x902E,0x968A,0x9EDB,0x9BDB,
+ 0x4EE3,0x53F0,0x5927,0x7B2C,0x918D,0x984C,0x9DF9,0x6EDD,0x7027,0x5353,
+ 0x5544,0x5B85,0x6258,0x629E,0x62D3,0x6CA2,0x6FEF,0x7422,0x8A17,0x9438,
+ 0x6FC1,0x8AFE,0x8338,0x51E7,0x86F8,0x53EA,0x53E9,0x4F46,0x9054,0x8FB0,
+ 0x596A,0x8131,0x5DFD,0x7AEA,0x8FBF,0x68DA,0x8C37,0x72F8,0x9C48,0x6A3D,
+ 0x8AB0,0x4E39,0x5358,0x5606,0x5766,0x62C5,0x63A2,0x65E6,0x6B4E,0x6DE1,
+ 0x6E5B,0x70AD,0x77ED,0x7AEF,0x7BAA,0x7DBB,0x803D,0x80C6,0x86CB,0x8A95,
+ 0x935B,0x56E3,0x58C7,0x5F3E,0x65AD,0x6696,0x6A80,0x6BB5,0x7537,0x8AC7,
+ 0x5024,0x77E5,0x5730,0x5F1B,0x6065,0x667A,0x6C60,0x75F4,0x7A1A,0x7F6E,
+ 0x81F4,0x8718,0x9045,0x99B3,0x7BC9,0x755C,0x7AF9,0x7B51,0x84C4,0x9010,
+ 0x79E9,0x7A92,0x8336,0x5AE1,0x7740,0x4E2D,0x4EF2,0x5B99,0x5FE0,0x62BD,
+ 0x663C,0x67F1,0x6CE8,0x866B,0x8877,0x8A3B,0x914E,0x92F3,0x99D0,0x6A17,
+ 0x7026,0x732A,0x82E7,0x8457,0x8CAF,0x4E01,0x5146,0x51CB,0x558B,0x5BF5,
+ 0x5E16,0x5E33,0x5E81,0x5F14,0x5F35,0x5F6B,0x5FB4,0x61F2,0x6311,0x66A2,
+ 0x671D,0x6F6E,0x7252,0x753A,0x773A,0x8074,0x8139,0x8178,0x8776,0x8ABF,
+ 0x8ADC,0x8D85,0x8DF3,0x929A,0x9577,0x9802,0x9CE5,0x52C5,0x6357,0x76F4,
+ 0x6715,0x6C88,0x73CD,0x8CC3,0x93AE,0x9673,0x6D25,0x589C,0x690E,0x69CC,
+ 0x8FFD,0x939A,0x75DB,0x901A,0x585A,0x6802,0x63B4,0x69FB,0x4F43,0x6F2C,
+ 0x67D8,0x8FBB,0x8526,0x7DB4,0x9354,0x693F,0x6F70,0x576A,0x58F7,0x5B2C,
+ 0x7D2C,0x722A,0x540A,0x91E3,0x9DB4,0x4EAD,0x4F4E,0x505C,0x5075,0x5243,
+ 0x8C9E,0x5448,0x5824,0x5B9A,0x5E1D,0x5E95,0x5EAD,0x5EF7,0x5F1F,0x608C,
+ 0x62B5,0x633A,0x63D0,0x68AF,0x6C40,0x7887,0x798E,0x7A0B,0x7DE0,0x8247,
+ 0x8A02,0x8AE6,0x8E44,0x9013,0x90B8,0x912D,0x91D8,0x9F0E,0x6CE5,0x6458,
+ 0x64E2,0x6575,0x6EF4,0x7684,0x7B1B,0x9069,0x93D1,0x6EBA,0x54F2,0x5FB9,
+ 0x64A4,0x8F4D,0x8FED,0x9244,0x5178,0x586B,0x5929,0x5C55,0x5E97,0x6DFB,
+ 0x7E8F,0x751C,0x8CBC,0x8EE2,0x985B,0x70B9,0x4F1D,0x6BBF,0x6FB1,0x7530,
+ 0x96FB,0x514E,0x5410,0x5835,0x5857,0x59AC,0x5C60,0x5F92,0x6597,0x675C,
+ 0x6E21,0x767B,0x83DF,0x8CED,0x9014,0x90FD,0x934D,0x7825,0x783A,0x52AA,
+ 0x5EA6,0x571F,0x5974,0x6012,0x5012,0x515A,0x51AC,0x51CD,0x5200,0x5510,
+ 0x5854,0x5858,0x5957,0x5B95,0x5CF6,0x5D8B,0x60BC,0x6295,0x642D,0x6771,
+ 0x6843,0x68BC,0x68DF,0x76D7,0x6DD8,0x6E6F,0x6D9B,0x706F,0x71C8,0x5F53,
+ 0x75D8,0x7977,0x7B49,0x7B54,0x7B52,0x7CD6,0x7D71,0x5230,0x8463,0x8569,
+ 0x85E4,0x8A0E,0x8B04,0x8C46,0x8E0F,0x9003,0x900F,0x9419,0x9676,0x982D,
+ 0x9A30,0x95D8,0x50CD,0x52D5,0x540C,0x5802,0x5C0E,0x61A7,0x649E,0x6D1E,
+ 0x77B3,0x7AE5,0x80F4,0x8404,0x9053,0x9285,0x5CE0,0x9D07,0x533F,0x5F97,
+ 0x5FB3,0x6D9C,0x7279,0x7763,0x79BF,0x7BE4,0x6BD2,0x72EC,0x8AAD,0x6803,
+ 0x6A61,0x51F8,0x7A81,0x6934,0x5C4A,0x9CF6,0x82EB,0x5BC5,0x9149,0x701E,
+ 0x5678,0x5C6F,0x60C7,0x6566,0x6C8C,0x8C5A,0x9041,0x9813,0x5451,0x66C7,
+ 0x920D,0x5948,0x90A3,0x5185,0x4E4D,0x51EA,0x8599,0x8B0E,0x7058,0x637A,
+ 0x934B,0x6962,0x99B4,0x7E04,0x7577,0x5357,0x6960,0x8EDF,0x96E3,0x6C5D,
+ 0x4E8C,0x5C3C,0x5F10,0x8FE9,0x5302,0x8CD1,0x8089,0x8679,0x5EFF,0x65E5,
+ 0x4E73,0x5165,0x5982,0x5C3F,0x97EE,0x4EFB,0x598A,0x5FCD,0x8A8D,0x6FE1,
+ 0x79B0,0x7962,0x5BE7,0x8471,0x732B,0x71B1,0x5E74,0x5FF5,0x637B,0x649A,
+ 0x71C3,0x7C98,0x4E43,0x5EFC,0x4E4B,0x57DC,0x56A2,0x60A9,0x6FC3,0x7D0D,
+ 0x80FD,0x8133,0x81BF,0x8FB2,0x8997,0x86A4,0x5DF4,0x628A,0x64AD,0x8987,
+ 0x6777,0x6CE2,0x6D3E,0x7436,0x7834,0x5A46,0x7F75,0x82AD,0x99AC,0x4FF3,
+ 0x5EC3,0x62DD,0x6392,0x6557,0x676F,0x76C3,0x724C,0x80CC,0x80BA,0x8F29,
+ 0x914D,0x500D,0x57F9,0x5A92,0x6885,0x6973,0x7164,0x72FD,0x8CB7,0x58F2,
+ 0x8CE0,0x966A,0x9019,0x877F,0x79E4,0x77E7,0x8429,0x4F2F,0x5265,0x535A,
+ 0x62CD,0x67CF,0x6CCA,0x767D,0x7B94,0x7C95,0x8236,0x8584,0x8FEB,0x66DD,
+ 0x6F20,0x7206,0x7E1B,0x83AB,0x99C1,0x9EA6,0x51FD,0x7BB1,0x7872,0x7BB8,
+ 0x8087,0x7B48,0x6AE8,0x5E61,0x808C,0x7551,0x7560,0x516B,0x9262,0x6E8C,
+ 0x767A,0x9197,0x9AEA,0x4F10,0x7F70,0x629C,0x7B4F,0x95A5,0x9CE9,0x567A,
+ 0x5859,0x86E4,0x96BC,0x4F34,0x5224,0x534A,0x53CD,0x53DB,0x5E06,0x642C,
+ 0x6591,0x677F,0x6C3E,0x6C4E,0x7248,0x72AF,0x73ED,0x7554,0x7E41,0x822C,
+ 0x85E9,0x8CA9,0x7BC4,0x91C6,0x7169,0x9812,0x98EF,0x633D,0x6669,0x756A,
+ 0x76E4,0x78D0,0x8543,0x86EE,0x532A,0x5351,0x5426,0x5983,0x5E87,0x5F7C,
+ 0x60B2,0x6249,0x6279,0x62AB,0x6590,0x6BD4,0x6CCC,0x75B2,0x76AE,0x7891,
+ 0x79D8,0x7DCB,0x7F77,0x80A5,0x88AB,0x8AB9,0x8CBB,0x907F,0x975E,0x98DB,
+ 0x6A0B,0x7C38,0x5099,0x5C3E,0x5FAE,0x6787,0x6BD8,0x7435,0x7709,0x7F8E,
+ 0x9F3B,0x67CA,0x7A17,0x5339,0x758B,0x9AED,0x5F66,0x819D,0x83F1,0x8098,
+ 0x5F3C,0x5FC5,0x7562,0x7B46,0x903C,0x6867,0x59EB,0x5A9B,0x7D10,0x767E,
+ 0x8B2C,0x4FF5,0x5F6A,0x6A19,0x6C37,0x6F02,0x74E2,0x7968,0x8868,0x8A55,
+ 0x8C79,0x5EDF,0x63CF,0x75C5,0x79D2,0x82D7,0x9328,0x92F2,0x849C,0x86ED,
+ 0x9C2D,0x54C1,0x5F6C,0x658C,0x6D5C,0x7015,0x8CA7,0x8CD3,0x983B,0x654F,
+ 0x74F6,0x4E0D,0x4ED8,0x57E0,0x592B,0x5A66,0x5BCC,0x51A8,0x5E03,0x5E9C,
+ 0x6016,0x6276,0x6577,0x65A7,0x666E,0x6D6E,0x7236,0x7B26,0x8150,0x819A,
+ 0x8299,0x8B5C,0x8CA0,0x8CE6,0x8D74,0x961C,0x9644,0x4FAE,0x64AB,0x6B66,
+ 0x821E,0x8461,0x856A,0x90E8,0x5C01,0x6953,0x98A8,0x847A,0x8557,0x4F0F,
+ 0x526F,0x5FA9,0x5E45,0x670D,0x798F,0x8179,0x8907,0x8986,0x6DF5,0x5F17,
+ 0x6255,0x6CB8,0x4ECF,0x7269,0x9B92,0x5206,0x543B,0x5674,0x58B3,0x61A4,
+ 0x626E,0x711A,0x596E,0x7C89,0x7CDE,0x7D1B,0x96F0,0x6587,0x805E,0x4E19,
+ 0x4F75,0x5175,0x5840,0x5E63,0x5E73,0x5F0A,0x67C4,0x4E26,0x853D,0x9589,
+ 0x965B,0x7C73,0x9801,0x50FB,0x58C1,0x7656,0x78A7,0x5225,0x77A5,0x8511,
+ 0x7B86,0x504F,0x5909,0x7247,0x7BC7,0x7DE8,0x8FBA,0x8FD4,0x904D,0x4FBF,
+ 0x52C9,0x5A29,0x5F01,0x97AD,0x4FDD,0x8217,0x92EA,0x5703,0x6355,0x6B69,
+ 0x752B,0x88DC,0x8F14,0x7A42,0x52DF,0x5893,0x6155,0x620A,0x66AE,0x6BCD,
+ 0x7C3F,0x83E9,0x5023,0x4FF8,0x5305,0x5446,0x5831,0x5949,0x5B9D,0x5CF0,
+ 0x5CEF,0x5D29,0x5E96,0x62B1,0x6367,0x653E,0x65B9,0x670B,0x6CD5,0x6CE1,
+ 0x70F9,0x7832,0x7E2B,0x80DE,0x82B3,0x840C,0x84EC,0x8702,0x8912,0x8A2A,
+ 0x8C4A,0x90A6,0x92D2,0x98FD,0x9CF3,0x9D6C,0x4E4F,0x4EA1,0x508D,0x5256,
+ 0x574A,0x59A8,0x5E3D,0x5FD8,0x5FD9,0x623F,0x66B4,0x671B,0x67D0,0x68D2,
+ 0x5192,0x7D21,0x80AA,0x81A8,0x8B00,0x8C8C,0x8CBF,0x927E,0x9632,0x5420,
+ 0x982C,0x5317,0x50D5,0x535C,0x58A8,0x64B2,0x6734,0x7267,0x7766,0x7A46,
+ 0x91E6,0x52C3,0x6CA1,0x6B86,0x5800,0x5E4C,0x5954,0x672C,0x7FFB,0x51E1,
+ 0x76C6,0x6469,0x78E8,0x9B54,0x9EBB,0x57CB,0x59B9,0x6627,0x679A,0x6BCE,
+ 0x54E9,0x69D9,0x5E55,0x819C,0x6795,0x9BAA,0x67FE,0x9C52,0x685D,0x4EA6,
+ 0x4FE3,0x53C8,0x62B9,0x672B,0x6CAB,0x8FC4,0x4FAD,0x7E6D,0x9EBF,0x4E07,
+ 0x6162,0x6E80,0x6F2B,0x8513,0x5473,0x672A,0x9B45,0x5DF3,0x7B95,0x5CAC,
+ 0x5BC6,0x871C,0x6E4A,0x84D1,0x7A14,0x8108,0x5999,0x7C8D,0x6C11,0x7720,
+ 0x52D9,0x5922,0x7121,0x725F,0x77DB,0x9727,0x9D61,0x690B,0x5A7F,0x5A18,
+ 0x51A5,0x540D,0x547D,0x660E,0x76DF,0x8FF7,0x9298,0x9CF4,0x59EA,0x725D,
+ 0x6EC5,0x514D,0x68C9,0x7DBF,0x7DEC,0x9762,0x9EBA,0x6478,0x6A21,0x8302,
+ 0x5984,0x5B5F,0x6BDB,0x731B,0x76F2,0x7DB2,0x8017,0x8499,0x5132,0x6728,
+ 0x9ED9,0x76EE,0x6762,0x52FF,0x9905,0x5C24,0x623B,0x7C7E,0x8CB0,0x554F,
+ 0x60B6,0x7D0B,0x9580,0x5301,0x4E5F,0x51B6,0x591C,0x723A,0x8036,0x91CE,
+ 0x5F25,0x77E2,0x5384,0x5F79,0x7D04,0x85AC,0x8A33,0x8E8D,0x9756,0x67F3,
+ 0x85AE,0x9453,0x6109,0x6108,0x6CB9,0x7652,0x8AED,0x8F38,0x552F,0x4F51,
+ 0x512A,0x52C7,0x53CB,0x5BA5,0x5E7D,0x60A0,0x6182,0x63D6,0x6709,0x67DA,
+ 0x6E67,0x6D8C,0x7336,0x7337,0x7531,0x7950,0x88D5,0x8A98,0x904A,0x9091,
+ 0x90F5,0x96C4,0x878D,0x5915,0x4E88,0x4F59,0x4E0E,0x8A89,0x8F3F,0x9810,
+ 0x50AD,0x5E7C,0x5996,0x5BB9,0x5EB8,0x63DA,0x63FA,0x64C1,0x66DC,0x694A,
+ 0x69D8,0x6D0B,0x6EB6,0x7194,0x7528,0x7AAF,0x7F8A,0x8000,0x8449,0x84C9,
+ 0x8981,0x8B21,0x8E0A,0x9065,0x967D,0x990A,0x617E,0x6291,0x6B32,0x6C83,
+ 0x6D74,0x7FCC,0x7FFC,0x6DC0,0x7F85,0x87BA,0x88F8,0x6765,0x83B1,0x983C,
+ 0x96F7,0x6D1B,0x7D61,0x843D,0x916A,0x4E71,0x5375,0x5D50,0x6B04,0x6FEB,
+ 0x85CD,0x862D,0x89A7,0x5229,0x540F,0x5C65,0x674E,0x68A8,0x7406,0x7483,
+ 0x75E2,0x88CF,0x88E1,0x91CC,0x96E2,0x9678,0x5F8B,0x7387,0x7ACB,0x844E,
+ 0x63A0,0x7565,0x5289,0x6D41,0x6E9C,0x7409,0x7559,0x786B,0x7C92,0x9686,
+ 0x7ADC,0x9F8D,0x4FB6,0x616E,0x65C5,0x865C,0x4E86,0x4EAE,0x50DA,0x4E21,
+ 0x51CC,0x5BEE,0x6599,0x6881,0x6DBC,0x731F,0x7642,0x77AD,0x7A1C,0x7CE7,
+ 0x826F,0x8AD2,0x907C,0x91CF,0x9675,0x9818,0x529B,0x7DD1,0x502B,0x5398,
+ 0x6797,0x6DCB,0x71D0,0x7433,0x81E8,0x8F2A,0x96A3,0x9C57,0x9E9F,0x7460,
+ 0x5841,0x6D99,0x7D2F,0x985E,0x4EE4,0x4F36,0x4F8B,0x51B7,0x52B1,0x5DBA,
+ 0x601C,0x73B2,0x793C,0x82D3,0x9234,0x96B7,0x96F6,0x970A,0x9E97,0x9F62,
+ 0x66A6,0x6B74,0x5217,0x52A3,0x70C8,0x88C2,0x5EC9,0x604B,0x6190,0x6F23,
+ 0x7149,0x7C3E,0x7DF4,0x806F,0x84EE,0x9023,0x932C,0x5442,0x9B6F,0x6AD3,
+ 0x7089,0x8CC2,0x8DEF,0x9732,0x52B4,0x5A41,0x5ECA,0x5F04,0x6717,0x697C,
+ 0x6994,0x6D6A,0x6F0F,0x7262,0x72FC,0x7BED,0x8001,0x807E,0x874B,0x90CE,
+ 0x516D,0x9E93,0x7984,0x808B,0x9332,0x8AD6,0x502D,0x548C,0x8A71,0x6B6A,
+ 0x8CC4,0x8107,0x60D1,0x67A0,0x9DF2,0x4E99,0x4E98,0x9C10,0x8A6B,0x85C1,
+ 0x8568,0x6900,0x6E7E,0x7897,0x8155,0x0000,0x0000,0x0000,0x0000,0x0000,
0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
+ 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x5F0C,0x4E10,
+ 0x4E15,0x4E2A,0x4E31,0x4E36,0x4E3C,0x4E3F,0x4E42,0x4E56,0x4E58,0x4E82,
+ 0x4E85,0x8C6B,0x4E8A,0x8212,0x5F0D,0x4E8E,0x4E9E,0x4E9F,0x4EA0,0x4EA2,
+ 0x4EB0,0x4EB3,0x4EB6,0x4ECE,0x4ECD,0x4EC4,0x4EC6,0x4EC2,0x4ED7,0x4EDE,
+ 0x4EED,0x4EDF,0x4EF7,0x4F09,0x4F5A,0x4F30,0x4F5B,0x4F5D,0x4F57,0x4F47,
+ 0x4F76,0x4F88,0x4F8F,0x4F98,0x4F7B,0x4F69,0x4F70,0x4F91,0x4F6F,0x4F86,
+ 0x4F96,0x5118,0x4FD4,0x4FDF,0x4FCE,0x4FD8,0x4FDB,0x4FD1,0x4FDA,0x4FD0,
+ 0x4FE4,0x4FE5,0x501A,0x5028,0x5014,0x502A,0x5025,0x5005,0x4F1C,0x4FF6,
+ 0x5021,0x5029,0x502C,0x4FFE,0x4FEF,0x5011,0x5006,0x5043,0x5047,0x6703,
+ 0x5055,0x5050,0x5048,0x505A,0x5056,0x506C,0x5078,0x5080,0x509A,0x5085,
+ 0x50B4,0x50B2,0x50C9,0x50CA,0x50B3,0x50C2,0x50D6,0x50DE,0x50E5,0x50ED,
+ 0x50E3,0x50EE,0x50F9,0x50F5,0x5109,0x5101,0x5102,0x5116,0x5115,0x5114,
+ 0x511A,0x5121,0x513A,0x5137,0x513C,0x513B,0x513F,0x5140,0x5152,0x514C,
+ 0x5154,0x5162,0x7AF8,0x5169,0x516A,0x516E,0x5180,0x5182,0x56D8,0x518C,
+ 0x5189,0x518F,0x5191,0x5193,0x5195,0x5196,0x51A4,0x51A6,0x51A2,0x51A9,
+ 0x51AA,0x51AB,0x51B3,0x51B1,0x51B2,0x51B0,0x51B5,0x51BD,0x51C5,0x51C9,
+ 0x51DB,0x51E0,0x8655,0x51E9,0x51ED,0x51F0,0x51F5,0x51FE,0x5204,0x520B,
+ 0x5214,0x520E,0x5227,0x522A,0x522E,0x5233,0x5239,0x524F,0x5244,0x524B,
+ 0x524C,0x525E,0x5254,0x526A,0x5274,0x5269,0x5273,0x527F,0x527D,0x528D,
+ 0x5294,0x5292,0x5271,0x5288,0x5291,0x8FA8,0x8FA7,0x52AC,0x52AD,0x52BC,
+ 0x52B5,0x52C1,0x52CD,0x52D7,0x52DE,0x52E3,0x52E6,0x98ED,0x52E0,0x52F3,
+ 0x52F5,0x52F8,0x52F9,0x5306,0x5308,0x7538,0x530D,0x5310,0x530F,0x5315,
+ 0x531A,0x5323,0x532F,0x5331,0x5333,0x5338,0x5340,0x5346,0x5345,0x4E17,
+ 0x5349,0x534D,0x51D6,0x535E,0x5369,0x536E,0x5918,0x537B,0x5377,0x5382,
+ 0x5396,0x53A0,0x53A6,0x53A5,0x53AE,0x53B0,0x53B6,0x53C3,0x7C12,0x96D9,
+ 0x53DF,0x66FC,0x71EE,0x53EE,0x53E8,0x53ED,0x53FA,0x5401,0x543D,0x5440,
+ 0x542C,0x542D,0x543C,0x542E,0x5436,0x5429,0x541D,0x544E,0x548F,0x5475,
+ 0x548E,0x545F,0x5471,0x5477,0x5470,0x5492,0x547B,0x5480,0x5476,0x5484,
+ 0x5490,0x5486,0x54C7,0x54A2,0x54B8,0x54A5,0x54AC,0x54C4,0x54C8,0x54A8,
+ 0x54AB,0x54C2,0x54A4,0x54BE,0x54BC,0x54D8,0x54E5,0x54E6,0x550F,0x5514,
+ 0x54FD,0x54EE,0x54ED,0x54FA,0x54E2,0x5539,0x5540,0x5563,0x554C,0x552E,
+ 0x555C,0x5545,0x5556,0x5557,0x5538,0x5533,0x555D,0x5599,0x5580,0x54AF,
+ 0x558A,0x559F,0x557B,0x557E,0x5598,0x559E,0x55AE,0x557C,0x5583,0x55A9,
+ 0x5587,0x55A8,0x55DA,0x55C5,0x55DF,0x55C4,0x55DC,0x55E4,0x55D4,0x5614,
+ 0x55F7,0x5616,0x55FE,0x55FD,0x561B,0x55F9,0x564E,0x5650,0x71DF,0x5634,
+ 0x5636,0x5632,0x5638,0x566B,0x5664,0x562F,0x566C,0x566A,0x5686,0x5680,
+ 0x568A,0x56A0,0x5694,0x568F,0x56A5,0x56AE,0x56B6,0x56B4,0x56C2,0x56BC,
+ 0x56C1,0x56C3,0x56C0,0x56C8,0x56CE,0x56D1,0x56D3,0x56D7,0x56EE,0x56F9,
+ 0x5700,0x56FF,0x5704,0x5709,0x5708,0x570B,0x570D,0x5713,0x5718,0x5716,
+ 0x55C7,0x571C,0x5726,0x5737,0x5738,0x574E,0x573B,0x5740,0x574F,0x5769,
+ 0x57C0,0x5788,0x5761,0x577F,0x5789,0x5793,0x57A0,0x57B3,0x57A4,0x57AA,
+ 0x57B0,0x57C3,0x57C6,0x57D4,0x57D2,0x57D3,0x580A,0x57D6,0x57E3,0x580B,
+ 0x5819,0x581D,0x5872,0x5821,0x5862,0x584B,0x5870,0x6BC0,0x5852,0x583D,
+ 0x5879,0x5885,0x58B9,0x589F,0x58AB,0x58BA,0x58DE,0x58BB,0x58B8,0x58AE,
+ 0x58C5,0x58D3,0x58D1,0x58D7,0x58D9,0x58D8,0x58E5,0x58DC,0x58E4,0x58DF,
+ 0x58EF,0x58FA,0x58F9,0x58FB,0x58FC,0x58FD,0x5902,0x590A,0x5910,0x591B,
+ 0x68A6,0x5925,0x592C,0x592D,0x5932,0x5938,0x593E,0x7AD2,0x5955,0x5950,
+ 0x594E,0x595A,0x5958,0x5962,0x5960,0x5967,0x596C,0x5969,0x5978,0x5981,
+ 0x599D,0x4F5E,0x4FAB,0x59A3,0x59B2,0x59C6,0x59E8,0x59DC,0x598D,0x59D9,
+ 0x59DA,0x5A25,0x5A1F,0x5A11,0x5A1C,0x5A09,0x5A1A,0x5A40,0x5A6C,0x5A49,
+ 0x5A35,0x5A36,0x5A62,0x5A6A,0x5A9A,0x5ABC,0x5ABE,0x5ACB,0x5AC2,0x5ABD,
+ 0x5AE3,0x5AD7,0x5AE6,0x5AE9,0x5AD6,0x5AFA,0x5AFB,0x5B0C,0x5B0B,0x5B16,
+ 0x5B32,0x5AD0,0x5B2A,0x5B36,0x5B3E,0x5B43,0x5B45,0x5B40,0x5B51,0x5B55,
+ 0x5B5A,0x5B5B,0x5B65,0x5B69,0x5B70,0x5B73,0x5B75,0x5B78,0x6588,0x5B7A,
+ 0x5B80,0x5B83,0x5BA6,0x5BB8,0x5BC3,0x5BC7,0x5BC9,0x5BD4,0x5BD0,0x5BE4,
+ 0x5BE6,0x5BE2,0x5BDE,0x5BE5,0x5BEB,0x5BF0,0x5BF6,0x5BF3,0x5C05,0x5C07,
+ 0x5C08,0x5C0D,0x5C13,0x5C20,0x5C22,0x5C28,0x5C38,0x5C39,0x5C41,0x5C46,
+ 0x5C4E,0x5C53,0x5C50,0x5C4F,0x5B71,0x5C6C,0x5C6E,0x4E62,0x5C76,0x5C79,
+ 0x5C8C,0x5C91,0x5C94,0x599B,0x5CAB,0x5CBB,0x5CB6,0x5CBC,0x5CB7,0x5CC5,
+ 0x5CBE,0x5CC7,0x5CD9,0x5CE9,0x5CFD,0x5CFA,0x5CED,0x5D8C,0x5CEA,0x5D0B,
+ 0x5D15,0x5D17,0x5D5C,0x5D1F,0x5D1B,0x5D11,0x5D14,0x5D22,0x5D1A,0x5D19,
+ 0x5D18,0x5D4C,0x5D52,0x5D4E,0x5D4B,0x5D6C,0x5D73,0x5D76,0x5D87,0x5D84,
+ 0x5D82,0x5DA2,0x5D9D,0x5DAC,0x5DAE,0x5DBD,0x5D90,0x5DB7,0x5DBC,0x5DC9,
+ 0x5DCD,0x5DD3,0x5DD2,0x5DD6,0x5DDB,0x5DEB,0x5DF2,0x5DF5,0x5E0B,0x5E1A,
+ 0x5E19,0x5E11,0x5E1B,0x5E36,0x5E37,0x5E44,0x5E43,0x5E40,0x5E4E,0x5E57,
+ 0x5E54,0x5E5F,0x5E62,0x5E64,0x5E47,0x5E75,0x5E76,0x5E7A,0x9EBC,0x5E7F,
+ 0x5EA0,0x5EC1,0x5EC2,0x5EC8,0x5ED0,0x5ECF,0x5ED6,0x5EE3,0x5EDD,0x5EDA,
+ 0x5EDB,0x5EE2,0x5EE1,0x5EE8,0x5EE9,0x5EEC,0x5EF1,0x5EF3,0x5EF0,0x5EF4,
+ 0x5EF8,0x5EFE,0x5F03,0x5F09,0x5F5D,0x5F5C,0x5F0B,0x5F11,0x5F16,0x5F29,
+ 0x5F2D,0x5F38,0x5F41,0x5F48,0x5F4C,0x5F4E,0x5F2F,0x5F51,0x5F56,0x5F57,
+ 0x5F59,0x5F61,0x5F6D,0x5F73,0x5F77,0x5F83,0x5F82,0x5F7F,0x5F8A,0x5F88,
+ 0x5F91,0x5F87,0x5F9E,0x5F99,0x5F98,0x5FA0,0x5FA8,0x5FAD,0x5FBC,0x5FD6,
+ 0x5FFB,0x5FE4,0x5FF8,0x5FF1,0x5FDD,0x60B3,0x5FFF,0x6021,0x6060,0x6019,
+ 0x6010,0x6029,0x600E,0x6031,0x601B,0x6015,0x602B,0x6026,0x600F,0x603A,
+ 0x605A,0x6041,0x606A,0x6077,0x605F,0x604A,0x6046,0x604D,0x6063,0x6043,
+ 0x6064,0x6042,0x606C,0x606B,0x6059,0x6081,0x608D,0x60E7,0x6083,0x609A,
+ 0x6084,0x609B,0x6096,0x6097,0x6092,0x60A7,0x608B,0x60E1,0x60B8,0x60E0,
+ 0x60D3,0x60B4,0x5FF0,0x60BD,0x60C6,0x60B5,0x60D8,0x614D,0x6115,0x6106,
+ 0x60F6,0x60F7,0x6100,0x60F4,0x60FA,0x6103,0x6121,0x60FB,0x60F1,0x610D,
+ 0x610E,0x6147,0x613E,0x6128,0x6127,0x614A,0x613F,0x613C,0x612C,0x6134,
+ 0x613D,0x6142,0x6144,0x6173,0x6177,0x6158,0x6159,0x615A,0x616B,0x6174,
+ 0x616F,0x6165,0x6171,0x615F,0x615D,0x6153,0x6175,0x6199,0x6196,0x6187,
+ 0x61AC,0x6194,0x619A,0x618A,0x6191,0x61AB,0x61AE,0x61CC,0x61CA,0x61C9,
+ 0x61F7,0x61C8,0x61C3,0x61C6,0x61BA,0x61CB,0x7F79,0x61CD,0x61E6,0x61E3,
+ 0x61F6,0x61FA,0x61F4,0x61FF,0x61FD,0x61FC,0x61FE,0x6200,0x6208,0x6209,
+ 0x620D,0x620C,0x6214,0x621B,0x621E,0x6221,0x622A,0x622E,0x6230,0x6232,
+ 0x6233,0x6241,0x624E,0x625E,0x6263,0x625B,0x6260,0x6268,0x627C,0x6282,
+ 0x6289,0x627E,0x6292,0x6293,0x6296,0x62D4,0x6283,0x6294,0x62D7,0x62D1,
+ 0x62BB,0x62CF,0x62FF,0x62C6,0x64D4,0x62C8,0x62DC,0x62CC,0x62CA,0x62C2,
+ 0x62C7,0x629B,0x62C9,0x630C,0x62EE,0x62F1,0x6327,0x6302,0x6308,0x62EF,
+ 0x62F5,0x6350,0x633E,0x634D,0x641C,0x634F,0x6396,0x638E,0x6380,0x63AB,
+ 0x6376,0x63A3,0x638F,0x6389,0x639F,0x63B5,0x636B,0x6369,0x63BE,0x63E9,
+ 0x63C0,0x63C6,0x63E3,0x63C9,0x63D2,0x63F6,0x63C4,0x6416,0x6434,0x6406,
+ 0x6413,0x6426,0x6436,0x651D,0x6417,0x6428,0x640F,0x6467,0x646F,0x6476,
+ 0x644E,0x652A,0x6495,0x6493,0x64A5,0x64A9,0x6488,0x64BC,0x64DA,0x64D2,
+ 0x64C5,0x64C7,0x64BB,0x64D8,0x64C2,0x64F1,0x64E7,0x8209,0x64E0,0x64E1,
+ 0x62AC,0x64E3,0x64EF,0x652C,0x64F6,0x64F4,0x64F2,0x64FA,0x6500,0x64FD,
+ 0x6518,0x651C,0x6505,0x6524,0x6523,0x652B,0x6534,0x6535,0x6537,0x6536,
+ 0x6538,0x754B,0x6548,0x6556,0x6555,0x654D,0x6558,0x655E,0x655D,0x6572,
+ 0x6578,0x6582,0x6583,0x8B8A,0x659B,0x659F,0x65AB,0x65B7,0x65C3,0x65C6,
+ 0x65C1,0x65C4,0x65CC,0x65D2,0x65DB,0x65D9,0x65E0,0x65E1,0x65F1,0x6772,
+ 0x660A,0x6603,0x65FB,0x6773,0x6635,0x6636,0x6634,0x661C,0x664F,0x6644,
+ 0x6649,0x6641,0x665E,0x665D,0x6664,0x6667,0x6668,0x665F,0x6662,0x6670,
+ 0x6683,0x6688,0x668E,0x6689,0x6684,0x6698,0x669D,0x66C1,0x66B9,0x66C9,
+ 0x66BE,0x66BC,0x66C4,0x66B8,0x66D6,0x66DA,0x66E0,0x663F,0x66E6,0x66E9,
+ 0x66F0,0x66F5,0x66F7,0x670F,0x6716,0x671E,0x6726,0x6727,0x9738,0x672E,
+ 0x673F,0x6736,0x6741,0x6738,0x6737,0x6746,0x675E,0x6760,0x6759,0x6763,
+ 0x6764,0x6789,0x6770,0x67A9,0x677C,0x676A,0x678C,0x678B,0x67A6,0x67A1,
+ 0x6785,0x67B7,0x67EF,0x67B4,0x67EC,0x67B3,0x67E9,0x67B8,0x67E4,0x67DE,
+ 0x67DD,0x67E2,0x67EE,0x67B9,0x67CE,0x67C6,0x67E7,0x6A9C,0x681E,0x6846,
+ 0x6829,0x6840,0x684D,0x6832,0x684E,0x68B3,0x682B,0x6859,0x6863,0x6877,
+ 0x687F,0x689F,0x688F,0x68AD,0x6894,0x689D,0x689B,0x6883,0x6AAE,0x68B9,
+ 0x6874,0x68B5,0x68A0,0x68BA,0x690F,0x688D,0x687E,0x6901,0x68CA,0x6908,
+ 0x68D8,0x6922,0x6926,0x68E1,0x690C,0x68CD,0x68D4,0x68E7,0x68D5,0x6936,
+ 0x6912,0x6904,0x68D7,0x68E3,0x6925,0x68F9,0x68E0,0x68EF,0x6928,0x692A,
+ 0x691A,0x6923,0x6921,0x68C6,0x6979,0x6977,0x695C,0x6978,0x696B,0x6954,
+ 0x697E,0x696E,0x6939,0x6974,0x693D,0x6959,0x6930,0x6961,0x695E,0x695D,
+ 0x6981,0x696A,0x69B2,0x69AE,0x69D0,0x69BF,0x69C1,0x69D3,0x69BE,0x69CE,
+ 0x5BE8,0x69CA,0x69DD,0x69BB,0x69C3,0x69A7,0x6A2E,0x6991,0x69A0,0x699C,
+ 0x6995,0x69B4,0x69DE,0x69E8,0x6A02,0x6A1B,0x69FF,0x6B0A,0x69F9,0x69F2,
+ 0x69E7,0x6A05,0x69B1,0x6A1E,0x69ED,0x6A14,0x69EB,0x6A0A,0x6A12,0x6AC1,
+ 0x6A23,0x6A13,0x6A44,0x6A0C,0x6A72,0x6A36,0x6A78,0x6A47,0x6A62,0x6A59,
+ 0x6A66,0x6A48,0x6A38,0x6A22,0x6A90,0x6A8D,0x6AA0,0x6A84,0x6AA2,0x6AA3,
+ 0x6A97,0x8617,0x6ABB,0x6AC3,0x6AC2,0x6AB8,0x6AB3,0x6AAC,0x6ADE,0x6AD1,
+ 0x6ADF,0x6AAA,0x6ADA,0x6AEA,0x6AFB,0x6B05,0x8616,0x6AFA,0x6B12,0x6B16,
+ 0x9B31,0x6B1F,0x6B38,0x6B37,0x76DC,0x6B39,0x98EE,0x6B47,0x6B43,0x6B49,
+ 0x6B50,0x6B59,0x6B54,0x6B5B,0x6B5F,0x6B61,0x6B78,0x6B79,0x6B7F,0x6B80,
+ 0x6B84,0x6B83,0x6B8D,0x6B98,0x6B95,0x6B9E,0x6BA4,0x6BAA,0x6BAB,0x6BAF,
+ 0x6BB2,0x6BB1,0x6BB3,0x6BB7,0x6BBC,0x6BC6,0x6BCB,0x6BD3,0x6BDF,0x6BEC,
+ 0x6BEB,0x6BF3,0x6BEF,0x9EBE,0x6C08,0x6C13,0x6C14,0x6C1B,0x6C24,0x6C23,
+ 0x6C5E,0x6C55,0x6C62,0x6C6A,0x6C82,0x6C8D,0x6C9A,0x6C81,0x6C9B,0x6C7E,
+ 0x6C68,0x6C73,0x6C92,0x6C90,0x6CC4,0x6CF1,0x6CD3,0x6CBD,0x6CD7,0x6CC5,
+ 0x6CDD,0x6CAE,0x6CB1,0x6CBE,0x6CBA,0x6CDB,0x6CEF,0x6CD9,0x6CEA,0x6D1F,
+ 0x884D,0x6D36,0x6D2B,0x6D3D,0x6D38,0x6D19,0x6D35,0x6D33,0x6D12,0x6D0C,
+ 0x6D63,0x6D93,0x6D64,0x6D5A,0x6D79,0x6D59,0x6D8E,0x6D95,0x6FE4,0x6D85,
+ 0x6DF9,0x6E15,0x6E0A,0x6DB5,0x6DC7,0x6DE6,0x6DB8,0x6DC6,0x6DEC,0x6DDE,
+ 0x6DCC,0x6DE8,0x6DD2,0x6DC5,0x6DFA,0x6DD9,0x6DE4,0x6DD5,0x6DEA,0x6DEE,
+ 0x6E2D,0x6E6E,0x6E2E,0x6E19,0x6E72,0x6E5F,0x6E3E,0x6E23,0x6E6B,0x6E2B,
+ 0x6E76,0x6E4D,0x6E1F,0x6E43,0x6E3A,0x6E4E,0x6E24,0x6EFF,0x6E1D,0x6E38,
+ 0x6E82,0x6EAA,0x6E98,0x6EC9,0x6EB7,0x6ED3,0x6EBD,0x6EAF,0x6EC4,0x6EB2,
+ 0x6ED4,0x6ED5,0x6E8F,0x6EA5,0x6EC2,0x6E9F,0x6F41,0x6F11,0x704C,0x6EEC,
+ 0x6EF8,0x6EFE,0x6F3F,0x6EF2,0x6F31,0x6EEF,0x6F32,0x6ECC,0x6F3E,0x6F13,
+ 0x6EF7,0x6F86,0x6F7A,0x6F78,0x6F81,0x6F80,0x6F6F,0x6F5B,0x6FF3,0x6F6D,
+ 0x6F82,0x6F7C,0x6F58,0x6F8E,0x6F91,0x6FC2,0x6F66,0x6FB3,0x6FA3,0x6FA1,
+ 0x6FA4,0x6FB9,0x6FC6,0x6FAA,0x6FDF,0x6FD5,0x6FEC,0x6FD4,0x6FD8,0x6FF1,
+ 0x6FEE,0x6FDB,0x7009,0x700B,0x6FFA,0x7011,0x7001,0x700F,0x6FFE,0x701B,
+ 0x701A,0x6F74,0x701D,0x7018,0x701F,0x7030,0x703E,0x7032,0x7051,0x7063,
+ 0x7099,0x7092,0x70AF,0x70F1,0x70AC,0x70B8,0x70B3,0x70AE,0x70DF,0x70CB,
+ 0x70DD,0x70D9,0x7109,0x70FD,0x711C,0x7119,0x7165,0x7155,0x7188,0x7166,
+ 0x7162,0x714C,0x7156,0x716C,0x718F,0x71FB,0x7184,0x7195,0x71A8,0x71AC,
+ 0x71D7,0x71B9,0x71BE,0x71D2,0x71C9,0x71D4,0x71CE,0x71E0,0x71EC,0x71E7,
+ 0x71F5,0x71FC,0x71F9,0x71FF,0x720D,0x7210,0x721B,0x7228,0x722D,0x722C,
+ 0x7230,0x7232,0x723B,0x723C,0x723F,0x7240,0x7246,0x724B,0x7258,0x7274,
+ 0x727E,0x7282,0x7281,0x7287,0x7292,0x7296,0x72A2,0x72A7,0x72B9,0x72B2,
+ 0x72C3,0x72C6,0x72C4,0x72CE,0x72D2,0x72E2,0x72E0,0x72E1,0x72F9,0x72F7,
+ 0x500F,0x7317,0x730A,0x731C,0x7316,0x731D,0x7334,0x732F,0x7329,0x7325,
+ 0x733E,0x734E,0x734F,0x9ED8,0x7357,0x736A,0x7368,0x7370,0x7378,0x7375,
+ 0x737B,0x737A,0x73C8,0x73B3,0x73CE,0x73BB,0x73C0,0x73E5,0x73EE,0x73DE,
+ 0x74A2,0x7405,0x746F,0x7425,0x73F8,0x7432,0x743A,0x7455,0x743F,0x745F,
+ 0x7459,0x7441,0x745C,0x7469,0x7470,0x7463,0x746A,0x7476,0x747E,0x748B,
+ 0x749E,0x74A7,0x74CA,0x74CF,0x74D4,0x73F1,0x74E0,0x74E3,0x74E7,0x74E9,
+ 0x74EE,0x74F2,0x74F0,0x74F1,0x74F8,0x74F7,0x7504,0x7503,0x7505,0x750C,
+ 0x750E,0x750D,0x7515,0x7513,0x751E,0x7526,0x752C,0x753C,0x7544,0x754D,
+ 0x754A,0x7549,0x755B,0x7546,0x755A,0x7569,0x7564,0x7567,0x756B,0x756D,
+ 0x7578,0x7576,0x7586,0x7587,0x7574,0x758A,0x7589,0x7582,0x7594,0x759A,
+ 0x759D,0x75A5,0x75A3,0x75C2,0x75B3,0x75C3,0x75B5,0x75BD,0x75B8,0x75BC,
+ 0x75B1,0x75CD,0x75CA,0x75D2,0x75D9,0x75E3,0x75DE,0x75FE,0x75FF,0x75FC,
+ 0x7601,0x75F0,0x75FA,0x75F2,0x75F3,0x760B,0x760D,0x7609,0x761F,0x7627,
+ 0x7620,0x7621,0x7622,0x7624,0x7634,0x7630,0x763B,0x7647,0x7648,0x7646,
+ 0x765C,0x7658,0x7661,0x7662,0x7668,0x7669,0x766A,0x7667,0x766C,0x7670,
+ 0x7672,0x7676,0x7678,0x767C,0x7680,0x7683,0x7688,0x768B,0x768E,0x7696,
+ 0x7693,0x7699,0x769A,0x76B0,0x76B4,0x76B8,0x76B9,0x76BA,0x76C2,0x76CD,
+ 0x76D6,0x76D2,0x76DE,0x76E1,0x76E5,0x76E7,0x76EA,0x862F,0x76FB,0x7708,
+ 0x7707,0x7704,0x7729,0x7724,0x771E,0x7725,0x7726,0x771B,0x7737,0x7738,
+ 0x7747,0x775A,0x7768,0x776B,0x775B,0x7765,0x777F,0x777E,0x7779,0x778E,
+ 0x778B,0x7791,0x77A0,0x779E,0x77B0,0x77B6,0x77B9,0x77BF,0x77BC,0x77BD,
+ 0x77BB,0x77C7,0x77CD,0x77D7,0x77DA,0x77DC,0x77E3,0x77EE,0x77FC,0x780C,
+ 0x7812,0x7926,0x7820,0x792A,0x7845,0x788E,0x7874,0x7886,0x787C,0x789A,
+ 0x788C,0x78A3,0x78B5,0x78AA,0x78AF,0x78D1,0x78C6,0x78CB,0x78D4,0x78BE,
+ 0x78BC,0x78C5,0x78CA,0x78EC,0x78E7,0x78DA,0x78FD,0x78F4,0x7907,0x7912,
+ 0x7911,0x7919,0x792C,0x792B,0x7940,0x7960,0x7957,0x795F,0x795A,0x7955,
+ 0x7953,0x797A,0x797F,0x798A,0x799D,0x79A7,0x9F4B,0x79AA,0x79AE,0x79B3,
+ 0x79B9,0x79BA,0x79C9,0x79D5,0x79E7,0x79EC,0x79E1,0x79E3,0x7A08,0x7A0D,
+ 0x7A18,0x7A19,0x7A20,0x7A1F,0x7980,0x7A31,0x7A3B,0x7A3E,0x7A37,0x7A43,
+ 0x7A57,0x7A49,0x7A61,0x7A62,0x7A69,0x9F9D,0x7A70,0x7A79,0x7A7D,0x7A88,
+ 0x7A97,0x7A95,0x7A98,0x7A96,0x7AA9,0x7AC8,0x7AB0,0x7AB6,0x7AC5,0x7AC4,
+ 0x7ABF,0x9083,0x7AC7,0x7ACA,0x7ACD,0x7ACF,0x7AD5,0x7AD3,0x7AD9,0x7ADA,
+ 0x7ADD,0x7AE1,0x7AE2,0x7AE6,0x7AED,0x7AF0,0x7B02,0x7B0F,0x7B0A,0x7B06,
+ 0x7B33,0x7B18,0x7B19,0x7B1E,0x7B35,0x7B28,0x7B36,0x7B50,0x7B7A,0x7B04,
+ 0x7B4D,0x7B0B,0x7B4C,0x7B45,0x7B75,0x7B65,0x7B74,0x7B67,0x7B70,0x7B71,
+ 0x7B6C,0x7B6E,0x7B9D,0x7B98,0x7B9F,0x7B8D,0x7B9C,0x7B9A,0x7B8B,0x7B92,
+ 0x7B8F,0x7B5D,0x7B99,0x7BCB,0x7BC1,0x7BCC,0x7BCF,0x7BB4,0x7BC6,0x7BDD,
+ 0x7BE9,0x7C11,0x7C14,0x7BE6,0x7BE5,0x7C60,0x7C00,0x7C07,0x7C13,0x7BF3,
+ 0x7BF7,0x7C17,0x7C0D,0x7BF6,0x7C23,0x7C27,0x7C2A,0x7C1F,0x7C37,0x7C2B,
+ 0x7C3D,0x7C4C,0x7C43,0x7C54,0x7C4F,0x7C40,0x7C50,0x7C58,0x7C5F,0x7C64,
+ 0x7C56,0x7C65,0x7C6C,0x7C75,0x7C83,0x7C90,0x7CA4,0x7CAD,0x7CA2,0x7CAB,
+ 0x7CA1,0x7CA8,0x7CB3,0x7CB2,0x7CB1,0x7CAE,0x7CB9,0x7CBD,0x7CC0,0x7CC5,
+ 0x7CC2,0x7CD8,0x7CD2,0x7CDC,0x7CE2,0x9B3B,0x7CEF,0x7CF2,0x7CF4,0x7CF6,
+ 0x7CFA,0x7D06,0x7D02,0x7D1C,0x7D15,0x7D0A,0x7D45,0x7D4B,0x7D2E,0x7D32,
+ 0x7D3F,0x7D35,0x7D46,0x7D73,0x7D56,0x7D4E,0x7D72,0x7D68,0x7D6E,0x7D4F,
+ 0x7D63,0x7D93,0x7D89,0x7D5B,0x7D8F,0x7D7D,0x7D9B,0x7DBA,0x7DAE,0x7DA3,
+ 0x7DB5,0x7DC7,0x7DBD,0x7DAB,0x7E3D,0x7DA2,0x7DAF,0x7DDC,0x7DB8,0x7D9F,
+ 0x7DB0,0x7DD8,0x7DDD,0x7DE4,0x7DDE,0x7DFB,0x7DF2,0x7DE1,0x7E05,0x7E0A,
+ 0x7E23,0x7E21,0x7E12,0x7E31,0x7E1F,0x7E09,0x7E0B,0x7E22,0x7E46,0x7E66,
+ 0x7E3B,0x7E35,0x7E39,0x7E43,0x7E37,0x7E32,0x7E3A,0x7E67,0x7E5D,0x7E56,
+ 0x7E5E,0x7E59,0x7E5A,0x7E79,0x7E6A,0x7E69,0x7E7C,0x7E7B,0x7E83,0x7DD5,
+ 0x7E7D,0x8FAE,0x7E7F,0x7E88,0x7E89,0x7E8C,0x7E92,0x7E90,0x7E93,0x7E94,
+ 0x7E96,0x7E8E,0x7E9B,0x7E9C,0x7F38,0x7F3A,0x7F45,0x7F4C,0x7F4D,0x7F4E,
+ 0x7F50,0x7F51,0x7F55,0x7F54,0x7F58,0x7F5F,0x7F60,0x7F68,0x7F69,0x7F67,
+ 0x7F78,0x7F82,0x7F86,0x7F83,0x7F88,0x7F87,0x7F8C,0x7F94,0x7F9E,0x7F9D,
+ 0x7F9A,0x7FA3,0x7FAF,0x7FB2,0x7FB9,0x7FAE,0x7FB6,0x7FB8,0x8B71,0x7FC5,
+ 0x7FC6,0x7FCA,0x7FD5,0x7FD4,0x7FE1,0x7FE6,0x7FE9,0x7FF3,0x7FF9,0x98DC,
+ 0x8006,0x8004,0x800B,0x8012,0x8018,0x8019,0x801C,0x8021,0x8028,0x803F,
+ 0x803B,0x804A,0x8046,0x8052,0x8058,0x805A,0x805F,0x8062,0x8068,0x8073,
+ 0x8072,0x8070,0x8076,0x8079,0x807D,0x807F,0x8084,0x8086,0x8085,0x809B,
+ 0x8093,0x809A,0x80AD,0x5190,0x80AC,0x80DB,0x80E5,0x80D9,0x80DD,0x80C4,
+ 0x80DA,0x80D6,0x8109,0x80EF,0x80F1,0x811B,0x8129,0x8123,0x812F,0x814B,
+ 0x968B,0x8146,0x813E,0x8153,0x8151,0x80FC,0x8171,0x816E,0x8165,0x8166,
+ 0x8174,0x8183,0x8188,0x818A,0x8180,0x8182,0x81A0,0x8195,0x81A4,0x81A3,
+ 0x815F,0x8193,0x81A9,0x81B0,0x81B5,0x81BE,0x81B8,0x81BD,0x81C0,0x81C2,
+ 0x81BA,0x81C9,0x81CD,0x81D1,0x81D9,0x81D8,0x81C8,0x81DA,0x81DF,0x81E0,
+ 0x81E7,0x81FA,0x81FB,0x81FE,0x8201,0x8202,0x8205,0x8207,0x820A,0x820D,
+ 0x8210,0x8216,0x8229,0x822B,0x8238,0x8233,0x8240,0x8259,0x8258,0x825D,
+ 0x825A,0x825F,0x8264,0x8262,0x8268,0x826A,0x826B,0x822E,0x8271,0x8277,
+ 0x8278,0x827E,0x828D,0x8292,0x82AB,0x829F,0x82BB,0x82AC,0x82E1,0x82E3,
+ 0x82DF,0x82D2,0x82F4,0x82F3,0x82FA,0x8393,0x8303,0x82FB,0x82F9,0x82DE,
+ 0x8306,0x82DC,0x8309,0x82D9,0x8335,0x8334,0x8316,0x8332,0x8331,0x8340,
+ 0x8339,0x8350,0x8345,0x832F,0x832B,0x8317,0x8318,0x8385,0x839A,0x83AA,
+ 0x839F,0x83A2,0x8396,0x8323,0x838E,0x8387,0x838A,0x837C,0x83B5,0x8373,
+ 0x8375,0x83A0,0x8389,0x83A8,0x83F4,0x8413,0x83EB,0x83CE,0x83FD,0x8403,
+ 0x83D8,0x840B,0x83C1,0x83F7,0x8407,0x83E0,0x83F2,0x840D,0x8422,0x8420,
+ 0x83BD,0x8438,0x8506,0x83FB,0x846D,0x842A,0x843C,0x855A,0x8484,0x8477,
+ 0x846B,0x84AD,0x846E,0x8482,0x8469,0x8446,0x842C,0x846F,0x8479,0x8435,
+ 0x84CA,0x8462,0x84B9,0x84BF,0x849F,0x84D9,0x84CD,0x84BB,0x84DA,0x84D0,
+ 0x84C1,0x84C6,0x84D6,0x84A1,0x8521,0x84FF,0x84F4,0x8517,0x8518,0x852C,
+ 0x851F,0x8515,0x8514,0x84FC,0x8540,0x8563,0x8558,0x8548,0x8541,0x8602,
+ 0x854B,0x8555,0x8580,0x85A4,0x8588,0x8591,0x858A,0x85A8,0x856D,0x8594,
+ 0x859B,0x85EA,0x8587,0x859C,0x8577,0x857E,0x8590,0x85C9,0x85BA,0x85CF,
+ 0x85B9,0x85D0,0x85D5,0x85DD,0x85E5,0x85DC,0x85F9,0x860A,0x8613,0x860B,
+ 0x85FE,0x85FA,0x8606,0x8622,0x861A,0x8630,0x863F,0x864D,0x4E55,0x8654,
+ 0x865F,0x8667,0x8671,0x8693,0x86A3,0x86A9,0x86AA,0x868B,0x868C,0x86B6,
+ 0x86AF,0x86C4,0x86C6,0x86B0,0x86C9,0x8823,0x86AB,0x86D4,0x86DE,0x86E9,
+ 0x86EC,0x86DF,0x86DB,0x86EF,0x8712,0x8706,0x8708,0x8700,0x8703,0x86FB,
+ 0x8711,0x8709,0x870D,0x86F9,0x870A,0x8734,0x873F,0x8737,0x873B,0x8725,
+ 0x8729,0x871A,0x8760,0x875F,0x8778,0x874C,0x874E,0x8774,0x8757,0x8768,
+ 0x876E,0x8759,0x8753,0x8763,0x876A,0x8805,0x87A2,0x879F,0x8782,0x87AF,
+ 0x87CB,0x87BD,0x87C0,0x87D0,0x96D6,0x87AB,0x87C4,0x87B3,0x87C7,0x87C6,
+ 0x87BB,0x87EF,0x87F2,0x87E0,0x880F,0x880D,0x87FE,0x87F6,0x87F7,0x880E,
+ 0x87D2,0x8811,0x8816,0x8815,0x8822,0x8821,0x8831,0x8836,0x8839,0x8827,
+ 0x883B,0x8844,0x8842,0x8852,0x8859,0x885E,0x8862,0x886B,0x8881,0x887E,
+ 0x889E,0x8875,0x887D,0x88B5,0x8872,0x8882,0x8897,0x8892,0x88AE,0x8899,
+ 0x88A2,0x888D,0x88A4,0x88B0,0x88BF,0x88B1,0x88C3,0x88C4,0x88D4,0x88D8,
+ 0x88D9,0x88DD,0x88F9,0x8902,0x88FC,0x88F4,0x88E8,0x88F2,0x8904,0x890C,
+ 0x890A,0x8913,0x8943,0x891E,0x8925,0x892A,0x892B,0x8941,0x8944,0x893B,
+ 0x8936,0x8938,0x894C,0x891D,0x8960,0x895E,0x8966,0x8964,0x896D,0x896A,
+ 0x896F,0x8974,0x8977,0x897E,0x8983,0x8988,0x898A,0x8993,0x8998,0x89A1,
+ 0x89A9,0x89A6,0x89AC,0x89AF,0x89B2,0x89BA,0x89BD,0x89BF,0x89C0,0x89DA,
+ 0x89DC,0x89DD,0x89E7,0x89F4,0x89F8,0x8A03,0x8A16,0x8A10,0x8A0C,0x8A1B,
+ 0x8A1D,0x8A25,0x8A36,0x8A41,0x8A5B,0x8A52,0x8A46,0x8A48,0x8A7C,0x8A6D,
+ 0x8A6C,0x8A62,0x8A85,0x8A82,0x8A84,0x8AA8,0x8AA1,0x8A91,0x8AA5,0x8AA6,
+ 0x8A9A,0x8AA3,0x8AC4,0x8ACD,0x8AC2,0x8ADA,0x8AEB,0x8AF3,0x8AE7,0x8AE4,
+ 0x8AF1,0x8B14,0x8AE0,0x8AE2,0x8AF7,0x8ADE,0x8ADB,0x8B0C,0x8B07,0x8B1A,
+ 0x8AE1,0x8B16,0x8B10,0x8B17,0x8B20,0x8B33,0x97AB,0x8B26,0x8B2B,0x8B3E,
+ 0x8B28,0x8B41,0x8B4C,0x8B4F,0x8B4E,0x8B49,0x8B56,0x8B5B,0x8B5A,0x8B6B,
+ 0x8B5F,0x8B6C,0x8B6F,0x8B74,0x8B7D,0x8B80,0x8B8C,0x8B8E,0x8B92,0x8B93,
+ 0x8B96,0x8B99,0x8B9A,0x8C3A,0x8C41,0x8C3F,0x8C48,0x8C4C,0x8C4E,0x8C50,
+ 0x8C55,0x8C62,0x8C6C,0x8C78,0x8C7A,0x8C82,0x8C89,0x8C85,0x8C8A,0x8C8D,
+ 0x8C8E,0x8C94,0x8C7C,0x8C98,0x621D,0x8CAD,0x8CAA,0x8CBD,0x8CB2,0x8CB3,
+ 0x8CAE,0x8CB6,0x8CC8,0x8CC1,0x8CE4,0x8CE3,0x8CDA,0x8CFD,0x8CFA,0x8CFB,
+ 0x8D04,0x8D05,0x8D0A,0x8D07,0x8D0F,0x8D0D,0x8D10,0x9F4E,0x8D13,0x8CCD,
+ 0x8D14,0x8D16,0x8D67,0x8D6D,0x8D71,0x8D73,0x8D81,0x8D99,0x8DC2,0x8DBE,
+ 0x8DBA,0x8DCF,0x8DDA,0x8DD6,0x8DCC,0x8DDB,0x8DCB,0x8DEA,0x8DEB,0x8DDF,
+ 0x8DE3,0x8DFC,0x8E08,0x8E09,0x8DFF,0x8E1D,0x8E1E,0x8E10,0x8E1F,0x8E42,
+ 0x8E35,0x8E30,0x8E34,0x8E4A,0x8E47,0x8E49,0x8E4C,0x8E50,0x8E48,0x8E59,
+ 0x8E64,0x8E60,0x8E2A,0x8E63,0x8E55,0x8E76,0x8E72,0x8E7C,0x8E81,0x8E87,
+ 0x8E85,0x8E84,0x8E8B,0x8E8A,0x8E93,0x8E91,0x8E94,0x8E99,0x8EAA,0x8EA1,
+ 0x8EAC,0x8EB0,0x8EC6,0x8EB1,0x8EBE,0x8EC5,0x8EC8,0x8ECB,0x8EDB,0x8EE3,
+ 0x8EFC,0x8EFB,0x8EEB,0x8EFE,0x8F0A,0x8F05,0x8F15,0x8F12,0x8F19,0x8F13,
+ 0x8F1C,0x8F1F,0x8F1B,0x8F0C,0x8F26,0x8F33,0x8F3B,0x8F39,0x8F45,0x8F42,
+ 0x8F3E,0x8F4C,0x8F49,0x8F46,0x8F4E,0x8F57,0x8F5C,0x8F62,0x8F63,0x8F64,
+ 0x8F9C,0x8F9F,0x8FA3,0x8FAD,0x8FAF,0x8FB7,0x8FDA,0x8FE5,0x8FE2,0x8FEA,
+ 0x8FEF,0x9087,0x8FF4,0x9005,0x8FF9,0x8FFA,0x9011,0x9015,0x9021,0x900D,
+ 0x901E,0x9016,0x900B,0x9027,0x9036,0x9035,0x9039,0x8FF8,0x904F,0x9050,
+ 0x9051,0x9052,0x900E,0x9049,0x903E,0x9056,0x9058,0x905E,0x9068,0x906F,
+ 0x9076,0x96A8,0x9072,0x9082,0x907D,0x9081,0x9080,0x908A,0x9089,0x908F,
+ 0x90A8,0x90AF,0x90B1,0x90B5,0x90E2,0x90E4,0x6248,0x90DB,0x9102,0x9112,
+ 0x9119,0x9132,0x9130,0x914A,0x9156,0x9158,0x9163,0x9165,0x9169,0x9173,
+ 0x9172,0x918B,0x9189,0x9182,0x91A2,0x91AB,0x91AF,0x91AA,0x91B5,0x91B4,
+ 0x91BA,0x91C0,0x91C1,0x91C9,0x91CB,0x91D0,0x91D6,0x91DF,0x91E1,0x91DB,
+ 0x91FC,0x91F5,0x91F6,0x921E,0x91FF,0x9214,0x922C,0x9215,0x9211,0x925E,
+ 0x9257,0x9245,0x9249,0x9264,0x9248,0x9295,0x923F,0x924B,0x9250,0x929C,
+ 0x9296,0x9293,0x929B,0x925A,0x92CF,0x92B9,0x92B7,0x92E9,0x930F,0x92FA,
+ 0x9344,0x932E,0x9319,0x9322,0x931A,0x9323,0x933A,0x9335,0x933B,0x935C,
+ 0x9360,0x937C,0x936E,0x9356,0x93B0,0x93AC,0x93AD,0x9394,0x93B9,0x93D6,
+ 0x93D7,0x93E8,0x93E5,0x93D8,0x93C3,0x93DD,0x93D0,0x93C8,0x93E4,0x941A,
+ 0x9414,0x9413,0x9403,0x9407,0x9410,0x9436,0x942B,0x9435,0x9421,0x943A,
+ 0x9441,0x9452,0x9444,0x945B,0x9460,0x9462,0x945E,0x946A,0x9229,0x9470,
+ 0x9475,0x9477,0x947D,0x945A,0x947C,0x947E,0x9481,0x947F,0x9582,0x9587,
+ 0x958A,0x9594,0x9596,0x9598,0x9599,0x95A0,0x95A8,0x95A7,0x95AD,0x95BC,
+ 0x95BB,0x95B9,0x95BE,0x95CA,0x6FF6,0x95C3,0x95CD,0x95CC,0x95D5,0x95D4,
+ 0x95D6,0x95DC,0x95E1,0x95E5,0x95E2,0x9621,0x9628,0x962E,0x962F,0x9642,
+ 0x964C,0x964F,0x964B,0x9677,0x965C,0x965E,0x965D,0x965F,0x9666,0x9672,
+ 0x966C,0x968D,0x9698,0x9695,0x9697,0x96AA,0x96A7,0x96B1,0x96B2,0x96B0,
+ 0x96B4,0x96B6,0x96B8,0x96B9,0x96CE,0x96CB,0x96C9,0x96CD,0x894D,0x96DC,
+ 0x970D,0x96D5,0x96F9,0x9704,0x9706,0x9708,0x9713,0x970E,0x9711,0x970F,
+ 0x9716,0x9719,0x9724,0x972A,0x9730,0x9739,0x973D,0x973E,0x9744,0x9746,
+ 0x9748,0x9742,0x9749,0x975C,0x9760,0x9764,0x9766,0x9768,0x52D2,0x976B,
+ 0x9771,0x9779,0x9785,0x977C,0x9781,0x977A,0x9786,0x978B,0x978F,0x9790,
+ 0x979C,0x97A8,0x97A6,0x97A3,0x97B3,0x97B4,0x97C3,0x97C6,0x97C8,0x97CB,
+ 0x97DC,0x97ED,0x9F4F,0x97F2,0x7ADF,0x97F6,0x97F5,0x980F,0x980C,0x9838,
+ 0x9824,0x9821,0x9837,0x983D,0x9846,0x984F,0x984B,0x986B,0x986F,0x9870,
+ 0x9871,0x9874,0x9873,0x98AA,0x98AF,0x98B1,0x98B6,0x98C4,0x98C3,0x98C6,
+ 0x98E9,0x98EB,0x9903,0x9909,0x9912,0x9914,0x9918,0x9921,0x991D,0x991E,
+ 0x9924,0x9920,0x992C,0x992E,0x993D,0x993E,0x9942,0x9949,0x9945,0x9950,
+ 0x994B,0x9951,0x9952,0x994C,0x9955,0x9997,0x9998,0x99A5,0x99AD,0x99AE,
+ 0x99BC,0x99DF,0x99DB,0x99DD,0x99D8,0x99D1,0x99ED,0x99EE,0x99F1,0x99F2,
+ 0x99FB,0x99F8,0x9A01,0x9A0F,0x9A05,0x99E2,0x9A19,0x9A2B,0x9A37,0x9A45,
+ 0x9A42,0x9A40,0x9A43,0x9A3E,0x9A55,0x9A4D,0x9A5B,0x9A57,0x9A5F,0x9A62,
+ 0x9A65,0x9A64,0x9A69,0x9A6B,0x9A6A,0x9AAD,0x9AB0,0x9ABC,0x9AC0,0x9ACF,
+ 0x9AD1,0x9AD3,0x9AD4,0x9ADE,0x9ADF,0x9AE2,0x9AE3,0x9AE6,0x9AEF,0x9AEB,
+ 0x9AEE,0x9AF4,0x9AF1,0x9AF7,0x9AFB,0x9B06,0x9B18,0x9B1A,0x9B1F,0x9B22,
+ 0x9B23,0x9B25,0x9B27,0x9B28,0x9B29,0x9B2A,0x9B2E,0x9B2F,0x9B32,0x9B44,
+ 0x9B43,0x9B4F,0x9B4D,0x9B4E,0x9B51,0x9B58,0x9B74,0x9B93,0x9B83,0x9B91,
+ 0x9B96,0x9B97,0x9B9F,0x9BA0,0x9BA8,0x9BB4,0x9BC0,0x9BCA,0x9BB9,0x9BC6,
+ 0x9BCF,0x9BD1,0x9BD2,0x9BE3,0x9BE2,0x9BE4,0x9BD4,0x9BE1,0x9C3A,0x9BF2,
+ 0x9BF1,0x9BF0,0x9C15,0x9C14,0x9C09,0x9C13,0x9C0C,0x9C06,0x9C08,0x9C12,
+ 0x9C0A,0x9C04,0x9C2E,0x9C1B,0x9C25,0x9C24,0x9C21,0x9C30,0x9C47,0x9C32,
+ 0x9C46,0x9C3E,0x9C5A,0x9C60,0x9C67,0x9C76,0x9C78,0x9CE7,0x9CEC,0x9CF0,
+ 0x9D09,0x9D08,0x9CEB,0x9D03,0x9D06,0x9D2A,0x9D26,0x9DAF,0x9D23,0x9D1F,
+ 0x9D44,0x9D15,0x9D12,0x9D41,0x9D3F,0x9D3E,0x9D46,0x9D48,0x9D5D,0x9D5E,
+ 0x9D64,0x9D51,0x9D50,0x9D59,0x9D72,0x9D89,0x9D87,0x9DAB,0x9D6F,0x9D7A,
+ 0x9D9A,0x9DA4,0x9DA9,0x9DB2,0x9DC4,0x9DC1,0x9DBB,0x9DB8,0x9DBA,0x9DC6,
+ 0x9DCF,0x9DC2,0x9DD9,0x9DD3,0x9DF8,0x9DE6,0x9DED,0x9DEF,0x9DFD,0x9E1A,
+ 0x9E1B,0x9E1E,0x9E75,0x9E79,0x9E7D,0x9E81,0x9E88,0x9E8B,0x9E8C,0x9E92,
+ 0x9E95,0x9E91,0x9E9D,0x9EA5,0x9EA9,0x9EB8,0x9EAA,0x9EAD,0x9761,0x9ECC,
+ 0x9ECE,0x9ECF,0x9ED0,0x9ED4,0x9EDC,0x9EDE,0x9EDD,0x9EE0,0x9EE5,0x9EE8,
+ 0x9EEF,0x9EF4,0x9EF6,0x9EF7,0x9EF9,0x9EFB,0x9EFC,0x9EFD,0x9F07,0x9F08,
+ 0x76B7,0x9F15,0x9F21,0x9F2C,0x9F3E,0x9F4A,0x9F52,0x9F54,0x9F63,0x9F5F,
+ 0x9F60,0x9F61,0x9F66,0x9F67,0x9F6C,0x9F6A,0x9F77,0x9F72,0x9F76,0x9F95,
+ 0x9F9C,0x9FA0,0x582F,0x69C7,0x9059,0x7464,0x51DC,0x7199,0x0000,0x0000,
0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
@@ -12002,6 +7483,44 @@
0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
+ 0x0000,0x0000,0x7E8A,0x891C,0x9348,0x9288,0x84DC,0x4FC9,0x70BB,0x6631,
+ 0x68C8,0x92F9,0x66FB,0x5F45,0x4E28,0x4EE1,0x4EFC,0x4F00,0x4F03,0x4F39,
+ 0x4F56,0x4F92,0x4F8A,0x4F9A,0x4F94,0x4FCD,0x5040,0x5022,0x4FFF,0x501E,
+ 0x5046,0x5070,0x5042,0x5094,0x50F4,0x50D8,0x514A,0x5164,0x519D,0x51BE,
+ 0x51EC,0x5215,0x529C,0x52A6,0x52C0,0x52DB,0x5300,0x5307,0x5324,0x5372,
+ 0x5393,0x53B2,0x53DD,0xFA0E,0x549C,0x548A,0x54A9,0x54FF,0x5586,0x5759,
+ 0x5765,0x57AC,0x57C8,0x57C7,0xFA0F,0xFA10,0x589E,0x58B2,0x590B,0x5953,
+ 0x595B,0x595D,0x5963,0x59A4,0x59BA,0x5B56,0x5BC0,0x752F,0x5BD8,0x5BEC,
+ 0x5C1E,0x5CA6,0x5CBA,0x5CF5,0x5D27,0x5D53,0xFA11,0x5D42,0x5D6D,0x5DB8,
+ 0x5DB9,0x5DD0,0x5F21,0x5F34,0x5F67,0x5FB7,0x5FDE,0x605D,0x6085,0x608A,
+ 0x60DE,0x60D5,0x6120,0x60F2,0x6111,0x6137,0x6130,0x6198,0x6213,0x62A6,
+ 0x63F5,0x6460,0x649D,0x64CE,0x654E,0x6600,0x6615,0x663B,0x6609,0x662E,
+ 0x661E,0x6624,0x6665,0x6657,0x6659,0xFA12,0x6673,0x6699,0x66A0,0x66B2,
+ 0x66BF,0x66FA,0x670E,0xF929,0x6766,0x67BB,0x6852,0x67C0,0x6801,0x6844,
+ 0x68CF,0xFA13,0x6968,0xFA14,0x6998,0x69E2,0x6A30,0x6A6B,0x6A46,0x6A73,
+ 0x6A7E,0x6AE2,0x6AE4,0x6BD6,0x6C3F,0x6C5C,0x6C86,0x6C6F,0x6CDA,0x6D04,
+ 0x6D87,0x6D6F,0x6D96,0x6DAC,0x6DCF,0x6DF8,0x6DF2,0x6DFC,0x6E39,0x6E5C,
+ 0x6E27,0x6E3C,0x6EBF,0x6F88,0x6FB5,0x6FF5,0x7005,0x7007,0x7028,0x7085,
+ 0x70AB,0x710F,0x7104,0x715C,0x7146,0x7147,0xFA15,0x71C1,0x71FE,0x72B1,
+ 0x72BE,0x7324,0xFA16,0x7377,0x73BD,0x73C9,0x73D6,0x73E3,0x73D2,0x7407,
+ 0x73F5,0x7426,0x742A,0x7429,0x742E,0x7462,0x7489,0x749F,0x7501,0x756F,
+ 0x7682,0x769C,0x769E,0x769B,0x76A6,0xFA17,0x7746,0x52AF,0x7821,0x784E,
+ 0x7864,0x787A,0x7930,0xFA18,0xFA19,0xFA1A,0x7994,0xFA1B,0x799B,0x7AD1,
+ 0x7AE7,0xFA1C,0x7AEB,0x7B9E,0xFA1D,0x7D48,0x7D5C,0x7DB7,0x7DA0,0x7DD6,
+ 0x7E52,0x7F47,0x7FA1,0xFA1E,0x8301,0x8362,0x837F,0x83C7,0x83F6,0x8448,
+ 0x84B4,0x8553,0x8559,0x856B,0xFA1F,0x85B0,0xFA20,0xFA21,0x8807,0x88F5,
+ 0x8A12,0x8A37,0x8A79,0x8AA7,0x8ABE,0x8ADF,0xFA22,0x8AF6,0x8B53,0x8B7F,
+ 0x8CF0,0x8CF4,0x8D12,0x8D76,0xFA23,0x8ECF,0xFA24,0xFA25,0x9067,0x90DE,
+ 0xFA26,0x9115,0x9127,0x91DA,0x91D7,0x91DE,0x91ED,0x91EE,0x91E4,0x91E5,
+ 0x9206,0x9210,0x920A,0x923A,0x9240,0x923C,0x924E,0x9259,0x9251,0x9239,
+ 0x9267,0x92A7,0x9277,0x9278,0x92E7,0x92D7,0x92D9,0x92D0,0xFA27,0x92D5,
+ 0x92E0,0x92D3,0x9325,0x9321,0x92FB,0xFA28,0x931E,0x92FF,0x931D,0x9302,
+ 0x9370,0x9357,0x93A4,0x93C6,0x93DE,0x93F8,0x9431,0x9445,0x9448,0x9592,
+ 0xF9DC,0xFA29,0x969D,0x96AF,0x9733,0x973B,0x9743,0x974D,0x974F,0x9751,
+ 0x9755,0x9857,0x9865,0xFA2A,0xFA2B,0x9927,0xFA2C,0x999E,0x9A4E,0x9AD9,
+ 0x9ADC,0x9B75,0x9B72,0x9B8F,0x9BB1,0x9BBB,0x9C00,0x9D70,0x9D6B,0xFA2D,
+ 0x9E19,0x9ED1,0x0000,0x0000,0x2170,0x2171,0x2172,0x2173,0x2174,0x2175,
+ 0x2176,0x2177,0x2178,0x2179,0x0000,0xFFE4,0xFF07,0xFF02,0x0000,0x0000,
0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
@@ -12012,33 +7531,4513 @@
0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
- 0x0000,0x212A,0x7C7E,0x2174,0x2170,0x2173,0x2175,0x7C7D,0x214A,0x214B,
- 0x2176,0x215C,0x2124,0x215D,0x2125,0x213F,0x2330,0x2331,0x2332,0x2333,
- 0x2334,0x2335,0x2336,0x2337,0x2338,0x2339,0x2127,0x2128,0x2163,0x2161,
- 0x2164,0x2129,0x2177,0x2341,0x2342,0x2343,0x2344,0x2345,0x2346,0x2347,
- 0x2348,0x2349,0x234A,0x234B,0x234C,0x234D,0x234E,0x234F,0x2350,0x2351,
- 0x2352,0x2353,0x2354,0x2355,0x2356,0x2357,0x2358,0x2359,0x235A,0x214E,
- 0x2140,0x214F,0x2130,0x2132,0x212E,0x2361,0x2362,0x2363,0x2364,0x2365,
- 0x2366,0x2367,0x2368,0x2369,0x236A,0x236B,0x236C,0x236D,0x236E,0x236F,
- 0x2370,0x2371,0x2372,0x2373,0x2374,0x2375,0x2376,0x2377,0x2378,0x2379,
- 0x237A,0x2150,0x2143,0x2151,0x2141,0x0000,0x0000,0x00A1,0x00A2,0x00A3,
- 0x00A4,0x00A5,0x00A6,0x00A7,0x00A8,0x00A9,0x00AA,0x00AB,0x00AC,0x00AD,
- 0x00AE,0x00AF,0x00B0,0x00B1,0x00B2,0x00B3,0x00B4,0x00B5,0x00B6,0x00B7,
- 0x00B8,0x00B9,0x00BA,0x00BB,0x00BC,0x00BD,0x00BE,0x00BF,0x00C0,0x00C1,
- 0x00C2,0x00C3,0x00C4,0x00C5,0x00C6,0x00C7,0x00C8,0x00C9,0x00CA,0x00CB,
- 0x00CC,0x00CD,0x00CE,0x00CF,0x00D0,0x00D1,0x00D2,0x00D3,0x00D4,0x00D5,
- 0x00D6,0x00D7,0x00D8,0x00D9,0x00DA,0x00DB,0x00DC,0x00DD,0x00DE,0x00DF,
0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
- 0x0000,0x0000,0x0000,0x0000,0x2171,0x2172,0x224C,0x2131,0x7C7C,0x216F,
0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
0x0000,0x0000,0x0000,0x0000,0x0000,0x0000
};
-static const int u2jtable_size = (sizeof (u2jtable) / sizeof (unsigned short));
+/*extern const int u2jtable_size;*/
+static const int u2jtable_size = (sizeof (u2jtable) / sizeof (unsigned short));
+/*extern const int j2utable_size;*/
+static const int j2utable_size = (sizeof (j2utable) / sizeof (unsigned short));
+
+
+/* language description structure */
+const char *mbfl_language_ja_jp_aliases[] = {"japanese", NULL};
+mbfl_language mbfl_language_unknown = {mbfl_no_language_unknown, "unknown", NULL};
+mbfl_language mbfl_language_universal = {mbfl_no_language_universal, "universal", NULL};
+mbfl_language mbfl_language_en_us = {mbfl_no_language_en_us, "en_US", NULL};
+mbfl_language mbfl_language_ja_jp = {mbfl_no_language_ja_jp, "ja_JP", &mbfl_language_ja_jp_aliases};
+
+mbfl_language_ptr mbfl_language_ptr_table[] = {
+ &mbfl_language_unknown,
+ &mbfl_language_universal,
+ &mbfl_language_en_us,
+ &mbfl_language_ja_jp,
+ NULL
+};
+
+/* encoding description structure */
+const char *mbfl_encoding_auto_aliases[] = {"unknown", NULL};
+const char *mbfl_encoding_pass_aliases[] = {"none", NULL};
+const char *mbfl_encoding_qprint_aliases[] = {"qprint", NULL};
+const char *mbfl_encoding_ja_jp_euc_aliases[] = {"EUC", "EUC_JP", "eucJP", "x-euc-jp", NULL};
+const char *mbfl_encoding_ja_jp_sjis_aliases[] = {"x-sjis", "MS_Kanji", NULL};
+mbfl_encoding mbfl_encoding_auto = {mbfl_no_encoding_auto, "auto", &mbfl_encoding_auto_aliases, "", &mbfl_language_unknown};
+mbfl_encoding mbfl_encoding_pass = {mbfl_no_encoding_pass, "pass", &mbfl_encoding_pass_aliases, "", &mbfl_language_unknown};
+mbfl_encoding mbfl_encoding_wchar = {mbfl_no_encoding_wchar, "wchar", NULL, "", &mbfl_language_unknown};
+mbfl_encoding mbfl_encoding_base64 = {mbfl_no_encoding_base64, "BASE64", NULL, "", &mbfl_language_unknown};
+mbfl_encoding mbfl_encoding_qprint = {mbfl_no_encoding_qprint, "Quoted-Printable", &mbfl_encoding_qprint_aliases, "", &mbfl_language_unknown};
+mbfl_encoding mbfl_encoding_utf8 = {mbfl_no_encoding_utf8, "UTF-8", NULL, "UTF-8", &mbfl_language_universal};
+mbfl_encoding mbfl_encoding_ucs = {mbfl_no_encoding_ucs, "UCS", NULL, "", &mbfl_language_universal};
+mbfl_encoding mbfl_encoding_en_us_ascii = {mbfl_no_encoding_en_us_ascii, "ASCII", NULL, "US-ASCII", &mbfl_language_en_us};
+mbfl_encoding mbfl_encoding_ja_jp_euc = {mbfl_no_encoding_ja_jp_euc, "EUC-JP", &mbfl_encoding_ja_jp_euc_aliases, "EUC-JP", &mbfl_language_ja_jp};
+mbfl_encoding mbfl_encoding_ja_jp_sjis = {mbfl_no_encoding_ja_jp_sjis, "SJIS", &mbfl_encoding_ja_jp_sjis_aliases, "Shift_JIS", &mbfl_language_ja_jp};
+mbfl_encoding mbfl_encoding_ja_jp_jis = {mbfl_no_encoding_ja_jp_jis, "JIS", NULL, "ISO-2022-JP", &mbfl_language_ja_jp};
+
+mbfl_encoding_ptr mbfl_encoding_ptr_table[] = {
+ &mbfl_encoding_auto,
+ &mbfl_encoding_pass,
+ &mbfl_encoding_wchar,
+ &mbfl_encoding_base64,
+ &mbfl_encoding_qprint,
+ &mbfl_encoding_utf8,
+ &mbfl_encoding_ucs,
+ &mbfl_encoding_en_us_ascii,
+ &mbfl_encoding_ja_jp_euc,
+ &mbfl_encoding_ja_jp_sjis,
+ &mbfl_encoding_ja_jp_jis,
+ NULL
+};
+
+mbfl_encoding_ptr
+mbfl_name2encoding(const char *name)
+{
+ mbfl_encoding_ptr penc;
+ int i, j;
+
+ if (name == NULL) {
+ return NULL;
+ }
+
+ i = 0;
+ while((penc = mbfl_encoding_ptr_table[i++]) != NULL){
+ if(strcasecmp(penc->name, name) == 0) {
+ return penc;
+ }
+ }
+
+ /* serch MIME charset name */
+ i = 0;
+ while((penc = mbfl_encoding_ptr_table[i++]) != NULL){
+ if(strcasecmp(penc->mime_name, name) == 0) {
+ return penc;
+ }
+ }
+
+ /* serch aliases */
+ i = 0;
+ while((penc = mbfl_encoding_ptr_table[i++]) != NULL){
+ if(penc->aliases != NULL) {
+ j = 0;
+ while((*penc->aliases)[j] != NULL) {
+ if(strcasecmp((*penc->aliases)[j], name) == 0)
+ return penc;
+ j++;
+ }
+ }
+ }
+
+ return NULL;
+}
+
+mbfl_encoding_ptr
+mbfl_no2encoding(int no_encoding)
+{
+ mbfl_encoding_ptr penc;
+ int i;
+
+ i = 0;
+ while((penc = mbfl_encoding_ptr_table[i++]) != NULL){
+ if(penc->no_encoding == no_encoding) {
+ return penc;
+ }
+ }
+
+ return NULL;
+}
+
+
+
+/*
+ * メモリに出力するoutput_function
+ * あとで使用する。
+ */
+int
+memory_device_output(int c, void* data)
+{
+ if (((struct memory_device*)data)->pos >= ((struct memory_device*)data)->length) {
+ /* バッファの長さを調節 */
+ int newlen = ((struct memory_device*)data)->length + MBFL_MEMORY_DEVICE_ALLOC_SIZE;
+ char *tmp = (char*)realloc((void*)((struct memory_device*)data)->buffer, newlen);
+ if (tmp == NULL) {
+ return -1;
+ }
+ ((struct memory_device*)data)->length = newlen;
+ ((struct memory_device*)data)->buffer = tmp;
+ }
+
+ ((struct memory_device*)data)->buffer[((struct memory_device*)data)->pos++] = (char)c;
+ return c;
+}
+
+int
+memory_device_cat(struct memory_device *pd, const char *psrc)
+{
+ int len;
+ const char *p;
+
+ len = 0;
+ p = psrc;
+ while (*p) {
+ p++;
+ len++;
+ }
+
+ if ((pd->pos + len) >= pd->length) {
+ /* バッファの長さを調節 */
+ int newlen = pd->length + len + MBFL_MEMORY_DEVICE_ALLOC_SIZE;
+ char *tmp = (char*)realloc((void*)pd->buffer, newlen);
+ if (tmp == NULL) {
+ return 0;
+ }
+ pd->length = newlen;
+ pd->buffer = tmp;
+ }
+
+ p = psrc;
+ while (*p) {
+ pd->buffer[pd->pos++] = *p++;
+ }
+ return 1;
+}
+
+int
+memory_device_ncat(struct memory_device *pd, const char *psrc, int len)
+{
+ if ((pd->pos + len) >= pd->length) {
+ /* バッファの長さを調節 */
+ int newlen = pd->length + len + MBFL_MEMORY_DEVICE_ALLOC_SIZE;
+ char *tmp = (char*)realloc((void*)pd->buffer, newlen);
+ if (tmp == NULL) {
+ return 0;
+ }
+ pd->length = newlen;
+ pd->buffer = tmp;
+ }
+
+ while (len > 0) {
+ pd->buffer[pd->pos++] = *psrc++;
+ len--;
+ }
+ return 1;
+}
+
+int
+wchar_device_output(int c, void* data)
+{
+ if (((struct wchar_device*)data)->pos >= ((struct wchar_device*)data)->length) {
+ /* バッファの長さを調節 */
+ int newlen = ((struct wchar_device*)data)->length + MBFL_MEMORY_DEVICE_ALLOC_SIZE;
+ int *tmp = (int*)realloc((void*)((struct wchar_device*)data)->buffer, newlen*sizeof(int));
+ if (tmp == NULL) {
+ return -1;
+ }
+ ((struct wchar_device*)data)->length = newlen;
+ ((struct wchar_device*)data)->buffer = tmp;
+ }
+
+ ((struct wchar_device*)data)->buffer[((struct wchar_device*)data)->pos++] = c;
+ return c;
+}
+
+/*
+ *
+ * kanji code filter
+ *
+ */
+struct mbfl_output_filter {
+ const struct filter_vtbl* vptr;
+ /* 行うべき変換によって異なるポインタを保持する。*/
+
+ int (*output_function)(int c, void* data);
+ /* 利用側が用意。エラーのときはマイナス値。*/
+
+ int (*flush_function)(void* data);
+ /* 利用側が用意。出力をフラッシュする。ヌルならば使用されない。*/
+
+ void* data;
+ /* 利用側が用意。(*output_function)()の1番目の引数に渡される。*/
+
+ int status;
+ /* vptr->filter_functionによって使用方法は異なる。*/
+
+ int cache;
+ /* vptr->filter_functionによって使用方法は異なる。*/
+
+ enum mbfl_no_encoding from;
+ enum mbfl_no_encoding to;
+ /* 変換前と後の漢字コード */
+};
+
+struct filter_vtbl {
+ void (*filter_ctor)(
+ struct mbfl_output_filter* filter,
+ enum mbfl_no_encoding from,
+ enum mbfl_no_encoding to,
+ int (*output_function)(int, void*),
+ int (*flush_function)(void*),
+ void* data);
+ /* mbfl_output_filterの内容を初期化する。*/
+
+ void (*filter_dtor)(struct mbfl_output_filter* filter);
+ /* mbfl_output_filterの削除前処理を行う。*/
+
+ int (*filter_function)(struct mbfl_output_filter* filter, int c);
+ /* 変換を行う関数へのポインタ。エラーのときはマイナス値。*/
+
+ int (*flush_function)(struct mbfl_output_filter* filter);
+ /* フラッシュを行う関数へのポインタ。*/
+};
+
+#define CK(statement) do { if ((statement) < 0) return (-1); } while (0)
+
+
+/*
+ * commonly used constructor and destructor
+ */
+static void
+filt_common_ctor(
+ struct mbfl_output_filter* filter,
+ enum mbfl_no_encoding from, /* ignored */
+ enum mbfl_no_encoding to, /* ignored */
+ int (*output_function)(int, void*),
+ int (*flush_function)(void*),
+ void* data)
+{
+ filter->output_function = output_function;
+ filter->flush_function = flush_function;
+ filter->data = data;
+ filter->status = 0;
+ filter->cache = 0;
+ filter->from = from;
+ filter->to = to;
+}
+
+static int
+filt_common_flush(struct mbfl_output_filter* filter)
+{
+ /* flush */
+ return (filter->flush_function ? (*filter->flush_function)(filter->data) : 0);
+}
+
+static void
+filt_common_dtor(struct mbfl_output_filter* filter)
+{
+ /* flush */
+ if (filter->flush_function) {
+ (void)(*filter->flush_function)(filter->data);
+ }
+
+ /* destruct */
+}
+
+static int
+filt_pass(struct mbfl_output_filter* filter, int c)
+{
+ return (*filter->output_function)(c, filter->data);
+}
+
+/*
+ * EUC-JP => JIS
+ */
+static int
+filt_eucjp_jis(struct mbfl_output_filter* filter, int c)
+{
+ switch (filter->status) {
+ case 0: /* roman */
+ case 10: /* kana */
+ case 20: /* kanji */
+ if (c == 0x8e) { /* kana first char */
+ filter->status++; /* 0->1, 10->11, 20->21 */
+ break;
+ } if (c >= 0x80) { /* kanji first char */
+ filter->status += 2; /* 0->2, 10->12, 20->22 */
+ filter->cache = c;
+ break;
+ }
+ if (filter->status != 0) {
+ CK((*filter->output_function)('\033', filter->data));
+ CK((*filter->output_function)('(', filter->data));
+ CK((*filter->output_function)('B', filter->data));
+ filter->status = 0;
+ }
+ CK((*filter->output_function)(c, filter->data));
+ break;
+
+ case 1: /* roman got 0x8e */
+ case 21: /* kanji got 0x8e */
+ CK((*filter->output_function)('\033', filter->data));
+ CK((*filter->output_function)('(', filter->data));
+ CK((*filter->output_function)('I', filter->data));
+ case 11: /* kana got 0x8e */
+ filter->status = 10;
+ CK((*filter->output_function)(c & 0x7f, filter->data));
+ break;
+
+ case 2: /* roman got first half */
+ case 12: /* kana got first half */
+ CK((*filter->output_function)('\033', filter->data));
+ CK((*filter->output_function)('$', filter->data));
+ CK((*filter->output_function)('B', filter->data));
+ case 22: /* kanji got first half */
+ filter->status = 20;
+ if (c == '\0') {
+ CK((*filter->output_function)(c, filter->data));
+ } else {
+ CK((*filter->output_function)(filter->cache & 0x7f, filter->data));
+ CK((*filter->output_function)(c & 0x7f, filter->data));
+ }
+ break;
+ }
+
+ return c;
+}
+
+static int
+filt_eucjp_jis_flush(struct mbfl_output_filter* filter)
+{
+ /* back to roman */
+ if (filter->status / 10 != 0) { /* upper digit of the status */
+ CK((*filter->output_function)('\033', filter->data));
+ CK((*filter->output_function)('(', filter->data));
+ CK((*filter->output_function)('B', filter->data));
+ }
+
+ /* flush */
+ return (filter->flush_function ? (*filter->flush_function)(filter->data) : 0);
+}
+
+static void
+filt_eucjp_jis_dtor(struct mbfl_output_filter* filter)
+{
+ (void)filt_eucjp_jis_flush(filter);
+}
+
+/*
+ * EUC-JP => SJIS
+ */
+static int
+filt_eucjp_sjis(struct mbfl_output_filter* filter, int c)
+{
+ int c1;
+
+ switch (filter->status) {
+ case 0: /* roman */
+ if (c == 0x8e) { /* kana first char */
+ filter->status = 1;
+ break;
+ }
+ if (c >= 0x80) { /* kanji first char */
+ filter->status = 2;
+ filter->cache = c;
+ break;
+ }
+ CK((*filter->output_function)(c, filter->data));
+ break;
+
+ case 1: /* got 0x8e */
+ filter->status = 0;
+ CK((*filter->output_function)(c, filter->data));
+ break;
+
+ case 2: /* got first half */
+ filter->status = 0;
+ if (c == '\0') {
+ CK((*filter->output_function)(c, filter->data));
+ } else {
+ c1 = filter->cache & 0x7f;
+ c &= 0x7f;
+ c += ((c1 % 2) ? (c > 0x5f ? 0x20 : 0x1f) : 0x7e);
+ CK((*filter->output_function)(((c1 + 1) >> 1) + (c1 < 0x5f ? 0x70 : 0xb0), filter->data));
+ CK((*filter->output_function)(c, filter->data));
+ }
+ break;
+ }
+
+ return c;
+}
+
+/*
+ * SJIS => JIS
+ */
+static int
+filt_sjis_jis(struct mbfl_output_filter* filter, int c)
+{
+ int next; /* next status */
+ int c1, row;
+
+ if (filter->status >= 10) { /* kanji second char */
+ filter->status %= 10;
+ next = 2;
+ } else if (c >= 0xa1 && c <= 0xdf) { /* kana */
+ next = 1;
+ } else if (c >= 0x80) { /* kanji first char */
+ filter->status += 10;
+ filter->cache = c;
+ return c;
+ } else { /* roman */
+ next = 0;
+ }
+
+ switch (next) {
+ case 0: /* roman */
+ if (filter->status != 0) {
+ CK((*filter->output_function)('\033', filter->data));
+ CK((*filter->output_function)('(', filter->data));
+ CK((*filter->output_function)('B', filter->data));
+ filter->status = 0;
+ }
+ CK((*filter->output_function)(c, filter->data));
+ break;
+
+ case 1: /* kana */
+ if (filter->status != 1) {
+ CK((*filter->output_function)('\033', filter->data));
+ CK((*filter->output_function)('(', filter->data));
+ CK((*filter->output_function)('I', filter->data));
+ filter->status = 1;
+ }
+ CK((*filter->output_function)(c & 0x7f, filter->data));
+ break;
+
+ case 2: /* kanji second char */
+ if (c == '\0') {
+ CK((*filter->output_function)(c, filter->data));
+ } else {
+ if (filter->status != 2) {
+ CK((*filter->output_function)('\033', filter->data));
+ CK((*filter->output_function)('$', filter->data));
+ CK((*filter->output_function)('B', filter->data));
+ filter->status = 2;
+ }
+ c1 = filter->cache;
+ row = (c1 < 0xa0 ? 0x70 : 0xb0);
+ if (c < 0x9f) {
+ c1 = ((c1 - row) << 1) - 1;
+ c -= (c > 0x7f ? 0x20 : 0x1f);
+ } else {
+ c1 = ((c1 - row) << 1);
+ c -= 0x7e;
+ }
+ CK((*filter->output_function)(c1, filter->data));
+ CK((*filter->output_function)(c, filter->data));
+ }
+ break;
+ }
+
+ return c;
+}
+
+static int
+filt_sjis_jis_flush(struct mbfl_output_filter* filter)
+{
+ /* back to roman */
+ if (filter->status != 0) {
+ (*filter->output_function)('\033', filter->data);
+ (*filter->output_function)('(', filter->data);
+ (*filter->output_function)('B', filter->data);
+ }
+
+ /* flush */
+ return (filter->flush_function ? (*filter->flush_function)(filter->data) : 0);
+}
+
+static void
+filt_sjis_jis_dtor(struct mbfl_output_filter* filter)
+{
+ (void)filt_sjis_jis_flush(filter);
+}
+
+/*
+ * SJIS => EUC-JP
+ */
+static int
+filt_sjis_eucjp(struct mbfl_output_filter* filter, int c)
+{
+ int c1, row;
+
+ if (filter->status == 1) { /* kanji second char */
+ filter->status = 0;
+ if (c == '\0') {
+ CK((*filter->output_function)(c, filter->data));
+ } else {
+ c1 = filter->cache;
+ row = (c1 < 0xa0 ? 0x70 : 0xb0);
+ if (c < 0x9f) {
+ c1 = ((c1 - row) << 1) - 1;
+ c -= (c > 0x7f ? 0x20 : 0x1f);
+ } else {
+ c1 = ((c1 - row) << 1);
+ c -= 0x7e;
+ }
+ CK((*filter->output_function)(c1 | 0x80, filter->data));
+ CK((*filter->output_function)(c | 0x80, filter->data));
+ }
+ } else if (c >= 0xa1 && c <= 0xdf) { /* kana */
+ CK((*filter->output_function)(0x8e, filter->data));
+ CK((*filter->output_function)(c, filter->data));
+ } else if (c >= 0x80) { /* kanji first char */
+ filter->status = 1;
+ filter->cache = c;
+ } else { /* roman */
+ CK((*filter->output_function)(c, filter->data));
+ }
+
+ return c;
+}
+
+/*
+ * JIS => EUC-JP
+ */
+static int
+filt_jis_eucjp(struct mbfl_output_filter* filter, int c)
+{
+retry:
+ switch (filter->status) {
+ case 0: /* roman */
+ case 10: /* kana */
+ case 20: /* kanji */
+ if (c == 0x1b) {
+ filter->status++;
+ } else if (c == 0x0e) { /* "kana in" */
+ filter->status = 10;
+ } else if (c == 0x0f) { /* "kana out" */
+ filter->status = 0;
+ } else if (c >= 0x21 && c <= 0x7e) {
+ if (filter->status == 20) { /* kanji first char */
+ filter->cache = c;
+ filter->status = 25;
+ } else if (filter->status == 10) { /* kana */
+ CK((*filter->output_function)(0x8e, filter->data));
+ CK((*filter->output_function)(c | 0x80, filter->data));
+ } else { /* ascii */
+ CK((*filter->output_function)(c, filter->data));
+ }
+ } else if (c >= 0xa1 && c <= 0xdf) { /* GR kana */
+ CK((*filter->output_function)(0x8e, filter->data));
+ CK((*filter->output_function)(c, filter->data));
+ } else { /* CR, LF, CTLs */
+ CK((*filter->output_function)(c, filter->data));
+ }
+ break;
+
+ case 25: /* kanji second char */
+ filter->status = 20;
+ if (c == '\0') {
+ CK((*filter->output_function)(c, filter->data));
+ } else if (c == 0x1b) {
+ goto retry;
+ } else {
+ CK((*filter->output_function)(filter->cache | 0x80, filter->data));
+ CK((*filter->output_function)(c | 0x80, filter->data));
+ }
+ break;
+
+ case 1: /* ESC */
+ case 11: /* ESC */
+ case 21: /* ESC */
+ if (c == 0x24) {
+ filter->status++;
+ } else if (c == 0x28) {
+ filter->status += 3;
+ } else {
+ filter->status--;
+ CK((*filter->output_function)(0x1b, filter->data));
+ goto retry;
+ }
+ break;
+
+ case 2: /* ESC 0x24 */
+ case 12: /* ESC 0x24 */
+ case 22: /* ESC 0x24 */
+ if (c == 0x40 || c == 0x42) {
+ filter->status = 20;
+ } else if (c == 0x28) {
+ filter->status++;
+ } else {
+ filter->status -= 2;
+ CK((*filter->output_function)(0x1b, filter->data));
+ CK((*filter->output_function)(0x24, filter->data));
+ goto retry;
+ }
+ break;
+
+ case 3: /* ESC 0x24 0x28 */
+ case 13: /* ESC 0x24 0x28 */
+ case 23: /* ESC 0x24 0x28 */
+ if (c == 0x44) {
+ filter->status = 20;
+ } else {
+ filter->status -= 3;
+ CK((*filter->output_function)(0x1b, filter->data));
+ CK((*filter->output_function)(0x24, filter->data));
+ CK((*filter->output_function)(0x28, filter->data));
+ goto retry;
+ }
+ break;
+
+ case 4: /* ESC 0x28 */
+ case 14: /* ESC 0x28 */
+ case 24: /* ESC 0x28 */
+ switch (c) {
+ case 0x42:
+ case 0x48:
+ case 0x4a:
+ filter->status = 0;
+ break;
+
+ case 0x49:
+ filter->status = 10;
+ break;
+
+ default:
+ filter->status -= 4;
+ CK((*filter->output_function)(0x1b, filter->data));
+ CK((*filter->output_function)(0x28, filter->data));
+ goto retry;
+ break;
+ }
+ break;
+ }
+
+ return c;
+}
+
+/*
+ * JIS => SJIS
+ */
+static int
+filt_jis_sjis(struct mbfl_output_filter* filter, int c)
+{
+ int c1;
+
+retry:
+ switch (filter->status) {
+ case 0: /* roman */
+ case 10: /* kana */
+ case 20: /* kanji */
+ if (c == 0x1b) {
+ filter->status++;
+ } else if (c == 0x0e) { /* "kana in" */
+ filter->status = 10;
+ } else if (c == 0x0f) { /* "kana out" */
+ filter->status = 0;
+ } else if (c >= 0x21 && c <= 0x7e) {
+ if (filter->status == 20) { /* kanji first char */
+ filter->cache = c;
+ filter->status = 25;
+ } else if (filter->status == 10) { /* kana */
+ CK((*filter->output_function)(c | 0x80, filter->data));
+ } else { /* ascii */
+ CK((*filter->output_function)(c, filter->data));
+ }
+ } else { /* CR, LF, CTLs or maybe GR kana */
+ CK((*filter->output_function)(c, filter->data));
+ }
+ break;
+
+ case 25: /* kanji second char */
+ filter->status = 20;
+ if (c == '\0') {
+ CK((*filter->output_function)(c, filter->data));
+ } else if (c == 0x1b) {
+ goto retry;
+ } else {
+ c1 = filter->cache;
+ c &= 0x7f;
+ c += ((c1 % 2) ? (c > 0x5f ? 0x20 : 0x1f) : 0x7e);
+ CK((*filter->output_function)(((c1 + 1) >> 1) + (c1 < 0x5f ? 0x70 : 0xb0), filter->data));
+ CK((*filter->output_function)(c, filter->data));
+ }
+ break;
+
+ case 1: /* ESC */
+ case 11: /* ESC */
+ case 21: /* ESC */
+ if (c == 0x24) {
+ filter->status++;
+ } else if (c == 0x28) {
+ filter->status += 3;
+ } else {
+ filter->status--;
+ CK((*filter->output_function)(0x1b, filter->data));
+ goto retry;
+ }
+ break;
+
+ case 2: /* ESC 0x24 */
+ case 12: /* ESC 0x24 */
+ case 22: /* ESC 0x24 */
+ if (c == 0x40 || c == 0x42) {
+ filter->status = 20;
+ } else if (c == 0x28) {
+ filter->status++;
+ } else {
+ filter->status -= 2;
+ CK((*filter->output_function)(0x1b, filter->data));
+ CK((*filter->output_function)(0x24, filter->data));
+ goto retry;
+ }
+ break;
+
+ case 3: /* ESC 0x24 0x28 */
+ case 13: /* ESC 0x24 0x28 */
+ case 23: /* ESC 0x24 0x28 */
+ if (c == 0x44) {
+ filter->status = 20;
+ } else {
+ filter->status -= 3;
+ CK((*filter->output_function)(0x1b, filter->data));
+ CK((*filter->output_function)(0x24, filter->data));
+ CK((*filter->output_function)(0x28, filter->data));
+ goto retry;
+ }
+ break;
+
+ case 4: /* ESC 0x28 */
+ case 14: /* ESC 0x28 */
+ case 24: /* ESC 0x28 */
+ switch (c) {
+ case 0x42:
+ case 0x48:
+ case 0x4a:
+ filter->status = 0;
+ break;
+
+ case 0x49:
+ filter->status = 10;
+ break;
+
+ default:
+ filter->status -= 4;
+ CK((*filter->output_function)(0x1b, filter->data));
+ CK((*filter->output_function)(0x28, filter->data));
+ goto retry;
+ break;
+ }
+ break;
+ }
+
+ return c;
+}
+
+/*
+ * EUC-JP => UTF-8
+ */
+static int
+filt_eucjp_utf8(struct mbfl_output_filter* filter, int c)
+{
+ int p, s;
+
+ switch (filter->status) {
+ case 0: /* roman */
+ if (c == 0x8e) { /* kana first char */
+ filter->status = 1;
+ } else if (c >= 0x80) { /* kanji first char */
+ filter->status = 2;
+ filter->cache = c;
+ } else {
+ CK((*filter->output_function)(c, filter->data));
+ }
+ break;
+
+ case 1: /* got 0x8e */
+ filter->status = 0;
+ if (c >= 0xa1 && c <= 0xdf) {
+ s = 0xfec0 + c;
+ CK((*filter->output_function)(((s >> 12) & 0x0f) | 0xe0, filter->data));
+ CK((*filter->output_function)(((s >> 6) & 0x3f) | 0x80, filter->data));
+ CK((*filter->output_function)((s & 0x3f) | 0x80, filter->data));
+ } else if (c < 0x80) {
+ CK((*filter->output_function)(c, filter->data));
+ }
+ break;
+
+ case 2: /* got first half */
+ filter->status = 0;
+ if (c == '\0') {
+ CK((*filter->output_function)(c, filter->data));
+ } else {
+ p = (filter->cache - 0xa1) * 94 + c - 0xa1;
+ s = 0;
+ if (p >= 0 && p < j2utable_size)
+ s = j2utable[p];
+ if (s == 0)
+ s = UNDEFCHAR_UNICODE;
+ if (s < 0x80) {
+ CK((*filter->output_function)(s, filter->data));
+ } else if (s < 0x800) {
+ CK((*filter->output_function)(((s >> 6) & 0x1f) | 0xc0, filter->data));
+ CK((*filter->output_function)((s & 0x3f) | 0x80, filter->data));
+ } else {
+ CK((*filter->output_function)(((s >> 12) & 0x0f) | 0xe0, filter->data));
+ CK((*filter->output_function)(((s >> 6) & 0x3f) | 0x80, filter->data));
+ CK((*filter->output_function)((s & 0x3f) | 0x80, filter->data));
+ }
+ }
+ break;
+ }
+
+ return c;
+}
+
+/*
+ * SJIS => UTF8
+ */
+static int
+filt_sjis_utf8(struct mbfl_output_filter* filter, int c)
+{
+ int p, s;
+
+ if (filter->status == 1) { /* kanji second char */
+ filter->status = 0;
+ if (c == '\0') {
+ CK((*filter->output_function)(c, filter->data));
+ } else {
+ p = filter->cache;
+ if (p < 0xa0)
+ p -= 0x81;
+ else
+ p -= 0xc1;
+ p *= 188;
+ if (c < 0x7f)
+ p += c - 0x40;
+ else
+ p += c - 0x41;
+ s = 0;
+ if (p >= 0 && p < j2utable_size)
+ s = j2utable[p];
+ if (s == 0)
+ s = UNDEFCHAR_UNICODE;
+ if (s < 0x80) {
+ CK((*filter->output_function)(s, filter->data));
+ } else if (s < 0x800) {
+ CK((*filter->output_function)(((s >> 6) & 0x1f) | 0xc0, filter->data));
+ CK((*filter->output_function)((s & 0x3f) | 0x80, filter->data));
+ } else {
+ CK((*filter->output_function)(((s >> 12) & 0x0f) | 0xe0, filter->data));
+ CK((*filter->output_function)(((s >> 6) & 0x3f) | 0x80, filter->data));
+ CK((*filter->output_function)((s & 0x3f) | 0x80, filter->data));
+ }
+ }
+ } else if (c >= 0xa1 && c <= 0xdf) { /* kana */
+ filter->status = 0;
+ s = 0xfec0 + c;
+ CK((*filter->output_function)(((s >> 12) & 0x0f) | 0xe0, filter->data));
+ CK((*filter->output_function)(((s >> 6) & 0x3f) | 0x80, filter->data));
+ CK((*filter->output_function)((s & 0x3f) | 0x80, filter->data));
+ } else if (c >= 0x80) { /* kanji first char */
+ filter->status = 1;
+ filter->cache = c;
+ } else { /* roman */
+ filter->status = 0;
+ CK((*filter->output_function)(c, filter->data));
+ }
+
+ return c;
+}
+
+/*
+ * JIS => UTF-8
+ */
+static int
+filt_jis_utf8(struct mbfl_output_filter* filter, int c)
+{
+ int p, s;
+
+retry:
+ switch (filter->status) {
+ case 0: /* roman */
+ case 10: /* kana */
+ case 20: /* kanji */
+ if (c == 0x1b) {
+ filter->status++;
+ } else if (c == 0x0e) { /* "kana in" */
+ filter->status = 10;
+ } else if (c == 0x0f) { /* "kana out" */
+ filter->status = 0;
+ } else if (c >= 0x21 && c <= 0x7e) {
+ if (filter->status == 20) { /* kanji first char */
+ filter->cache = c;
+ filter->status = 25;
+ } else if (filter->status == 10) { /* kana */
+ s = 0xff40 + c;
+ CK((*filter->output_function)(((s >> 12) & 0x0f) | 0xe0, filter->data));
+ CK((*filter->output_function)(((s >> 6) & 0x3f) | 0x80, filter->data));
+ CK((*filter->output_function)((s & 0x3f) | 0x80, filter->data));
+ } else { /* ascii */
+ CK((*filter->output_function)(c, filter->data));
+ }
+ } else if (c >= 0xa1 && c <= 0xdf) { /* GR kana */
+ s = 0xfec0 + c;
+ CK((*filter->output_function)(((s >> 12) & 0x0f) | 0xe0, filter->data));
+ CK((*filter->output_function)(((s >> 6) & 0x3f) | 0x80, filter->data));
+ CK((*filter->output_function)((s & 0x3f) | 0x80, filter->data));
+ } else { /* CR, LF, CTLs */
+ CK((*filter->output_function)(c, filter->data));
+ }
+ break;
+
+ case 25: /* kanji second char */
+ filter->status = 20;
+ if (c == '\0') {
+ CK((*filter->output_function)(c, filter->data));
+ } else if (c == 0x1b) {
+ goto retry;
+ } else {
+ p = (filter->cache - 0x21) * 94 + c - 0x21;
+ s = 0;
+ if (p >= 0 && p < j2utable_size)
+ s = j2utable[p];
+ if (s == 0)
+ s = UNDEFCHAR_UNICODE;
+ if (s < 0x80) {
+ CK((*filter->output_function)(s, filter->data));
+ } else if (s < 0x800) {
+ CK((*filter->output_function)(((s >> 6) & 0x1f) | 0xc0, filter->data));
+ CK((*filter->output_function)((s & 0x3f) | 0x80, filter->data));
+ } else {
+ CK((*filter->output_function)(((s >> 12) & 0x0f) | 0xe0, filter->data));
+ CK((*filter->output_function)(((s >> 6) & 0x3f) | 0x80, filter->data));
+ CK((*filter->output_function)((s & 0x3f) | 0x80, filter->data));
+ }
+ }
+ break;
+
+ case 1: /* ESC */
+ case 11: /* ESC */
+ case 21: /* ESC */
+ if (c == 0x24) {
+ filter->status++;
+ } else if (c == 0x28) {
+ filter->status += 3;
+ } else {
+ filter->status--;
+ CK((*filter->output_function)(0x1b, filter->data));
+ goto retry;
+ }
+ break;
+
+ case 2: /* ESC 0x24 */
+ case 12: /* ESC 0x24 */
+ case 22: /* ESC 0x24 */
+ if (c == 0x40 || c == 0x42) {
+ filter->status = 20;
+ } else if (c == 0x28) {
+ filter->status++;
+ } else {
+ filter->status -= 2;
+ CK((*filter->output_function)(0x1b, filter->data));
+ CK((*filter->output_function)(0x24, filter->data));
+ goto retry;
+ }
+ break;
+
+ case 3: /* ESC 0x24 0x28 */
+ case 13: /* ESC 0x24 0x28 */
+ case 23: /* ESC 0x24 0x28 */
+ if (c == 0x44) {
+ filter->status = 20;
+ } else {
+ filter->status -= 3;
+ CK((*filter->output_function)(0x1b, filter->data));
+ CK((*filter->output_function)(0x24, filter->data));
+ CK((*filter->output_function)(0x28, filter->data));
+ goto retry;
+ }
+ break;
+
+ case 4: /* ESC 0x28 */
+ case 14: /* ESC 0x28 */
+ case 24: /* ESC 0x28 */
+ switch (c) {
+ case 0x42:
+ case 0x48:
+ case 0x4a:
+ filter->status = 0;
+ break;
+ case 0x49:
+ filter->status = 10;
+ break;
+ default:
+ filter->status -= 4;
+ CK((*filter->output_function)(0x1b, filter->data));
+ CK((*filter->output_function)(0x28, filter->data));
+ goto retry;
+ }
+ break;
+ }
+
+ return c;
+}
+
+
+/*
+ * UTF-8 => EUC-JP
+ */
+static int
+filt_utf8_euc(struct mbfl_output_filter* filter, int c)
+{
+ int s;
+
+ if (c < 0x80) {
+ filter->status = 0;
+ CK((*filter->output_function)(c, filter->data));
+ } else if (c < 0xc0) {
+ switch (filter->status) {
+ case 0x20: /* 3 byte code second char */
+ filter->cache += ((c & 0x3f) << 6);
+ filter->status++;
+ break;
+
+ case 0x10: /* 2 byte code second char */
+ case 0x21: /* 3 byte code third char */
+ filter->status = 0;
+ s = u2jtable[filter->cache + (c & 0x3f)];
+ if (s == 0)
+ s = UNDEFCHAR_JIS;
+ if(s < 0x80) {
+ CK((*filter->output_function)(s, filter->data));
+ } else if (s < 0x100) {
+ CK((*filter->output_function)(0x8e, filter->data));
+ CK((*filter->output_function)(s, filter->data));
+ } else {
+ CK((*filter->output_function)(((s >> 8) & 0xff) | 0x80, filter->data));
+ CK((*filter->output_function)((s & 0xff) | 0x80, filter->data));
+ }
+ break;
+
+ default:
+ filter->status = 0;
+ break;
+ }
+ } else if (c < 0xe0) { /* 2 byte code first char */
+ filter->status = 0x10;
+ filter->cache = (c & 0x1f) << 6;
+ } else if (c < 0xf0) { /* 3 byte code first char */
+ filter->status = 0x20;
+ filter->cache = (c & 0xf) << 12;
+ } else { /* 4, 5 or 6 byte code first char */
+ filter->status = 0;
+ }
+
+ return c;
+}
+
+/*
+ * UTF-8 => SJIS
+ */
+static int
+filt_utf8_sjis(struct mbfl_output_filter* filter, int c)
+{
+ int c1, c2, s1, s2;
+
+ if (c < 0x80) {
+ filter->status = 0;
+ CK((*filter->output_function)(c, filter->data));
+ } else if (c < 0xc0) {
+ switch (filter->status & 0xff) {
+ case 0x20: /* 3 byte code second char */
+ filter->cache += ((c & 0x3f) << 6);
+ filter->status++;
+ break;
+
+ case 0x10: /* 2 byte code second char */
+ case 0x21: /* 3 byte code third char */
+ filter->status = 0;
+ s1 = u2jtable[filter->cache + (c & 0x3f)];
+ if (s1 == 0)
+ s1 = UNDEFCHAR_JIS;
+ if(s1 < 0x100) {
+ CK((*filter->output_function)(s1, filter->data));
+ } else {
+ c1 = (s1 >> 8) & 0xff;
+ c2 = s1 & 0xff;
+ s1 = ((c1 + 1) >> 1) + (c1 < 0x5f ? 0x70 : 0xb0);
+ s2 = c2 + (c1 & 1 ? (c2 > 0x5f ? 0x20 : 0x1f) : 0x7e);
+ CK((*filter->output_function)(s1, filter->data));
+ CK((*filter->output_function)(s2, filter->data));
+ }
+ break;
+
+ default:
+ filter->status = 0;
+ break;
+ }
+ } else if (c < 0xe0) { /* 2 byte code first char */
+ filter->status = 0x10;
+ filter->cache = ((c & 0x1f) << 6);
+ } else if (c < 0xf0) { /* 3 byte code first char */
+ filter->status = 0x20;
+ filter->cache = ((c & 0xf) << 12);
+ } else { /* 4, 5 or 6 byte code first char */
+ filter->status = 0;
+ }
+
+ return c;
+}
+
+/*
+ * UTF-8 => JIS
+ */
+static int
+filt_utf8_jis(struct mbfl_output_filter* filter, int c)
+{
+ int s;
+
+ if (c < 0x80) {
+ if ((filter->status & 0xff00) != 0) {
+ CK((*filter->output_function)('\033', filter->data));
+ CK((*filter->output_function)('(', filter->data));
+ CK((*filter->output_function)('B', filter->data));
+ }
+ filter->status = 0;
+ CK((*filter->output_function)(c, filter->data));
+ } else if (c < 0xc0) {
+ switch(filter->status & 0xff) {
+ case 0x20: /* 3 byte code second char */
+ filter->cache += ((c & 0x3f) << 6);
+ filter->status++;
+ break;
+
+ case 0x10: /* 2 byte code second char */
+ case 0x21: /* 3 byte code third char */
+ s = u2jtable[filter->cache + (c & 0x3f)];
+ if(s == 0)
+ s = UNDEFCHAR_JIS;
+ if(s < 0x80) { /* roman */
+ if((filter->status & 0xff00) != 0) {
+ CK((*filter->output_function)('\033', filter->data));
+ CK((*filter->output_function)('(', filter->data));
+ CK((*filter->output_function)('B', filter->data));
+ }
+ filter->status = 0;
+ CK((*filter->output_function)(s, filter->data));
+ } else if(s < 0x100) { /* kana */
+ if((filter->status & 0xff00) != 0x100){
+ CK((*filter->output_function)('\033', filter->data));
+ CK((*filter->output_function)('(', filter->data));
+ CK((*filter->output_function)('I', filter->data));
+ }
+ filter->status = 0x30100;
+ CK((*filter->output_function)(s & 0x7f, filter->data));
+ } else { /* kanji */
+ if((filter->status & 0xff00) != 0x200){
+ CK((*filter->output_function)('\033', filter->data));
+ CK((*filter->output_function)('$', filter->data));
+ CK((*filter->output_function)('B', filter->data));
+ }
+ filter->status = 0x30200;
+ CK((*filter->output_function)((s >> 8) & 0x7f, filter->data));
+ CK((*filter->output_function)(s & 0x7f, filter->data));
+ }
+ break;
+
+ default:
+ filter->status &= ~0xff;
+ break;
+ }
+ } else if (c < 0xe0) { /* 2 byte code first char */
+ filter->status &= ~0xff;
+ filter->status |= 0x10;
+ filter->cache = (c & 0x1f) << 6;
+ } else if (c < 0xf0) { /* 3 byte code first char */
+ filter->status &= ~0xff;
+ filter->status |= 0x20;
+ filter->cache = (c & 0xf) << 12;
+ } else { /* 4, 5 or 6 byte code first char */
+ filter->status &= ~0xff;
+ }
+
+ return c;
+}
+
+static int
+filt_ucs_jis_flush(struct mbfl_output_filter* filter)
+{
+ /* back to roman */
+ if ((filter->status & 0xff00) != 0) {
+ (*filter->output_function)('\033', filter->data);
+ (*filter->output_function)('(', filter->data);
+ (*filter->output_function)('B', filter->data);
+ }
+ filter->status &= 0xff;
+
+ /* flush */
+ return (filter->flush_function ? (*filter->flush_function)(filter->data) : 0);
+}
+
+static void
+filt_ucs_jis_dtor(struct mbfl_output_filter* filter)
+{
+ (void)filt_ucs_jis_flush(filter);
+}
+
+/*
+ * EUC-JP => UCS
+ */
+static int
+filt_euc_ucs(struct mbfl_output_filter* filter, int c)
+{
+ int s;
+ switch (filter->status) {
+ case 0: /* roman */
+ if (c == 0x8e) { /* kana first char */
+ filter->status = 1;
+ } else if (c >= 0x80) { /* kanji first char */
+ filter->status = 2;
+ filter->cache = c;
+ } else {
+ CK((*filter->output_function)(c, filter->data));
+ }
+ break;
+ case 1: /* got 0x8e */
+ filter->status = 0;
+ if(c >= 0xa1 && c <= 0xdf){
+ CK((*filter->output_function)(0xfec0 + c, filter->data));
+ } else if(c < 0x80) {
+ CK((*filter->output_function)(c, filter->data));
+ }
+ break;
+ case 2: /* got first half */
+ filter->status = 0;
+ if(c == '\0'){
+ CK((*filter->output_function)(c, filter->data));
+ } else {
+ s = (filter->cache - 0xa1)*94 + c - 0xa1;
+ if(s >= 0 && s < j2utable_size)
+ s = j2utable[s];
+ else
+ s = 0;
+ if(s == 0)
+ s = UNDEFCHAR_UNICODE;
+ CK((*filter->output_function)(s, filter->data));
+ }
+ break;
+ }
+
+ return c;
+}
+
+/*
+ * UCS => EUC-JP
+ */
+static int
+filt_ucs_euc(struct mbfl_output_filter* filter, int c)
+{
+ int s = 0;
+ if(c > 0 && c < u2jtable_size)
+ s = u2jtable[c];
+ if(s == 0 && c != 0)
+ s = UNDEFCHAR_JIS;
+
+ if(s < 0x80) { /* roman */
+ CK((*filter->output_function)(s, filter->data));
+ } else if(s < 0x100) { /* kana */
+ CK((*filter->output_function)(0x8e, filter->data));
+ CK((*filter->output_function)(s, filter->data));
+ } else { /* kanji */
+ CK((*filter->output_function)(((s >> 8) & 0xff) | 0x80, filter->data));
+ CK((*filter->output_function)((s & 0xff) | 0x80, filter->data));
+ }
+
+ return c;
+}
+
+/*
+ * EUC-JP => wchar
+ */
+static int
+filt_euc_wchar(struct mbfl_output_filter* filter, int c)
+{
+ switch (filter->status) {
+ case 0: /* roman */
+ if (c == 0x8e) { /* kana first char */
+ filter->status = 1;
+ } else if (c >= 0x80) { /* kanji first char */
+ filter->status = 2;
+ filter->cache = c;
+ } else {
+ CK((*filter->output_function)(c, filter->data));
+ }
+ break;
+ case 1: /* got 0x8e */
+ filter->status = 0;
+ CK((*filter->output_function)(c, filter->data));
+ break;
+ case 2: /* got first half */
+ filter->status = 0;
+ if(c == '\0'){
+ CK((*filter->output_function)(c, filter->data));
+ } else {
+ CK((*filter->output_function)((filter->cache << 8) + c, filter->data));
+ }
+ break;
+ }
+
+ return c;
+}
+
+/*
+ * wchar => EUC-JP
+ */
+static int
+filt_wchar_euc(struct mbfl_output_filter* filter, int c)
+{
+ if(c < 0x80) { /* roman */
+ CK((*filter->output_function)(c, filter->data));
+ } else if(c < 0x100) { /* kana */
+ CK((*filter->output_function)(0x8e, filter->data));
+ CK((*filter->output_function)(c, filter->data));
+ } else { /* kanji */
+ CK((*filter->output_function)((c >> 8) & 0xff, filter->data));
+ CK((*filter->output_function)(c & 0xff, filter->data));
+ }
+
+ return c;
+}
+
+/*
+ * SJIS => UCS
+ */
+static int
+filt_sjis_ucs(struct mbfl_output_filter* filter, int c)
+{
+ int s;
+ if (filter->status == 1) { /* kanji second char */
+ filter->status = 0;
+ if(c == '\0'){
+ CK((*filter->output_function)(c, filter->data));
+ } else {
+ s = filter->cache;
+ if(s < 0xa0)
+ s -= 0x81;
+ else
+ s -= 0xc1;
+ s *= 188;
+ if(c < 0x7f)
+ s += c - 0x40;
+ else
+ s += c - 0x41;
+ if(s >= 0 && s < j2utable_size)
+ s = j2utable[s];
+ else
+ s = 0;
+ if(s == 0)
+ s = UNDEFCHAR_UNICODE;
+ CK((*filter->output_function)(s, filter->data));
+ }
+ } else if (c >= 0xa1 && c <= 0xdf) { /* kana */
+ filter->status = 0;
+ CK((*filter->output_function)(0xfec0 + c, filter->data));
+ } else if (c >= 0x80) { /* kanji first char */
+ filter->status = 1;
+ filter->cache = c;
+ } else { /* roman */
+ filter->status = 0;
+ CK((*filter->output_function)(c, filter->data));
+ }
+
+ return c;
+}
+
+/*
+ * UCS => SJIS
+ */
+static int
+filt_ucs_sjis(struct mbfl_output_filter* filter, int c)
+{
+ int s1 = 0;
+ int c1,c2,s2;
+ if(c > 0 && c < u2jtable_size)
+ s1 = u2jtable[c];
+ if(s1 == 0 && c != 0)
+ s1 = UNDEFCHAR_JIS;
+
+ if(s1 < 0x100) { /* roman or kana */
+ CK((*filter->output_function)(s1, filter->data));
+ } else { /* kanji */
+ c1 = (s1 >> 8) & 0xff;
+ c2 = s1 & 0xff;
+ s1 = ((c1 + 1) >> 1) + (c1 < 0x5f ? 0x70 : 0xb0);
+ s2 = c2 + (c1 & 1 ? (c2 > 0x5f ? 0x20 : 0x1f) : 0x7e);
+ CK((*filter->output_function)(s1, filter->data));
+ CK((*filter->output_function)(s2, filter->data));
+ }
+
+ return c;
+}
+
+/*
+ * SJIS => wchar
+ */
+static int
+filt_sjis_wchar(struct mbfl_output_filter* filter, int c)
+{
+ if (filter->status == 1) { /* kanji second char */
+ filter->status = 0;
+ if(c == '\0') {
+ CK((*filter->output_function)(c, filter->data));
+ } else {
+ CK((*filter->output_function)((filter->cache << 8) + c, filter->data));
+ }
+ } else if (c >= 0xa1 && c <= 0xdf) { /* kana */
+ filter->status = 0;
+ CK((*filter->output_function)(c, filter->data));
+ } else if (c >= 0x80) { /* kanji first char */
+ filter->status = 1;
+ filter->cache = c;
+ } else { /* roman */
+ filter->status = 0;
+ CK((*filter->output_function)(c, filter->data));
+ }
+
+ return c;
+}
+
+/*
+ * wchar => SJIS
+ */
+static int
+filt_wchar_sjis(struct mbfl_output_filter* filter, int c)
+{
+
+ if(c < 0x100) { /* roman or kana */
+ CK((*filter->output_function)(c, filter->data));
+ } else { /* kanji */
+ CK((*filter->output_function)((c >> 8) & 0xff, filter->data));
+ CK((*filter->output_function)(c & 0xff, filter->data));
+ }
+
+ return c;
+}
+
+/*
+ * JIS => UCS
+ */
+static int
+filt_jis_ucs(struct mbfl_output_filter* filter, int c)
+{
+ int s;
+retry:
+ switch (filter->status) {
+ case 0: /* roman */
+ case 10: /* kana */
+ case 20: /* kanji */
+ if (c == 0x1b) {
+ filter->status++;
+ } else if (c == 0x0e) { /* "kana in" */
+ filter->status = 10;
+ } else if (c == 0x0f) { /* "kana out" */
+ filter->status = 0;
+ } else if (c >= 0x21 && c <= 0x7e) {
+ if (filter->status == 20) { /* kanji first char */
+ filter->cache = c;
+ filter->status = 25;
+ } else if (filter->status == 10) { /* kana */
+ CK((*filter->output_function)(0xff40 + c, filter->data));
+ } else {
+ CK((*filter->output_function)(c, filter->data));
+ }
+ } else if (c >= 0xa1 && c <= 0xdf) { /* GR kana */
+ CK((*filter->output_function)(0xfec0 + c, filter->data));
+ } else {
+ CK((*filter->output_function)(c, filter->data));
+ }
+ break;
+ case 25: /* kanji second char */
+ filter->status = 20;
+ if (c == '\0') {
+ CK((*filter->output_function)(c, filter->data));
+ } else if (c == 0x1b) {
+ goto retry;
+ } else {
+ s = (filter->cache - 0x21)*94 + c - 0x21;
+ if(s >= 0 && s < j2utable_size)
+ s = j2utable[s];
+ else
+ s = 0;
+ if(s == 0)
+ s = UNDEFCHAR_UNICODE;
+ CK((*filter->output_function)(s, filter->data));
+ }
+ break;
+ case 1: /* ESC */
+ case 11: /* ESC */
+ case 21: /* ESC */
+ if (c == 0x24) {
+ filter->status++;
+ } else if (c == 0x28) {
+ filter->status += 3;
+ } else {
+ filter->status--;
+ CK((*filter->output_function)(0x1b, filter->data));
+ goto retry;
+ }
+ break;
+ case 2: /* ESC 0x24 */
+ case 12: /* ESC 0x24 */
+ case 22: /* ESC 0x24 */
+ if (c == 0x40 || c == 0x42) {
+ filter->status = 20;
+ } else if (c == 0x28) {
+ filter->status++;
+ }else {
+ filter->status -= 2;
+ CK((*filter->output_function)(0x1b, filter->data));
+ CK((*filter->output_function)(0x24, filter->data));
+ goto retry;
+ }
+ break;
+ case 3: /* ESC 0x24 0x28 */
+ case 13: /* ESC 0x24 0x28 */
+ case 23: /* ESC 0x24 0x28 */
+ if (c == 0x44) {
+ filter->status = 20;
+ } else {
+ filter->status -= 3;
+ CK((*filter->output_function)(0x1b, filter->data));
+ CK((*filter->output_function)(0x24, filter->data));
+ CK((*filter->output_function)(0x28, filter->data));
+ goto retry;
+ }
+ break;
+ case 4: /* ESC 0x28 */
+ case 14: /* ESC 0x28 */
+ case 24: /* ESC 0x28 */
+ switch (c) {
+ case 0x42:
+ case 0x48:
+ case 0x4a:
+ filter->status = 0;
+ break;
+ case 0x49:
+ filter->status = 10;
+ break;
+ default:
+ filter->status -= 4;
+ CK((*filter->output_function)(0x1b, filter->data));
+ CK((*filter->output_function)(0x28, filter->data));
+ goto retry;
+ }
+ break;
+ }
+
+ return c;
+}
+
+/*
+ * UCS => JIS
+ */
+static int
+filt_ucs_jis(struct mbfl_output_filter* filter, int c)
+{
+ int s = 0;
+
+ if(c > 0 && c < u2jtable_size)
+ s = u2jtable[c];
+ if(s == 0 && c != 0)
+ s = UNDEFCHAR_JIS;
+
+ if(s < 0x80) { /* roman */
+ if((filter->status & 0xff00) != 0){
+ CK((*filter->output_function)('\033', filter->data));
+ CK((*filter->output_function)('(', filter->data));
+ CK((*filter->output_function)('B', filter->data));
+ }
+ filter->status = 0;
+ CK((*filter->output_function)(s, filter->data));
+ } else if(s < 0x100) { /* kana */
+ if((filter->status & 0xff00) != 0x100){
+ CK((*filter->output_function)('\033', filter->data));
+ CK((*filter->output_function)('(', filter->data));
+ CK((*filter->output_function)('I', filter->data));
+ }
+ filter->status = 0x30100;
+ CK((*filter->output_function)(s & 0x7f, filter->data));
+ } else { /* kanji */
+ if((filter->status & 0xff00) != 0x200){
+ CK((*filter->output_function)('\033', filter->data));
+ CK((*filter->output_function)('$', filter->data));
+ CK((*filter->output_function)('B', filter->data));
+ }
+ filter->status = 0x30200;
+ CK((*filter->output_function)((s >> 8) & 0x7f, filter->data));
+ CK((*filter->output_function)(s & 0x7f, filter->data));
+ }
+
+ return c;
+}
+
+/*
+ * JIS => wchar
+ */
+static int
+filt_jis_wchar(struct mbfl_output_filter* filter, int c)
+{
+retry:
+ switch (filter->status) {
+ case 0: /* roman */
+ case 10: /* kana */
+ case 20: /* kanji */
+ if (c == 0x1b) {
+ filter->status++;
+ } else if (c == 0x0e) { /* "kana in" */
+ filter->status = 10;
+ } else if (c == 0x0f) { /* "kana out" */
+ filter->status = 0;
+ } else if (c >= 0x21 && c <= 0x7e) {
+ if (filter->status == 20) { /* kanji first char */
+ filter->cache = c;
+ filter->status = 25;
+ } else if (filter->status == 10) { /* kana */
+ CK((*filter->output_function)(c | 0x80, filter->data));
+ } else {
+ CK((*filter->output_function)(c, filter->data));
+ }
+ } else { /* CR, LF, CTLs, or maybe GR kana */
+ CK((*filter->output_function)(c, filter->data));
+ }
+ break;
+ case 25: /* kanji second char */
+ filter->status = 20;
+ if (c == '\0') {
+ CK((*filter->output_function)(c, filter->data));
+ } else if (c == 0x1b) {
+ goto retry;
+ } else {
+ CK((*filter->output_function)((filter->cache << 8) + c, filter->data));
+ }
+ break;
+ case 1: /* ESC */
+ case 11: /* ESC */
+ case 21: /* ESC */
+ if (c == 0x24) {
+ filter->status++;
+ } else if (c == 0x28) {
+ filter->status += 3;
+ } else {
+ CK((*filter->output_function)(0x1b, filter->data));
+ filter->status--;
+ goto retry;
+ }
+ break;
+ case 2: /* ESC 0x24 */
+ case 12: /* ESC 0x24 */
+ case 22: /* ESC 0x24 */
+ if (c == 0x40 || c == 0x42) {
+ filter->status = 20;
+ } else if (c == 0x28) {
+ filter->status++;
+ } else {
+ filter->status -= 2;
+ CK((*filter->output_function)(0x1b, filter->data));
+ CK((*filter->output_function)(0x24, filter->data));
+ goto retry;
+ }
+ break;
+ case 3: /* ESC 0x24 0x28 */
+ case 13: /* ESC 0x24 0x28 */
+ case 23: /* ESC 0x24 0x28 */
+ if (c == 0x44) {
+ filter->status = 20;
+ } else {
+ filter->status -= 3;
+ CK((*filter->output_function)(0x1b, filter->data));
+ CK((*filter->output_function)(0x24, filter->data));
+ CK((*filter->output_function)(0x28, filter->data));
+ goto retry;
+ }
+ break;
+ case 4: /* ESC 0x28 */
+ case 14: /* ESC 0x28 */
+ case 24: /* ESC 0x28 */
+ switch (c) {
+ case 0x42:
+ case 0x48:
+ case 0x4a:
+ filter->status = 0;
+ break;
+ case 0x49:
+ filter->status = 10;
+ break;
+ default:
+ filter->status -= 4;
+ CK((*filter->output_function)(0x1b, filter->data));
+ CK((*filter->output_function)(0x28, filter->data));
+ goto retry;
+ }
+ break;
+ }
+
+ return c;
+}
+
+/*
+ * wchar => JIS
+ */
+static int
+filt_wchar_jis(struct mbfl_output_filter* filter, int c)
+{
+ if(c < 0x80) { /* roman */
+ if((filter->status & 0xff00) != 0){
+ CK((*filter->output_function)('\033', filter->data));
+ CK((*filter->output_function)('(', filter->data));
+ CK((*filter->output_function)('B', filter->data));
+ }
+ filter->status = 0;
+ CK((*filter->output_function)(c, filter->data));
+ } else if(c < 0x100) { /* kana */
+ if((filter->status & 0xff00) != 0x100){
+ CK((*filter->output_function)('\033', filter->data));
+ CK((*filter->output_function)('(', filter->data));
+ CK((*filter->output_function)('I', filter->data));
+ }
+ filter->status = 0x30100;
+ CK((*filter->output_function)(c & 0x7f, filter->data));
+ } else { /* kanji */
+ if((filter->status & 0xff00) != 0x200){
+ CK((*filter->output_function)('\033', filter->data));
+ CK((*filter->output_function)('$', filter->data));
+ CK((*filter->output_function)('B', filter->data));
+ }
+ filter->status = 0x30200;
+ CK((*filter->output_function)((c >> 8) & 0x7f, filter->data));
+ CK((*filter->output_function)(c & 0x7f, filter->data));
+ }
+
+ return c;
+}
+
+/*
+ * UNKNOWN->(UTF-8|EUC-JP|SJIS|JIS)
+ */
+struct unknown_data {
+ enum mbfl_no_encoding to;
+ /* 変換後のコード */
+
+ void* data;
+ /* 本来のvoid* data */
+
+ struct memory_device device;
+ /* 推定作業中にはここに出力しておく。*/
+
+ enum mbfl_no_encoding from_default;
+ /* 不定の場合のコード */
+};
+
+static void
+filt_unknown_ja_jp_ctor(
+ struct mbfl_output_filter* filter,
+ enum mbfl_no_encoding from, /* ignored */
+ enum mbfl_no_encoding to,
+ int (*output_function)(int, void*),
+ int (*flush_function)(void*),
+ void* data)
+{
+ struct unknown_data* u = (struct unknown_data*)malloc(sizeof (struct unknown_data));
+ u->to = to;
+ u->from_default = mbfl_no_encoding_pass;
+ u->data = data;
+ u->device.buffer = (char*)0;
+ u->device.length = 0;
+ u->device.pos = 0;
+
+ filter->output_function = output_function;
+ filter->flush_function = flush_function;
+ filter->data = (void*)u;
+ filter->status = 0;
+ filter->cache = 0;
+ filter->from = from;
+ filter->to = to;
+}
+
+/* forward */
+static int filt_unknown_ja_jp_identify(struct mbfl_output_filter* filter);
+
+static int
+filt_unknown_ja_jp(struct mbfl_output_filter* filter, int c)
+{
+ int bad;
+ struct memory_device* dev = &((struct unknown_data*)filter->data)->device;
+
+ /* filter->cache holds "bad" scores for UTF-8 EUC-JP, SJIS, JIS */
+ /* filter->status holds status for UTF-8 EUC-JP, SJIS, JIS */
+ /* 0xWWXXYYZZ - WW for UTF-8, XX for EUC-JP, YY for SJIS, ZZ for JIS */
+#define S_UTF8(x) ((x) << 24)
+#define S_EUCJP(x) ((x) << 16)
+#define S_SJIS(x) ((x) << 8)
+#define S_JIS(x) ((x))
+#define M_UTF8 0xff000000
+#define M_EUCJP 0x00ff0000
+#define M_SJIS 0x0000ff00
+#define M_JIS 0x000000ff
+
+ if (dev->pos == 0 && ((c >= 0x20 && c <= 0x7e) || c == '\t' || c == '\n' || c == '\r' || c == '\0')) {
+ /* 先頭の連続するASCIIはそのまま出力する。*/
+ return (*filter->output_function)(c, ((struct unknown_data*)filter->data)->data);
+ }
+
+ /*
+ * UTF-8だとした場合。
+ */
+ if ((filter->cache & M_UTF8) == 0) {
+ if (c < 0x80) {
+ if (filter->status & M_UTF8) {
+ filter->cache |= S_UTF8(1); /* bad */
+ } else if (c == 0x1b || c == 0x0e || c == 0x0f) {
+ filter->cache |= S_UTF8(1); /* bad */
+ }
+ filter->status &= ~M_UTF8;
+ } else if (c < 0xc0) {
+ switch(filter->status & M_UTF8) {
+ case S_UTF8(0x20): /* 3 byte code 2nd char */
+ case S_UTF8(0x30): /* 4 byte code 2nd char */
+ case S_UTF8(0x31): /* 4 byte code 3rd char */
+ case S_UTF8(0x40): /* 5 byte code 2nd char */
+ case S_UTF8(0x41): /* 5 byte code 3rd char */
+ case S_UTF8(0x42): /* 5 byte code 4th char */
+ case S_UTF8(0x50): /* 6 byte code 2nd char */
+ case S_UTF8(0x51): /* 6 byte code 3rd char */
+ case S_UTF8(0x52): /* 6 byte code 4th char */
+ case S_UTF8(0x53): /* 6 byte code 5th char */
+ filter->status += S_UTF8(1);
+ break;
+ case S_UTF8(0x10): /* 2 byte code 2nd char */
+ case S_UTF8(0x21): /* 3 byte code 3rd char */
+ case S_UTF8(0x32): /* 4 byte code 4th char */
+ case S_UTF8(0x43): /* 5 byte code 5th char */
+ case S_UTF8(0x54): /* 6 byte code 6th char */
+ filter->status &= ~M_UTF8;
+ break;
+ default:
+ filter->cache |= S_UTF8(1); /* bad */
+ filter->status &= ~M_UTF8;
+ break;
+ }
+ } else {
+ if (filter->status & M_UTF8) {
+ filter->cache |= S_UTF8(1); /* bad */
+ }
+ filter->status &= ~M_UTF8;
+ if (c < 0xe0) { /* 2 byte code first char */
+ filter->status |= S_UTF8(0x10);
+ } else if (c < 0xf0) { /* 3 byte code 1st char */
+ filter->status |= S_UTF8(0x20);
+ } else if (c < 0xf8) { /* 4 byte code 1st char */
+ filter->status |= S_UTF8(0x30);
+ } else if (c < 0xfc) { /* 5 byte code 1st char */
+ filter->status |= S_UTF8(0x40);
+ } else { /* 6 byte code 1st char */
+ filter->status |= S_UTF8(0x50);
+ }
+ }
+ }
+
+ /*
+ * EUC-JPだとした場合。
+ */
+ if ((filter->cache & M_EUCJP) == 0) {
+ switch ((filter->status & M_EUCJP)) {
+ case S_EUCJP(0): /* roman */
+ if (c == 0x1b || c == 0x0e || c == 0x0f) { /* bad */
+ filter->cache |= S_EUCJP(1);
+ } else if (c >= 0 && c <= 0x7e) { /* ok */
+ ;
+ } else if (c == 0x8e) { /* kana first char */
+ filter->status += S_EUCJP(1);
+ } else if (c >= 0xa1 && c <= 0xfe) { /* kanji first char */
+ filter->status += S_EUCJP(2);
+ } else { /* bad */
+ filter->cache |= S_EUCJP(1);
+ }
+ break;
+
+ case S_EUCJP(1): /* got 0x8e */
+ if (c < 0xa1 || c > 0xdf) { /* bad */
+ filter->cache |= S_EUCJP(1);
+ }
+ filter->status -= S_EUCJP(1);
+ break;
+
+ case S_EUCJP(2): /* got first half */
+ if (c < 0xa1 || c > 0xfe) { /* bad */
+ filter->cache |= S_EUCJP(1);
+ }
+ filter->status -= S_EUCJP(2);
+ break;
+ }
+ }
+
+ /*
+ * SJISだとした場合。
+ */
+ if ((filter->cache & M_SJIS) == 0) {
+ if ((filter->status & M_SJIS)) { /* kanji second char */
+ if (c < 0x40 || c > 0xfc || c == 0x7f) { /* bad */
+ filter->cache |= S_SJIS(1);
+ }
+ filter->status &= ~M_SJIS; /* 0にもどす。*/
+ } else if (c == 0x1b || c == 0x0e || c == 0x0f) { /* bad */
+ filter->cache |= S_SJIS(1);
+ } else if (c >= 0 && c <= 0x7e) { /* roman ok */
+ ;
+ } else if (c >= 0xa1 && c <= 0xdf) { /* kana ok */
+ ;
+ } else if (c >= 0x81 && c <= 0xef) { /* kanji first char */
+ filter->status += S_SJIS(1);
+ } else { /* bad */
+ filter->cache |= S_SJIS(1);
+ }
+ }
+
+ /*
+ * JISだとした場合。
+ */
+ if ((filter->cache & M_JIS) == 0) {
+retry:
+ switch ((filter->status & M_JIS)) {
+ case S_JIS(0): /* roman */
+ case S_JIS(10): /* kana */
+ case S_JIS(20): /* kanji */
+ if (c == 0x1b) {
+ filter->status += S_JIS(1);
+ } else if (c == 0x0e) { /* "kana in" */
+ filter->status = (filter->status & ~M_JIS) + 10;
+ } else if (c == 0x0f) { /* "kana out" */
+ filter->status &= ~M_JIS;
+ } else if (c >= 0 && c <= 0x20) { /* CTLs ok */
+ ;
+ } else if (c >= 0x21 && c <= 0x7e) {
+ if ((filter->status & M_JIS) == 20) { /* kanji first char */
+ filter->status += S_JIS(5);
+ }
+ } else {
+ filter->cache |= S_JIS(1); /* bad */
+ }
+ break;
+
+ case S_JIS(25): /* kanji second char */
+ filter->status -= S_JIS(5);
+ if (c < 0x21 || c > 0x7e) { /* bad */
+ filter->cache |= S_JIS(1);
+ }
+ if (c == 0x1b) {
+ goto retry;
+ }
+ break;
+
+ case S_JIS(1): /* ESC */
+ case S_JIS(11): /* ESC */
+ case S_JIS(21): /* ESC */
+ if (c == 0x24) {
+ filter->status += S_JIS(1);
+ } else if (c == 0x28) {
+ filter->status += S_JIS(3);
+ } else {
+ filter->cache |= S_JIS(1); /* bad */
+ filter->status -= S_JIS(1);
+ goto retry;
+ }
+ break;
+
+ case S_JIS(2): /* ESC 0x24 */
+ case S_JIS(12): /* ESC 0x24 */
+ case S_JIS(22): /* ESC 0x24 */
+ if (c == 0x40 || c == 0x42) {
+ filter->status = (filter->status & ~M_JIS) + 20;
+ } else if (c == 0x28) {
+ filter->status += S_JIS(1);
+ } else {
+ filter->cache |= S_JIS(1); /* bad */
+ filter->status -= S_JIS(2);
+ goto retry;
+ }
+ break;
+
+ case S_JIS(3): /* ESC 0x24 0x28 */
+ case S_JIS(13): /* ESC 0x24 0x28 */
+ case S_JIS(23): /* ESC 0x24 0x28 */
+ if (c == 0x44) {
+ filter->status = (filter->status & ~M_JIS) + 20;
+ } else {
+ filter->cache |= S_JIS(1); /* bad */
+ filter->status -= S_JIS(3);
+ goto retry;
+ }
+ break;
+
+ case S_JIS(4): /* ESC 0x28 */
+ case S_JIS(14): /* ESC 0x28 */
+ case S_JIS(24): /* ESC 0x28 */
+ switch (c) {
+ case 0x42:
+ case 0x48:
+ case 0x4a:
+ filter->status &= ~M_JIS;
+ break;
+
+ case 0x49:
+ filter->status = (filter->status & ~M_JIS) + 10;
+ break;
+
+ default:
+ filter->cache |= S_JIS(1); /* bad */
+ filter->status -= S_JIS(4);
+ goto retry;
+ break;
+ }
+ break;
+ }
+ }
+
+ /*
+ * おしまい。
+ */
+ (void)memory_device_output(c, dev); /* 覚えておく */
+
+ bad = 0;
+ if (filter->cache & M_UTF8) {
+ bad++;
+ }
+ if (filter->cache & M_EUCJP) {
+ bad++;
+ }
+ if (filter->cache & M_SJIS) {
+ bad++;
+ }
+ if (filter->cache & M_JIS) {
+ bad++;
+ }
+ if (bad >= 3 /* 3つ以上のエンコーディングでない (一つ以下に確定) */
+ || dev->pos >= 8192) { /* もう8192文字溜まっている */
+ if (filt_unknown_ja_jp_identify(filter) < 0) { /* 漢字コードの判定を行う */
+ c = -1;
+ }
+ }
+
+ return c;
+}
+
+/*
+ * 漢字コードを判定し、vptrを切りかえ、溜まっているデータを出力する。
+ */
+
+/* forward */
+static struct filter_vtbl*
+select_vtbl(enum mbfl_no_encoding from, enum mbfl_no_encoding to);
+
+static int
+filt_unknown_ja_jp_identify(struct mbfl_output_filter* filter)
+{
+ int n;
+ char *p;
+ struct unknown_data* u;
+ enum mbfl_no_encoding code = mbfl_no_encoding_pass;
+
+ /* saved data */
+ u = (struct unknown_data*)filter->data;
+
+ /* 判定 */
+ n = 0;
+ if ((filter->cache & M_UTF8) == 0) {
+ n++;
+ code = mbfl_no_encoding_utf8;
+ }
+ if ((filter->cache & M_EUCJP) == 0) {
+ n++;
+ code = mbfl_no_encoding_ja_jp_euc;
+ }
+ if ((filter->cache & M_SJIS) == 0) {
+ n++;
+ code = mbfl_no_encoding_ja_jp_sjis;
+ }
+ if ((filter->cache & M_JIS) == 0) {
+ n++;
+ code = mbfl_no_encoding_ja_jp_jis;
+ }
+ if (n != 1) {
+ code = u->from_default;
+ }
+
+ /* 漢字らしきものが見つからなかった、
+ そして、たぶんデストラクタが呼ばれた。*/
+ if (u->device.pos == 0) {
+ code = mbfl_no_encoding_en_us_ascii;
+ }
+
+ /* select the vtbl */
+ filter->vptr = select_vtbl(code, u->to);
+
+ /* constructor */
+ (*filter->vptr->filter_ctor)(filter, code, u->to,
+ filter->output_function, filter->flush_function, u->data);
+
+ /* 溜まっているデータを吐き出す */
+ for (p = u->device.buffer, n = u->device.pos; n > 0; n--) {
+ if ((*filter->vptr->filter_function)(filter, *p++ & 0xff) < 0) {
+ n = -1;
+ break;
+ }
+ }
+ /* 正常に終わった場合はnは0であるはず。*/
+
+ /* free */
+ if (u->device.buffer) {
+ free((void*)u->device.buffer);
+ }
+ free((void*)u);
+
+ return n; /* 正常ならば0、エラーならば-1 */
+}
+
+static int
+filt_unknown_ja_jp_flush(struct mbfl_output_filter* filter)
+{
+ if (filt_unknown_ja_jp_identify(filter) < 0)
+ return -1;
+
+ /* flush */
+ return (filter->flush_function ? (*filter->flush_function)(filter->data) : 0);
+}
+
+static void
+filt_unknown_ja_jp_dtor(struct mbfl_output_filter* filter)
+{
+ /* flush */
+ (void)filt_unknown_ja_jp_flush(filter);
+
+ /* destruct */
+ (*filter->vptr->filter_dtor)(filter);
+}
+
+
+/*
+ * UTF8 => wchar
+ */
+static int
+filt_utf8_wchar(struct mbfl_output_filter* filter, int c)
+{
+ int s;
+ if(c < 0x80) {
+ CK((*filter->output_function)(c, filter->data));
+ filter->status = 0;
+ } else if(c < 0xc0) {
+ switch (filter->status & 0xff) {
+ case 0x10: /* 2byte code 2nd char */
+ case 0x21: /* 3byte code 3rd char */
+ case 0x32: /* 4byte code 4th char */
+ case 0x43: /* 5byte code 5th char */
+ case 0x54: /* 6byte code 6th char */
+ filter->status = 0;
+ s = filter->cache + (c & 0x3f);
+ if(s == 0) {
+ s = UNDEFCHAR_UNICODE;
+ }
+ CK((*filter->output_function)(s, filter->data));
+ break;
+ case 0x20: /* 3byte code 2nd char */
+ case 0x31: /* 4byte code 3rd char */
+ case 0x42: /* 5byte code 4th char */
+ case 0x53: /* 6byte code 5th char */
+ filter->cache += ((c & 0x3f) << 6);
+ filter->status++;
+ break;
+ case 0x30: /* 4byte code 2nd char */
+ case 0x41: /* 5byte code 3rd char */
+ case 0x52: /* 6byte code 4th char */
+ filter->cache += ((c & 0x3f) << 12);
+ filter->status++;
+ break;
+ case 0x40: /* 5byte code 2nd char */
+ case 0x51: /* 6byte code 3rd char */
+ filter->cache += ((c & 0x3f) << 18);
+ filter->status++;
+ break;
+ case 0x50: /* 6byte code 2nd char */
+ filter->cache += ((c & 0x3f) << 24);
+ filter->status++;
+ break;
+ default:
+ filter->status = 0;
+ break;
+ }
+ } else if(c < 0xe0) { /* 2byte code first char */
+ filter->status = 0x10;
+ filter->cache = (c & 0x1f) << 6;
+ } else if(c < 0xf0) { /* 3byte code first char */
+ filter->status = 0x20;
+ filter->cache = (c & 0xf) << 12;
+ } else if(c < 0xf8) { /* 4byte code first char */
+ filter->status = 0x30;
+ filter->cache = (c & 0x7) << 18;
+ } else if(c < 0xfc) { /* 5byte code first char */
+ filter->status = 0x40;
+ filter->cache = (c & 0x3) << 24;
+ } else { /* 6 byte code first char */
+ filter->status = 0x50;
+ filter->cache = (c & 0x1) << 30;
+ }
+
+ return c;
+}
+
+/*
+ * wchar => UTF-8
+ */
+static int
+filt_wchar_utf8(struct mbfl_output_filter* filter, int c)
+{
+ if(c < 0x80){
+ CK((*filter->output_function)(c, filter->data));
+ } else if(c < 0x800) {
+ CK((*filter->output_function)(((c >> 6) & 0x1f) | 0xc0, filter->data));
+ CK((*filter->output_function)((c & 0x3f) | 0x80, filter->data));
+ } else if(c < 0x10000) {
+ CK((*filter->output_function)(((c >> 12) & 0x0f) | 0xe0, filter->data));
+ CK((*filter->output_function)(((c >> 6) & 0x3f) | 0x80, filter->data));
+ CK((*filter->output_function)((c & 0x3f) | 0x80, filter->data));
+ } else if(c < 0x200000) {
+ CK((*filter->output_function)(((c >> 18) & 0x07) | 0xf0, filter->data));
+ CK((*filter->output_function)(((c >> 12) & 0x3f) | 0x80, filter->data));
+ CK((*filter->output_function)(((c >> 6) & 0x3f) | 0x80, filter->data));
+ CK((*filter->output_function)((c & 0x3f) | 0x80, filter->data));
+ } else if(c < 0x4000000) {
+ CK((*filter->output_function)(((c >> 24) & 0x03) | 0xf8, filter->data));
+ CK((*filter->output_function)(((c >> 18) & 0x3f) | 0x80, filter->data));
+ CK((*filter->output_function)(((c >> 12) & 0x3f) | 0x80, filter->data));
+ CK((*filter->output_function)(((c >> 6) & 0x3f) | 0x80, filter->data));
+ CK((*filter->output_function)((c & 0x3f) | 0x80, filter->data));
+ } else {
+ CK((*filter->output_function)(((c >> 30) & 0x01) | 0xfc, filter->data));
+ CK((*filter->output_function)(((c >> 24) & 0x3f) | 0x80, filter->data));
+ CK((*filter->output_function)(((c >> 18) & 0x3f) | 0x80, filter->data));
+ CK((*filter->output_function)(((c >> 12) & 0x3f) | 0x80, filter->data));
+ CK((*filter->output_function)(((c >> 6) & 0x3f) | 0x80, filter->data));
+ CK((*filter->output_function)((c & 0x3f) | 0x80, filter->data));
+ }
+
+ return c;
+}
+
+/*
+ * any => BASE64
+ */
+static const char mbfl_b64_table[] =
+{ 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M',
+ 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z',
+ 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm',
+ 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z',
+ '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '+', '/', '\0'
+};
+
+static int
+filt_b64enc(struct mbfl_output_filter* filter, int c)
+{
+ if (filter->status == 0) {
+ filter->cache = (c & 0xff) << 16;
+ filter->status++;
+ } else if (filter->status == 1) {
+ filter->cache |= (c & 0xff) << 8;
+ filter->status++;
+ } else {
+ int s = filter->cache | (c & 0xff);
+ filter->cache = 0;
+ filter->status = 0;
+ CK((*filter->output_function)(mbfl_b64_table[(s >> 18) & 0x3f], filter->data));
+ CK((*filter->output_function)(mbfl_b64_table[(s >> 12) & 0x3f], filter->data));
+ CK((*filter->output_function)(mbfl_b64_table[(s >> 6) & 0x3f], filter->data));
+ CK((*filter->output_function)(mbfl_b64_table[s & 0x3f], filter->data));
+ }
+
+ return c;
+}
+
+static int
+filt_b64enc_flush(struct mbfl_output_filter* filter)
+{
+ /* flush fragments */
+ if (filter->status >= 1) {
+ CK((*filter->output_function)(mbfl_b64_table[(filter->cache >> 18) & 0x3f], filter->data));
+ CK((*filter->output_function)(mbfl_b64_table[(filter->cache >> 12) & 0x3f], filter->data));
+ if (filter->status == 1) {
+ CK((*filter->output_function)('=', filter->data));
+ CK((*filter->output_function)('=', filter->data));
+ } else {
+ CK((*filter->output_function)(mbfl_b64_table[(filter->cache >> 6) & 0x3f], filter->data));
+ CK((*filter->output_function)('=', filter->data));
+ }
+ }
+ filter->status = 0;
+ filter->cache = 0;
+
+ /* flush */
+ return (filter->flush_function ? (*filter->flush_function)(filter->data) : 0);
+}
+
+static void
+filt_b64enc_dtor(struct mbfl_output_filter* filter)
+{
+ (void)filt_b64enc_flush(filter);
+}
+
+/*
+ * BASE64 => any
+ */
+static int
+filt_b64dec(struct mbfl_output_filter* filter, int c)
+{
+ int n = 0;
+ char a;
+
+ if(c == '=')
+ return -1;
+
+ if(c == '\r' || c == '\n' || c == ' ' || c == '\t')
+ return c;
+
+ while((a = mbfl_b64_table[n]) != '\0') {
+ if(a == (char)c)
+ break;
+ n++;
+ }
+ n &= 0x3f;
+
+ switch(filter->status) {
+ case 0:
+ filter->cache = n << 18;
+ filter->status++;
+ break;
+ case 1:
+ filter->cache |= n << 12;
+ filter->status++;
+ break;
+ case 2:
+ filter->cache |= n << 6;
+ filter->status++;
+ break;
+ default:
+ n |= filter->cache;
+ filter->cache = 0;
+ filter->status = 0;
+ CK((*filter->output_function)((n >> 16) & 0xff, filter->data));
+ CK((*filter->output_function)((n >> 8) & 0xff, filter->data));
+ CK((*filter->output_function)(n & 0xff, filter->data));
+ break;
+ }
+
+ return c;
+}
+
+static int
+filt_b64dec_flush(struct mbfl_output_filter* filter)
+{
+ /* flush fragments */
+ if (filter->status >= 2) {
+ CK((*filter->output_function)((filter->cache >> 16) & 0xff, filter->data));
+ if (filter->status == 3) {
+ CK((*filter->output_function)((filter->cache >> 8) & 0xff, filter->data));
+ }
+ }
+ filter->status = 0;
+ filter->cache = 0;
+
+ /* flush */
+ return (filter->flush_function ? (*filter->flush_function)(filter->data) : 0);
+}
+
+static void
+filt_b64dec_dtor(struct mbfl_output_filter* filter)
+{
+ (void)filt_b64dec_flush(filter);
+}
+
+/*
+ * any => Quoted-Printable
+ */
+static int
+filt_qprintenc(struct mbfl_output_filter* filter, int c)
+{
+ int s, n, m;
+
+ switch(filter->status & 0xff) {
+ case 0:
+ filter->cache = c;
+ filter->status &= ~0xffffff;
+ filter->status |= 1;
+ break;
+ default:
+ s = filter->cache;
+ filter->cache = c;
+ n = (filter->status & 0xffffff) >> 8;
+ if (s == '=' ||s >= 0x80) {
+ if(n >= 73)
+ m = 2;
+ else
+ m = 3;
+ } else if (filter->status & 0x1000000 &&
+ (s == ' ' || s == '\t' || s == '?' || s == '_' || s == '(' || s == ')' || s == '\"')) {
+ if(n >= 73)
+ m = 2;
+ else
+ m = 3;
+ } else if ((s == ' ' || s == '\t') && (c == '\r' || c == '\n')) {
+ m = 3;
+ } else if ((s == ' ' || s == '\t') && n >= 72) {
+ m = 4;
+ } else if (s == '\r' || s == '\n') {
+ m = 5;
+ } else if(n >= 75) {
+ m = 1;
+ } else {
+ m = 0;
+ }
+
+ if (m == 1 || m == 2) {
+ CK((*filter->output_function)('=', filter->data));
+ }
+ if (m == 1 || m == 2 || m == 5) {
+ CK((*filter->output_function)('\r', filter->data));
+ CK((*filter->output_function)('\n', filter->data));
+ if((m == 5) && (c == '\r' || c == '\n')) {
+ filter->status &= ~0xffffff;
+ } else {
+ filter->status &= ~0xffffff;
+ filter->status |= 1;
+ }
+ }
+ if(m <= 1) {
+ CK((*filter->output_function)(s, filter->data));
+ filter->status += 0x100;
+ } else if(m == 2 || m == 3 || m == 4) {
+ CK((*filter->output_function)('=', filter->data));
+ n = (s >> 4) & 0xf;
+ if(n < 10)
+ n += '0';
+ else
+ n += 'A' - 10;
+ CK((*filter->output_function)(n, filter->data));
+ n = s & 0xf;
+ if(n < 10)
+ n += '0';
+ else
+ n += 'A' - 10;
+ CK((*filter->output_function)(n, filter->data));
+ filter->status += 0x300;
+ }
+ if(m == 4) {
+ CK((*filter->output_function)('=', filter->data));
+ CK((*filter->output_function)('\r', filter->data));
+ CK((*filter->output_function)('\n', filter->data));
+ filter->status = 1;
+ }
+ break;
+ }
+
+ return c;
+}
+
+static int
+filt_qprintenc_flush(struct mbfl_output_filter* filter)
+{
+ /* flush filter cache */
+ (*filter->vptr->filter_function)(filter, '\r');
+ filter->status = 0;
+ filter->cache = 0;
+
+ /* flush */
+ return (filter->flush_function ? (*filter->flush_function)(filter->data) : 0);
+}
+
+static void
+filt_qprintenc_dtor(struct mbfl_output_filter* filter)
+{
+ (void)filt_qprintenc_flush(filter);
+}
+
+/*
+ * Quoted-Printable => any
+ */
+static int
+filt_qprintdec(struct mbfl_output_filter* filter, int c)
+{
+ int n;
+ switch(filter->status) {
+ case 1:
+ if((c >= '0' && c <= '9') || (c >= 'A' && c <= 'F')) {
+ filter->cache = c;
+ filter->status = 2;
+ } else if(c == '\r' || c == '\n') {
+ filter->status = 3;
+ } else {
+ CK((*filter->output_function)('=', filter->data));
+ CK((*filter->output_function)(c, filter->data));
+ filter->status = 0;
+ }
+ break;
+ case 2:
+ n = filter->cache;
+ if(n >= '0' && n <= '9') {
+ n -= '0';
+ } else {
+ n -= ('A' + 10);
+ }
+ n <<= 4;
+ if(c >= '0' && c <= '9') {
+ n += (c - '0');
+ } else if(c >= 'A' && c <= 'F') {
+ n += (c - 'A') + 10;
+ } else {
+ CK((*filter->output_function)('=', filter->data));
+ CK((*filter->output_function)(filter->cache, filter->data));
+ n = c;
+ }
+ CK((*filter->output_function)(n, filter->data));
+ filter->status = 0;
+ break;
+ case 3:
+ if(c != '\n' && c != '\r') {
+ CK((*filter->output_function)(c, filter->data));
+ }
+ filter->status = 0;
+ break;
+ default:
+ if(c == '=') {
+ filter->status = 1;
+ } else {
+ CK((*filter->output_function)(c, filter->data));
+ }
+ break;
+ }
+
+ return c;
+}
+
+static int
+filt_qprintdec_flush(struct mbfl_output_filter* filter)
+{
+ /* flush fragments */
+ if (filter->status == 1) {
+ CK((*filter->output_function)('=', filter->data));
+ } else if (filter->status == 2) {
+ CK((*filter->output_function)('=', filter->data));
+ CK((*filter->output_function)(filter->cache, filter->data));
+ }
+ filter->status = 0;
+ filter->cache = 0;
+
+ /* flush */
+ return (filter->flush_function ? (*filter->flush_function)(filter->data) : 0);
+}
+
+static void
+filt_qprintdec_dtor(struct mbfl_output_filter* filter)
+{
+ (void)filt_qprintdec_flush(filter);
+}
+
+
+/*
+ *
+ * kanji code filter for output stream
+ *
+ */
+static struct filter_vtbl vtbl_pass = {
+ filt_common_ctor,
+ filt_common_dtor,
+ filt_pass,
+ filt_common_flush };
+
+static struct filter_vtbl vtbl_eucjp_jis = {
+ filt_common_ctor,
+ filt_eucjp_jis_dtor,
+ filt_eucjp_jis,
+ filt_eucjp_jis_flush };
+
+static struct filter_vtbl vtbl_eucjp_sjis = {
+ filt_common_ctor,
+ filt_common_dtor,
+ filt_eucjp_sjis,
+ filt_common_flush };
+
+static struct filter_vtbl vtbl_sjis_jis = {
+ filt_common_ctor,
+ filt_sjis_jis_dtor,
+ filt_sjis_jis,
+ filt_sjis_jis_flush };
+
+static struct filter_vtbl vtbl_sjis_eucjp = {
+ filt_common_ctor,
+ filt_common_dtor,
+ filt_sjis_eucjp,
+ filt_common_flush };
+
+static struct filter_vtbl vtbl_jis_eucjp = {
+ filt_common_ctor,
+ filt_common_dtor,
+ filt_jis_eucjp,
+ filt_common_flush };
+
+static struct filter_vtbl vtbl_jis_sjis = {
+ filt_common_ctor,
+ filt_common_dtor,
+ filt_jis_sjis,
+ filt_common_flush };
+
+static struct filter_vtbl vtbl_eucjp_utf8 = {
+ filt_common_ctor,
+ filt_common_dtor,
+ filt_eucjp_utf8,
+ filt_common_flush };
+
+static struct filter_vtbl vtbl_sjis_utf8 = {
+ filt_common_ctor,
+ filt_common_dtor,
+ filt_sjis_utf8,
+ filt_common_flush };
+
+static struct filter_vtbl vtbl_jis_utf8 = {
+ filt_common_ctor,
+ filt_common_dtor,
+ filt_jis_utf8,
+ filt_common_flush };
+
+static struct filter_vtbl vtbl_utf8_euc = {
+ filt_common_ctor,
+ filt_common_dtor,
+ filt_utf8_euc,
+ filt_common_flush };
+
+static struct filter_vtbl vtbl_utf8_sjis = {
+ filt_common_ctor,
+ filt_common_dtor,
+ filt_utf8_sjis,
+ filt_common_flush };
+
+static struct filter_vtbl vtbl_utf8_jis = {
+ filt_common_ctor,
+ filt_ucs_jis_dtor,
+ filt_utf8_jis,
+ filt_ucs_jis_flush };
+
+static struct filter_vtbl vtbl_euc_ucs = {
+ filt_common_ctor,
+ filt_common_dtor,
+ filt_euc_ucs,
+ filt_common_flush };
+
+static struct filter_vtbl vtbl_ucs_euc = {
+ filt_common_ctor,
+ filt_common_dtor,
+ filt_ucs_euc,
+ filt_common_flush };
+
+static struct filter_vtbl vtbl_euc_wchar = {
+ filt_common_ctor,
+ filt_common_dtor,
+ filt_euc_wchar,
+ filt_common_flush };
+
+static struct filter_vtbl vtbl_wchar_euc = {
+ filt_common_ctor,
+ filt_common_dtor,
+ filt_wchar_euc,
+ filt_common_flush };
+
+static struct filter_vtbl vtbl_sjis_ucs = {
+ filt_common_ctor,
+ filt_common_dtor,
+ filt_sjis_ucs,
+ filt_common_flush };
+
+static struct filter_vtbl vtbl_ucs_sjis = {
+ filt_common_ctor,
+ filt_common_dtor,
+ filt_ucs_sjis,
+ filt_common_flush };
+
+static struct filter_vtbl vtbl_sjis_wchar = {
+ filt_common_ctor,
+ filt_common_dtor,
+ filt_sjis_wchar,
+ filt_common_flush };
+
+static struct filter_vtbl vtbl_wchar_sjis = {
+ filt_common_ctor,
+ filt_common_dtor,
+ filt_wchar_sjis,
+ filt_common_flush };
+
+static struct filter_vtbl vtbl_jis_ucs = {
+ filt_common_ctor,
+ filt_common_dtor,
+ filt_jis_ucs,
+ filt_common_flush };
+
+static struct filter_vtbl vtbl_ucs_jis = {
+ filt_common_ctor,
+ filt_ucs_jis_dtor,
+ filt_ucs_jis,
+ filt_ucs_jis_flush };
+
+static struct filter_vtbl vtbl_jis_wchar = {
+ filt_common_ctor,
+ filt_common_dtor,
+ filt_jis_wchar,
+ filt_common_flush };
+
+static struct filter_vtbl vtbl_wchar_jis = {
+ filt_common_ctor,
+ filt_ucs_jis_dtor,
+ filt_wchar_jis,
+ filt_ucs_jis_flush };
+
+static struct filter_vtbl vtbl_unknown_ja_jp = {
+ filt_unknown_ja_jp_ctor,
+ filt_unknown_ja_jp_dtor,
+ filt_unknown_ja_jp,
+ filt_unknown_ja_jp_flush };
+
+static struct filter_vtbl vtbl_utf8_wchar = {
+ filt_common_ctor,
+ filt_common_dtor,
+ filt_utf8_wchar,
+ filt_common_flush };
+
+static struct filter_vtbl vtbl_wchar_utf8 = {
+ filt_common_ctor,
+ filt_common_dtor,
+ filt_wchar_utf8,
+ filt_common_flush };
+
+static struct filter_vtbl vtbl_b64enc = {
+ filt_common_ctor,
+ filt_b64enc_dtor,
+ filt_b64enc,
+ filt_b64enc_flush };
+
+static struct filter_vtbl vtbl_b64dec = {
+ filt_common_ctor,
+ filt_b64dec_dtor,
+ filt_b64dec,
+ filt_b64dec_flush };
+
+static struct filter_vtbl vtbl_qprintenc = {
+ filt_common_ctor,
+ filt_qprintenc_dtor,
+ filt_qprintenc,
+ filt_qprintenc_flush };
+
+static struct filter_vtbl vtbl_qprintdec = {
+ filt_common_ctor,
+ filt_qprintdec_dtor,
+ filt_qprintdec,
+ filt_qprintdec_flush };
+
+
+static struct filter_vtbl*
+select_vtbl(enum mbfl_no_encoding from, enum mbfl_no_encoding to)
+{
+ struct filter_vtbl* pvtbl = &vtbl_pass;
+
+ if (to == mbfl_no_encoding_base64)
+ return &vtbl_b64enc;
+
+ if (to == mbfl_no_encoding_qprint)
+ return &vtbl_qprintenc;
+
+ if (from == mbfl_no_encoding_auto) {
+ pvtbl = &vtbl_unknown_ja_jp;
+ } else if (from == mbfl_no_encoding_base64) {
+ pvtbl = &vtbl_b64dec;
+ } else if (from == mbfl_no_encoding_qprint) {
+ pvtbl = &vtbl_qprintdec;
+ } else if (from == mbfl_no_encoding_wchar) {
+ if (to == mbfl_no_encoding_utf8) {
+ pvtbl = &vtbl_wchar_utf8;
+ } else if (to == mbfl_no_encoding_ja_jp_euc) {
+ pvtbl = &vtbl_wchar_euc;
+ } else if (to == mbfl_no_encoding_ja_jp_sjis) {
+ pvtbl = &vtbl_wchar_sjis;
+ } else if (to == mbfl_no_encoding_ja_jp_jis) {
+ pvtbl = &vtbl_wchar_jis;
+ }
+ } else if (from == mbfl_no_encoding_utf8) {
+ if (to == mbfl_no_encoding_ja_jp_euc) {
+ pvtbl = &vtbl_utf8_euc;
+ } else if (to == mbfl_no_encoding_ja_jp_sjis) {
+ pvtbl = &vtbl_utf8_sjis;
+ } else if (to == mbfl_no_encoding_ja_jp_jis) {
+ pvtbl = &vtbl_utf8_jis;
+ } else if (to == mbfl_no_encoding_wchar
+ || to == mbfl_no_encoding_ucs) {
+ pvtbl = &vtbl_utf8_wchar;
+ }
+ } else if (from == mbfl_no_encoding_ucs) {
+ if (to == mbfl_no_encoding_utf8) {
+ pvtbl = &vtbl_wchar_utf8;
+ } else if (to == mbfl_no_encoding_ja_jp_euc) {
+ pvtbl = &vtbl_ucs_euc;
+ } else if (to == mbfl_no_encoding_ja_jp_sjis) {
+ pvtbl = &vtbl_ucs_sjis;
+ } else if (to == mbfl_no_encoding_ja_jp_jis) {
+ pvtbl = &vtbl_ucs_jis;
+ }
+ } else if (from == mbfl_no_encoding_ja_jp_euc) {
+ if (to == mbfl_no_encoding_ja_jp_jis) {
+ pvtbl = &vtbl_eucjp_jis;
+ } else if (to == mbfl_no_encoding_ja_jp_sjis) {
+ pvtbl = &vtbl_eucjp_sjis;
+ } else if (to == mbfl_no_encoding_utf8) {
+ pvtbl = &vtbl_eucjp_utf8;
+ } else if (to == mbfl_no_encoding_ucs) {
+ pvtbl = &vtbl_euc_ucs;
+ } else if (to == mbfl_no_encoding_wchar) {
+ pvtbl = &vtbl_euc_wchar;
+ }
+ } else if (from == mbfl_no_encoding_ja_jp_sjis) {
+ if (to == mbfl_no_encoding_ja_jp_jis) {
+ pvtbl = &vtbl_sjis_jis;
+ } else if (to == mbfl_no_encoding_ja_jp_euc) {
+ pvtbl = &vtbl_sjis_eucjp;
+ } else if (to == mbfl_no_encoding_utf8) {
+ pvtbl = &vtbl_sjis_utf8;
+ } else if (to == mbfl_no_encoding_ucs) {
+ pvtbl = &vtbl_sjis_ucs;
+ } else if (to == mbfl_no_encoding_wchar) {
+ pvtbl = &vtbl_sjis_wchar;
+ }
+ } else if (from == mbfl_no_encoding_ja_jp_jis) {
+ if (to == mbfl_no_encoding_ja_jp_euc) {
+ pvtbl = &vtbl_jis_eucjp;
+ } else if (to == mbfl_no_encoding_ja_jp_sjis) {
+ pvtbl = &vtbl_jis_sjis;
+ } else if (to == mbfl_no_encoding_utf8) {
+ pvtbl = &vtbl_jis_utf8;
+ } else if (to == mbfl_no_encoding_ucs) {
+ pvtbl = &vtbl_jis_ucs;
+ } else if (to == mbfl_no_encoding_wchar) {
+ pvtbl = &vtbl_jis_wchar;
+ }
+ }
+
+ return pvtbl;
+}
+
+
+struct mbfl_output_filter*
+mbfl_output_filter_new(
+ enum mbfl_no_encoding from,
+ enum mbfl_no_encoding to,
+ int (*output_function)(int, void*),
+ int (*flush_function)(void*),
+ void* data)
+{
+ /* allocate */
+ struct mbfl_output_filter* filter = (struct mbfl_output_filter*)malloc(sizeof(struct mbfl_output_filter));
+
+ /* select the vtbl */
+ filter->vptr = select_vtbl(from, to);
+
+ /* constructor */
+ (*filter->vptr->filter_ctor)(filter, from, to, output_function, flush_function, data);
+
+ return filter;
+}
+
+void
+mbfl_output_filter_delete(struct mbfl_output_filter* filter)
+{
+ (*filter->vptr->filter_dtor)(filter);
+ free((void*)filter);
+}
+
+int
+mbfl_output_filter_feed(struct mbfl_output_filter* filter, int c)
+{
+ return (*filter->vptr->filter_function)(filter, c);
+}
+
+int
+mbfl_output_filter_flush(struct mbfl_output_filter* filter)
+{
+ return (*filter->vptr->flush_function)(filter);
+}
+
+enum mbfl_no_encoding
+mbfl_output_filter_encoding(struct mbfl_output_filter* filter)
+{
+ return filter->from;
+}
+
+void
+mbfl_output_filter_reset(
+ struct mbfl_output_filter* filter,
+ enum mbfl_no_encoding from,
+ enum mbfl_no_encoding to)
+{
+ /* escape filter member */
+ int (*output_function)(int, void*) = filter->output_function;
+ int (*flush_function)(void*) = filter->flush_function;
+ void* data = filter->data;
+
+ /* destruct old filter */
+ (*filter->vptr->filter_dtor)(filter);
+
+ /* select the vtbl */
+ filter->vptr = select_vtbl(from, to);
+
+ /* construct new filter */
+ (*filter->vptr->filter_ctor)(filter, from, to,
+ output_function, flush_function, data);
+}
+
+void
+mbfl_output_filter_copy(
+ struct mbfl_output_filter* src,
+ struct mbfl_output_filter* dist)
+{
+ dist->vptr = src->vptr;
+ dist->output_function = src->output_function;
+ dist->flush_function = src->flush_function;
+ dist->data = src->data;
+ dist->status = src->status;
+ dist->cache = src->cache;
+ dist->from = src->from;
+ dist->to = src->to;
+}
+
+int
+mbfl_output_filter_unknown_default(struct mbfl_output_filter* filter, enum mbfl_no_encoding dfl)
+{
+ if (filter->from != mbfl_no_encoding_auto || dfl == mbfl_no_encoding_auto) {
+ return 0;
+ }
+ ((struct unknown_data*)filter->data)->from_default = dfl;
+ return 1;
+}
+
+
+/*
+ * filter pipe
+ */
+static int
+filter_pipe_output(int c, void* data)
+{
+ struct mbfl_output_filter *filter = (struct mbfl_output_filter*)data;
+ return (*filter->vptr->filter_function)(filter, c);
+}
+
+
+/*
+ *
+ * output to memory
+ *
+ */
+struct mbfl_output_filter*
+mbfl_output_to_memory_new(
+ enum mbfl_no_encoding from,
+ enum mbfl_no_encoding to)
+{
+ /* メモリーデバイス */
+ struct memory_device* device = (struct memory_device*)malloc(sizeof (struct memory_device));
+ device->buffer = (char*)0;
+ device->length = 0;
+ device->pos = 0;
+
+ /* フィルタを作成 */
+ return mbfl_output_filter_new(from, to, memory_device_output, 0, device);
+}
+
+void
+mbfl_output_to_memory_delete(struct mbfl_output_filter* filter)
+{
+ void* device;
+ mbfl_output_filter_flush(filter);
+ /* This flushes it and makes filter->data as I specified for ..._new(). */
+ device = filter->data;
+ mbfl_output_filter_delete(filter);
+ free(device);
+}
+
+char*
+mbfl_output_to_memory_result(struct mbfl_output_filter* filter)
+{
+ char* result;
+ struct memory_device* device;
+
+ mbfl_output_filter_flush(filter);
+ device = (struct memory_device*)filter->data;
+ memory_device_output('\0', device);
+ result = device->buffer;
+ device->buffer = (char*)0;
+ device->length = 0;
+ device->pos = 0;
+
+ return result; /* free()は呼び出し側の責任 */
+}
+
+
+/*
+ *
+ * multi byte code filter for input stream
+ *
+ */
+struct mbfl_input_filter {
+ int (*input_function)(void* data);
+ void* data;
+ struct mbfl_output_filter* encoder;
+ struct memory_device device;
+ int pos;
+ enum mbfl_no_encoding from; /* encoder->fromのコピー */
+};
+
+struct mbfl_input_filter*
+mbfl_input_filter_new(
+ enum mbfl_no_encoding from,
+ enum mbfl_no_encoding to,
+ int (*input_function)(void*),
+ void* data)
+{
+ struct mbfl_input_filter* filter = (struct mbfl_input_filter*)malloc(sizeof (struct mbfl_input_filter));
+
+ filter->input_function = input_function;
+ filter->data = data;
+ filter->device.buffer = (char*)0;
+ filter->device.length = 0;
+ filter->device.pos = 0; /* writing position */
+ filter->pos = 0; /* reading position */
+ filter->from = from;
+ filter->encoder = mbfl_output_filter_new(from, to, memory_device_output, 0, (void*)&filter->device);
+ return filter;
+}
+
+void
+mbfl_input_filter_delete(struct mbfl_input_filter* filter)
+{
+ if (filter->encoder) {
+ /* XXX mbfl_output_filter_delete()の中身のコピー */
+ (*filter->encoder->vptr->filter_dtor)(filter->encoder);
+ filter->from = filter->encoder->from; /* 判定結果 */
+ free((void*)filter->encoder);
+ }
+
+ if (filter->device.buffer) {
+ free((void*)filter->device.buffer);
+ }
+ free((void*)filter);
+}
+
+int
+mbfl_input_filter_retrieve(struct mbfl_input_filter* filter)
+{
+ int c;
+ struct memory_device* device = &filter->device;
+
+ for (;;) {
+ if (device->pos > filter->pos) {
+ /* have some char in a buffer */
+ c = device->buffer[filter->pos++] & 0xff;
+ if (filter->pos >= device->pos) {
+ filter->pos = device->pos = 0;
+ }
+ return c;
+ } else if (filter->input_function == 0) {
+ /* already hit an EOF */
+ return -1; /* EOF */
+ } else if ((c = (*filter->input_function)(filter->data)) < 0) {
+ /* EOF */
+ /* XXX mbfl_output_filter_delete()の中身のコピー */
+ (*filter->encoder->vptr->filter_dtor)(filter->encoder);
+ filter->from = filter->encoder->from; /* 判定結果 */
+ free((void*)filter->encoder);
+ filter->encoder = 0;
+ filter->input_function = 0; /* mark it */
+ } else {
+ /* got a char from the input function */
+ (void)mbfl_output_filter_feed(filter->encoder, c);
+ /* never returns an error */
+ }
+ }
+}
+
+enum mbfl_no_encoding
+mbfl_input_filter_encoding(struct mbfl_input_filter* filter)
+{
+ return (filter->encoder ? filter->encoder->from : filter->from);
+}
+
+
+/*
+ *
+ * multi byte code converter for C string
+ *
+ */
+char*
+mbfl_encoding_convert(
+ enum mbfl_no_encoding from,
+ enum mbfl_no_encoding to,
+ const char* s)
+{
+ /* 準備 */
+ struct memory_device device = { (char*)0, 0, 0 };
+ struct mbfl_output_filter* filter =
+ mbfl_output_filter_new(from, to, memory_device_output, 0, &device);
+
+ /* 流す */
+ while (*s)
+ (void)mbfl_output_filter_feed(filter, *s++ & 0xff);
+
+ /* 端末処理 */
+ mbfl_output_filter_delete(filter);
+ memory_device_output('\0', &device);
+ /* これにより、device.bufferが0でないことが保証される。*/
+
+ /* 終わり */
+ return device.buffer; /* free()は呼び出し側の責任 */
+}
+
+
+/*
+ *
+ * identify kanji code
+ *
+ */
+static int
+null_device_output(int c, void* data)
+{
+ return 0;
+}
+
+enum mbfl_no_encoding
+mbfl_identify_encoding(const char* s)
+{
+ enum mbfl_no_encoding code;
+
+ /* 準備 */
+ struct mbfl_output_filter* filter = mbfl_output_filter_new(
+ mbfl_no_encoding_auto,
+ mbfl_no_encoding_auto,
+ null_device_output, 0, 0);
+
+ /* 流す */
+ while (*s) {
+ (void)mbfl_output_filter_feed(filter, *s++ & 0xff);
+ if (mbfl_output_filter_encoding(filter) != mbfl_no_encoding_auto)
+ break;
+ }
+
+ mbfl_output_filter_flush(filter);
+ code = mbfl_output_filter_encoding(filter);
+ mbfl_output_filter_delete(filter);
+
+ /* 終わり */
+ return code;
+}
+
+
+/*
+ * strlen
+ */
+static int
+filter_count_output(int c, void* data)
+{
+ (*(int *)data)++;
+ return c;
+}
+
+int
+mbfl_strlen(
+ const char* s,
+ enum mbfl_no_encoding code)
+{
+ /* 文字数を記憶する */
+ int len = 0;
+
+ /* マルチバイト文字からワイド文字に変換するフィルタ */
+ struct mbfl_output_filter* filter = mbfl_output_filter_new(
+ code, mbfl_no_encoding_wchar,
+ filter_count_output, 0, &len);
+
+ /* 流す */
+ while (*s)
+ (void)mbfl_output_filter_feed(filter, *s++ & 0xff);
+
+ mbfl_output_filter_delete(filter);
+
+ /* 終わり */
+ return len;
+}
+
+
+/*
+ * collector
+ */
+struct collector_data {
+ struct mbfl_output_filter *next_filter;
+ struct memory_device bytedev;
+ struct wchar_device wcdev;
+ int start;
+ int stop;
+ int input;
+ int output;
+ int pos;
+ int length;
+ int count;
+};
+
+static struct collector_data*
+collector_data_new()
+{
+ struct collector_data *pc = (struct collector_data*)malloc(sizeof(struct collector_data));
+ if (pc == NULL)
+ return NULL;
+
+ pc->next_filter = (struct mbfl_output_filter *)0;
+ pc->bytedev.buffer = (char*)0;
+ pc->bytedev.length = 0;
+ pc->bytedev.pos = 0;
+ pc->wcdev.buffer = (int*)0;
+ pc->wcdev.length = 0;
+ pc->wcdev.pos = 0;
+ pc->start = 0;
+ pc->stop = 0;
+ pc->input = 0;
+ pc->output = 0;
+ pc->pos = 0;
+ pc->length = 0;
+ pc->count = 0;
+
+ return pc;
+}
+
+static void
+collector_data_delete(struct collector_data *pc)
+{
+ if(pc->bytedev.buffer)
+ free((void*)pc->bytedev.buffer);
+ if(pc->wcdev.buffer)
+ free((void*)pc->wcdev.buffer);
+ free((void*)pc);
+}
+
+
+/*
+ * strpos
+ */
+static int
+collector_strpos(int c, void* data)
+{
+ int *p, *h, *m, n;
+ struct collector_data *pc = (struct collector_data*)data;
+ if (pc->output >= pc->start) {
+ if (c == pc->wcdev.buffer[pc->length]) {
+ if (pc->length == 0)
+ pc->pos = pc->output; /* found position */
+ pc->length++; /* needle pointer */
+ if (pc->wcdev.buffer[pc->length] == '\0') {
+ pc->stop = pc->pos; /* matchd position */
+ pc->count = 1; /* matchd flag */
+ pc->length--;
+ goto retry;
+ }
+ } else if (pc->length != 0) {
+retry:
+ h = pc->wcdev.buffer;
+ h++;
+ for (;;) {
+ pc->pos++;
+ p = h;
+ m = pc->wcdev.buffer;
+ n = pc->length - 1;
+ while (n > 0 && *p == *m) {
+ n--;
+ p++;
+ m++;
+ }
+ if (n <= 0) {
+ if (*m != c)
+ pc->length = 0;
+ break;
+ } else {
+ h++;
+ pc->length--;
+ }
+ }
+ }
+ }
+
+ pc->output++;
+ return c;
+}
+
+int
+mbfl_strpos(
+ const char* haystack,
+ const char* needle,
+ int offset,
+ enum mbfl_no_encoding code,
+ int reverse)
+{
+ int pos;
+ const char *s;
+ struct collector_data *pc;
+ struct mbfl_output_filter* filter;
+
+ pc = collector_data_new();
+ if (pc == NULL)
+ return -4;
+
+ pc->start = offset;
+
+ /* needleをワイド文字に変換 */
+ filter = mbfl_output_filter_new(code, mbfl_no_encoding_wchar, wchar_device_output, 0, &(pc->wcdev));
+ s = needle;
+ while (*s)
+ (void)mbfl_output_filter_feed(filter, *s++ & 0xff);
+
+ mbfl_output_filter_delete(filter);
+ wchar_device_output('\0', &(pc->wcdev));
+
+ if(pc->wcdev.buffer[0] == '\0') {
+ collector_data_delete(pc);
+ return -2;
+ }
+
+ /* haystackをワイド文字に変換するフィルタ */
+ filter = mbfl_output_filter_new(code, mbfl_no_encoding_wchar, collector_strpos, 0, pc);
+ /* collector_strposで文字の比較を行う */
+
+ /* 流す */
+ s = haystack;
+ while (*s) {
+ (void)mbfl_output_filter_feed(filter, *s++ & 0xff);
+ if (pc->count != 0 && !reverse)
+ break;
+ }
+
+ mbfl_output_filter_delete(filter);
+
+ if(pc->count == 0)
+ pos = -1;
+ else
+ pos = pc->stop;
+
+ collector_data_delete(pc);
+
+ /* 終わり */
+ return pos;
+}
+
+
+/*
+ * substr
+ */
+static int
+collector_substr(int c, void* data)
+{
+ struct collector_data *pc = (struct collector_data*)data;
+
+ if(pc->output >= pc->stop)
+ return -1;
+
+ if(pc->output >= pc->start)
+ (*pc->next_filter->vptr->filter_function)(pc->next_filter, c);
+
+ pc->output++;
+
+ return c;
+}
+
+char*
+mbfl_substr(
+ const char* s,
+ int from,
+ int length,
+ enum mbfl_no_encoding code)
+{
+ char *result;
+ struct collector_data *pc;
+ struct mbfl_output_filter* decoder;
+ struct mbfl_output_filter* encoder;
+
+ pc = collector_data_new();
+ if (pc == NULL)
+ return NULL;
+
+ /* ワイド文字からもとのコードに戻しメモリデバイスに出力するフィルタ */
+ decoder = mbfl_output_filter_new(mbfl_no_encoding_wchar, code, memory_device_output, 0, &(pc->bytedev));
+ pc->next_filter = decoder;
+
+ pc->start = from;
+ pc->stop = from + length;
+
+ /* sをワイド文字に変換するフィルタ */
+ encoder = mbfl_output_filter_new(code, mbfl_no_encoding_wchar, collector_substr, 0, pc);
+ /* collector_substrで切り出す文字位置を判定 */
+
+ /* 流す */
+ while (*s) {
+ if (mbfl_output_filter_feed(encoder, *s++ & 0xff) < 0)
+ break;
+ }
+
+ mbfl_output_filter_delete(encoder);
+ mbfl_output_filter_delete(decoder);
+
+ /* 端末処理 */
+ memory_device_output('\0', &(pc->bytedev));
+ /* これにより、device.bufferが0でないことが保証される。*/
+
+ result = pc->bytedev.buffer;
+ pc->bytedev.buffer = (char*)0;
+ collector_data_delete(pc);
+
+ /* 終わり */
+ return result; /* free()は呼び出し側の責任 */
+}
+
+
+/*
+ * strcut
+ */
+static int
+collector_strcut(int c, void* data)
+{
+ int n;
+ struct collector_data *pc = (struct collector_data*)data;
+
+ pc->pos = pc->bytedev.pos;
+ if(pc->input >= pc->start) {
+ (*pc->next_filter->vptr->filter_function)(pc->next_filter, c);
+ }
+
+ n = pc->bytedev.pos + ((pc->next_filter->status >> 16) & 0xff);
+ if(n > pc->stop) {
+ pc->bytedev.pos = pc->pos;
+ c = -1;
+ }
+
+ return c;
+}
+
+char*
+mbfl_strcut(
+ const char* s,
+ int from,
+ int length,
+ enum mbfl_no_encoding code)
+{
+ char *result;
+ struct collector_data *pc;
+ struct mbfl_output_filter* decoder;
+ struct mbfl_output_filter* encoder;
+
+ pc = collector_data_new();
+ if (pc == NULL)
+ return NULL;
+
+ /* ワイド文字からもとのコードに戻しメモリデバイスに出力するフィルタ */
+ decoder = mbfl_output_filter_new(mbfl_no_encoding_wchar, code, memory_device_output, 0, &(pc->bytedev));
+ pc->next_filter = decoder;
+
+ pc->start = from;
+ pc->stop = length;
+
+ /* sをワイド文字に変換するフィルタ */
+ encoder = mbfl_output_filter_new(code, mbfl_no_encoding_wchar, collector_strcut, 0, pc);
+ /* collector_strcutで切り出す文字位置を判定 */
+
+ /* 流す */
+ while (*s) {
+ if (mbfl_output_filter_feed(encoder, *s++ & 0xff) < 0)
+ break;
+ pc->input++;
+ }
+
+ mbfl_output_filter_delete(encoder);
+ mbfl_output_filter_delete(decoder);
+
+ /* 端末処理 */
+ memory_device_output('\0', &(pc->bytedev));
+ /* これにより、device.bufferが0でないことが保証される。*/
+
+ result = pc->bytedev.buffer;
+ pc->bytedev.buffer = (char*)0;
+ collector_data_delete(pc);
+
+ /* 終わり */
+ return result; /* free()は呼び出し側の責任 */
+}
+
+
+/*
+ * convert Hankaku and Zenkaku
+ */
+static const unsigned char hankana2zenkata_table[64] = {
+ 0x00,0x02,0x0C,0x0D,0x01,0xFB,0xF2,0xA1,0xA3,0xA5,
+ 0xA7,0xA9,0xE3,0xE5,0xE7,0xC3,0xFC,0xA2,0xA4,0xA6,
+ 0xA8,0xAA,0xAB,0xAD,0xAF,0xB1,0xB3,0xB5,0xB7,0xB9,
+ 0xBB,0xBD,0xBF,0xC1,0xC4,0xC6,0xC8,0xCA,0xCB,0xCC,
+ 0xCD,0xCE,0xCF,0xD2,0xD5,0xD8,0xDB,0xDE,0xDF,0xE0,
+ 0xE1,0xE2,0xE4,0xE6,0xE8,0xE9,0xEA,0xEB,0xEC,0xED,
+ 0xEF,0xF3,0x9B,0x9C
+};
+static const unsigned char hankana2zenhira_table[64] = {
+ 0x00,0x02,0x0C,0x0D,0x01,0xFB,0x92,0x41,0x43,0x45,
+ 0x47,0x49,0x83,0x85,0x87,0x63,0xFC,0x42,0x44,0x46,
+ 0x48,0x4A,0x4B,0x4D,0x4F,0x51,0x53,0x55,0x57,0x59,
+ 0x5B,0x5D,0x5F,0x61,0x64,0x66,0x68,0x6A,0x6B,0x6C,
+ 0x6D,0x6E,0x6F,0x72,0x75,0x78,0x7B,0x7E,0x7F,0x80,
+ 0x81,0x82,0x84,0x86,0x88,0x89,0x8A,0x8B,0x8C,0x8D,
+ 0x8F,0x93,0x9B,0x9C
+};
+static const unsigned char zenkana2hankana_table[84][2] = {
+ {0x67,0x00},{0x71,0x00},{0x68,0x00},{0x72,0x00},{0x69,0x00},
+ {0x73,0x00},{0x6A,0x00},{0x74,0x00},{0x6B,0x00},{0x75,0x00},
+ {0x76,0x00},{0x76,0x9E},{0x77,0x00},{0x77,0x9E},{0x78,0x00},
+ {0x78,0x9E},{0x79,0x00},{0x79,0x9E},{0x7A,0x00},{0x7A,0x9E},
+ {0x7B,0x00},{0x7B,0x9E},{0x7C,0x00},{0x7C,0x9E},{0x7D,0x00},
+ {0x7D,0x9E},{0x7E,0x00},{0x7E,0x9E},{0x7F,0x00},{0x7F,0x9E},
+ {0x80,0x00},{0x80,0x9E},{0x81,0x00},{0x81,0x9E},{0x6F,0x00},
+ {0x82,0x00},{0x82,0x9E},{0x83,0x00},{0x83,0x9E},{0x84,0x00},
+ {0x84,0x9E},{0x85,0x00},{0x86,0x00},{0x87,0x00},{0x88,0x00},
+ {0x89,0x00},{0x8A,0x00},{0x8A,0x9E},{0x8A,0x9F},{0x8B,0x00},
+ {0x8B,0x9E},{0x8B,0x9F},{0x8C,0x00},{0x8C,0x9E},{0x8C,0x9F},
+ {0x8D,0x00},{0x8D,0x9E},{0x8D,0x9F},{0x8E,0x00},{0x8E,0x9E},
+ {0x8E,0x9F},{0x8F,0x00},{0x90,0x00},{0x91,0x00},{0x92,0x00},
+ {0x93,0x00},{0x6C,0x00},{0x94,0x00},{0x6D,0x00},{0x95,0x00},
+ {0x6E,0x00},{0x96,0x00},{0x97,0x00},{0x98,0x00},{0x99,0x00},
+ {0x9A,0x00},{0x9B,0x00},{0x9C,0x00},{0x9C,0x00},{0x72,0x00},
+ {0x74,0x00},{0x66,0x00},{0x9D,0x00},{0x73,0x9E}
+};
+
+static int
+collector_hantozen(int c, void* data)
+{
+ int s, mode, n;
+ struct collector_data *pc = (struct collector_data*)data;
+ s = c;
+ mode = pc->start;
+
+ if(mode & 0x7) { /* hankaku to zenkaku */
+ if((mode & 0x1) && c >= 0x21 && c <= 0x7e) { /* all */
+ s = c + 0xfee0;
+ } else if((mode & 0x2) && ((c >= 0x41 && c <= 0x5a) || (c >= 0x61 && c <= 0x7a))) { /* alpha */
+ s = c + 0xfee0;
+ } else if((mode & 0x4) && c >= 0x30 && c <= 0x39) { /* num */
+ s = c + 0xfee0;
+ }
+ }
+
+ if(mode & 0x70) { /* zenkaku to hankaku */
+ if((mode & 0x10) && c >= 0xff01 && c <= 0xff5e) { /* all */
+ s = c - 0xfee0;
+ } else if((mode & 0x20) && ((c >= 0xff21 && c <= 0xff3a) || (c >= 0xff41 && c <= 0xff5a))) { /* alpha */
+ s = c - 0xfee0;
+ } else if((mode & 0x40) && (c >= 0xff10 && c <= 0xff19)) { /* num */
+ s = c - 0xfee0;
+ }
+ }
+
+ if(mode & 0x300) { /* hankaku kana to zenkaku kana */
+ if((mode & 0x100) && (mode & 0x800)) { /* hankaku kana to zenkaku katakana and glue voice soundmark */
+ if(c >= 0xff61 && c <= 0xff9f) {
+ if(pc->pos) {
+ n = (pc->output - 0xff60) & 0x3f;
+ if(c == 0xff9e && ((n >= 22 && n <= 36) || (n >= 42 && n <= 46))) {
+ pc->pos = 0;
+ s = 0x3001 + hankana2zenkata_table[n];
+ } else if(c == 0xff9e && n == 19) {
+ pc->pos = 0;
+ s = 0x30f4;
+ } else if(c == 0xff9f && (n >= 42 && n <= 46)) {
+ pc->pos = 0;
+ s = 0x3002 + hankana2zenkata_table[n];
+ } else {
+ pc->pos = 1;
+ pc->output = c;
+ s = 0x3000 + hankana2zenkata_table[n];
+ }
+ } else {
+ pc->pos = 1;
+ pc->output = c;
+ return c;
+ }
+ } else {
+ if(pc->pos) {
+ n = (pc->output - 0xff60) & 0x3f;
+ pc->pos = 0;
+ (*pc->next_filter->vptr->filter_function)(pc->next_filter, 0x3000 + hankana2zenkata_table[n]);
+ }
+ }
+ } else if((mode & 0x200) && (mode & 0x800)) { /* hankaku kana to zenkaku hirangana and glue voice soundmark */
+ if(c >= 0xff61 && c <= 0xff9f) {
+ if(pc->pos) {
+ n = (pc->output - 0xff60) & 0x3f;
+ if(c == 0xff9e && ((n >= 22 && n <= 36) || (n >= 42 && n <= 46))) {
+ pc->pos = 0;
+ s = 0x3001 + hankana2zenhira_table[n];
+ } else if(c == 0xff9f && (n >= 42 && n <= 46)) {
+ pc->pos = 0;
+ s = 0x3002 + hankana2zenhira_table[n];
+ } else {
+ pc->pos = 1;
+ pc->output = c;
+ s = 0x3000 + hankana2zenhira_table[n];
+ }
+ } else {
+ pc->pos = 1;
+ pc->output = c;
+ return c;
+ }
+ } else {
+ if(pc->pos) {
+ n = (pc->output - 0xff60) & 0x3f;
+ pc->pos = 0;
+ (*pc->next_filter->vptr->filter_function)(pc->next_filter, 0x3000 + hankana2zenhira_table[n]);
+ }
+ }
+ } else if((mode & 0x100) && c >= 0xff61 && c <= 0xff9f) { /* hankaku kana to zenkaku katakana */
+ s = 0x3000 + hankana2zenkata_table[c - 0xff60];
+ } else if((mode & 0x200) && c >= 0xff61 && c <= 0xff9f) { /* hankaku kana to zenkaku hirangana */
+ s = 0x3000 + hankana2zenhira_table[c - 0xff60];
+ }
+ }
+
+ if(mode & 0x3000) { /* Zenkaku kana to hankaku kana */
+ if((mode & 0x1000) && c >= 0x30a1 && c <= 0x30f4) { /* Zenkaku katakana to hankaku kana */
+ n = c - 0x30a1;
+ if(zenkana2hankana_table[n][1] != 0) {
+ (*pc->next_filter->vptr->filter_function)(pc->next_filter, 0xff00 + zenkana2hankana_table[n][0]);
+ s = 0xff00 + zenkana2hankana_table[n][1];
+ } else {
+ s = 0xff00 + zenkana2hankana_table[n][0];
+ }
+ } else if((mode & 0x2000) && c >= 0x3041 && c <= 0x3093) { /* Zenkaku hirangana to hankaku kana */
+ n = c - 0x3041;
+ if(zenkana2hankana_table[n][1] != 0) {
+ (*pc->next_filter->vptr->filter_function)(pc->next_filter, 0xff00 + zenkana2hankana_table[n][0]);
+ s = 0xff00 + zenkana2hankana_table[n][1];
+ } else {
+ s = 0xff00 + zenkana2hankana_table[n][0];
+ }
+ } else if(c == 0x3001) {
+ s = 0xff64;
+ } else if(c == 0x3002) {
+ s = 0xff61;
+ } else if(c == 0x309b) {
+ s = 0xff9e;
+ } else if(c == 0x309c) {
+ s = 0xff9f;
+ } else if(c == 0x30fc) {
+ s = 0xff70;
+ }
+ } else if(mode & 0x30000) {
+ if((mode & 0x10000) && c >= 0x3041 && c <= 0x3093) { /* Zenkaku hirangana to Zenkaku katakana */
+ s = c + 0x60;
+ } else if((mode & 0x20000) && c >= 0x30a1 && c <= 0x30f3) { /* Zenkaku katakana to Zenkaku hirangana */
+ s = c - 0x60;
+ }
+ }
+
+ return (*pc->next_filter->vptr->filter_function)(pc->next_filter, s);
+}
+
+char*
+mbfl_ja_jp_hantozen(
+ const char* s,
+ int mode,
+ enum mbfl_no_encoding code)
+{
+ char *result;
+ struct collector_data *pc;
+ struct mbfl_output_filter* decoder;
+ struct mbfl_output_filter* encoder;
+
+ pc = collector_data_new();
+ if (pc == NULL)
+ return NULL;
+
+ /* 変換結果をUCSからもとのコードに戻しメモリデバイスに出力するフィルタ */
+ decoder = mbfl_output_filter_new(mbfl_no_encoding_ucs, code, memory_device_output, 0, &(pc->bytedev));
+ pc->next_filter = decoder;
+ pc->start = mode;
+
+ /* sのエンコードをUCSに変換するフィルタ */
+ encoder = mbfl_output_filter_new(code, mbfl_no_encoding_ucs, collector_hantozen, 0, pc);
+ /* collector_hantozenで半角と全角の変換 */
+
+ /* 流す */
+ while (*s)
+ (void)mbfl_output_filter_feed(encoder, *s++ & 0xff);
+
+ (void)mbfl_output_filter_feed(encoder, '\0');
+ mbfl_output_filter_delete(encoder);
+ mbfl_output_filter_delete(decoder);
+
+ result = pc->bytedev.buffer;
+ pc->bytedev.buffer = (char*)0;
+ collector_data_delete(pc);
+
+ /* 終わり */
+ return result; /* free()は呼び出し側の責任 */
+}
+
+
+/*
+ * MIME header encode
+ */
+struct mime_header_encoder_data {
+ struct mbfl_output_filter *toucs_filter;
+ struct mbfl_output_filter *tomb_filter;
+ struct mbfl_output_filter *tomb_tmp_filter;
+ struct mbfl_output_filter *enc_filter;
+ struct mbfl_output_filter *enc_tmp_filter;
+ struct memory_device device;
+ struct memory_device tmpdev;
+ int prevpos;
+ int status;
+ int linehead;
+ int encnamelen;
+ char encname[64];
+ char linefeed[8];
+};
+
+static int
+mime_header_encoder_collector(int c, void* data)
+{
+ int n,p;
+ struct mime_header_encoder_data *pe = (struct mime_header_encoder_data*)data;
+
+ if (c != '\r' && c != '\n') {
+ switch(pe->status) {
+ case 10: /* Quoted-Printable encoding mode: initial state */
+ pe->status = 11;
+ memory_device_ncat(&(pe->device), pe->encname, pe->encnamelen);
+ c = (*pe->tomb_filter->vptr->filter_function)(pe->tomb_filter, c);
+ pe->prevpos = pe->device.pos;
+ mbfl_output_filter_copy(pe->tomb_filter, pe->tomb_tmp_filter);
+ mbfl_output_filter_copy(pe->enc_filter, pe->enc_tmp_filter);
+ break;
+ case 11: /* Quoted-Printable encoding mode: normal state */
+ (*pe->tomb_filter->vptr->filter_function)(pe->tomb_filter, c);
+ (*pe->tomb_filter->vptr->flush_function)(pe->tomb_filter);
+ (*pe->enc_filter->vptr->flush_function)(pe->enc_filter);
+ n = pe->device.pos - pe->linehead;
+ if(n > 70) {
+ memory_device_ncat(&(pe->device), "?=", 2);
+ memory_device_cat(&(pe->device), pe->linefeed);
+ pe->linehead = pe->device.pos;
+ memory_device_output(' ', &(pe->device));
+ memory_device_ncat(&(pe->device), pe->encname, pe->encnamelen);
+ c = (*pe->tomb_filter->vptr->filter_function)(pe->tomb_filter, c);
+ } else {
+ pe->device.pos = pe->prevpos;
+ mbfl_output_filter_copy(pe->tomb_tmp_filter, pe->tomb_filter);
+ mbfl_output_filter_copy(pe->enc_tmp_filter, pe->enc_filter);
+ c = (*pe->tomb_filter->vptr->filter_function)(pe->tomb_filter, c);
+ }
+ pe->prevpos = pe->device.pos;
+ mbfl_output_filter_copy(pe->tomb_filter, pe->tomb_tmp_filter);
+ mbfl_output_filter_copy(pe->enc_filter, pe->enc_tmp_filter);
+ break;
+
+ case 2: /* nonASCII for BASE64 encoding mode w/LWSP sequence */
+ case 3: /* nonASCII for BASE64 encoding mode w/LWSP+ASCII sequence */
+ if(c == ' ' || c == '\t') {
+ memory_device_output(c, &(pe->tmpdev));
+ if (pe->status == 3) {
+ (*pe->tomb_filter->vptr->flush_function)(pe->tomb_filter);
+ (*pe->enc_filter->vptr->flush_function)(pe->enc_filter);
+ memory_device_ncat(&(pe->device), "?=", 2);
+
+ if (pe->device.pos + pe->tmpdev.pos - pe->linehead >= 73) {
+ memory_device_cat(&(pe->device), pe->linefeed);
+ pe->linehead = pe->device.pos;
+ }
+ p = 0;
+ while (p < pe->tmpdev.pos) {
+ if (pe->device.pos - pe->linehead >= 74) {
+ memory_device_cat(&(pe->device), pe->linefeed);
+ pe->linehead = pe->device.pos;
+ memory_device_output(' ', &(pe->device));
+ }
+ memory_device_output(pe->tmpdev.buffer[p++], &(pe->device));
+ }
+ pe->tmpdev.pos = 0;
+ pe->status = 0;
+ }
+ break;
+ } else if (c < 0x80) {
+ memory_device_output(c, &(pe->tmpdev));
+ pe->status = 3;
+ break;
+ }
+ pe->status = 1;
+
+ p = 0;
+ while (p < pe->tmpdev.pos) {
+ (*pe->tomb_filter->vptr->filter_function)(pe->tomb_filter, pe->tmpdev.buffer[p]);
+ (*pe->tomb_filter->vptr->flush_function)(pe->tomb_filter);
+ (*pe->enc_filter->vptr->flush_function)(pe->enc_filter);
+ n = pe->device.pos - pe->linehead;
+ pe->device.pos = pe->prevpos;
+ mbfl_output_filter_copy(pe->tomb_tmp_filter, pe->tomb_filter);
+ mbfl_output_filter_copy(pe->enc_tmp_filter, pe->enc_filter);
+
+ if(n >= 73) {
+ (*pe->tomb_filter->vptr->flush_function)(pe->tomb_filter);
+ (*pe->enc_filter->vptr->flush_function)(pe->enc_filter);
+ memory_device_ncat(&(pe->device), "?=", 2);
+ memory_device_cat(&(pe->device), pe->linefeed);
+ pe->linehead = pe->device.pos;
+ memory_device_output(' ', &(pe->device));
+ memory_device_ncat(&(pe->device), pe->encname, pe->encnamelen);
+ }
+ (*pe->tomb_filter->vptr->filter_function)(pe->tomb_filter, pe->tmpdev.buffer[p++]);
+ pe->prevpos = pe->device.pos;
+ mbfl_output_filter_copy(pe->tomb_filter, pe->tomb_tmp_filter);
+ mbfl_output_filter_copy(pe->enc_filter, pe->enc_tmp_filter);
+ }
+ pe->tmpdev.pos = 0;
+ case 1: /* nonASCII for BASE64 encoding mode */
+ (*pe->tomb_filter->vptr->filter_function)(pe->tomb_filter, c);
+ (*pe->tomb_filter->vptr->flush_function)(pe->tomb_filter);
+ (*pe->enc_filter->vptr->flush_function)(pe->enc_filter);
+ n = pe->device.pos - pe->linehead;
+
+ pe->device.pos = pe->prevpos;
+ mbfl_output_filter_copy(pe->tomb_tmp_filter, pe->tomb_filter);
+ mbfl_output_filter_copy(pe->enc_tmp_filter, pe->enc_filter);
+
+ if(c == ' ' || c == '\t') {
+ memory_device_output(c, &(pe->tmpdev));
+ pe->status = 2;
+ } else {
+ if(n >= 73) {
+ (*pe->tomb_filter->vptr->flush_function)(pe->tomb_filter);
+ (*pe->enc_filter->vptr->flush_function)(pe->enc_filter);
+ memory_device_ncat(&(pe->device), "?=", 2);
+ memory_device_cat(&(pe->device), pe->linefeed);
+ pe->linehead = pe->device.pos;
+ memory_device_output(' ', &(pe->device));
+ memory_device_ncat(&(pe->device), pe->encname, pe->encnamelen);
+ }
+ c = (*pe->tomb_filter->vptr->filter_function)(pe->tomb_filter, c);
+ }
+ pe->prevpos = pe->device.pos;
+ mbfl_output_filter_copy(pe->tomb_filter, pe->tomb_tmp_filter);
+ mbfl_output_filter_copy(pe->enc_filter, pe->enc_tmp_filter);
+ break;
+ default: /* ASCII for BASE64 encoding mode */
+ if(c == ' ' || c == '\t') {
+ memory_device_output(c, &(pe->tmpdev));
+ if (pe->device.pos + pe->tmpdev.pos - pe->linehead >= 73) {
+ if(pe->device.buffer[pe->device.pos-1] == '\t'
+ || pe->device.buffer[pe->device.pos-1] == ' ') {
+ pe->device.pos--;
+ }
+ memory_device_cat(&(pe->device), pe->linefeed);
+ pe->linehead = pe->device.pos;
+ memory_device_output(' ', &(pe->device));
+ }
+ p = 0;
+ while (p < pe->tmpdev.pos) {
+ if (pe->device.pos - pe->linehead >= 74) {
+ memory_device_cat(&(pe->device), pe->linefeed);
+ pe->linehead = pe->device.pos;
+ memory_device_output(' ', &(pe->device));
+ }
+ memory_device_output(pe->tmpdev.buffer[p++], &(pe->device));
+ }
+ pe->tmpdev.pos = 0;
+ } else if (c < 0x80) {
+ memory_device_output(c, &(pe->tmpdev));
+ } else {
+ if((pe->device.pos - pe->linehead + pe->encnamelen) >= 60) {
+ if(pe->device.buffer[pe->device.pos-1] == '\t'
+ || pe->device.buffer[pe->device.pos-1] == ' ') {
+ pe->device.pos--;
+ }
+ memory_device_cat(&(pe->device), pe->linefeed);
+ pe->linehead = pe->device.pos;
+ memory_device_output(' ', &(pe->device));
+ }
+ memory_device_ncat(&(pe->device), pe->encname, pe->encnamelen);
+ pe->prevpos = pe->device.pos;
+
+ p = 0;
+ while (p < pe->tmpdev.pos) {
+ (*pe->tomb_filter->vptr->filter_function)(pe->tomb_filter, pe->tmpdev.buffer[p]);
+ (*pe->tomb_filter->vptr->flush_function)(pe->tomb_filter);
+ (*pe->enc_filter->vptr->flush_function)(pe->enc_filter);
+ n = pe->device.pos - pe->linehead;
+ pe->device.pos = pe->prevpos;
+ mbfl_output_filter_copy(pe->tomb_tmp_filter, pe->tomb_filter);
+ mbfl_output_filter_copy(pe->enc_tmp_filter, pe->enc_filter);
+
+ if(n >= 73) {
+ (*pe->tomb_filter->vptr->flush_function)(pe->tomb_filter);
+ (*pe->enc_filter->vptr->flush_function)(pe->enc_filter);
+ memory_device_ncat(&(pe->device), "?=", 2);
+ memory_device_cat(&(pe->device), pe->linefeed);
+ pe->linehead = pe->device.pos;
+ memory_device_output(' ', &(pe->device));
+ memory_device_ncat(&(pe->device), pe->encname, pe->encnamelen);
+ }
+ (*pe->tomb_filter->vptr->filter_function)(pe->tomb_filter, pe->tmpdev.buffer[p++]);
+ pe->prevpos = pe->device.pos;
+ mbfl_output_filter_copy(pe->tomb_filter, pe->tomb_tmp_filter);
+ mbfl_output_filter_copy(pe->enc_filter, pe->enc_tmp_filter);
+ }
+ pe->tmpdev.pos = 0;
+ pe->status = 1;
+
+ c = (*pe->tomb_filter->vptr->filter_function)(pe->tomb_filter, c);
+ pe->prevpos = pe->device.pos;
+ mbfl_output_filter_copy(pe->tomb_filter, pe->tomb_tmp_filter);
+ mbfl_output_filter_copy(pe->enc_filter, pe->enc_tmp_filter);
+ }
+ break;
+ }
+ }
+
+ return c;
+}
+
+struct mime_header_encoder_data*
+mime_header_encoder_new(
+ enum mbfl_no_encoding incode,
+ enum mbfl_no_encoding outcode,
+ enum mbfl_no_encoding encoding)
+{
+ int n;
+ const char *s;
+ mbfl_encoding_ptr poutenc;
+ struct mime_header_encoder_data *pe;
+
+ /* get output encoding and check MIME charset name */
+ poutenc = mbfl_no2encoding(outcode);
+ if (poutenc == NULL || poutenc->mime_name == NULL || *poutenc->mime_name == '\0')
+ return NULL;
+
+ pe = (struct mime_header_encoder_data*)malloc(sizeof(struct mime_header_encoder_data));
+ if (pe == NULL)
+ return NULL;
+
+ pe->device.buffer = (char*)0;
+ pe->device.length = 0;
+ pe->device.pos = 0;
+ pe->tmpdev.buffer = (char*)0;
+ pe->tmpdev.length = 0;
+ pe->tmpdev.pos = 0;
+ pe->prevpos = 0;
+ pe->linehead = 0;
+
+ /* make encoding description string ie."=?ISO-2022-JP?B?" */
+ n = 0;
+ pe->encname[n++] = '=';
+ pe->encname[n++] = '?';
+ s = poutenc->mime_name;
+ while(*s)
+ pe->encname[n++] = *s++;
+ pe->encname[n++] = '?';
+ if(encoding == mbfl_no_encoding_qprint) {
+ pe->status = 10;
+ pe->encname[n++] = 'Q';
+ } else {
+ pe->status = 0;
+ pe->encname[n++] = 'B';
+ encoding = mbfl_no_encoding_base64;
+ }
+ pe->encname[n++] = '?';
+ pe->encname[n] = '\0';
+ pe->encnamelen = n;
+
+ pe->linefeed[0] = '\r';
+ pe->linefeed[1] = '\n';
+ pe->linefeed[2] = '\0';
+
+ /* encode filter */
+ pe->enc_filter = mbfl_output_filter_new(outcode, encoding, memory_device_output, 0, &(pe->device));
+ pe->enc_tmp_filter = mbfl_output_filter_new(outcode, encoding, memory_device_output, 0, &(pe->device));
+
+ /* UCS to Output code filter */
+ pe->tomb_filter = mbfl_output_filter_new(mbfl_no_encoding_ucs, outcode, filter_pipe_output, 0, pe->enc_filter);
+ pe->tomb_tmp_filter = mbfl_output_filter_new(mbfl_no_encoding_ucs, outcode, filter_pipe_output, 0, pe->enc_filter);
+
+ /* Input code to UCS filter */
+ pe->toucs_filter = mbfl_output_filter_new(incode, mbfl_no_encoding_ucs, mime_header_encoder_collector, 0, pe);
+
+ if (pe->enc_filter == NULL ||
+ pe->enc_tmp_filter == NULL ||
+ pe->tomb_filter == NULL ||
+ pe->tomb_tmp_filter == NULL ||
+ pe->toucs_filter == NULL) {
+ mime_header_encoder_delete(pe);
+ return NULL;
+ }
+
+ return pe;
+}
+
+void
+mime_header_encoder_delete(struct mime_header_encoder_data *pe)
+{
+ if (pe->toucs_filter)
+ mbfl_output_filter_delete(pe->toucs_filter);
+ if (pe->tomb_filter)
+ mbfl_output_filter_delete(pe->tomb_filter);
+ if (pe->tomb_tmp_filter)
+ mbfl_output_filter_delete(pe->tomb_tmp_filter);
+ if (pe->enc_filter)
+ mbfl_output_filter_delete(pe->enc_filter);
+ if (pe->enc_tmp_filter)
+ mbfl_output_filter_delete(pe->enc_tmp_filter);
+ if (pe->device.buffer)
+ free((void*)pe->device.buffer);
+ if (pe->tmpdev.buffer)
+ free((void*)pe->tmpdev.buffer);
+ free((void*)pe);
+}
+
+int
+mime_header_encoder_feed(int c, struct mime_header_encoder_data *pe)
+{
+ return (*pe->toucs_filter->vptr->filter_function)(pe->toucs_filter, c);
+}
+
+char*
+mime_header_encoder_result(struct mime_header_encoder_data *pe)
+{
+ char* result;
+ int n,p;
+
+ switch(pe->status) {
+ case 2: /* nonASCII for BASE64 encoding mode w/LWSP sequence */
+ case 1: /* nonASCII for BASE64 encoding mode */
+ p = 0;
+ while (p < pe->tmpdev.pos) {
+ (*pe->tomb_filter->vptr->filter_function)(pe->tomb_filter, pe->tmpdev.buffer[p]);
+ (*pe->tomb_filter->vptr->flush_function)(pe->tomb_filter);
+ (*pe->enc_filter->vptr->flush_function)(pe->enc_filter);
+ n = pe->device.pos - pe->linehead;
+ pe->device.pos = pe->prevpos;
+ mbfl_output_filter_copy(pe->tomb_tmp_filter, pe->tomb_filter);
+ mbfl_output_filter_copy(pe->enc_tmp_filter, pe->enc_filter);
+
+ if(n >= 73) {
+ (*pe->tomb_filter->vptr->flush_function)(pe->tomb_filter);
+ (*pe->enc_filter->vptr->flush_function)(pe->enc_filter);
+ memory_device_ncat(&(pe->device), "?=", 2);
+ memory_device_cat(&(pe->device), pe->linefeed);
+ pe->linehead = pe->device.pos;
+ memory_device_output(' ', &(pe->device));
+ memory_device_ncat(&(pe->device), pe->encname, pe->encnamelen);
+ }
+ (*pe->tomb_filter->vptr->filter_function)(pe->tomb_filter, pe->tmpdev.buffer[p++]);
+ pe->prevpos = pe->device.pos;
+ mbfl_output_filter_copy(pe->tomb_filter, pe->tomb_tmp_filter);
+ mbfl_output_filter_copy(pe->enc_filter, pe->enc_tmp_filter);
+ }
+
+ (*pe->tomb_filter->vptr->flush_function)(pe->tomb_filter);
+ (*pe->enc_filter->vptr->flush_function)(pe->enc_filter);
+ memory_device_output('?', &(pe->device));
+ memory_device_output('=', &(pe->device));
+ break;
+
+ case 3: /* nonASCII for BASE64 encoding mode w/LWSP+ASCII sequence */
+ (*pe->tomb_filter->vptr->flush_function)(pe->tomb_filter);
+ (*pe->enc_filter->vptr->flush_function)(pe->enc_filter);
+ memory_device_ncat(&(pe->device), "?=", 2);
+ default: /* ASCII for BASE64 encoding mode */
+ if (pe->device.pos + pe->tmpdev.pos - pe->linehead >= 73) {
+ if(pe->device.buffer[pe->device.pos-1] == '\t'
+ || pe->device.buffer[pe->device.pos-1] == ' ') {
+ pe->device.pos--;
+ }
+ memory_device_cat(&(pe->device), pe->linefeed);
+ pe->linehead = pe->device.pos;
+ memory_device_output(' ', &(pe->device));
+ }
+ p = 0;
+ while (p < pe->tmpdev.pos) {
+ if (pe->device.pos - pe->linehead >= 74) {
+ memory_device_cat(&(pe->device), pe->linefeed);
+ pe->linehead = pe->device.pos;
+ memory_device_output(' ', &(pe->device));
+ }
+ memory_device_output(pe->tmpdev.buffer[p++], &(pe->device));
+ }
+ break;
+ }
+
+ pe->tmpdev.pos = 0;
+ pe->status = 0;
+
+ memory_device_output('\0', &(pe->device));
+ result = pe->device.buffer;
+ pe->device.buffer = (char*)0;
+ pe->device.length = 0;
+ pe->device.pos = 0;
+
+ return result; /* free()は呼び出し側の責任 */
+}
+
+char*
+mbfl_mime_header_encode(
+ enum mbfl_no_encoding incode,
+ enum mbfl_no_encoding outcode,
+ enum mbfl_no_encoding encoding,
+ const char *s,
+ const char *linefeed)
+{
+ int n;
+ char *p;
+ struct mime_header_encoder_data *pe = mime_header_encoder_new(incode, outcode, encoding);
+ if (pe == NULL)
+ return NULL;
+
+ if (linefeed != NULL) {
+ p = pe->linefeed; /* buffer pointer */
+ n = 8; /* buffer length */
+ while(*linefeed && --n > 0)
+ *p++ = *linefeed++;
+ *p = '\0';
+ }
+
+ /* 流す */
+ while (*s)
+ (void)(*pe->toucs_filter->vptr->filter_function)(pe->toucs_filter, *s++ & 0xff);
+
+ p = mime_header_encoder_result(pe);
+ mime_header_encoder_delete(pe);
+
+ /* 終わり */
+ return p; /* free()は呼び出し側の責任 */
+}
+
+
+/*
+ * MIME header decode
+ */
+struct mime_header_decoder_data {
+ struct mbfl_output_filter *deco_filter;
+ struct mbfl_output_filter *conv_filter;
+ struct memory_device outdev;
+ struct memory_device tmpdev;
+ struct memory_device lwspdev;
+ int cspos;
+ int status;
+ int outputstatus;
+ enum mbfl_no_encoding encoding;
+ enum mbfl_no_encoding incode;
+ enum mbfl_no_encoding outcode;
+};
+
+static int
+mime_header_decoder_collector(int c, void* data)
+{
+ mbfl_encoding_ptr penc;
+ struct mime_header_decoder_data *pd = (struct mime_header_decoder_data*)data;
+
+ switch(pd->status) {
+ case 1:
+ if(c == '?') {
+ memory_device_output(c, &(pd->tmpdev));
+ pd->cspos = pd->tmpdev.pos;
+ pd->status = 2;
+ } else {
+ if (pd->outputstatus != 1) {
+ memory_device_ncat(&(pd->outdev), pd->lwspdev.buffer, pd->lwspdev.pos);
+ }
+ pd->lwspdev.pos = 0;
+ pd->outputstatus = 1;
+ memory_device_ncat(&(pd->outdev), pd->tmpdev.buffer, pd->tmpdev.pos);
+ pd->tmpdev.pos = 0;
+ if (c == '=') {
+ memory_device_output(c, &(pd->tmpdev));
+ } else if (c == '\r' || c == '\n') {
+ pd->status = 8;
+ } else {
+ memory_device_output(c, &(pd->outdev));
+ pd->status = 0;
+ }
+ }
+ break;
+ case 2: /* store charset string */
+ if (c == '?') { /* identify charset */
+ memory_device_output('\0', &(pd->tmpdev));
+ penc = mbfl_name2encoding(&(pd->tmpdev.buffer[pd->cspos]));
+ if (penc != NULL) {
+ pd->incode = penc->no_encoding;
+ pd->status = 3;
+ }
+ pd->tmpdev.pos--;
+ memory_device_output(c, &(pd->tmpdev));
+ } else {
+ memory_device_output(c, &(pd->tmpdev));
+ if (pd->tmpdev.pos > 100) { /* too long charset string */
+ pd->status = 0;
+ } else if (c == '\r' || c == '\n'){
+ pd->tmpdev.pos--;
+ pd->status = 8;
+ }
+ if (pd->status != 2) {
+ if (pd->outputstatus != 1) {
+ memory_device_ncat(&(pd->outdev), pd->lwspdev.buffer, pd->lwspdev.pos);
+ }
+ pd->lwspdev.pos = 0;
+ pd->outputstatus = 1;
+ memory_device_ncat(&(pd->outdev), pd->tmpdev.buffer, pd->tmpdev.pos);
+ pd->tmpdev.pos = 0;
+ }
+ }
+ break;
+ case 3: /* identify encoding */
+ memory_device_output(c, &(pd->tmpdev));
+ if(c == 'b' || c == 'B') {
+ pd->encoding = mbfl_no_encoding_base64;
+ pd->status = 4;
+ } else if(c == 'q' || c == 'Q') {
+ pd->encoding = mbfl_no_encoding_qprint;
+ pd->status = 4;
+ } else {
+ if (c == '\r' || c == '\n'){
+ pd->tmpdev.pos--;
+ pd->status = 8;
+ } else {
+ pd->status = 0;
+ }
+ if (pd->outputstatus != 1) {
+ memory_device_ncat(&(pd->outdev), pd->lwspdev.buffer, pd->lwspdev.pos);
+ }
+ pd->lwspdev.pos = 0;
+ pd->outputstatus = 1;
+ memory_device_ncat(&(pd->outdev), pd->tmpdev.buffer, pd->tmpdev.pos);
+ pd->tmpdev.pos = 0;
+ }
+ break;
+ case 4: /* reset filter */
+ memory_device_output(c, &(pd->tmpdev));
+ if(c == '?') {
+ /* charset convert filter */
+ mbfl_output_filter_reset(pd->conv_filter, pd->incode, pd->outcode);
+ /* decode filter */
+ mbfl_output_filter_reset(pd->deco_filter, pd->encoding, pd->incode);
+ pd->status = 5;
+ if (pd->outputstatus != 2) {
+ memory_device_ncat(&(pd->outdev), pd->lwspdev.buffer, pd->lwspdev.pos);
+ }
+ pd->lwspdev.pos = 0;
+ pd->outputstatus = 2;
+ } else {
+ if (c == '\r' || c == '\n'){
+ pd->tmpdev.pos--;
+ pd->status = 8;
+ } else {
+ pd->status = 0;
+ }
+ if (pd->outputstatus != 1) {
+ memory_device_ncat(&(pd->outdev), pd->lwspdev.buffer, pd->lwspdev.pos);
+ }
+ pd->lwspdev.pos = 0;
+ pd->outputstatus = 1;
+ memory_device_ncat(&(pd->outdev), pd->tmpdev.buffer, pd->tmpdev.pos);
+ }
+ pd->tmpdev.pos = 0;
+ break;
+ case 5: /* encoded block */
+ if(c == '?') {
+ pd->status = 6;
+ } else {
+ (*pd->deco_filter->vptr->filter_function)(pd->deco_filter, c);
+ }
+ break;
+ case 6: /* identify end position */
+ if (c == '=') {
+ (*pd->deco_filter->vptr->flush_function)(pd->deco_filter);
+ (*pd->conv_filter->vptr->flush_function)(pd->conv_filter);
+ pd->status = 7;
+ } else {
+ (*pd->deco_filter->vptr->filter_function)(pd->deco_filter, '?');
+ if (c != '?') {
+ (*pd->deco_filter->vptr->filter_function)(pd->deco_filter, c);
+ pd->status = 5;
+ }
+ }
+ break;
+ case 7: /* after encoded block */
+ memory_device_output(c, &(pd->tmpdev));
+ if (c == '=') {
+ pd->status = 1;
+ } else if (c == '\r' || c == '\n') {
+ pd->tmpdev.pos = 0;
+ pd->status = 8;
+ } else if (c != ' ' && c != '\t') {
+ memory_device_ncat(&(pd->outdev), pd->tmpdev.buffer, pd->tmpdev.pos);
+ pd->tmpdev.pos = 0;
+ pd->status = 0;
+ }
+ break;
+ case 8: /* folding */
+ if (c != '\r' && c != '\n' && c != ' ' && c != ' ') {
+ if (c == '=') {
+ memory_device_output(c, &(pd->tmpdev));
+ pd->status = 1;
+ } else {
+ memory_device_ncat(&(pd->outdev), pd->lwspdev.buffer, pd->lwspdev.pos);
+ pd->outputstatus = 1;
+ pd->lwspdev.pos = 0;
+ memory_device_output(c, &(pd->outdev));
+ pd->status = 0;
+ }
+ } else if (c == ' ' || c == '\t') {
+ memory_device_output(c, &(pd->lwspdev));
+ }
+ break;
+ default: /* non encoded block */
+ if (c == '=') {
+ memory_device_output(c, &(pd->tmpdev));
+ pd->status = 1;
+ } else if (c == '\r' || c == '\n') {
+ pd->status = 8;
+ pd->lwspdev.pos = 0;
+ } else {
+ memory_device_output(c, &(pd->outdev));
+ pd->outputstatus = 1;
+ }
+ break;
+ }
+
+ return c;
+}
+
+struct mime_header_decoder_data*
+mime_header_decoder_new(enum mbfl_no_encoding outcode)
+{
+ struct mime_header_decoder_data *pd = (struct mime_header_decoder_data*)malloc(sizeof(struct mime_header_decoder_data));
+ if (pd == NULL)
+ return NULL;
+
+ pd->outdev.buffer = (char*)0;
+ pd->outdev.length = 0;
+ pd->outdev.pos = 0;
+ pd->tmpdev.buffer = (char*)0;
+ pd->tmpdev.length = 0;
+ pd->tmpdev.pos = 0;
+ pd->lwspdev.buffer = (char*)0;
+ pd->lwspdev.length = 0;
+ pd->lwspdev.pos = 0;
+ pd->cspos = 0;
+ pd->status = 0;
+ pd->outputstatus = 0;
+ pd->encoding = mbfl_no_encoding_pass;
+ pd->incode = mbfl_no_encoding_pass;
+ pd->outcode = outcode;
+ /* charset convert filter */
+ pd->conv_filter = mbfl_output_filter_new(pd->incode, pd->outcode, memory_device_output, 0, &(pd->outdev));
+ /* decode filter */
+ pd->deco_filter = mbfl_output_filter_new(pd->encoding, pd->incode, filter_pipe_output, 0, pd->conv_filter);
+
+ if (pd->conv_filter == NULL ||
+ pd->deco_filter == NULL) {
+ mime_header_decoder_delete(pd);
+ return NULL;
+ }
+
+ return pd;
+}
+
+void
+mime_header_decoder_delete(struct mime_header_decoder_data *pd)
+{
+ if (pd->deco_filter)
+ mbfl_output_filter_delete(pd->deco_filter);
+ if (pd->conv_filter)
+ mbfl_output_filter_delete(pd->conv_filter);
+ if (pd->outdev.buffer)
+ free((void*)pd->outdev.buffer);
+ if (pd->tmpdev.buffer)
+ free((void*)pd->tmpdev.buffer);
+ if (pd->lwspdev.buffer)
+ free((void*)pd->lwspdev.buffer);
+ free((void*)pd);
+}
+
+int
+mime_header_decoder_feed(int c, struct mime_header_decoder_data *pd)
+{
+ return mime_header_decoder_collector(c, pd);
+}
+
+char*
+mime_header_decoder_result(struct mime_header_decoder_data *pd)
+{
+ char* s;
+
+ switch (pd->status) {
+ case 1:
+ case 2:
+ case 3:
+ case 4:
+ memory_device_ncat(&(pd->outdev), pd->tmpdev.buffer, pd->tmpdev.pos);
+ break;
+ case 5:
+ case 6:
+ (*pd->deco_filter->vptr->flush_function)(pd->deco_filter);
+ (*pd->conv_filter->vptr->flush_function)(pd->conv_filter);
+ break;
+ }
+ pd->status = 0;
+ pd->tmpdev.pos = 0;
+ pd->lwspdev.pos = 0;
+
+ memory_device_output('\0', &(pd->outdev));
+ s = pd->outdev.buffer;
+ pd->outdev.buffer = (char*)0;
+ pd->outdev.length = 0;
+ pd->outdev.pos = 0;
+
+ return s; /* free()は呼び出し側の責任 */
+}
+
+char*
+mbfl_mime_header_decode(
+ enum mbfl_no_encoding outcode,
+ const char *s)
+{
+ char *p;
+ struct mime_header_decoder_data *pd = mime_header_decoder_new(outcode);
+ if (pd == NULL)
+ return NULL;
+
+ /* 流す */
+ while (*s)
+ (void)mime_header_decoder_collector(*s++ & 0xff, pd);
+
+ p = mime_header_decoder_result(pd);
+ mime_header_decoder_delete(pd);
+
+ /* 終わり */
+ return p; /* free()は呼び出し側の責任 */
+}
+
+
+
+
+
+
+/*
+ * Unicode table
+ */
#endif /* PHP3_I18N */
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment