4 * Create arrays for initializing the kernel folded tables (using a hash
5 * table turned out to be to limiting...) Unfortunately we can't simply
6 * preinitialize the tables at compile time since kfree() cannot accept
7 * memory not allocated by kmalloc(), and doing our own memory management
8 * just for this seems like massive overkill.
10 * Copyright (C) 1995-1997 H. Peter Anvin
12 * This program is a part of the Linux kernel, and may be freely
13 * copied under the terms of the GNU General Public License (GPL),
14 * version 2, or at your option any later version.
23 #define MAX_FONTLEN 256
25 typedef unsigned short unicode
;
27 void usage(char *argv0
)
29 fprintf(stderr
, "Usage: \n"
30 " %s chartable [hashsize] [hashstep] [maxhashlevel]\n", argv0
);
34 int getunicode(char **p0
)
38 while (*p
== ' ' || *p
== '\t')
40 if (*p
!= 'U' || p
[1] != '+' ||
41 !isxdigit(p
[2]) || !isxdigit(p
[3]) || !isxdigit(p
[4]) ||
42 !isxdigit(p
[5]) || isxdigit(p
[6]))
45 return strtol(p
+2,0,16);
48 unicode unitable
[MAX_FONTLEN
][255];
49 /* Massive overkill, but who cares? */
50 int unicount
[MAX_FONTLEN
];
52 void addpair(int fp
, int un
)
58 /* Check it isn't a duplicate */
60 for ( i
= 0 ; i
< unicount
[fp
] ; i
++ )
61 if ( unitable
[fp
][i
] == un
)
66 if ( unicount
[fp
] > 254 )
68 fprintf(stderr
, "ERROR: Only 255 unicodes/glyph permitted!\n");
72 unitable
[fp
][unicount
[fp
]] = un
;
76 /* otherwise: ignore */
79 int main(int argc
, char *argv
[])
86 int fp0
, fp1
, un0
, un1
;
89 if ( argc
< 2 || argc
> 5 )
92 if ( !strcmp(argv
[1],"-") )
99 ctbl
= fopen(tblname
= argv
[1], "r");
107 /* For now we assume the default font is always 256 characters. */
110 /* Initialize table */
112 for ( i
= 0 ; i
< fontlen
; i
++ )
115 /* Now we come to the tricky part. Parse the input table. */
117 while ( fgets(buffer
, sizeof(buffer
), ctbl
) != NULL
)
119 if ( (p
= strchr(buffer
, '\n')) != NULL
)
122 fprintf(stderr
, "%s: Warning: line too long\n", tblname
);
128 * <fontpos> <unicode> <unicode> ...
130 * <range> <unicode range>
132 * where <range> ::= <fontpos>-<fontpos>
133 * and <unicode> ::= U+<h><h><h><h>
134 * and <h> ::= <hexadecimal digit>
137 while (*p
== ' ' || *p
== '\t')
139 if (!*p
|| *p
== '#')
140 continue; /* skip comment or blank line */
142 fp0
= strtol(p
, &p1
, 0);
145 fprintf(stderr
, "Bad input line: %s\n", buffer
);
150 while (*p
== ' ' || *p
== '\t')
155 fp1
= strtol(p
, &p1
, 0);
158 fprintf(stderr
, "Bad input line: %s\n", buffer
);
166 if ( fp0
< 0 || fp0
>= fontlen
)
169 "%s: Glyph number (0x%x) larger than font length\n",
173 if ( fp1
&& (fp1
< fp0
|| fp1
>= fontlen
) )
176 "%s: Bad end of range (0x%x)\n",
183 /* we have a range; expect the word "idem" or a Unicode range of the
185 while (*p
== ' ' || *p
== '\t')
187 if (!strncmp(p
, "idem", 4))
189 for (i
=fp0
; i
<=fp1
; i
++)
195 un0
= getunicode(&p
);
196 while (*p
== ' ' || *p
== '\t')
201 "%s: Corresponding to a range of font positions, there should be a Unicode range\n",
206 un1
= getunicode(&p
);
207 if (un0
< 0 || un1
< 0)
210 "%s: Bad Unicode range corresponding to font position range 0x%x-0x%x\n",
214 if (un1
- un0
!= fp1
- fp0
)
217 "%s: Unicode range U+%x-U+%x not of the same length as font position range 0x%x-0x%x\n",
218 tblname
, un0
, un1
, fp0
, fp1
);
221 for(i
=fp0
; i
<=fp1
; i
++)
222 addpair(i
,un0
-fp0
+i
);
227 /* no range; expect a list of unicode values for a single font position */
229 while ( (un0
= getunicode(&p
)) >= 0 )
232 while (*p
== ' ' || *p
== '\t')
235 fprintf(stderr
, "%s: trailing junk (%s) ignored\n", tblname
, p
);
238 /* Okay, we hit EOF, now output hash table */
243 /* Compute total size of Unicode list */
245 for ( i
= 0 ; i
< fontlen
; i
++ )
250 * Do not edit this file; it was automatically generated by\n\
252 * conmakehash %s > [this file]\n\
256 #include <linux/types.h>\n\
258 u8 dfont_unicount[%d] = \n\
259 {\n\t", argv
[1], fontlen
);
261 for ( i
= 0 ; i
< fontlen
; i
++ )
263 printf("%3d", unicount
[i
]);
264 if ( i
== fontlen
-1 )
266 else if ( i
% 8 == 7 )
272 printf("\nu16 dfont_unitable[%d] = \n{\n\t", nuni
);
276 for ( i
= 0 ; i
< nuni
; i
++ )
278 while ( nent
>= unicount
[fp0
] )
283 printf("0x%04x", unitable
[fp0
][nent
++]);
286 else if ( i
% 8 == 7 )