| /* Copyright (C) 1999 Free Software Foundation |
| |
| This file is part of libgcj. |
| |
| This software is copyrighted work licensed under the terms of the |
| Libgcj License. Please consult the file "LIBGCJ_LICENSE" for |
| details. */ |
| |
| #include <stdio.h> |
| struct chval |
| { |
| unsigned char b1; /* 1st byte */ |
| unsigned char b2; /* 2nd byte */ |
| unsigned short uc; /* unicode value */ |
| }; |
| |
| #define MAP(B1, B2, C) { B1, B2, C }, |
| |
| struct chval chtab_0201[] = { |
| #include "JIS0201.h" |
| { 255, 255, 0} |
| }; |
| |
| struct chval chtab_0208[] = { |
| #include "JIS0208.h" |
| { 255, 255, 0} |
| }; |
| |
| struct chval chtab_0212[] = { |
| #include "JIS0212.h" |
| { 255, 255, 0} |
| }; |
| #undef MAP |
| |
| struct chval sorted[] = { |
| #define MAP(B1, B2, C) { B1, B2, C }, |
| #include "JIS0208.h" |
| #undef MAP |
| #define MAP(B1, B2, C) { 0x80|B1, B2, C }, |
| #include "JIS0212.h" |
| #undef MAP |
| }; |
| |
| struct chval *chtab; |
| |
| int |
| compare (void *p1, void *p2) |
| { |
| struct chval *c1 = (struct chval *) p1; |
| struct chval *c2 = (struct chval *) p2; |
| return (int) c1->uc - (int) c2->uc; |
| } |
| |
| int |
| main(int argc, char** argv) |
| { |
| FILE *out = stdout; |
| int min1 = 256, max1 = 0, min2 = 256, max2 = 0, count = 0; |
| int low1_uc = 0xFFFF, high1_uc = 0; |
| int low2_uc = 0xFFFF, high2_uc = 0; |
| int i; int row, col; |
| if (strcmp (argv[1], "JIS0208") == 0) |
| chtab = chtab_0208; |
| else if (strcmp (argv[1], "JIS0212") == 0) |
| chtab = chtab_0212; |
| else if (strcmp (argv[1], "toJIS") == 0) |
| { |
| int i; |
| for (i = 0; chtab_0201[i].b1 != 255; i++) |
| { |
| enter(chtab_0201[i].uc, chtab_0201[i].b2); |
| } |
| for (i = 0; i < 0x20; i++) |
| { |
| enter (i, i); |
| } |
| enter (127, 127); |
| for (i = 0; chtab_0208[i].b1 != 255; i++) |
| { |
| enter(chtab_0208[i].uc, |
| (chtab_0208[i].b1 << 8) | chtab_0208[i].b2); |
| } |
| for (i = 0; chtab_0212[i].b1 != 255; i++) |
| { |
| enter(chtab_0212[i].uc, |
| 0x8000 | (chtab_0212[i].b1 << 8) | chtab_0212[i].b2); |
| } |
| print_table ("Unicode_to_JIS", stdout); |
| exit(0); |
| } |
| else |
| { |
| fprintf (stderr, "bad argument!"); |
| exit (-1); |
| } |
| for (i = 0; chtab[i].b1 != 255; i++) |
| { |
| if (chtab[i].b1 < min1) min1 = chtab[i].b1; |
| if (chtab[i].b2 < min2) min2 = chtab[i].b2; |
| if (chtab[i].b1 > max1) max1 = chtab[i].b1; |
| if (chtab[i].b2 > max2) max2 = chtab[i].b2; |
| count++; |
| } |
| fprintf(stderr, "1st byte ranges from %d to %d.\n", min1, max1); |
| fprintf(stderr, "2nd byte ranges from %d to %d.\n", min2, max2); |
| |
| fprintf(out,"/* This file is automatically generated from %s.TXT. */\n", |
| argv[1]); |
| fprintf(out,"#pragma GCC java_exceptions\n", |
| argv[1]); |
| fprintf(out, "unsigned short %s_to_Unicode[%d][%d] = {\n", |
| argv[1], max1 - min1 + 1, max2 - min2 + 1); |
| i = 0; |
| for (row = min1; row <= max1; row++) |
| { |
| fprintf(out, "/* 1st byte: %d */ { ", row); |
| if (row < chtab[i].b1) |
| { |
| fprintf(out, "0 }, /* unused row */\n"); |
| } |
| else if (row > chtab[i].b1) |
| { |
| fprintf (stderr, "error - char table out of order!\n"); |
| exit (-1); |
| } |
| else |
| { |
| fprintf(out, "\n"); |
| for (col = min2; col <= max2; col++) |
| { |
| if (row == chtab[i].b1 && col == chtab[i].b2) |
| { |
| int uc = chtab[i].uc; |
| if (uc < 0x2000) |
| { |
| if (uc > high1_uc) |
| high1_uc = uc; |
| if (uc < low1_uc) |
| low1_uc = uc; |
| } |
| else |
| { |
| if (uc > high2_uc) |
| high2_uc = uc; |
| if (uc < low2_uc) |
| low2_uc = uc; |
| } |
| fprintf (out, " /* 2nd byte: %d */ 0x%04x", |
| chtab[i].b2, uc); |
| i++; |
| } |
| else if (row < chtab[i].b1 |
| || (row == chtab[i].b1 && col < chtab[i].b2)) |
| { |
| fprintf (out, " 0"); |
| } |
| else |
| { |
| fprintf (stderr, "error - char table our of order!\n"); |
| exit (-1); |
| } |
| if (col != max2) |
| fprintf (out, ",\n"); |
| } |
| fprintf(out, row == max1 ? "}\n" : "},\n"); |
| } |
| } |
| fprintf(out, "};\n"); |
| fprintf(stderr, "total number of characters is %d.\n", count); |
| fprintf(stderr, "Range is 0x%04x-0x%04x and 0x%04x-0x%04x.\n", |
| low1_uc, high1_uc, low2_uc, high2_uc); |
| return 0; |
| } |