11da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* 21da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * conmakehash.c 31da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 41da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Create arrays for initializing the kernel folded tables (using a hash 51da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * table turned out to be to limiting...) Unfortunately we can't simply 61da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * preinitialize the tables at compile time since kfree() cannot accept 71da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * memory not allocated by kmalloc(), and doing our own memory management 81da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * just for this seems like massive overkill. 91da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Copyright (C) 1995-1997 H. Peter Anvin 111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * This program is a part of the Linux kernel, and may be freely 131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * copied under the terms of the GNU General Public License (GPL), 141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * version 2, or at your option any later version. 151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <stdio.h> 181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <stdlib.h> 191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <sysexits.h> 201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <string.h> 211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <ctype.h> 221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define MAX_FONTLEN 256 241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldstypedef unsigned short unicode; 261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 275c725138437837291db5c25f4a076ee852e806e3Trevor Keithstatic void usage(char *argv0) 281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds fprintf(stderr, "Usage: \n" 301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds " %s chartable [hashsize] [hashstep] [maxhashlevel]\n", argv0); 311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds exit(EX_USAGE); 321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 345c725138437837291db5c25f4a076ee852e806e3Trevor Keithstatic int getunicode(char **p0) 351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 3661d9cdf2a9ccb9e4770d7723db8b18b8952778ceJ.A. Magallon char *p = *p0; 371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds while (*p == ' ' || *p == '\t') 391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds p++; 401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (*p != 'U' || p[1] != '+' || 411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds !isxdigit(p[2]) || !isxdigit(p[3]) || !isxdigit(p[4]) || 421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds !isxdigit(p[5]) || isxdigit(p[6])) 431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return -1; 441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *p0 = p+6; 451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return strtol(p+2,0,16); 461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsunicode unitable[MAX_FONTLEN][255]; 491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* Massive overkill, but who cares? */ 501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsint unicount[MAX_FONTLEN]; 511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 525c725138437837291db5c25f4a076ee852e806e3Trevor Keithstatic void addpair(int fp, int un) 531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds int i; 551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if ( un <= 0xfffe ) 571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds { 581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* Check it isn't a duplicate */ 591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds for ( i = 0 ; i < unicount[fp] ; i++ ) 611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if ( unitable[fp][i] == un ) 621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return; 631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* Add to list */ 651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if ( unicount[fp] > 254 ) 671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds { 681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds fprintf(stderr, "ERROR: Only 255 unicodes/glyph permitted!\n"); 691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds exit(EX_DATAERR); 701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds unitable[fp][unicount[fp]] = un; 731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds unicount[fp]++; 741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* otherwise: ignore */ 771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsint main(int argc, char *argv[]) 801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds FILE *ctbl; 821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds char *tblname; 831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds char buffer[65536]; 841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds int fontlen; 851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds int i, nuni, nent; 861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds int fp0, fp1, un0, un1; 871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds char *p, *p1; 881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if ( argc < 2 || argc > 5 ) 901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds usage(argv[0]); 911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if ( !strcmp(argv[1],"-") ) 931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds { 941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ctbl = stdin; 951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds tblname = "stdin"; 961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds else 981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds { 991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ctbl = fopen(tblname = argv[1], "r"); 1001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if ( !ctbl ) 1011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds { 1021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds perror(tblname); 1031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds exit(EX_NOINPUT); 1041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 1051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 1061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 10738385f8f0180322513a6350234737fbc02172d06Masahiro Yamada /* For now we assume the default font is always 256 characters. */ 1081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds fontlen = 256; 1091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* Initialize table */ 1111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds for ( i = 0 ; i < fontlen ; i++ ) 1131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds unicount[i] = 0; 1141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* Now we come to the tricky part. Parse the input table. */ 1161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds while ( fgets(buffer, sizeof(buffer), ctbl) != NULL ) 1181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds { 1191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if ( (p = strchr(buffer, '\n')) != NULL ) 1201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *p = '\0'; 1211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds else 1221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds fprintf(stderr, "%s: Warning: line too long\n", tblname); 1231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds p = buffer; 1251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* 1271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Syntax accepted: 1281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * <fontpos> <unicode> <unicode> ... 1291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * <range> idem 1301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * <range> <unicode range> 1311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 1321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * where <range> ::= <fontpos>-<fontpos> 1331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * and <unicode> ::= U+<h><h><h><h> 1341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * and <h> ::= <hexadecimal digit> 1351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 1361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds while (*p == ' ' || *p == '\t') 1381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds p++; 1391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (!*p || *p == '#') 1401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds continue; /* skip comment or blank line */ 1411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds fp0 = strtol(p, &p1, 0); 1431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (p1 == p) 1441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds { 1451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds fprintf(stderr, "Bad input line: %s\n", buffer); 1461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds exit(EX_DATAERR); 1471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 1481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds p = p1; 1491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds while (*p == ' ' || *p == '\t') 1511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds p++; 1521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (*p == '-') 1531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds { 1541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds p++; 1551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds fp1 = strtol(p, &p1, 0); 1561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (p1 == p) 1571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds { 1581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds fprintf(stderr, "Bad input line: %s\n", buffer); 1591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds exit(EX_DATAERR); 1601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 1611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds p = p1; 1621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 1631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds else 1641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds fp1 = 0; 1651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if ( fp0 < 0 || fp0 >= fontlen ) 1671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds { 1681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds fprintf(stderr, 1691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds "%s: Glyph number (0x%x) larger than font length\n", 1701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds tblname, fp0); 1711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds exit(EX_DATAERR); 1721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 1731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if ( fp1 && (fp1 < fp0 || fp1 >= fontlen) ) 1741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds { 1751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds fprintf(stderr, 1761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds "%s: Bad end of range (0x%x)\n", 1771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds tblname, fp1); 1781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds exit(EX_DATAERR); 1791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 1801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (fp1) 1821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds { 1831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* we have a range; expect the word "idem" or a Unicode range of the 1841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds same length */ 1851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds while (*p == ' ' || *p == '\t') 1861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds p++; 1871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (!strncmp(p, "idem", 4)) 1881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds { 1891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds for (i=fp0; i<=fp1; i++) 1901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds addpair(i,i); 1911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds p += 4; 1921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 1931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds else 1941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds { 1951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds un0 = getunicode(&p); 1961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds while (*p == ' ' || *p == '\t') 1971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds p++; 1981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (*p != '-') 1991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds { 2001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds fprintf(stderr, 2011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds"%s: Corresponding to a range of font positions, there should be a Unicode range\n", 2021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds tblname); 2031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds exit(EX_DATAERR); 2041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 2051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds p++; 2061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds un1 = getunicode(&p); 2071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (un0 < 0 || un1 < 0) 2081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds { 2091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds fprintf(stderr, 2101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds"%s: Bad Unicode range corresponding to font position range 0x%x-0x%x\n", 2111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds tblname, fp0, fp1); 2121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds exit(EX_DATAERR); 2131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 2141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (un1 - un0 != fp1 - fp0) 2151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds { 2161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds fprintf(stderr, 2171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds"%s: Unicode range U+%x-U+%x not of the same length as font position range 0x%x-0x%x\n", 2181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds tblname, un0, un1, fp0, fp1); 2191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds exit(EX_DATAERR); 2201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 2211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds for(i=fp0; i<=fp1; i++) 2221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds addpair(i,un0-fp0+i); 2231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 2241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 2251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds else 2261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds { 2271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* no range; expect a list of unicode values for a single font position */ 2281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds while ( (un0 = getunicode(&p)) >= 0 ) 2301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds addpair(fp0, un0); 2311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 2321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds while (*p == ' ' || *p == '\t') 2331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds p++; 2341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (*p && *p != '#') 2351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds fprintf(stderr, "%s: trailing junk (%s) ignored\n", tblname, p); 2361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 2371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* Okay, we hit EOF, now output hash table */ 23938385f8f0180322513a6350234737fbc02172d06Masahiro Yamada 2401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds fclose(ctbl); 24138385f8f0180322513a6350234737fbc02172d06Masahiro Yamada 2421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* Compute total size of Unicode list */ 2441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds nuni = 0; 2451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds for ( i = 0 ; i < fontlen ; i++ ) 2461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds nuni += unicount[i]; 24738385f8f0180322513a6350234737fbc02172d06Masahiro Yamada 2481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds printf("\ 2491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*\n\ 2501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Do not edit this file; it was automatically generated by\n\ 2511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *\n\ 2521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * conmakehash %s > [this file]\n\ 2531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *\n\ 2541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */\n\ 2551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds\n\ 2561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/types.h>\n\ 2571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds\n\ 2581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsu8 dfont_unicount[%d] = \n\ 2591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{\n\t", argv[1], fontlen); 2601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds for ( i = 0 ; i < fontlen ; i++ ) 2621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds { 2631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds printf("%3d", unicount[i]); 2641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if ( i == fontlen-1 ) 2651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds printf("\n};\n"); 2661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds else if ( i % 8 == 7 ) 2671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds printf(",\n\t"); 2681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds else 2691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds printf(", "); 2701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 27138385f8f0180322513a6350234737fbc02172d06Masahiro Yamada 2721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds printf("\nu16 dfont_unitable[%d] = \n{\n\t", nuni); 27338385f8f0180322513a6350234737fbc02172d06Masahiro Yamada 2741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds fp0 = 0; 2751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds nent = 0; 2761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds for ( i = 0 ; i < nuni ; i++ ) 2771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds { 2781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds while ( nent >= unicount[fp0] ) 2791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds { 2801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds fp0++; 2811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds nent = 0; 2821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 2831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds printf("0x%04x", unitable[fp0][nent++]); 2841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if ( i == nuni-1 ) 2851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds printf("\n};\n"); 2861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds else if ( i % 8 == 7 ) 2871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds printf(",\n\t"); 2881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds else 2891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds printf(", "); 2901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 2911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds exit(EX_OK); 2931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 294