📄 8bit_tab_to_h.c
字号:
} } if (!(i1 == 0 && i2 == 16)) fprintf(f, " }\n"); i1 = i2; } if (final_ret_reached) fprintf(f, " return RET_ILSEQ;\n"); } else { for (i1 = 0; i1 < 16;) { int t = line[i1]; for (i2 = i1; i2 < 16 && line[i2] == t; i2++); if (i1 == 0) { if (i2 == 16) { fprintf(f, " "); } else { fprintf(f, " if (c < 0x%02x)\n ", 16*i2); } } else { if (i2 == 16) { fprintf(f, " else\n "); } else { fprintf(f, " else if (c < 0x%02x)\n ", 16*i2); } } if (t == -1) fprintf(f, "*pwc = (ucs4_t) c;\n"); else { fprintf(f, "*pwc = (ucs4_t) %s_2uni", c_charsetname); if (tableno > 1) fprintf(f, "_%d", t+1); fprintf(f, "[c"); if (tables[t].minline > 0) fprintf(f, "-0x%02x", 16*tables[t].minline); fprintf(f, "];\n"); } i1 = i2; } fprintf(f, " return 1;\n"); } fprintf(f, "}\n"); } fprintf(f, "\n"); { int uni2charset[0x10000]; bool pages[0x100]; int line[0x2000]; int tableno; struct { int minline; int maxline; int usecount; const char* suffix; } tables[0x2000]; bool need_c; bool fix_0000; int i, j, p, j1, j2, t; for (j = 0; j < 0x10000; j++) uni2charset[j] = 0; for (p = 0; p < 0x100; p++) pages[p] = false; for (i = 0; i < 0x100; i++) { j = charset2uni[i]; if (j != 0xfffd) { uni2charset[j] = i; pages[j>>8] = true; } } for (j1 = 0; j1 < 0x2000; j1++) { bool all_invalid = true; bool all_identity = true; for (j2 = 0; j2 < 8; j2++) { j = 8*j1+j2; if (uni2charset[j] != 0) all_invalid = false; if (uni2charset[j] != j) all_identity = false; } if (all_invalid) line[j1] = -2; else if (all_identity) line[j1] = -1; else line[j1] = 0; } tableno = 0; for (j1 = 0; j1 < 0x2000; j1++) { if (line[j1] >= 0) { if (tableno > 0 && ((j1 > 0 && line[j1-1] == tableno-1) || ((tables[tableno-1].maxline >> 5) == (j1 >> 5) && j1 - tables[tableno-1].maxline <= 8))) { line[j1] = tableno-1; tables[tableno-1].maxline = j1; } else { tableno++; line[j1] = tableno-1; tables[tableno-1].minline = tables[tableno-1].maxline = j1; } } } for (t = 0; t < tableno; t++) { tables[t].usecount = 0; j1 = 8*tables[t].minline; j2 = 8*(tables[t].maxline+1); for (j = j1; j < j2; j++) if (uni2charset[j] != 0) tables[t].usecount++; } for (t = 0, p = -1, i = 0; t < tableno; t++) { if (tables[t].usecount > 1) { char* s; if (p == tables[t].minline >> 5) { s = (char*) malloc(5+1); sprintf(s, "%02x_%d", p, ++i); } else { p = tables[t].minline >> 5; s = (char*) malloc(2+1); sprintf(s, "%02x", p); } tables[t].suffix = s; } else tables[t].suffix = NULL; } { p = -1; for (t = 0; t < tableno; t++) if (tables[t].usecount > 1) { p = 0; fprintf(f, "static const unsigned char %s_page%s[%d] = {\n", c_charsetname, tables[t].suffix, 8*(tables[t].maxline-tables[t].minline+1)); for (j1 = tables[t].minline; j1 <= tables[t].maxline; j1++) { if ((j1 % 0x20) == 0 && j1 > tables[t].minline) fprintf(f, " /* 0x%04x */\n", 8*j1); fprintf(f, " "); for (j2 = 0; j2 < 8; j2++) { j = 8*j1+j2; fprintf(f, " 0x%02x,", uni2charset[j]); } fprintf(f, " /* 0x%02x-0x%02x */\n", 8*(j1 % 0x20), 8*(j1 % 0x20)+7); } fprintf(f, "};\n"); } if (p >= 0) fprintf(f, "\n"); } need_c = false; for (j1 = 0; j1 < 0x2000;) { t = line[j1]; for (j2 = j1; j2 < 0x2000 && line[j2] == t; j2++); if (t >= 0) j2 = tables[t].maxline+1; if (!(t == -2 || (t == -1 && j1 == 0))) need_c = true; j1 = j2; } fix_0000 = false; fprintf(f, "static int\n%s_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n)\n", c_charsetname); fprintf(f, "{\n"); if (need_c) fprintf(f, " unsigned char c = 0;\n"); for (j1 = 0; j1 < 0x2000;) { t = line[j1]; for (j2 = j1; j2 < 0x2000 && line[j2] == t; j2++); if (t >= 0) { if (j1 != tables[t].minline) abort(); if (j2 > tables[t].maxline+1) abort(); j2 = tables[t].maxline+1; } if (t == -2) { } else { if (j1 == 0) fprintf(f, " "); else fprintf(f, " else "); if (t >= 0 && tables[t].usecount == 0) abort(); if (t >= 0 && tables[t].usecount == 1) { if (j2 != j1+1) abort(); for (j = 8*j1; j < 8*j2; j++) if (uni2charset[j] != 0) { fprintf(f, "if (wc == 0x%04x)\n c = 0x%02x;\n", j, uni2charset[j]); break; } } else { if (j1 == 0) { fprintf(f, "if (wc < 0x%04x)", 8*j2); } else { fprintf(f, "if (wc >= 0x%04x && wc < 0x%04x)", 8*j1, 8*j2); } if (t == -1) { if (j1 == 0) /* If wc == 0, the function must return 1, not -1. */ fprintf(f, " {\n *r = wc;\n return 1;\n }\n"); else fprintf(f, "\n c = wc;\n"); } else { fprintf(f, "\n c = %s_page%s[wc", c_charsetname, tables[t].suffix); if (tables[t].minline > 0) fprintf(f, "-0x%04x", 8*j1); fprintf(f, "];\n"); if (j1 == 0 && uni2charset[0] == 0) /* If wc == 0, the function must return 1, not -1. */ fix_0000 = true; } } } j1 = j2; } if (need_c) { if (fix_0000) fprintf(f, " if (c != 0 || wc == 0) {\n"); else fprintf(f, " if (c != 0) {\n"); fprintf(f, " *r = c;\n"); fprintf(f, " return 1;\n"); fprintf(f, " }\n"); } fprintf(f, " return RET_ILUNI;\n"); fprintf(f, "}\n"); } if (ferror(f) || fclose(f)) exit(1); }#if 0 int i1, i2, i3, i1_min, i1_max, j1, j2; i1_min = 16; i1_max = -1; for (i1 = 0; i1 < 16; i1++) for (i2 = 0; i2 < 16; i2++) if (charset2uni[16*i1+i2] != 0xfffd) { if (i1_min > i1) i1_min = i1; if (i1_max < i1) i1_max = i1; } printf("static const unsigned short %s_2uni[%d] = {\n", name, 16*(i1_max-i1_min+1)); for (i1 = i1_min; i1 <= i1_max; i1++) { printf(" /""* 0x%02x *""/\n", 16*i1); for (i2 = 0; i2 < 2; i2++) { printf(" "); for (i3 = 0; i3 < 8; i3++) { if (i3 > 0) printf(" "); printf("0x%04x,", charset2uni[16*i1+8*i2+i3]); } printf("\n"); } } printf("};\n"); printf("\n"); for (p = 0; p < 0x100; p++) pages[p] = 0; for (i = 0; i < 0x100; i++) if (charset2uni[i] != 0xfffd) pages[charset2uni[i]>>8] = 1; for (p = 0; p < 0x100; p++) if (pages[p]) { int j1_min = 32; int j1_max = -1; for (j1 = 0; j1 < 32; j1++) for (j2 = 0; j2 < 8; j2++) if (uni2charset[256*p+8*j1+j2] != 0) { if (j1_min > j1) j1_min = j1; if (j1_max < j1) j1_max = j1; } printf("static const unsigned char %s_page%02x[%d] = {\n", name, p, 8*(j1_max-j1_min+1)); for (j1 = j1_min; j1 <= j1_max; j1++) { printf(" "); for (j2 = 0; j2 < 8; j2++) printf("0x%02x, ", uni2charset[256*p+8*j1+j2]); printf("/""* 0x%02x-0x%02x *""/\n", 8*j1, 8*j1+7); } printf("};\n"); } printf("\n");}#endif exit(0);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -