/* Copyright (C) 1999 Cygnus Solutions 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 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_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; unsigned min1 = 256, max1 = 0, min2 = 256, max2 = 0, count = 0; unsigned short low1_uc = 0xFFFF, high1_uc = 0; unsigned short 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; int count = sizeof(sorted)/sizeof(struct chval); qsort (sorted, count, sizeof(struct chval), compare); for (i = 0; i < count; i++) { fprintf (out, " 0x%04x -> 0x%02x, 0x%02x\n", sorted[i].uc, sorted[i].b1, sorted[i].b2); } 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, "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) { unsigned 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; }