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