Annotation of embedaddon/libiconv/tools/8bit_tab_to_h.c, revision 1.1
1.1 ! misho 1: /* Copyright (C) 1999-2002 Free Software Foundation, Inc.
! 2: This file is part of the GNU LIBICONV Tools.
! 3:
! 4: This program is free software: you can redistribute it and/or modify
! 5: it under the terms of the GNU General Public License as published by
! 6: the Free Software Foundation; either version 3 of the License, or
! 7: (at your option) any later version.
! 8:
! 9: This program is distributed in the hope that it will be useful,
! 10: but WITHOUT ANY WARRANTY; without even the implied warranty of
! 11: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
! 12: GNU General Public License for more details.
! 13:
! 14: You should have received a copy of the GNU General Public License
! 15: along with this program; if not, write to the Free Software Foundation,
! 16: Inc., along with this program. If not, see <http://www.gnu.org/licenses/>. */
! 17:
! 18: /*
! 19: * Generates an 8-bit character set table from a .TXT table as found on
! 20: * ftp.unicode.org or from a table containing the 256 Unicode values as
! 21: * hexadecimal integers.
! 22: * Examples:
! 23: *
! 24: * ./8bit_tab_to_h ISO-8859-1 iso8859_1 < tab8859_1
! 25: * ./8bit_tab_to_h ISO-8859-2 iso8859_2 < tab8859_2
! 26: * ./8bit_tab_to_h ISO-8859-3 iso8859_3 < tab8859_3
! 27: * ./8bit_tab_to_h ISO-8859-4 iso8859_4 < tab8859_4
! 28: * ./8bit_tab_to_h ISO-8859-5 iso8859_5 < tab8859_5
! 29: * ./8bit_tab_to_h ISO-8859-6 iso8859_6 < tab8859_6
! 30: * ./8bit_tab_to_h ISO-8859-7 iso8859_7 < tab8859_7
! 31: * ./8bit_tab_to_h ISO-8859-8 iso8859_8 < tab8859_8
! 32: * ./8bit_tab_to_h ISO-8859-9 iso8859_9 < tab8859_9
! 33: * ./8bit_tab_to_h ISO-8859-10 iso8859_10 < tab8859_10
! 34: * ./8bit_tab_to_h ISO-8859-14 iso8859_14 < tab8859_14
! 35: * ./8bit_tab_to_h ISO-8859-15 iso8859_15 < tab8859_15
! 36: * ./8bit_tab_to_h JISX0201.1976-0 jisx0201 < jis0201
! 37: * ./8bit_tab_to_h TIS620.2533-1 tis620 < tabtis620
! 38: * ./8bit_tab_to_h KOI8-R koi8_r < tabkoi8_r
! 39: * ./8bit_tab_to_h KOI8-U koi8_u < tabkoi8_u
! 40: * ./8bit_tab_to_h ARMSCII-8 armscii_8 < tabarmscii_8
! 41: * ./8bit_tab_to_h CP1133 cp1133 < tabibm_cp1133
! 42: * ./8bit_tab_to_h MULELAO-1 mulelao < tabmulelao_1
! 43: * ./8bit_tab_to_h VISCII1.1-1 viscii1 < tabviscii
! 44: * ./8bit_tab_to_h TCVN-5712 tcvn < tabtcvn
! 45: * ./8bit_tab_to_h GEORGIAN-ACADEMY georgian_ac < tabgeorgian_academy
! 46: * ./8bit_tab_to_h GEORGIAN-PS georgian_ps < tabgeorgian_ps
! 47: *
! 48: * ./8bit_tab_to_h ISO-8859-1 iso8859_1 < 8859-1.TXT
! 49: * ./8bit_tab_to_h ISO-8859-2 iso8859_2 < 8859-2.TXT
! 50: * ./8bit_tab_to_h ISO-8859-3 iso8859_3 < 8859-3.TXT
! 51: * ./8bit_tab_to_h ISO-8859-4 iso8859_4 < 8859-4.TXT
! 52: * ./8bit_tab_to_h ISO-8859-5 iso8859_5 < 8859-5.TXT
! 53: * ./8bit_tab_to_h ISO-8859-6 iso8859_6 < 8859-6.TXT
! 54: * ./8bit_tab_to_h ISO-8859-7 iso8859_7 < 8859-7.TXT
! 55: * ./8bit_tab_to_h ISO-8859-8 iso8859_8 < 8859-8.TXT
! 56: * ./8bit_tab_to_h ISO-8859-9 iso8859_9 < 8859-9.TXT
! 57: * ./8bit_tab_to_h ISO-8859-10 iso8859_10 < 8859-10.TXT
! 58: * ./8bit_tab_to_h ISO-8859-14 iso8859_14 < 8859-14.TXT
! 59: * ./8bit_tab_to_h ISO-8859-15 iso8859_15 < 8859-15.TXT
! 60: * ./8bit_tab_to_h JISX0201.1976-0 jisx0201 < JIS0201.TXT
! 61: * ./8bit_tab_to_h KOI8-R koi8_r < KOI8-R.TXT
! 62: */
! 63:
! 64: #include <stdio.h>
! 65: #include <stdlib.h>
! 66: #include <stdbool.h>
! 67: #include <string.h>
! 68:
! 69: int main (int argc, char *argv[])
! 70: {
! 71: const char* charsetname;
! 72: const char* c_charsetname;
! 73: const char* filename;
! 74: const char* directory;
! 75: int charset2uni[0x100];
! 76:
! 77: if (argc != 3 && argc != 4 && argc != 5)
! 78: exit(1);
! 79: charsetname = argv[1];
! 80: c_charsetname = argv[2];
! 81: if (argc > 3) {
! 82: filename = argv[3];
! 83: } else {
! 84: char* s = (char*) malloc(strlen(c_charsetname)+strlen(".h")+1);
! 85: strcpy(s,c_charsetname); strcat(s,".h");
! 86: filename = s;
! 87: }
! 88: directory = (argc > 4 ? argv[4] : "");
! 89:
! 90: fprintf(stderr, "Creating %s%s\n", directory, filename);
! 91:
! 92: {
! 93: int i, c;
! 94: c = getc(stdin);
! 95: ungetc(c,stdin);
! 96: if (c == '#') {
! 97: /* Read a unicode.org style .TXT file. */
! 98: for (i = 0; i < 0x100; i++)
! 99: charset2uni[i] = 0xfffd;
! 100: for (;;) {
! 101: c = getc(stdin);
! 102: if (c == EOF)
! 103: break;
! 104: if (c == '\n' || c == ' ' || c == '\t')
! 105: continue;
! 106: if (c == '#') {
! 107: do { c = getc(stdin); } while (!(c == EOF || c == '\n'));
! 108: continue;
! 109: }
! 110: ungetc(c,stdin);
! 111: if (scanf("0x%x", &i) != 1 || !(i >= 0 && i < 0x100))
! 112: exit(1);
! 113: do { c = getc(stdin); } while (c == ' ' || c == '\t');
! 114: if (c != EOF)
! 115: ungetc(c,stdin);
! 116: if (c == '\n' || c == '#')
! 117: continue;
! 118: if (scanf("0x%x", &charset2uni[i]) != 1)
! 119: exit(1);
! 120: }
! 121: } else {
! 122: /* Read a table of hexadecimal Unicode values. */
! 123: for (i = 0; i < 0x100; i++) {
! 124: if (scanf("%x", &charset2uni[i]) != 1)
! 125: exit(1);
! 126: if (charset2uni[i] < 0 || charset2uni[i] == 0xffff)
! 127: charset2uni[i] = 0xfffd;
! 128: }
! 129: if (scanf("%x", &i) != EOF)
! 130: exit(1);
! 131: }
! 132: }
! 133:
! 134: /* Write the output file. */
! 135: {
! 136: FILE* f;
! 137:
! 138: {
! 139: char* fname = malloc(strlen(directory)+strlen(filename)+1);
! 140: strcpy(fname,directory); strcat(fname,filename);
! 141: f = fopen(fname,"w");
! 142: if (f == NULL)
! 143: exit(1);
! 144: }
! 145:
! 146: fprintf(f, "/*\n");
! 147: fprintf(f, " * Copyright (C) 1999-2002 Free Software Foundation, Inc.\n");
! 148: fprintf(f, " * This file is part of the GNU LIBICONV Library.\n");
! 149: fprintf(f, " *\n");
! 150: fprintf(f, " * The GNU LIBICONV Library is free software; you can redistribute it\n");
! 151: fprintf(f, " * and/or modify it under the terms of the GNU Library General Public\n");
! 152: fprintf(f, " * License as published by the Free Software Foundation; either version 2\n");
! 153: fprintf(f, " * of the License, or (at your option) any later version.\n");
! 154: fprintf(f, " *\n");
! 155: fprintf(f, " * The GNU LIBICONV Library is distributed in the hope that it will be\n");
! 156: fprintf(f, " * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of\n");
! 157: fprintf(f, " * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\n");
! 158: fprintf(f, " * Library General Public License for more details.\n");
! 159: fprintf(f, " *\n");
! 160: fprintf(f, " * You should have received a copy of the GNU Library General Public\n");
! 161: fprintf(f, " * License along with the GNU LIBICONV Library; see the file COPYING.LIB.\n");
! 162: fprintf(f, " * If not, write to the Free Software Foundation, Inc., 51 Franklin Street,\n");
! 163: fprintf(f, " * Fifth Floor, Boston, MA 02110-1301, USA.\n");
! 164: fprintf(f, " */\n");
! 165: fprintf(f, "\n");
! 166: fprintf(f, "/*\n");
! 167: fprintf(f, " * %s\n", charsetname);
! 168: fprintf(f, " */\n");
! 169: fprintf(f, "\n");
! 170:
! 171: {
! 172: int i, i1, i2, i3;
! 173: int line[16];
! 174: int tableno;
! 175: struct { int minline; int maxline; } tables[16];
! 176: bool some_invalid;
! 177: bool final_ret_reached;
! 178:
! 179: for (i1 = 0; i1 < 16; i1++) {
! 180: bool all_invalid = true;
! 181: bool all_identity = true;
! 182: for (i2 = 0; i2 < 16; i2++) {
! 183: i = 16*i1+i2;
! 184: if (charset2uni[i] != 0xfffd)
! 185: all_invalid = false;
! 186: if (charset2uni[i] != i)
! 187: all_identity = false;
! 188: }
! 189: if (all_invalid)
! 190: line[i1] = -2;
! 191: else if (all_identity)
! 192: line[i1] = -1;
! 193: else
! 194: line[i1] = 0;
! 195: }
! 196: tableno = 0;
! 197: for (i1 = 0; i1 < 16; i1++) {
! 198: if (line[i1] >= 0) {
! 199: if (i1 > 0 && tableno > 0 && line[i1-1] == tableno-1) {
! 200: line[i1] = tableno-1;
! 201: tables[tableno-1].maxline = i1;
! 202: } else {
! 203: tableno++;
! 204: line[i1] = tableno-1;
! 205: tables[tableno-1].minline = tables[tableno-1].maxline = i1;
! 206: }
! 207: }
! 208: }
! 209: some_invalid = false;
! 210: for (i = 0; i < 0x100; i++)
! 211: if (charset2uni[i] == 0xfffd)
! 212: some_invalid = true;
! 213: if (tableno > 0) {
! 214: int t;
! 215: for (t = 0; t < tableno; t++) {
! 216: fprintf(f, "static const unsigned short %s_2uni", c_charsetname);
! 217: if (tableno > 1)
! 218: fprintf(f, "_%d", t+1);
! 219: fprintf(f, "[%d] = {\n", 16*(tables[t].maxline-tables[t].minline+1));
! 220: for (i1 = tables[t].minline; i1 <= tables[t].maxline; i1++) {
! 221: fprintf(f, " /* 0x%02x */\n", 16*i1);
! 222: for (i2 = 0; i2 < 2; i2++) {
! 223: fprintf(f, " ");
! 224: for (i3 = 0; i3 < 8; i3++) {
! 225: i = 16*i1+8*i2+i3;
! 226: fprintf(f, " 0x%04x,", charset2uni[i]);
! 227: }
! 228: fprintf(f, "\n");
! 229: }
! 230: }
! 231: fprintf(f, "};\n");
! 232: }
! 233: fprintf(f, "\n");
! 234: }
! 235: final_ret_reached = false;
! 236: fprintf(f, "static int\n%s_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n)\n", c_charsetname);
! 237: fprintf(f, "{\n");
! 238: fprintf(f, " unsigned char c = *s;\n");
! 239: if (some_invalid) {
! 240: for (i1 = 0; i1 < 16;) {
! 241: int t = line[i1];
! 242: const char* indent;
! 243: for (i2 = i1; i2 < 16 && line[i2] == t; i2++);
! 244: indent = (i1 == 0 && i2 == 16 ? " " : " ");
! 245: if (i1 == 0) {
! 246: if (i2 == 16) {
! 247: } else {
! 248: fprintf(f, " if (c < 0x%02x) {\n", 16*i2);
! 249: }
! 250: } else {
! 251: if (i2 == 16) {
! 252: fprintf(f, " else {\n");
! 253: } else {
! 254: fprintf(f, " else if (c < 0x%02x) {\n", 16*i2);
! 255: }
! 256: }
! 257: if (t == -2) {
! 258: final_ret_reached = true;
! 259: } else if (t == -1) {
! 260: fprintf(f, "%s*pwc = (ucs4_t) c;\n", indent);
! 261: fprintf(f, "%sreturn 1;\n", indent);
! 262: } else {
! 263: fprintf(f, "%s", indent);
! 264: some_invalid = false;
! 265: for (i = 16*i1; i < 16*i2; i++)
! 266: if (charset2uni[i] == 0xfffd)
! 267: some_invalid = true;
! 268: if (some_invalid)
! 269: fprintf(f, "unsigned short wc = ");
! 270: else
! 271: fprintf(f, "*pwc = (ucs4_t) ");
! 272: fprintf(f, "%s_2uni", c_charsetname);
! 273: if (tableno > 1)
! 274: fprintf(f, "_%d", t+1);
! 275: fprintf(f, "[c");
! 276: if (tables[t].minline > 0)
! 277: fprintf(f, "-0x%02x", 16*tables[t].minline);
! 278: fprintf(f, "];\n");
! 279: if (some_invalid) {
! 280: fprintf(f, "%sif (wc != 0xfffd) {\n", indent);
! 281: fprintf(f, "%s *pwc = (ucs4_t) wc;\n", indent);
! 282: fprintf(f, "%s return 1;\n", indent);
! 283: fprintf(f, "%s}\n", indent);
! 284: final_ret_reached = true;
! 285: } else {
! 286: fprintf(f, "%sreturn 1;\n", indent);
! 287: }
! 288: }
! 289: if (!(i1 == 0 && i2 == 16))
! 290: fprintf(f, " }\n");
! 291: i1 = i2;
! 292: }
! 293: if (final_ret_reached)
! 294: fprintf(f, " return RET_ILSEQ;\n");
! 295: } else {
! 296: for (i1 = 0; i1 < 16;) {
! 297: int t = line[i1];
! 298: for (i2 = i1; i2 < 16 && line[i2] == t; i2++);
! 299: if (i1 == 0) {
! 300: if (i2 == 16) {
! 301: fprintf(f, " ");
! 302: } else {
! 303: fprintf(f, " if (c < 0x%02x)\n ", 16*i2);
! 304: }
! 305: } else {
! 306: if (i2 == 16) {
! 307: fprintf(f, " else\n ");
! 308: } else {
! 309: fprintf(f, " else if (c < 0x%02x)\n ", 16*i2);
! 310: }
! 311: }
! 312: if (t == -1)
! 313: fprintf(f, "*pwc = (ucs4_t) c;\n");
! 314: else {
! 315: fprintf(f, "*pwc = (ucs4_t) %s_2uni", c_charsetname);
! 316: if (tableno > 1)
! 317: fprintf(f, "_%d", t+1);
! 318: fprintf(f, "[c");
! 319: if (tables[t].minline > 0)
! 320: fprintf(f, "-0x%02x", 16*tables[t].minline);
! 321: fprintf(f, "];\n");
! 322: }
! 323: i1 = i2;
! 324: }
! 325: fprintf(f, " return 1;\n");
! 326: }
! 327: fprintf(f, "}\n");
! 328:
! 329: }
! 330:
! 331: fprintf(f, "\n");
! 332:
! 333: {
! 334: int uni2charset[0x10000];
! 335: bool pages[0x100];
! 336: int line[0x2000];
! 337: int tableno;
! 338: struct { int minline; int maxline; int usecount; const char* suffix; } tables[0x2000];
! 339: bool need_c;
! 340: bool fix_0000;
! 341: int i, j, p, j1, j2, t;
! 342:
! 343: for (j = 0; j < 0x10000; j++)
! 344: uni2charset[j] = 0;
! 345: for (p = 0; p < 0x100; p++)
! 346: pages[p] = false;
! 347: for (i = 0; i < 0x100; i++) {
! 348: j = charset2uni[i];
! 349: if (j != 0xfffd) {
! 350: uni2charset[j] = i;
! 351: pages[j>>8] = true;
! 352: }
! 353: }
! 354: for (j1 = 0; j1 < 0x2000; j1++) {
! 355: bool all_invalid = true;
! 356: bool all_identity = true;
! 357: for (j2 = 0; j2 < 8; j2++) {
! 358: j = 8*j1+j2;
! 359: if (uni2charset[j] != 0)
! 360: all_invalid = false;
! 361: if (uni2charset[j] != j)
! 362: all_identity = false;
! 363: }
! 364: if (all_invalid)
! 365: line[j1] = -2;
! 366: else if (all_identity)
! 367: line[j1] = -1;
! 368: else
! 369: line[j1] = 0;
! 370: }
! 371: tableno = 0;
! 372: for (j1 = 0; j1 < 0x2000; j1++) {
! 373: if (line[j1] >= 0) {
! 374: if (tableno > 0
! 375: && ((j1 > 0 && line[j1-1] == tableno-1)
! 376: || ((tables[tableno-1].maxline >> 5) == (j1 >> 5)
! 377: && j1 - tables[tableno-1].maxline <= 8))) {
! 378: line[j1] = tableno-1;
! 379: tables[tableno-1].maxline = j1;
! 380: } else {
! 381: tableno++;
! 382: line[j1] = tableno-1;
! 383: tables[tableno-1].minline = tables[tableno-1].maxline = j1;
! 384: }
! 385: }
! 386: }
! 387: for (t = 0; t < tableno; t++) {
! 388: tables[t].usecount = 0;
! 389: j1 = 8*tables[t].minline;
! 390: j2 = 8*(tables[t].maxline+1);
! 391: for (j = j1; j < j2; j++)
! 392: if (uni2charset[j] != 0)
! 393: tables[t].usecount++;
! 394: }
! 395: for (t = 0, p = -1, i = 0; t < tableno; t++) {
! 396: if (tables[t].usecount > 1) {
! 397: char* s;
! 398: if (p == tables[t].minline >> 5) {
! 399: s = (char*) malloc(5+1);
! 400: sprintf(s, "%02x_%d", p, ++i);
! 401: } else {
! 402: p = tables[t].minline >> 5;
! 403: s = (char*) malloc(2+1);
! 404: sprintf(s, "%02x", p);
! 405: }
! 406: tables[t].suffix = s;
! 407: } else
! 408: tables[t].suffix = NULL;
! 409: }
! 410: {
! 411: p = -1;
! 412: for (t = 0; t < tableno; t++)
! 413: if (tables[t].usecount > 1) {
! 414: p = 0;
! 415: fprintf(f, "static const unsigned char %s_page%s[%d] = {\n", c_charsetname, tables[t].suffix, 8*(tables[t].maxline-tables[t].minline+1));
! 416: for (j1 = tables[t].minline; j1 <= tables[t].maxline; j1++) {
! 417: if ((j1 % 0x20) == 0 && j1 > tables[t].minline)
! 418: fprintf(f, " /* 0x%04x */\n", 8*j1);
! 419: fprintf(f, " ");
! 420: for (j2 = 0; j2 < 8; j2++) {
! 421: j = 8*j1+j2;
! 422: fprintf(f, " 0x%02x,", uni2charset[j]);
! 423: }
! 424: fprintf(f, " /* 0x%02x-0x%02x */\n", 8*(j1 % 0x20), 8*(j1 % 0x20)+7);
! 425: }
! 426: fprintf(f, "};\n");
! 427: }
! 428: if (p >= 0)
! 429: fprintf(f, "\n");
! 430: }
! 431: need_c = false;
! 432: for (j1 = 0; j1 < 0x2000;) {
! 433: t = line[j1];
! 434: for (j2 = j1; j2 < 0x2000 && line[j2] == t; j2++);
! 435: if (t >= 0)
! 436: j2 = tables[t].maxline+1;
! 437: if (!(t == -2 || (t == -1 && j1 == 0)))
! 438: need_c = true;
! 439: j1 = j2;
! 440: }
! 441: fix_0000 = false;
! 442: fprintf(f, "static int\n%s_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n)\n", c_charsetname);
! 443: fprintf(f, "{\n");
! 444: if (need_c)
! 445: fprintf(f, " unsigned char c = 0;\n");
! 446: for (j1 = 0; j1 < 0x2000;) {
! 447: t = line[j1];
! 448: for (j2 = j1; j2 < 0x2000 && line[j2] == t; j2++);
! 449: if (t >= 0) {
! 450: if (j1 != tables[t].minline) abort();
! 451: if (j2 > tables[t].maxline+1) abort();
! 452: j2 = tables[t].maxline+1;
! 453: }
! 454: if (t == -2) {
! 455: } else {
! 456: if (j1 == 0)
! 457: fprintf(f, " ");
! 458: else
! 459: fprintf(f, " else ");
! 460: if (t >= 0 && tables[t].usecount == 0) abort();
! 461: if (t >= 0 && tables[t].usecount == 1) {
! 462: if (j2 != j1+1) abort();
! 463: for (j = 8*j1; j < 8*j2; j++)
! 464: if (uni2charset[j] != 0) {
! 465: fprintf(f, "if (wc == 0x%04x)\n c = 0x%02x;\n", j, uni2charset[j]);
! 466: break;
! 467: }
! 468: } else {
! 469: if (j1 == 0) {
! 470: fprintf(f, "if (wc < 0x%04x)", 8*j2);
! 471: } else {
! 472: fprintf(f, "if (wc >= 0x%04x && wc < 0x%04x)", 8*j1, 8*j2);
! 473: }
! 474: if (t == -1) {
! 475: if (j1 == 0)
! 476: /* If wc == 0, the function must return 1, not -1. */
! 477: fprintf(f, " {\n *r = wc;\n return 1;\n }\n");
! 478: else
! 479: fprintf(f, "\n c = wc;\n");
! 480: } else {
! 481: fprintf(f, "\n c = %s_page%s[wc", c_charsetname, tables[t].suffix);
! 482: if (tables[t].minline > 0)
! 483: fprintf(f, "-0x%04x", 8*j1);
! 484: fprintf(f, "];\n");
! 485: if (j1 == 0 && uni2charset[0] == 0)
! 486: /* If wc == 0, the function must return 1, not -1. */
! 487: fix_0000 = true;
! 488: }
! 489: }
! 490: }
! 491: j1 = j2;
! 492: }
! 493: if (need_c) {
! 494: if (fix_0000)
! 495: fprintf(f, " if (c != 0 || wc == 0) {\n");
! 496: else
! 497: fprintf(f, " if (c != 0) {\n");
! 498: fprintf(f, " *r = c;\n");
! 499: fprintf(f, " return 1;\n");
! 500: fprintf(f, " }\n");
! 501: }
! 502: fprintf(f, " return RET_ILUNI;\n");
! 503: fprintf(f, "}\n");
! 504:
! 505: }
! 506:
! 507: if (ferror(f) || fclose(f))
! 508: exit(1);
! 509: }
! 510:
! 511: #if 0
! 512:
! 513: int i1, i2, i3, i1_min, i1_max, j1, j2;
! 514:
! 515: i1_min = 16;
! 516: i1_max = -1;
! 517: for (i1 = 0; i1 < 16; i1++)
! 518: for (i2 = 0; i2 < 16; i2++)
! 519: if (charset2uni[16*i1+i2] != 0xfffd) {
! 520: if (i1_min > i1) i1_min = i1;
! 521: if (i1_max < i1) i1_max = i1;
! 522: }
! 523: printf("static const unsigned short %s_2uni[%d] = {\n",
! 524: name, 16*(i1_max-i1_min+1));
! 525: for (i1 = i1_min; i1 <= i1_max; i1++) {
! 526: printf(" /""* 0x%02x *""/\n", 16*i1);
! 527: for (i2 = 0; i2 < 2; i2++) {
! 528: printf(" ");
! 529: for (i3 = 0; i3 < 8; i3++) {
! 530: if (i3 > 0) printf(" ");
! 531: printf("0x%04x,", charset2uni[16*i1+8*i2+i3]);
! 532: }
! 533: printf("\n");
! 534: }
! 535: }
! 536: printf("};\n");
! 537: printf("\n");
! 538:
! 539: for (p = 0; p < 0x100; p++)
! 540: pages[p] = 0;
! 541: for (i = 0; i < 0x100; i++)
! 542: if (charset2uni[i] != 0xfffd)
! 543: pages[charset2uni[i]>>8] = 1;
! 544: for (p = 0; p < 0x100; p++)
! 545: if (pages[p]) {
! 546: int j1_min = 32;
! 547: int j1_max = -1;
! 548: for (j1 = 0; j1 < 32; j1++)
! 549: for (j2 = 0; j2 < 8; j2++)
! 550: if (uni2charset[256*p+8*j1+j2] != 0) {
! 551: if (j1_min > j1) j1_min = j1;
! 552: if (j1_max < j1) j1_max = j1;
! 553: }
! 554: printf("static const unsigned char %s_page%02x[%d] = {\n",
! 555: name, p, 8*(j1_max-j1_min+1));
! 556: for (j1 = j1_min; j1 <= j1_max; j1++) {
! 557: printf(" ");
! 558: for (j2 = 0; j2 < 8; j2++)
! 559: printf("0x%02x, ", uni2charset[256*p+8*j1+j2]);
! 560: printf("/""* 0x%02x-0x%02x *""/\n", 8*j1, 8*j1+7);
! 561: }
! 562: printf("};\n");
! 563: }
! 564: printf("\n");
! 565:
! 566: }
! 567: #endif
! 568:
! 569: exit(0);
! 570: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>