^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) }