Orange Pi5 kernel

Deprecated Linux kernel 5.10.110 for OrangePi 5/5B/5+ boards

3 Commits   0 Branches   0 Tags
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   1) // SPDX-License-Identifier: GPL-2.0-or-later
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   2) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   3)  * conmakehash.c
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   4)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   5)  * Create arrays for initializing the kernel folded tables (using a hash
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   6)  * table turned out to be to limiting...)  Unfortunately we can't simply
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   7)  * preinitialize the tables at compile time since kfree() cannot accept
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   8)  * memory not allocated by kmalloc(), and doing our own memory management
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   9)  * just for this seems like massive overkill.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  10)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  11)  * Copyright (C) 1995-1997 H. Peter Anvin
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  12)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  13) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  14) #include <stdio.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  15) #include <stdlib.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  16) #include <sysexits.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  17) #include <string.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  18) #include <ctype.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  19) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  20) #define MAX_FONTLEN 256
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  21) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  22) typedef unsigned short unicode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  23) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  24) static void usage(char *argv0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  25) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  26)   fprintf(stderr, "Usage: \n"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  27)          "        %s chartable [hashsize] [hashstep] [maxhashlevel]\n", argv0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  28)   exit(EX_USAGE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  29) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  30) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  31) static int getunicode(char **p0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  32) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  33)   char *p = *p0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  34) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  35)   while (*p == ' ' || *p == '\t')
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  36)     p++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  37)   if (*p != 'U' || p[1] != '+' ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  38)       !isxdigit(p[2]) || !isxdigit(p[3]) || !isxdigit(p[4]) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  39)       !isxdigit(p[5]) || isxdigit(p[6]))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  40)     return -1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  41)   *p0 = p+6;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  42)   return strtol(p+2,0,16);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  43) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  44) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  45) unicode unitable[MAX_FONTLEN][255];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  46) 				/* Massive overkill, but who cares? */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  47) int unicount[MAX_FONTLEN];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  48) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  49) static void addpair(int fp, int un)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  50) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  51)   int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  52) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  53)   if ( un <= 0xfffe )
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  54)     {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  55)       /* Check it isn't a duplicate */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  56) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  57)       for ( i = 0 ; i < unicount[fp] ; i++ )
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  58) 	if ( unitable[fp][i] == un )
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  59) 	  return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  60) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  61)       /* Add to list */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  62) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  63)       if ( unicount[fp] > 254 )
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  64) 	{
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  65) 	  fprintf(stderr, "ERROR: Only 255 unicodes/glyph permitted!\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  66) 	  exit(EX_DATAERR);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  67) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  68) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  69)       unitable[fp][unicount[fp]] = un;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  70)       unicount[fp]++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  71)     }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  72) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  73)   /* otherwise: ignore */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  74) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  75) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  76) int main(int argc, char *argv[])
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  77) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  78)   FILE *ctbl;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  79)   char *tblname;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  80)   char buffer[65536];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  81)   int fontlen;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  82)   int i, nuni, nent;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  83)   int fp0, fp1, un0, un1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  84)   char *p, *p1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  85) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  86)   if ( argc < 2 || argc > 5 )
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  87)     usage(argv[0]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  88) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  89)   if ( !strcmp(argv[1],"-") )
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  90)     {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  91)       ctbl = stdin;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  92)       tblname = "stdin";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  93)     }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  94)   else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  95)     {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  96)       ctbl = fopen(tblname = argv[1], "r");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  97)       if ( !ctbl )
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  98) 	{
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  99) 	  perror(tblname);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) 	  exit(EX_NOINPUT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102)     }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104)   /* For now we assume the default font is always 256 characters. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105)   fontlen = 256;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107)   /* Initialize table */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109)   for ( i = 0 ; i < fontlen ; i++ )
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110)     unicount[i] = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112)   /* Now we come to the tricky part.  Parse the input table. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114)   while ( fgets(buffer, sizeof(buffer), ctbl) != NULL )
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115)     {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116)       if ( (p = strchr(buffer, '\n')) != NULL )
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) 	*p = '\0';
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118)       else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) 	fprintf(stderr, "%s: Warning: line too long\n", tblname);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121)       p = buffer;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124)  * Syntax accepted:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125)  *	<fontpos>	<unicode> <unicode> ...
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126)  *	<range>		idem
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127)  *	<range>		<unicode range>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129)  * where <range> ::= <fontpos>-<fontpos>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130)  * and <unicode> ::= U+<h><h><h><h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131)  * and <h> ::= <hexadecimal digit>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134)       while (*p == ' ' || *p == '\t')
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) 	p++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136)       if (!*p || *p == '#')
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) 	continue;	/* skip comment or blank line */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139)       fp0 = strtol(p, &p1, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140)       if (p1 == p)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) 	{
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142) 	  fprintf(stderr, "Bad input line: %s\n", buffer);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143) 	  exit(EX_DATAERR);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144)         }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145)       p = p1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147)       while (*p == ' ' || *p == '\t')
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148) 	p++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149)       if (*p == '-')
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150) 	{
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151) 	  p++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152) 	  fp1 = strtol(p, &p1, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153) 	  if (p1 == p)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154) 	    {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155) 	      fprintf(stderr, "Bad input line: %s\n", buffer);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156) 	      exit(EX_DATAERR);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157) 	    }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158) 	  p = p1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159)         }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160)       else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161) 	fp1 = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163)       if ( fp0 < 0 || fp0 >= fontlen )
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164) 	{
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165) 	    fprintf(stderr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166) 		    "%s: Glyph number (0x%x) larger than font length\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167) 		    tblname, fp0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168) 	    exit(EX_DATAERR);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170)       if ( fp1 && (fp1 < fp0 || fp1 >= fontlen) )
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171) 	{
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172) 	    fprintf(stderr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173) 		    "%s: Bad end of range (0x%x)\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174) 		    tblname, fp1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175) 	    exit(EX_DATAERR);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 176) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 177) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 178)       if (fp1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 179) 	{
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 180) 	  /* we have a range; expect the word "idem" or a Unicode range of the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 181) 	     same length */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 182) 	  while (*p == ' ' || *p == '\t')
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 183) 	    p++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 184) 	  if (!strncmp(p, "idem", 4))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 185) 	    {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 186) 	      for (i=fp0; i<=fp1; i++)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 187) 		addpair(i,i);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 188) 	      p += 4;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 189) 	    }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 190) 	  else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 191) 	    {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 192) 	      un0 = getunicode(&p);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 193) 	      while (*p == ' ' || *p == '\t')
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 194) 		p++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 195) 	      if (*p != '-')
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 196) 		{
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 197) 		  fprintf(stderr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 198) "%s: Corresponding to a range of font positions, there should be a Unicode range\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 199) 			  tblname);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 200) 		  exit(EX_DATAERR);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 201) 	        }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 202) 	      p++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 203) 	      un1 = getunicode(&p);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 204) 	      if (un0 < 0 || un1 < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 205) 		{
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 206) 		  fprintf(stderr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 207) "%s: Bad Unicode range corresponding to font position range 0x%x-0x%x\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 208) 			  tblname, fp0, fp1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 209) 		  exit(EX_DATAERR);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 210) 	        }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 211) 	      if (un1 - un0 != fp1 - fp0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 212) 		{
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 213) 		  fprintf(stderr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 214) "%s: Unicode range U+%x-U+%x not of the same length as font position range 0x%x-0x%x\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 215) 			  tblname, un0, un1, fp0, fp1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 216) 		  exit(EX_DATAERR);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 217) 	        }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 218) 	      for(i=fp0; i<=fp1; i++)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 219) 		addpair(i,un0-fp0+i);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 220) 	    }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 221)         }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 222)       else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 223) 	{
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 224) 	    /* no range; expect a list of unicode values for a single font position */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 225) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 226) 	    while ( (un0 = getunicode(&p)) >= 0 )
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 227) 	      addpair(fp0, un0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 228) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 229)       while (*p == ' ' || *p == '\t')
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 230) 	p++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 231)       if (*p && *p != '#')
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 232) 	fprintf(stderr, "%s: trailing junk (%s) ignored\n", tblname, p);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 233)     }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 234) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 235)   /* Okay, we hit EOF, now output hash table */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 236) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 237)   fclose(ctbl);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 238) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 239) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 240)   /* Compute total size of Unicode list */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 241)   nuni = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 242)   for ( i = 0 ; i < fontlen ; i++ )
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 243)     nuni += unicount[i];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 244) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 245)   printf("\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 246) /*\n\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 247)  * Do not edit this file; it was automatically generated by\n\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 248)  *\n\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 249)  * conmakehash %s > [this file]\n\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 250)  *\n\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 251)  */\n\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 252) \n\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 253) #include <linux/types.h>\n\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 254) \n\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 255) u8 dfont_unicount[%d] = \n\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 256) {\n\t", argv[1], fontlen);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 257) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 258)   for ( i = 0 ; i < fontlen ; i++ )
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 259)     {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 260)       printf("%3d", unicount[i]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 261)       if ( i == fontlen-1 )
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 262)         printf("\n};\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 263)       else if ( i % 8 == 7 )
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 264)         printf(",\n\t");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 265)       else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 266)         printf(", ");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 267)     }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 268) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 269)   printf("\nu16 dfont_unitable[%d] = \n{\n\t", nuni);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 270) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 271)   fp0 = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 272)   nent = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 273)   for ( i = 0 ; i < nuni ; i++ )
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 274)     {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 275)       while ( nent >= unicount[fp0] )
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 276) 	{
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 277) 	  fp0++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 278) 	  nent = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 279) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 280)       printf("0x%04x", unitable[fp0][nent++]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 281)       if ( i == nuni-1 )
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 282)          printf("\n};\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 283)        else if ( i % 8 == 7 )
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 284)          printf(",\n\t");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 285)        else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 286)          printf(", ");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 287)     }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 288) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 289)   exit(EX_OK);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 290) }