summaryrefslogtreecommitdiff
path: root/Build/source/texk/web2c/luatexdir/luafontloader/fontforge/Unicode/dump.c
diff options
context:
space:
mode:
Diffstat (limited to 'Build/source/texk/web2c/luatexdir/luafontloader/fontforge/Unicode/dump.c')
-rw-r--r--Build/source/texk/web2c/luatexdir/luafontloader/fontforge/Unicode/dump.c994
1 files changed, 994 insertions, 0 deletions
diff --git a/Build/source/texk/web2c/luatexdir/luafontloader/fontforge/Unicode/dump.c b/Build/source/texk/web2c/luatexdir/luafontloader/fontforge/Unicode/dump.c
new file mode 100644
index 00000000000..5b0796e2d55
--- /dev/null
+++ b/Build/source/texk/web2c/luatexdir/luafontloader/fontforge/Unicode/dump.c
@@ -0,0 +1,994 @@
+/* Copyright (C) 2000-2008 by George Williams */
+/*
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+
+ * Redistributions of source code must retain the above copyright notice, this
+ * list of conditions and the following disclaimer.
+
+ * Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+
+ * The name of the author may not be used to endorse or promote products
+ * derived from this software without specific prior written permission.
+
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
+ * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+ * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <ctype.h>
+#include "../inc/charset.h"
+#include "../inc/basics.h"
+
+char *alphabets[] = { "8859-1.TXT", "8859-2.TXT", "8859-3.TXT", "8859-4.TXT",
+ "8859-5.TXT", "8859-6.TXT", "8859-7.TXT", "8859-8.TXT", "8859-9.TXT",
+ "8859-10.TXT", "8859-11.TXT", "8859-13.TXT", "8859-14.TXT", "8859-15.TXT",
+ "koi8r.TXT", "JIS0201.txt", "WIN.TXT", "MacRoman.TXT",
+ "MacSYMBOL.TXT", "zapfding.TXT", /*"MacCYRILLIC.TXT",*/ NULL };
+char *alnames[] = { "i8859_1", "i8859_2", "i8859_3", "i8859_4",
+ "i8859_5", "i8859_6", "i8859_7", "i8859_8", "i8859_9",
+ "i8859_10", "i8859_11", "i8859_13", "i8859_14", "i8859_15",
+ "koi8_r", "jis201", "win", "mac",
+ "MacSymbol", "ZapfDingbats", /*"MacCyrillic",*/ NULL };
+int almaps[] = { em_iso8859_1, em_iso8859_2, em_iso8859_3, em_iso8859_4,
+ em_iso8859_5, em_iso8859_6, em_iso8859_7, em_iso8859_8, em_iso8859_9,
+ em_iso8859_10, em_iso8859_11, em_iso8859_13, em_iso8859_14, em_iso8859_15,
+ em_koi8_r, em_jis201, em_win, em_mac, em_symbol, em_zapfding,
+ -1 };
+
+
+char *cjk[] = { "JIS0208.TXT", "JIS0212.TXT", "BIG5.TXT", "GB2312.TXT",
+ "HANGUL.TXT", "Big5HKSCS.txt", NULL };
+/* I'm only paying attention to Wansung encoding (in HANGUL.TXT) which is 94x94 */
+/* I used to look at OLD5601, but that maps to Unicode 1.0, and Hangul's moved*/
+char *adobecjk[] = { "aj16cid2code.txt", "aj20cid2code.txt", "ac15cid2code.txt",
+ "ag15cid2code.txt", "ak12cid2code.txt", NULL };
+/* I'm told that most of the mappings provided on the Unicode site go to */
+/* Unicode 1.* and that CJK have been moved radically since. So instead */
+/* of the unicode site's files, try using adobe's which claim they are */
+/* up to date. These may be found in: */
+/* ftp://ftp.ora.com/pub/examples/nutshell/ujip/adobe/samples/{aj14,aj20,ak12,ac13,ag14}/cid2code.txt */
+/* they may be bundled up in a tar file, I forget exactly... */
+char *cjknames[] = { "jis208", "jis212", "big5", "gb2312", "ksc5601", "big5hkscs", NULL };
+int cjkmaps[] = { em_jis208, em_jis212, em_big5, em_gb2312, em_ksc5601, em_big5hkscs };
+
+unsigned long *used[256];
+
+static void dumpalphas(FILE *output, FILE *header) {
+ FILE *file;
+ int i,j,k, first, last;
+ long _orig, _unicode, mask;
+ unichar_t unicode[256];
+ unsigned char *table[256], *plane;
+ char buffer[200];
+
+ fprintf(output, "#include <chardata.h>\n\n" );
+ fprintf(output, "const unsigned char c_allzeros[256] = { 0 };\n\n" );
+
+ for ( k=0; k<256; ++k ) table[k] = NULL;
+
+ for ( j=0; alphabets[j]!=NULL; ++j ) {
+ file = fopen( alphabets[j], "r" );
+ if ( file==NULL ) {
+ fprintf( stderr, "Can't open %s\n", alphabets[j]);
+ } else {
+ for ( i=0; i<160; ++i )
+ unicode[i] = i;
+ for ( ; i<256; ++i )
+ unicode[i] = 0;
+ while ( fgets(buffer,sizeof(buffer),file)!=NULL ) {
+ if ( buffer[0]=='#' )
+ continue;
+ sscanf(buffer, "0x%lx 0x%lx", (unsigned long *) &_orig, (unsigned long *) &_unicode);
+ unicode[_orig] = _unicode;
+ if ( table[_unicode>>8]==NULL ) {
+ plane = table[_unicode>>8] = calloc(256,1);
+ if ( j==0 && (_unicode>>8)==0 )
+ for ( k=0; k<256; ++k )
+ plane[k] = k;
+ else if ( j==0 )
+ for ( k=0; k<128; ++k )
+ plane[k] = k;
+ }
+ table[_unicode>>8][_unicode&0xff] = _orig;
+ if ( used[_unicode>>8]==NULL ) {
+ used[_unicode>>8] = calloc(256,sizeof(long));
+ }
+ if ( almaps[j]!=-1 )
+ used[_unicode>>8][_unicode&0xff] |= (1<<almaps[j]);
+ }
+ fclose(file);
+
+ fprintf( header, "extern const unichar_t unicode_from_%s[];\n", alnames[j] );
+ fprintf( output, "const unichar_t unicode_from_%s[] = {\n", alnames[j] );
+ for ( i=0; i<256-8; i+=8 )
+ fprintf( output, " 0x%04x, 0x%04x, 0x%04x, 0x%04x, 0x%04x, 0x%04x, 0x%04x, 0x%04x,\n",
+ unicode[i], unicode[i+1], unicode[i+2], unicode[i+3],
+ unicode[i+4], unicode[i+5], unicode[i+6], unicode[i+7]);
+ fprintf( output, " 0x%04x, 0x%04x, 0x%04x, 0x%04x, 0x%04x, 0x%04x, 0x%04x, 0x%04x\n};\n\n",
+ unicode[i], unicode[i+1], unicode[i+2], unicode[i+3],
+ unicode[i+4], unicode[i+5], unicode[i+6], unicode[i+7]);
+
+ first = last = -1;
+ for ( k=0; k<256; ++k ) {
+ if ( table[k]!=NULL ) {
+ if ( first==-1 ) first = k;
+ last = k;
+ plane = table[k];
+ fprintf( output, "static const unsigned char %s_from_unicode_%x[] = {\n", alnames[j], k );
+ for ( i=0; i<256-16; i+=16 )
+ fprintf( output, " 0x%02x, 0x%02x, 0x%02x, 0x%02x, 0x%02x, 0x%02x, 0x%02x, 0x%02x, 0x%02x, 0x%02x, 0x%02x, 0x%02x, 0x%02x, 0x%02x, 0x%02x, 0x%02x,\n",
+ plane[i], plane[i+1], plane[i+2], plane[i+3],
+ plane[i+4], plane[i+5], plane[i+6], plane[i+7],
+ plane[i+8], plane[i+9], plane[i+10], plane[i+11],
+ plane[i+12], plane[i+13], plane[i+14], plane[i+15]);
+ fprintf( output, " 0x%02x, 0x%02x, 0x%02x, 0x%02x, 0x%02x, 0x%02x, 0x%02x, 0x%02x, 0x%02x, 0x%02x, 0x%02x, 0x%02x, 0x%02x, 0x%02x, 0x%02x, 0x%02x\n};\n\n",
+ plane[i], plane[i+1], plane[i+2], plane[i+3],
+ plane[i+4], plane[i+5], plane[i+6], plane[i+7],
+ plane[i+8], plane[i+9], plane[i+10], plane[i+11],
+ plane[i+12], plane[i+13], plane[i+14], plane[i+15]);
+ }
+ }
+ fprintf( output, "static const unsigned char * const %s_from_unicode_[] = {\n", alnames[j] );
+ for ( k=first; k<=last; ++k )
+ if ( table[k]!=NULL )
+ fprintf( output, " %s_from_unicode_%x%s", alnames[j], k, k!=last?",\n":"\n" );
+ else
+ fprintf( output, " c_allzeros,\n" );
+ fprintf( output, "};\n\n" );
+ fprintf( header, "extern struct charmap %s_from_unicode;\n", alnames[j]);
+ fprintf( output, "struct charmap %s_from_unicode = { %d, %d, (unsigned char **) %s_from_unicode_, (unichar_t *) unicode_from_%s };\n\n",
+ alnames[j], first, last, alnames[j], alnames[j]);
+
+ for ( k=first; k<=last; ++k ) {
+ free(table[k]);
+ table[k]=NULL;
+ }
+ }
+ }
+
+/* Mac Symbol appears as a font even on unix. Cyrillic does not but so what?
+ for ( j=0; alphabets[j]!=NULL; ++j )
+ if ( strcmp(alphabets[j],"MacSYMBOL.TXT")==0 ) alphabets[j]=NULL;
+*/
+
+ fprintf( header, "\nextern unichar_t *unicode_from_alphabets[];\n" );
+#if 0
+ fprintf( output, "\n/* the windows charset is a superset of latin1. Many PC centric users think */\n" );
+ fprintf( output, "/* IT is the standard charset for the web and try to use &#153; for &#2122; */\n" );
+ fprintf( output, "/* so even if we expect latin1, let's check for windows too, can't hurt. */\n" );
+ fprintf( output, "unichar_t *unicode_from_alphabets[]={\n" );
+ fprintf( output, " unicode_from_win, 0,0, unicode_from_win, \n" );
+#else
+ fprintf( output, "unichar_t *unicode_from_alphabets[]={\n" );
+ fprintf( output, " (unichar_t *) unicode_from_win, 0,0,\n (unichar_t *) unicode_from_i8859_1, \n" );
+#endif
+ for ( j=1; alphabets[j]!=NULL; ++j )
+ fprintf( output, " (unichar_t *) unicode_from_%s,\n", alnames[j] );
+ fprintf( output, " (unichar_t *) unicode_from_%s,\t/* Place holder for user-defined map */\n", alnames[0] );
+ fprintf( output, " 0\n" );
+ fprintf( output, "};\n" );
+ fprintf( header, "extern struct charmap *alphabets_from_unicode[];\n" );
+ fprintf( output, "\nstruct charmap *alphabets_from_unicode[]={ 0,0,0,\n" );
+ for ( j=0; alphabets[j]!=NULL; ++j )
+ fprintf( output, " &%s_from_unicode,\n", alnames[j] );
+ fprintf( output, " &%s_from_unicode,\t/* Place holder for user-defined map*/\n", alnames[0] );
+ fprintf( output, " 0\n" );
+ fprintf( output, "};\n" );
+
+ fprintf( header, "\n" );
+
+ for ( i=0; i<=255; ++i )
+ used[0][i] |= 1; /* Map this plane entirely to 8859-1 */
+ mask = 0;
+ for ( j=0; alphabets[j]!=NULL; ++j )
+ if ( almaps[j]!=-1 )
+ mask |= (1<<almaps[j]);
+ for ( i=0; i<' '; ++i )
+ used[0][i] |= mask;
+}
+
+#if 0
+static char base64[64] = {
+ 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P',
+ 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f',
+ 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v',
+ 'w', 'x', 'y', 'z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '+', '/'};
+
+static unsigned char nigori[48] = {
+ 0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,
+ 1,1,1,1,1,0,0,0,0,0,1,1,1,1,1,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+};
+static unsigned char maru[48] = {
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,2,2,2,2,2,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+};
+
+static void dumprandom(FILE *output,FILE *header) {
+ int inbase64[128], i;
+
+ for ( i=0; i<128; ++i )
+ inbase64[i] = -1;
+ for ( i=0; i<64; ++i )
+ inbase64[base64[i]] = i;
+ fprintf( header, "extern signed char inbase64[128];\n" );
+ fprintf( output, "signed char inbase64[128] = {\n" );
+ for ( i=0; i<128; i+= 16 )
+ fprintf( output, " %2d, %2d, %2d, %2d, %2d, %2d, %2d, %2d, %2d, %2d, %2d, %2d, %2d, %2d, %2d, %2d%s\n",
+ inbase64[i], inbase64[i+1], inbase64[i+2], inbase64[i+3],
+ inbase64[i+4], inbase64[i+5], inbase64[i+6], inbase64[i+7],
+ inbase64[i+8], inbase64[i+9], inbase64[i+10], inbase64[i+11],
+ inbase64[i+12], inbase64[i+13], inbase64[i+14], inbase64[i+15],
+ i==128-16?"":",");
+ fprintf( output, "};\n" );
+
+ fprintf( header, "/* Need to subtract 0xb0 from jis206 before indexing this array */\n" );
+ fprintf( header, "extern char nigori[48];\n" );
+ fprintf( output, "char nigori[48] = {\n" );
+ for ( i=0; i<48; i+= 16 )
+ fprintf( output, " %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d%s\n",
+ nigori[i], nigori[i+1], nigori[i+2], nigori[i+3],
+ nigori[i+4], nigori[i+5], nigori[i+6], nigori[i+7],
+ nigori[i+8], nigori[i+9], nigori[i+10], nigori[i+11],
+ nigori[i+12], nigori[i+13], nigori[i+14], nigori[i+15],
+ i==48-16?"":",");
+ fprintf( output, "};\n" );
+
+ fprintf( header, "/* Need to subtract 0xb0 from jis206 before indexing this array */\n" );
+ fprintf( header, "extern char maru[48];\n" );
+ fprintf( output, "char maru[48] = {\n" );
+ for ( i=0; i<48; i+= 16 )
+ fprintf( output, " %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d%s\n",
+ maru[i], maru[i+1], maru[i+2], maru[i+3],
+ maru[i+4], maru[i+5], maru[i+6], maru[i+7],
+ maru[i+8], maru[i+9], maru[i+10], maru[i+11],
+ maru[i+12], maru[i+13], maru[i+14], maru[i+15],
+ i==48-16?"":",");
+ fprintf( output, "};\n" );
+
+ fprintf( header, "\n" );
+}
+#endif
+
+#define VERTMARK 0x1000000
+
+static int ucs2_score(int val) { /* Supplied by KANOU Hiroki */
+ if ( val>=0x2e80 && val<=0x2fff )
+return( 1 ); /* New CJK Radicals are least important */
+ else if ( val>=VERTMARK )
+return( 0 ); /* Then vertical guys */
+ /* only we can't handle vertical here */
+ else if ( val>=0xf000 && val<=0xffff )
+return( 3 );
+/* else if (( val>=0x3400 && val<0x3dff ) || (val>=0x4000 && val<=0x4dff))*/
+ else if ( val>=0x3400 && val<=0x4dff )
+return( 4 );
+ else
+return( 5 );
+}
+
+static int getnth(char *buffer, int col) {
+ int i, val=0, best;
+ char *end;
+ int vals[10];
+
+ if ( col==1 ) {
+ /* first column is decimal, others are hex */
+ if ( !isdigit(*buffer))
+return( -1 );
+ while ( isdigit(*buffer))
+ val = 10*val + *buffer++-'0';
+return( val );
+ }
+ for ( i=1; i<col; ++buffer ) {
+ if ( *buffer=='\t' )
+ ++i;
+ else if ( *buffer=='\0' )
+return( -1 );
+ }
+ val = strtol(buffer,&end,16);
+ if ( end==buffer )
+return( -1 );
+ if ( *end=='v' ) {
+ val += VERTMARK;
+ ++end;
+ }
+ if ( *end==',' ) {
+ /* Multiple guess... now we've got to pick one */
+ vals[0] = val;
+ i = 1;
+ while ( *end==',' && i<9 ) {
+ buffer = end+1;
+ vals[i] = strtol(buffer,&end,16);
+ if ( *end=='v' ) {
+ vals[i] += VERTMARK;
+ ++end;
+ }
+ ++i;
+ }
+ vals[i] = 0;
+ best = 0; val = -1;
+ for ( i=0; vals[i]!=0; ++i ) {
+ if ( ucs2_score(vals[i])>best ) {
+ val = vals[i];
+ best = ucs2_score(vals[i]);
+ }
+ }
+ }
+
+ if ( val >= VERTMARK )
+return( -1 );
+
+return( val );
+}
+
+static void dumpjis(FILE *output,FILE *header) {
+ FILE *file;
+ int i,j,k, first, last;
+ long _orig, _unicode;
+ unichar_t unicode208[94*94], unicode212[94*94];
+ unichar_t *table[256], *plane;
+ char buffer[400];
+
+ memset(table,0,sizeof(table));
+
+ j=0;
+ file = fopen( adobecjk[j], "r" );
+ if ( file==NULL ) {
+ fprintf( stderr, "Can't open %s\n", adobecjk[j]);
+ } else {
+ memset(unicode208,0,sizeof(unicode208));
+ while ( fgets(buffer,sizeof(buffer),file)!=NULL ) {
+ if ( buffer[0]=='#' )
+ continue;
+ _orig = getnth(buffer,2);
+ if ( _orig==-1 )
+ continue;
+ _unicode = getnth(buffer,22);
+ if ( _unicode==-1 ) {
+ fprintf( stderr, "Eh? JIS 208-1997 %lx is unencoded\n", _orig );
+ continue;
+ }
+ if ( _unicode>0xffff ) {
+ fprintf( stderr, "Eh? JIS 208-1997 %lx is outside of BMP\n", _orig );
+ continue;
+ }
+ if ( table[_unicode>>8]==NULL )
+ table[_unicode>>8] = calloc(256,sizeof(unichar_t));
+ table[_unicode>>8][_unicode&0xff] = _orig;
+ _orig -= 0x2121;
+ _orig = (_orig>>8)*94 + (_orig&0xff);
+ if ( _orig>=94*94 )
+ fprintf( stderr, "Attempt to index with %ld\n", _orig );
+ else {
+ unicode208[_orig] = _unicode;
+ if ( used[_unicode>>8]==NULL ) {
+ used[_unicode>>8] = calloc(256,sizeof(long));
+ }
+ used[_unicode>>8][_unicode&0xff] |= (1<<em_jis208);
+ }
+ }
+ fclose(file);
+ }
+
+ j=1;
+ file = fopen( adobecjk[j], "r" );
+ if ( file==NULL ) {
+ fprintf( stderr, "Can't open %s\n", adobecjk[j]);
+ } else {
+ memset(unicode212,0,sizeof(unicode212));
+ while ( fgets(buffer,sizeof(buffer),file)!=NULL ) {
+ if ( buffer[0]=='#' )
+ continue;
+ _orig = getnth(buffer,2);
+ if ( _orig==-1 )
+ continue;
+ _unicode = getnth(buffer,7);
+ if ( _unicode==-1 ) {
+ fprintf( stderr, "Eh? JIS 212-1990 %lx is unencoded\n", _orig );
+ continue;
+ }
+ if ( _unicode>0xffff ) {
+ fprintf( stderr, "Eh? JIS 212-1990 %lx is out of BMP U+%lx\n", _orig, _unicode );
+ continue;
+ }
+ if ( table[_unicode>>8]==NULL )
+ table[_unicode>>8] = calloc(256,sizeof(unichar_t));
+ if ( table[_unicode>>8][_unicode&0xff]==0 )
+ table[_unicode>>8][_unicode&0xff] = _orig|0x8000;
+ else
+ fprintf( stderr, "JIS clash at JIS212 %lx, unicode %lx\n", _orig, _unicode ); /* there are said to be a few of these, I'll just always map to 208 */
+ _orig -= 0x2121;
+ _orig = (_orig>>8)*94 + (_orig&0xff);
+ if ( _orig>=94*94 )
+ fprintf( stderr, "Attempt to index JIS212 with %ld\n", _orig );
+ else {
+ unicode212[_orig] = _unicode;
+ if ( used[_unicode>>8]==NULL ) {
+ used[_unicode>>8] = calloc(256,sizeof(long));
+ }
+ used[_unicode>>8][_unicode&0xff] |= (1<<em_jis212);
+ }
+ }
+ fclose(file);
+ }
+
+ j=0;
+ fprintf( header, "extern const unichar_t unicode_from_%s[];\n", cjknames[j] );
+ fprintf( output, "const unichar_t unicode_from_%s[] = {\n", cjknames[j] );
+ for ( i=0; i<sizeof(unicode208)/sizeof(unicode208[0]); i+=8 )
+ fprintf( output, " 0x%04x, 0x%04x, 0x%04x, 0x%04x, 0x%04x, 0x%04x, 0x%04x, 0x%04x,\n",
+ unicode208[i], unicode208[i+1], unicode208[i+2], unicode208[i+3],
+ unicode208[i+4], unicode208[i+5], unicode208[i+6], unicode208[i+7]);
+ fprintf( output, " 0x%04x, 0x%04x, 0x%04x, 0x%04x, 0x%04x, 0x%04x, 0x%04x, 0x%04x\n};\n\n",
+ unicode208[i], unicode208[i+1], unicode208[i+2], unicode208[i+3],
+ unicode208[i+4], unicode208[i+5], unicode208[i+6], unicode208[i+7]);
+ j=1;
+ fprintf( header, "extern const unichar_t unicode_from_%s[];\n", cjknames[j] );
+ fprintf( output, "const unichar_t unicode_from_%s[] = {\n", cjknames[j] );
+ for ( i=0; i<sizeof(unicode212)/sizeof(unicode212[0]); i+=8 )
+ fprintf( output, " 0x%04x, 0x%04x, 0x%04x, 0x%04x, 0x%04x, 0x%04x, 0x%04x, 0x%04x,\n",
+ unicode212[i], unicode212[i+1], unicode212[i+2], unicode212[i+3],
+ unicode212[i+4], unicode212[i+5], unicode212[i+6], unicode212[i+7]);
+ fprintf( output, " 0x%04x, 0x%04x, 0x%04x, 0x%04x, 0x%04x, 0x%04x, 0x%04x, 0x%04x\n};\n\n",
+ unicode212[i], unicode212[i+1], unicode212[i+2], unicode212[i+3],
+ unicode212[i+4], unicode212[i+5], unicode212[i+6], unicode212[i+7]);
+
+ first = last = -1;
+ for ( k=0; k<256; ++k ) {
+ if ( table[k]!=NULL ) {
+ if ( first==-1 ) first = k;
+ last = k;
+ plane = table[k];
+ fprintf( output, "static const unsigned short jis_from_unicode_%x[] = {\n", k );
+ for ( i=0; i<256-8; i+=8 )
+ fprintf( output, " 0x%04x, 0x%04x, 0x%04x, 0x%04x, 0x%04x, 0x%04x, 0x%04x, 0x%04x,\n",
+ plane[i], plane[i+1], plane[i+2], plane[i+3],
+ plane[i+4], plane[i+5], plane[i+6], plane[i+7]);
+ fprintf( output, " 0x%04x, 0x%04x, 0x%04x, 0x%04x, 0x%04x, 0x%04x, 0x%04x, 0x%04x\n};\n\n",
+ plane[i], plane[i+1], plane[i+2], plane[i+3],
+ plane[i+4], plane[i+5], plane[i+6], plane[i+7]);
+ }
+ }
+ fprintf( output, "static const unsigned short * const jis_from_unicode_[] = {\n" );
+ for ( k=first; k<=last; ++k )
+ if ( table[k]!=NULL )
+ fprintf( output, " jis_from_unicode_%x%s", k, k!=last?",\n":"\n" );
+ else
+ fprintf( output, " u_allzeros,\n" );
+ fprintf( output, "};\n\n" );
+ fprintf( header, "extern struct charmap2 jis_from_unicode;\n" );
+ fprintf( output, "struct charmap2 jis_from_unicode = { %d, %d, (unsigned short **) jis_from_unicode_, (unichar_t *) unicode_from_%s };\n\n",
+ first, last, cjknames[j]);
+
+ for ( k=first; k<=last; ++k )
+ free(table[k]);
+}
+
+static void dumpbig5(FILE *output,FILE *header) {
+ FILE *file;
+ int i,j,k, first, last;
+ long _orig, _unicode;
+ unichar_t unicode[0x6000];
+ unichar_t *table[256], *plane;
+ char buffer[400];
+
+ j = 2;
+
+ memset(table,0,sizeof(table));
+
+ file = fopen( adobecjk[j], "r" );
+ if ( file==NULL ) {
+ fprintf( stderr, "Can't open %s\n", adobecjk[j]);
+ } else {
+ memset(unicode,0,sizeof(unicode));
+ while ( fgets(buffer,sizeof(buffer),file)!=NULL ) {
+ if ( buffer[0]=='#' )
+ continue;
+ _orig = getnth(buffer,3);
+ if ( /*_orig==-1*/ _orig<0xa100 )
+ continue;
+ _unicode = getnth(buffer,11);
+ if ( _unicode==-1 ) {
+ if ( _orig==0xa1c3 )
+ _unicode = 0xFFE3;
+ else if ( _orig==0xa1c5 )
+ _unicode = 0x2cd;
+ else if ( _orig==0xa1fe )
+ _unicode = 0xff0f;
+ else if ( _orig==0xa240 )
+ _unicode = 0xff3c;
+ else if ( _orig==0xa2cc )
+ _unicode = 0x5341;
+ else if ( _orig==0xa2ce )
+ _unicode = 0x5345;
+ else if ( _orig==0xa15a )
+ _unicode = 0x2574;
+ }
+ if ( _unicode==-1 ) {
+ fprintf( stderr, "Eh? BIG5 %lx is unencoded\n", _orig );
+ continue;
+ }
+ if ( _unicode>0xffff ) {
+ fprintf( stderr, "Eh? BIG5 %lx is out of BMP U+%lx\n", _orig, _unicode );
+ continue;
+ }
+ unicode[_orig-0xa100] = _unicode;
+ if ( table[_unicode>>8]==NULL )
+ table[_unicode>>8] = calloc(256,sizeof(unichar_t));
+ table[_unicode>>8][_unicode&0xff] = _orig;
+ if ( used[_unicode>>8]==NULL ) {
+ used[_unicode>>8] = calloc(256,sizeof(long));
+ }
+ used[_unicode>>8][_unicode&0xff] |= (1<<em_big5);
+ }
+ fclose(file);
+
+ fprintf( header, "/* Subtract 0xa100 before indexing this array */\n" );
+ fprintf( header, "extern const unichar_t unicode_from_%s[];\n", cjknames[j] );
+ fprintf( output, "const unichar_t unicode_from_%s[] = {\n", cjknames[j] );
+ for ( i=0; i<sizeof(unicode)/sizeof(unicode[0]); i+=8 )
+ fprintf( output, " 0x%04x, 0x%04x, 0x%04x, 0x%04x, 0x%04x, 0x%04x, 0x%04x, 0x%04x,\n",
+ unicode[i], unicode[i+1], unicode[i+2], unicode[i+3],
+ unicode[i+4], unicode[i+5], unicode[i+6], unicode[i+7]);
+ fprintf( output, " 0x%04x, 0x%04x, 0x%04x, 0x%04x, 0x%04x, 0x%04x, 0x%04x, 0x%04x\n};\n\n",
+ unicode[i], unicode[i+1], unicode[i+2], unicode[i+3],
+ unicode[i+4], unicode[i+5], unicode[i+6], unicode[i+7]);
+
+ first = last = -1;
+ for ( k=0; k<256; ++k ) {
+ if ( table[k]!=NULL ) {
+ if ( first==-1 ) first = k;
+ last = k;
+ plane = table[k];
+ fprintf( output, "static const unsigned short %s_from_unicode_%x[] = {\n", cjknames[j], k );
+ for ( i=0; i<256-8; i+=8 )
+ fprintf( output, " 0x%04x, 0x%04x, 0x%04x, 0x%04x, 0x%04x, 0x%04x, 0x%04x, 0x%04x,\n",
+ plane[i], plane[i+1], plane[i+2], plane[i+3],
+ plane[i+4], plane[i+5], plane[i+6], plane[i+7]);
+ fprintf( output, " 0x%04x, 0x%04x, 0x%04x, 0x%04x, 0x%04x, 0x%04x, 0x%04x, 0x%04x\n};\n\n",
+ plane[i], plane[i+1], plane[i+2], plane[i+3],
+ plane[i+4], plane[i+5], plane[i+6], plane[i+7]);
+ }
+ }
+ fprintf( output, "static const unsigned short * const %s_from_unicode_[] = {\n", cjknames[j] );
+ for ( k=first; k<=last; ++k )
+ if ( table[k]!=NULL )
+ fprintf( output, " %s_from_unicode_%x%s", cjknames[j], k, k!=last?",\n":"\n" );
+ else
+ fprintf( output, " u_allzeros,\n" );
+ fprintf( output, "};\n\n" );
+ fprintf( header, "extern struct charmap2 %s_from_unicode;\n", cjknames[j]);
+ fprintf( output, "struct charmap2 %s_from_unicode = { %d, %d, (unsigned short **) %s_from_unicode_, (unichar_t *) unicode_from_%s };\n\n",
+ cjknames[j], first, last, cjknames[j], cjknames[j]);
+
+ for ( k=first; k<=last; ++k )
+ free(table[k]);
+ }
+}
+
+static void dumpbig5hkscs(FILE *output,FILE *header) {
+ FILE *file;
+ int i,j,k, first, last;
+ long _orig, _unicode;
+ unichar_t unicode[0x8000];
+ unichar_t *table[256], *plane;
+ char buffer[400];
+
+ j=5;
+
+ memset(table,0,sizeof(table));
+
+ file = fopen( cjk[j], "r" );
+ if ( file==NULL ) {
+ fprintf( stderr, "Can't open %s\n", cjk[j] );
+ } else {
+ memset(unicode,0,sizeof(unicode));
+ while ( fgets(buffer,sizeof(buffer),file)!=NULL ) {
+ if ( buffer[0]=='#' )
+ continue;
+ if ( sscanf( buffer, "U+%lx: %lx", (unsigned long *) &_unicode, (unsigned long *) &_orig )!=2 )
+ continue;
+ if ( _orig<0x8140 )
+ continue;
+ if ( _unicode==-1 ) {
+ fprintf( stderr, "Eh? BIG5HKSCS %lx is unencoded\n", _orig );
+ continue;
+ }
+ unicode[_orig-0x8100] = _unicode;
+ if ( table[_unicode>>8]==NULL )
+ table[_unicode>>8] = calloc(256,sizeof(unichar_t));
+ table[_unicode>>8][_unicode&0xff] = _orig;
+ if ( used[_unicode>>8]==NULL ) {
+ used[_unicode>>8] = calloc(256,sizeof(long));
+ }
+ used[_unicode>>8][_unicode&0xff] |= (1<<em_big5hkscs);
+ }
+ fclose(file);
+
+ fprintf( header, "/* Subtract 0x8100 before indexing this array */\n" );
+ fprintf( header, "extern const unichar_t unicode_from_%s[];\n", cjknames[j] );
+ fprintf( output, "const unichar_t unicode_from_%s[] = {\n", cjknames[j] );
+ for ( i=0; i<sizeof(unicode)/sizeof(unicode[0]); i+=8 )
+ fprintf( output, " 0x%04x, 0x%04x, 0x%04x, 0x%04x, 0x%04x, 0x%04x, 0x%04x, 0x%04x,\n",
+ unicode[i], unicode[i+1], unicode[i+2], unicode[i+3],
+ unicode[i+4], unicode[i+5], unicode[i+6], unicode[i+7]);
+ fprintf( output, " 0x%04x, 0x%04x, 0x%04x, 0x%04x, 0x%04x, 0x%04x, 0x%04x, 0x%04x\n};\n\n",
+ unicode[i], unicode[i+1], unicode[i+2], unicode[i+3],
+ unicode[i+4], unicode[i+5], unicode[i+6], unicode[i+7]);
+
+ first = last = -1;
+ for ( k=0; k<256; ++k ) {
+ if ( table[k]!=NULL ) {
+ if ( first==-1 ) first = k;
+ last = k;
+ plane = table[k];
+ fprintf( output, "static const unsigned short %s_from_unicode_%x[] = {\n", cjknames[j], k );
+ for ( i=0; i<256-8; i+=8 )
+ fprintf( output, " 0x%04x, 0x%04x, 0x%04x, 0x%04x, 0x%04x, 0x%04x, 0x%04x, 0x%04x,\n",
+ plane[i], plane[i+1], plane[i+2], plane[i+3],
+ plane[i+4], plane[i+5], plane[i+6], plane[i+7]);
+ fprintf( output, " 0x%04x, 0x%04x, 0x%04x, 0x%04x, 0x%04x, 0x%04x, 0x%04x, 0x%04x\n};\n\n",
+ plane[i], plane[i+1], plane[i+2], plane[i+3],
+ plane[i+4], plane[i+5], plane[i+6], plane[i+7]);
+ }
+ }
+ fprintf( output, "static const unsigned short * const %s_from_unicode_[] = {\n", cjknames[j] );
+ for ( k=first; k<=last; ++k )
+ if ( table[k]!=NULL )
+ fprintf( output, " %s_from_unicode_%x%s", cjknames[j], k, k!=last?",\n":"\n" );
+ else
+ fprintf( output, " u_allzeros,\n" );
+ fprintf( output, "};\n\n" );
+ fprintf( header, "extern struct charmap2 %s_from_unicode;\n", cjknames[j]);
+ fprintf( output, "struct charmap2 %s_from_unicode = { %d, %d, (unsigned short **) %s_from_unicode_, (unichar_t *) unicode_from_%s };\n\n",
+ cjknames[j], first, last, cjknames[j], cjknames[j]);
+
+ for ( k=first; k<=last; ++k )
+ free(table[k]);
+ }
+}
+
+static void dumpWansung(FILE *output,FILE *header) {
+ FILE *file;
+ int i,j=4,k, first, last;
+ long _orig, _unicode, _johab;
+ unichar_t unicode[94*94], junicode[0x7c00];
+ unichar_t *table[256], *plane, *jtable[256];
+ char buffer[400];
+ /* Johab high=[0x84-0xf9] low=[0x31-0xfe] */
+
+ memset(table,0,sizeof(table));
+ memset(jtable,0,sizeof(jtable));
+
+ file = fopen( adobecjk[j], "r" );
+ if ( file==NULL ) {
+ fprintf( stderr, "Can't open %s\n", adobecjk[j]);
+ } else {
+ memset(unicode,0,sizeof(unicode));
+ memset(junicode,0,sizeof(junicode));
+ while ( fgets(buffer,sizeof(buffer),file)!=NULL ) {
+ if ( buffer[0]=='#' )
+ continue;
+ _johab = getnth(buffer,7);
+ _orig = getnth(buffer,2);
+ _unicode = getnth(buffer,11);
+ if ( _unicode==-1 ) {
+ if ( _orig>=0x2121 && (_orig&0xff)>=0x21 && _orig<=0x7e7e && (_orig&0xff)<=0x7e )
+ fprintf( stderr, "Eh? Wansung %lx is unencoded\n", _orig );
+ else if ( _johab>=0x8431 && _johab<=0xf9fe )
+ fprintf( stderr, "Eh? Johab %lx is unencoded\n", _johab );
+ continue;
+ }
+ if ( _unicode>0xffff ) {
+ if ( _orig>=0x2121 && (_orig&0xff)>=0x21 && _orig<=0x7e7e && (_orig&0xff)<=0x7e )
+ fprintf( stderr, "Eh? Wansung %lx is out of BMP U+%lx\n", _orig, _unicode );
+ else if ( _johab>=0x8431 && _johab<=0xf9fe )
+ fprintf( stderr, "Eh? Johab %lx is out of BMP U+%lx\n", _johab, _unicode );
+ continue;
+ }
+ if ( _orig>=0x2121 && (_orig&0xff)>=0x21 && _orig<=0x7e7e && (_orig&0xff)<=0x7e ) {
+ if ( table[_unicode>>8]==NULL )
+ table[_unicode>>8] = calloc(256,sizeof(unichar_t));
+ table[_unicode>>8][_unicode&0xff] = _orig;
+ _orig -= 0x2121;
+ _orig = (_orig>>8)*94 + (_orig&0xff);
+ if ( _orig>=94*94 ) {
+ fprintf( stderr, "Not 94x94\n" );
+ continue;
+ }
+ unicode[_orig] = _unicode;
+ if ( used[_unicode>>8]==NULL ) {
+ used[_unicode>>8] = calloc(256,sizeof(long));
+ }
+ used[_unicode>>8][_unicode&0xff] |= (1<<cjkmaps[j]);
+ }
+ if ( _johab>=0x8431 && _johab<=0xf9fe ) {
+ if ( jtable[_unicode>>8]==NULL )
+ jtable[_unicode>>8] = calloc(256,sizeof(unichar_t));
+ jtable[_unicode>>8][_unicode&0xff] = _johab;
+ _johab -= 0x8400;
+ junicode[_johab] = _unicode;
+ if ( used[_unicode>>8]==NULL ) {
+ used[_unicode>>8] = calloc(256,sizeof(long));
+ }
+ used[_unicode>>8][_unicode&0xff] |= (1<<em_johab);
+ }
+ }
+ fclose(file);
+ }
+
+ /* First Wansung */
+ fprintf( header, "extern const unichar_t unicode_from_%s[];\n", cjknames[j] );
+ fprintf( output, "const unichar_t unicode_from_%s[] = {\n", cjknames[j] );
+ for ( i=0; i<sizeof(unicode)/sizeof(unicode[0]); i+=8 )
+ fprintf( output, " 0x%04x, 0x%04x, 0x%04x, 0x%04x, 0x%04x, 0x%04x, 0x%04x, 0x%04x,\n",
+ unicode[i], unicode[i+1], unicode[i+2], unicode[i+3],
+ unicode[i+4], unicode[i+5], unicode[i+6], unicode[i+7]);
+ fprintf( output, " 0x%04x, 0x%04x, 0x%04x, 0x%04x, 0x%04x, 0x%04x, 0x%04x, 0x%04x\n};\n\n",
+ unicode[i], unicode[i+1], unicode[i+2], unicode[i+3],
+ unicode[i+4], unicode[i+5], unicode[i+6], unicode[i+7]);
+
+ first = last = -1;
+ for ( k=0; k<256; ++k ) {
+ if ( table[k]!=NULL ) {
+ if ( first==-1 ) first = k;
+ last = k;
+ plane = table[k];
+ fprintf( output, "static unsigned short %s_from_unicode_%x[] = {\n", cjknames[j], k );
+ for ( i=0; i<256-8; i+=8 )
+ fprintf( output, " 0x%04x, 0x%04x, 0x%04x, 0x%04x, 0x%04x, 0x%04x, 0x%04x, 0x%04x,\n",
+ plane[i], plane[i+1], plane[i+2], plane[i+3],
+ plane[i+4], plane[i+5], plane[i+6], plane[i+7]);
+ fprintf( output, " 0x%04x, 0x%04x, 0x%04x, 0x%04x, 0x%04x, 0x%04x, 0x%04x, 0x%04x\n};\n\n",
+ plane[i], plane[i+1], plane[i+2], plane[i+3],
+ plane[i+4], plane[i+5], plane[i+6], plane[i+7]);
+ }
+ }
+ fprintf( output, "static const unsigned short * const %s_from_unicode_[] = {\n", cjknames[j] );
+ for ( k=first; k<=last; ++k )
+ if ( table[k]!=NULL )
+ fprintf( output, " %s_from_unicode_%x%s", cjknames[j], k, k!=last?",\n":"\n" );
+ else
+ fprintf( output, " u_allzeros,\n" );
+ fprintf( output, "};\n\n" );
+ fprintf( header, "extern struct charmap2 %s_from_unicode;\n", cjknames[j]);
+ fprintf( output, "struct charmap2 %s_from_unicode = { %d, %d, (unsigned short **) %s_from_unicode_, (unichar_t *) unicode_from_%s };\n\n",
+ cjknames[j], first, last, cjknames[j], cjknames[j]);
+
+ if ( first==-1 )
+ fprintf( stderr, "No Hangul\n" );
+ else for ( k=first; k<=last; ++k ) {
+ free(table[k]);
+ table[k]=NULL;
+ }
+
+ /* Then Johab */
+ fprintf( header, "/* Subtract 0x8400 before indexing this array */\n" );
+ fprintf( header, "extern const unichar_t unicode_from_johab[];\n" );
+ fprintf( output, "const unichar_t unicode_from_johab[] = {\n" );
+ for ( i=0; i<sizeof(junicode)/sizeof(junicode[0]); i+=8 )
+ fprintf( output, " 0x%04x, 0x%04x, 0x%04x, 0x%04x, 0x%04x, 0x%04x, 0x%04x, 0x%04x,\n",
+ junicode[i], junicode[i+1], junicode[i+2], junicode[i+3],
+ junicode[i+4], junicode[i+5], junicode[i+6], junicode[i+7]);
+ fprintf( output, " 0x%04x, 0x%04x, 0x%04x, 0x%04x, 0x%04x, 0x%04x, 0x%04x, 0x%04x\n};\n\n",
+ junicode[i], junicode[i+1], junicode[i+2], junicode[i+3],
+ junicode[i+4], junicode[i+5], junicode[i+6], junicode[i+7]);
+
+ first = last = -1;
+ for ( k=0; k<256; ++k ) {
+ if ( jtable[k]!=NULL ) {
+ if ( first==-1 ) first = k;
+ last = k;
+ plane = jtable[k];
+ fprintf( output, "static unsigned short johab_from_unicode_%x[] = {\n", k );
+ for ( i=0; i<256-8; i+=8 )
+ fprintf( output, " 0x%04x, 0x%04x, 0x%04x, 0x%04x, 0x%04x, 0x%04x, 0x%04x, 0x%04x,\n",
+ plane[i], plane[i+1], plane[i+2], plane[i+3],
+ plane[i+4], plane[i+5], plane[i+6], plane[i+7]);
+ fprintf( output, " 0x%04x, 0x%04x, 0x%04x, 0x%04x, 0x%04x, 0x%04x, 0x%04x, 0x%04x\n};\n\n",
+ plane[i], plane[i+1], plane[i+2], plane[i+3],
+ plane[i+4], plane[i+5], plane[i+6], plane[i+7]);
+ }
+ }
+ fprintf( output, "static const unsigned short * const johab_from_unicode_[] = {\n" );
+ for ( k=first; k<=last; ++k )
+ if ( jtable[k]!=NULL )
+ fprintf( output, " johab_from_unicode_%x%s", k, k!=last?",\n":"\n" );
+ else
+ fprintf( output, " u_allzeros,\n" );
+ fprintf( output, "};\n\n" );
+ fprintf( header, "extern struct charmap2 johab_from_unicode;\n" );
+ fprintf( output, "struct charmap2 johab_from_unicode = { %d, %d, (unsigned short **) johab_from_unicode_, (unichar_t *) unicode_from_johab };\n\n",
+ first, last );
+
+ if ( first==-1 )
+ fprintf( stderr, "No Johab\n" );
+ else for ( k=first; k<=last; ++k ) {
+ free(table[k]);
+ table[k]=NULL;
+ }
+}
+
+static void dumpgb2312(FILE *output,FILE *header) {
+ FILE *file;
+ int i,j,k, first, last;
+ long _orig, _unicode;
+ unichar_t unicode[94*94];
+ unichar_t *table[256], *plane;
+ char buffer[400];
+
+ memset(table,0,sizeof(table));
+
+ j = 3;
+ file = fopen( adobecjk[j], "r" );
+ if ( file==NULL ) {
+ fprintf( stderr, "Can't open %s\n", adobecjk[j]);
+ } else {
+ memset(unicode,0,sizeof(unicode));
+ while ( fgets(buffer,sizeof(buffer),file)!=NULL ) {
+ if ( buffer[0]=='#' )
+ continue;
+ _orig = getnth(buffer,2);
+ if ( _orig==-1 )
+ continue;
+ _unicode = getnth(buffer,14);
+ if ( _unicode==-1 ) {
+ fprintf( stderr, "Eh? GB2312-80 %lx is unencoded\n", _orig );
+ continue;
+ }
+ if ( _unicode>0xffff ) {
+ fprintf( stderr, "Eh? GB2312-80 %lx is out of BMP U+%lx\n", _orig, _unicode );
+ continue;
+ }
+ if ( table[_unicode>>8]==NULL )
+ table[_unicode>>8] = calloc(256,sizeof(unichar_t));
+ table[_unicode>>8][_unicode&0xff] = _orig;
+ _orig -= 0x2121;
+ _orig = (_orig>>8)*94 + (_orig&0xff);
+ unicode[_orig] = _unicode;
+ if ( used[_unicode>>8]==NULL ) {
+ used[_unicode>>8] = calloc(256,sizeof(long));
+ }
+ used[_unicode>>8][_unicode&0xff] |= (1<<cjkmaps[j]);
+ }
+ fclose(file);
+ }
+
+ fprintf( header, "extern const unichar_t unicode_from_%s[];\n", cjknames[j] );
+ fprintf( output, "const unichar_t unicode_from_%s[] = {\n", cjknames[j] );
+ for ( i=0; i<sizeof(unicode)/sizeof(unicode[0]); i+=8 )
+ fprintf( output, " 0x%04x, 0x%04x, 0x%04x, 0x%04x, 0x%04x, 0x%04x, 0x%04x, 0x%04x,\n",
+ unicode[i], unicode[i+1], unicode[i+2], unicode[i+3],
+ unicode[i+4], unicode[i+5], unicode[i+6], unicode[i+7]);
+ fprintf( output, " 0x%04x, 0x%04x, 0x%04x, 0x%04x, 0x%04x, 0x%04x, 0x%04x, 0x%04x\n};\n\n",
+ unicode[i], unicode[i+1], unicode[i+2], unicode[i+3],
+ unicode[i+4], unicode[i+5], unicode[i+6], unicode[i+7]);
+
+ first = last = -1;
+ for ( k=0; k<256; ++k ) {
+ if ( table[k]!=NULL ) {
+ if ( first==-1 ) first = k;
+ last = k;
+ plane = table[k];
+ fprintf( output, "static unsigned short %s_from_unicode_%x[] = {\n", cjknames[j], k );
+ for ( i=0; i<256-8; i+=8 )
+ fprintf( output, " 0x%04x, 0x%04x, 0x%04x, 0x%04x, 0x%04x, 0x%04x, 0x%04x, 0x%04x,\n",
+ plane[i], plane[i+1], plane[i+2], plane[i+3],
+ plane[i+4], plane[i+5], plane[i+6], plane[i+7]);
+ fprintf( output, " 0x%04x, 0x%04x, 0x%04x, 0x%04x, 0x%04x, 0x%04x, 0x%04x, 0x%04x\n};\n\n",
+ plane[i], plane[i+1], plane[i+2], plane[i+3],
+ plane[i+4], plane[i+5], plane[i+6], plane[i+7]);
+ }
+ }
+ fprintf( output, "static const unsigned short * const %s_from_unicode_[] = {\n", cjknames[j] );
+ for ( k=first; k<=last; ++k )
+ if ( table[k]!=NULL )
+ fprintf( output, " %s_from_unicode_%x%s", cjknames[j], k, k!=last?",\n":"\n" );
+ else
+ fprintf( output, " u_allzeros,\n" );
+ fprintf( output, "};\n\n" );
+ fprintf( header, "extern struct charmap2 %s_from_unicode;\n", cjknames[j]);
+ fprintf( output, "struct charmap2 %s_from_unicode = { %d, %d, (unsigned short **) %s_from_unicode_, (unichar_t *) unicode_from_%s };\n\n",
+ cjknames[j], first, last, cjknames[j], cjknames[j]);
+
+ if ( first==-1 )
+ fprintf( stderr, "No 94x94\n" );
+ else for ( k=first; k<=last; ++k ) {
+ free(table[k]);
+ table[k]=NULL;
+ }
+}
+
+static void dumpcjks(FILE *output,FILE *header) {
+
+ fprintf(output, "#include <chardata.h>\n\n" );
+ fprintf(output, "const unsigned short u_allzeros[256] = { 0 };\n\n" );
+
+ dumpjis(output,header);
+ dumpbig5(output,header);
+ dumpbig5hkscs(output,header);
+ dumpWansung(output,header);
+ dumpgb2312(output,header);
+}
+
+static void dumptrans(FILE *output, FILE *header) {
+ unsigned long *plane;
+ int k, i;
+
+ fprintf(output, "static const unsigned long l_allzeros[256] = { 0 };\n" );
+ for ( k=0; k<256; ++k ) {
+ if ( used[k]!=NULL ) {
+ plane = used[k];
+ fprintf( output, "static const unsigned long unicode_backtrans_%x[] = {\n", k );
+ for ( i=0; i<256-8; i+=8 )
+ fprintf( output, " 0x%06lx, 0x%06lx, 0x%06lx, 0x%06lx, 0x%06lx, 0x%06lx, 0x%06lx, 0x%06lx,\n",
+ plane[i], plane[i+1], plane[i+2], plane[i+3],
+ plane[i+4], plane[i+5], plane[i+6], plane[i+7]);
+ fprintf( output, " 0x%06lx, 0x%06lx, 0x%06lx, 0x%06lx, 0x%06lx, 0x%06lx, 0x%06lx, 0x%06lx\n};\n\n",
+ plane[i], plane[i+1], plane[i+2], plane[i+3],
+ plane[i+4], plane[i+5], plane[i+6], plane[i+7]);
+ }
+ }
+ fprintf( header, "\n/* a mask for each character saying what charset(s) it may be found in */\n" );
+ fprintf( header, "extern const unsigned long * const unicode_backtrans[];\n" );
+ fprintf( output, "const unsigned long *const unicode_backtrans[] = {\n" );
+ for ( k=0; k<256; ++k )
+ if ( used[k]!=NULL )
+ fprintf( output, " unicode_backtrans_%x%s", k, k!=255?",\n":"\n" );
+ else
+ fprintf( output, " l_allzeros,\n" );
+ fprintf( output, "};\n" );
+}
+
+int main(int argc, char **argv) {
+ FILE *output, *header;
+
+ if (( output = fopen( "alphabet.c", "w" ))==NULL ) {
+ fprintf( stderr, "Can't open %s\n", "alphabet.c" );
+return 1;
+ }
+ if (( header = fopen( "chardata.h", "w" ))==NULL ) {
+ fprintf( stderr, "Can't open %s\n", "chardata.h" );
+return 1;
+ }
+
+ fprintf( header, "#include \"basics.h\"\n\n" );
+ fprintf( header, "struct charmap {\n int first, last;\n unsigned char **table;\n unichar_t *totable;\n};\n" );
+ fprintf( header, "struct charmap2 {\n int first, last;\n unsigned short **table;\n unichar_t *totable;\n};\n\n" );
+
+ dumpalphas(output,header);
+ /*dumprandom(output,header);*/
+ fclose(output);
+
+ if (( output = fopen( "cjk.c", "w" ))==NULL ) {
+ fprintf( stderr, "Can't open %s\n", "cjk.c" );
+return 1;
+ }
+ dumpcjks(output,header);
+ if (( output = fopen( "backtrns.c", "w" ))==NULL ) {
+ fprintf( stderr, "Can't open %s\n", "cjk.c" );
+return 1;
+ }
+ dumptrans(output,header);
+
+ /* This really should be in make ctype, but putting it there causes all */
+ /* sorts of build problems in things happen out of order */
+ fprintf( header,"\nextern const unichar_t *const * const unicode_alternates[];\n" );
+
+ fclose(output); fclose(header);
+return 0;
+}