Annotation of embedaddon/libiconv/tools/8bit_tab_to_h.c, revision 1.1.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>