Mercurial > libunicode
annotate gen/src/mkunicode-c.c @ 10:ae1003c2a284
misc: extreme simplification
author | David Demelier <markand@malikania.fr> |
---|---|
date | Wed, 25 Mar 2020 09:56:05 +0100 |
parents | |
children | 153c09cc6dcb |
rev | line source |
---|---|
10
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
1 /* |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
2 * Tool to create our unicode.c |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
3 * |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
4 * Current version: 7.0.0 |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
5 * |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
6 * Based on mkrunetype from the Go language. |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
7 * |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
8 * Adapted to generated C++ code. |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
9 */ |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
10 |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
11 // Copyright 2009 The Go Authors. All rights reserved. |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
12 // Use of this source code is governed by a BSD-style |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
13 // license that can be found in the LICENSE file. |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
14 |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
15 /* |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
16 * make is(upper|lower|title|space|alpha)rune and |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
17 * to(upper|lower|title)rune from a UnicodeData.txt file. |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
18 * these can be found at unicode.org |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
19 * |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
20 * with -c, runs a check of the existing runetype functions vs. |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
21 * those extracted from UnicodeData. |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
22 * |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
23 * with -p, generates tables for pairs of chars, as well as for ranges |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
24 * and singletons. |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
25 * |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
26 * UnicodeData defines 4 fields of interest: |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
27 * 1) a category |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
28 * 2) an upper case mapping |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
29 * 3) a lower case mapping |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
30 * 4) a title case mapping |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
31 * |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
32 * toupper, tolower, and totitle are defined directly from the mapping. |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
33 * |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
34 * isalpharune(c) is true iff c is a "letter" category |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
35 * isupperrune(c) is true iff c is the target of toupperrune, |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
36 * or is in the uppercase letter category |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
37 * similarly for islowerrune and istitlerune. |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
38 * isspacerune is true for space category chars, "C" locale white space chars, |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
39 * and two additions: |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
40 * 0085 "next line" control char |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
41 * feff] "zero-width non-break space" |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
42 * isdigitrune is true iff c is a numeric-digit category. |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
43 */ |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
44 |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
45 #include <stdarg.h> |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
46 #include <stdio.h> |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
47 #include <stdlib.h> |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
48 #include <string.h> |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
49 |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
50 #include "utf.h" |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
51 #include "utfdef.h" |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
52 |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
53 #define nelem(x) (sizeof(x)/sizeof((x)[0])) |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
54 |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
55 enum { |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
56 /* |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
57 * fields in the unicode data file |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
58 */ |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
59 FIELD_CODE, |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
60 FIELD_NAME, |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
61 FIELD_CATEGORY, |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
62 FIELD_COMBINING, |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
63 FIELD_BIDIR, |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
64 FIELD_DECOMP, |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
65 FIELD_DECIMAL_DIG, |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
66 FIELD_DIG, |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
67 FIELD_NUMERIC_VAL, |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
68 FIELD_MIRRORED, |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
69 FIELD_UNICODE_1_NAME, |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
70 FIELD_COMMENT, |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
71 FIELD_UPPER, |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
72 FIELD_LOWER, |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
73 FIELD_TITLE, |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
74 NFIELDS, |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
75 |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
76 MAX_LINE = 1024, |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
77 |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
78 TO_OFFSET = 1 << 20, |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
79 |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
80 NRUNES = 1 << 21, |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
81 }; |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
82 |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
83 #define TO_DELTA(xmapped,x) (TO_OFFSET + (xmapped) - (x)) |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
84 |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
85 static FILE *out; |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
86 static char myisspace[NRUNES]; |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
87 static char myisalpha[NRUNES]; |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
88 static char myisdigit[NRUNES]; |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
89 static char myisupper[NRUNES]; |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
90 static char myislower[NRUNES]; |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
91 static char myistitle[NRUNES]; |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
92 |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
93 static int mytoupper[NRUNES]; |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
94 static int mytolower[NRUNES]; |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
95 static int mytotitle[NRUNES]; |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
96 |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
97 static void check(void); |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
98 static void mktables(char *src, int usepairs); |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
99 static void fatal(const char *fmt, ...); |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
100 static int mygetfields(char **fields, int nfields, char *str, const char *delim); |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
101 static int getunicodeline(FILE *in, char **fields, char *buf); |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
102 static int getcode(char *s); |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
103 |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
104 static void |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
105 usage(void) |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
106 { |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
107 fprintf(stderr, "usage: mktables [-cp] output UnicodeData.txt\n"); |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
108 exit(1); |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
109 } |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
110 |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
111 int |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
112 main(int argc, char *argv[]) |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
113 { |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
114 FILE *in; |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
115 char buf[MAX_LINE], buf2[MAX_LINE]; |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
116 char *fields[NFIELDS + 1], *fields2[NFIELDS + 1]; |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
117 char *p; |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
118 int i, code, last, usepairs; |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
119 |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
120 usepairs = 0; |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
121 |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
122 --argc; |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
123 ++argv; |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
124 |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
125 if (argc != 2){ |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
126 usage(); |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
127 } |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
128 |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
129 out = fopen(argv[0], "a"); |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
130 if (out == NULL) { |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
131 fatal("can't open %s", argv[0]); |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
132 } |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
133 |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
134 in = fopen(argv[1], "r"); |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
135 |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
136 if (in == NULL) { |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
137 fatal("can't open %s", argv[1]); |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
138 } |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
139 |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
140 for(i = 0; i < NRUNES; i++){ |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
141 mytoupper[i] = i; |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
142 mytolower[i] = i; |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
143 mytotitle[i] = i; |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
144 } |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
145 |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
146 /* |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
147 * make sure isspace has all of the "C" locale whitespace chars |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
148 */ |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
149 myisspace['\t'] = 1; |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
150 myisspace['\n'] = 1; |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
151 myisspace['\r'] = 1; |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
152 myisspace['\f'] = 1; |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
153 myisspace['\v'] = 1; |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
154 |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
155 /* |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
156 * a couple of other exceptions |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
157 */ |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
158 myisspace[0x85] = 1; /* control char, "next line" */ |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
159 myisspace[0xfeff] = 1; /* zero-width non-break space */ |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
160 |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
161 last = -1; |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
162 while(getunicodeline(in, fields, buf)){ |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
163 code = getcode(fields[FIELD_CODE]); |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
164 if (code >= NRUNES) |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
165 fatal("code-point value too big: %x", code); |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
166 if(code <= last) |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
167 fatal("bad code sequence: %x then %x", last, code); |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
168 last = code; |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
169 |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
170 /* |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
171 * check for ranges |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
172 */ |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
173 p = fields[FIELD_CATEGORY]; |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
174 if(strstr(fields[FIELD_NAME], ", First>") != NULL){ |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
175 if(!getunicodeline(in, fields2, buf2)) |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
176 fatal("range start at eof"); |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
177 if (strstr(fields2[FIELD_NAME], ", Last>") == NULL) |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
178 fatal("range start not followed by range end"); |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
179 last = getcode(fields2[FIELD_CODE]); |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
180 if(last <= code) |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
181 fatal("range out of sequence: %x then %x", code, last); |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
182 if(strcmp(p, fields2[FIELD_CATEGORY]) != 0) |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
183 fatal("range with mismatched category"); |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
184 } |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
185 |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
186 /* |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
187 * set properties and conversions |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
188 */ |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
189 for (; code <= last; code++){ |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
190 if(p[0] == 'L') |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
191 myisalpha[code] = 1; |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
192 if(p[0] == 'Z') |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
193 myisspace[code] = 1; |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
194 |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
195 if(strcmp(p, "Lu") == 0) |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
196 myisupper[code] = 1; |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
197 if(strcmp(p, "Ll") == 0) |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
198 myislower[code] = 1; |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
199 |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
200 if(strcmp(p, "Lt") == 0) |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
201 myistitle[code] = 1; |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
202 |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
203 if(strcmp(p, "Nd") == 0) |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
204 myisdigit[code] = 1; |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
205 |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
206 /* |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
207 * when finding conversions, also need to mark |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
208 * upper/lower case, since some chars, like |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
209 * "III" (0x2162), aren't defined as letters but have a |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
210 * lower case mapping ("iii" (0x2172)). |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
211 */ |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
212 if(fields[FIELD_UPPER][0] != '\0'){ |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
213 mytoupper[code] = getcode(fields[FIELD_UPPER]); |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
214 } |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
215 if(fields[FIELD_LOWER][0] != '\0'){ |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
216 mytolower[code] = getcode(fields[FIELD_LOWER]); |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
217 } |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
218 if(fields[FIELD_TITLE][0] != '\0'){ |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
219 mytotitle[code] = getcode(fields[FIELD_TITLE]); |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
220 } |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
221 } |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
222 } |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
223 |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
224 fclose(in); |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
225 |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
226 /* |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
227 * check for codes with no totitle mapping but a toupper mapping. |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
228 * these appear in UnicodeData-2.0.14.txt, but are almost certainly |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
229 * erroneous. |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
230 */ |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
231 for(i = 0; i < NRUNES; i++){ |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
232 if(mytotitle[i] == i |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
233 && mytoupper[i] != i |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
234 && !myistitle[i]) |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
235 fprintf(stderr, "warning: code=%.4x not istitle, totitle is same, toupper=%.4x\n", i, mytoupper[i]); |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
236 } |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
237 |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
238 /* |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
239 * make sure isupper[c] is true if for some x toupper[x] == c |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
240 * ditto for islower and istitle |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
241 */ |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
242 for(i = 0; i < NRUNES; i++) { |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
243 if(mytoupper[i] != i) |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
244 myisupper[mytoupper[i]] = 1; |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
245 if(mytolower[i] != i) |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
246 myislower[mytolower[i]] = 1; |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
247 if(mytotitle[i] != i) |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
248 myistitle[mytotitle[i]] = 1; |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
249 } |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
250 |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
251 mktables(argv[0], usepairs); |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
252 exit(0); |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
253 } |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
254 |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
255 /* |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
256 * generate a properties array for ranges, clearing those cases covered. |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
257 * if force, generate one-entry ranges for singletons. |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
258 */ |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
259 static int |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
260 mkisrange(const char* label, char* prop, int force) |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
261 { |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
262 int start, stop, some; |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
263 |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
264 /* |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
265 * first, the ranges |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
266 */ |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
267 some = 0; |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
268 for(start = 0; start < NRUNES; ) { |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
269 if(!prop[start]){ |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
270 start++; |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
271 continue; |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
272 } |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
273 |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
274 for(stop = start + 1; stop < NRUNES; stop++){ |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
275 if(!prop[stop]){ |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
276 break; |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
277 } |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
278 prop[stop] = 0; |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
279 } |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
280 if(force || stop != start + 1){ |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
281 if(!some){ |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
282 fprintf(out, "static const uint32_t is%sr[] = {\n", label); |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
283 some = 1; |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
284 } |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
285 prop[start] = 0; |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
286 fprintf(out, "\t0x%.4x, 0x%.4x,\n", start, stop - 1); |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
287 } |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
288 |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
289 start = stop; |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
290 } |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
291 if(some) { |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
292 fprintf(out, "};\n\n"); |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
293 } |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
294 |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
295 return some; |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
296 } |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
297 |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
298 /* |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
299 * generate a mapping array for pairs with a skip between, |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
300 * clearing those entries covered. |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
301 */ |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
302 static int |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
303 mkispair(const char *label, char *prop) |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
304 { |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
305 int start, stop, some; |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
306 |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
307 some = 0; |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
308 for(start = 0; start + 2 < NRUNES; ) { |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
309 if(!prop[start]){ |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
310 start++; |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
311 continue; |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
312 } |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
313 |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
314 for(stop = start + 2; stop < NRUNES; stop += 2){ |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
315 if(!prop[stop]){ |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
316 break; |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
317 } |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
318 prop[stop] = 0; |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
319 } |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
320 if(stop != start + 2){ |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
321 if(!some){ |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
322 fprintf(out, "static const uint32_t is%sp[] = {\n", label); |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
323 some = 1; |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
324 } |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
325 prop[start] = 0; |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
326 fprintf(out, "\t0x%.4x, 0x%.4x,\n", start, stop - 2); |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
327 } |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
328 |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
329 start = stop; |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
330 } |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
331 if(some) { |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
332 fprintf(out, "};\n\n"); |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
333 } |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
334 return some; |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
335 } |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
336 |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
337 /* |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
338 * generate a properties array for singletons, clearing those cases covered. |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
339 */ |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
340 static int |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
341 mkissingle(const char *label, char *prop) |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
342 { |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
343 int start, some; |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
344 |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
345 some = 0; |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
346 for(start = 0; start < NRUNES; start++) { |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
347 if(!prop[start]){ |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
348 continue; |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
349 } |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
350 |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
351 if(!some){ |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
352 fprintf(out, "static const uint32_t is%ss[] = {\n", label); |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
353 some = 1; |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
354 } |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
355 prop[start] = 0; |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
356 fprintf(out, "\t0x%.4x,\n", start); |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
357 } |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
358 if(some) { |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
359 fprintf(out, "};\n\n"); |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
360 } |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
361 return some; |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
362 } |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
363 |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
364 /* |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
365 * generate tables and a function for is<label>rune |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
366 */ |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
367 static void |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
368 mkis(const char* label, char* prop, int usepairs) |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
369 { |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
370 int isr, isp, iss; |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
371 |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
372 isr = mkisrange(label, prop, 0); |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
373 isp = 0; |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
374 if(usepairs) |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
375 isp = mkispair(label, prop); |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
376 iss = mkissingle(label, prop); |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
377 |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
378 fprintf(out, |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
379 "bool\n" |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
380 "uni_is%s(uint32_t c)\n" |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
381 "{\n" |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
382 "\tconst uint32_t *p;\n" |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
383 "\n", |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
384 label); |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
385 |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
386 if(isr) |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
387 fprintf(out, |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
388 "\tp = search(c, is%sr, nelem (is%sr) / 2, 2);\n\n" |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
389 "\tif (p && c >= p[0] && c <= p[1])\n" |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
390 "\t\treturn true;\n", |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
391 label, label); |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
392 |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
393 if(isp) |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
394 fprintf(out, |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
395 "\n" |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
396 "\tp = search(c, is%sp, nelem (is%sp) / 2, 2);\n\n" |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
397 "\tif (p && c >= p[0] && c <= p[1] && !((c - p[0]) & 1))\n" |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
398 "\t\treturn true;\n", |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
399 label, label); |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
400 |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
401 if(iss) |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
402 fprintf(out, |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
403 "\n" |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
404 "\tp = search(c, is%ss, nelem (is%ss), 1);\n\n" |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
405 "\tif (p && c == p[0])\n" |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
406 "\t\treturn true;\n", |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
407 label, label); |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
408 |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
409 |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
410 fprintf(out, |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
411 "\n" |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
412 "\treturn false;\n" |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
413 "}\n" |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
414 "\n" |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
415 ); |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
416 } |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
417 |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
418 /* |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
419 * generate a mapping array for ranges, clearing those entries covered. |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
420 * if force, generate one-entry ranges for singletons. |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
421 */ |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
422 static int |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
423 mktorange(const char* label, int* map, int force) |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
424 { |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
425 int start, stop, delta, some; |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
426 |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
427 some = 0; |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
428 for(start = 0; start < NRUNES; ) { |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
429 if(map[start] == start){ |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
430 start++; |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
431 continue; |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
432 } |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
433 |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
434 delta = TO_DELTA(map[start], start); |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
435 if(delta != (Rune)delta) |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
436 fatal("bad map delta %d", delta); |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
437 for(stop = start + 1; stop < NRUNES; stop++){ |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
438 if(TO_DELTA(map[stop], stop) != delta){ |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
439 break; |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
440 } |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
441 map[stop] = stop; |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
442 } |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
443 if(stop != start + 1){ |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
444 if(!some){ |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
445 fprintf(out, "static const uint32_t to%sr[] = {\n", label); |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
446 some = 1; |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
447 } |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
448 map[start] = start; |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
449 fprintf(out, "\t0x%.4x, 0x%.4x, %d,\n", start, stop - 1, delta); |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
450 } |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
451 |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
452 start = stop; |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
453 } |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
454 if(some) { |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
455 fprintf(out, "};\n\n"); |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
456 } |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
457 |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
458 return some; |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
459 } |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
460 |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
461 /* |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
462 * generate a mapping array for pairs with a skip between, |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
463 * clearing those entries covered. |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
464 */ |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
465 static int |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
466 mktopair(const char* label, int* map) |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
467 { |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
468 int start, stop, delta, some; |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
469 |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
470 some = 0; |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
471 for(start = 0; start + 2 < NRUNES; ) { |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
472 if(map[start] == start){ |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
473 start++; |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
474 continue; |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
475 } |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
476 |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
477 delta = TO_DELTA(map[start], start); |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
478 if(delta != (Rune)delta) |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
479 fatal("bad map delta %d", delta); |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
480 for(stop = start + 2; stop < NRUNES; stop += 2){ |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
481 if(TO_DELTA(map[stop], stop) != delta){ |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
482 break; |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
483 } |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
484 map[stop] = stop; |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
485 } |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
486 if(stop != start + 2){ |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
487 if(!some){ |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
488 fprintf(out, "static const uint32_t to%sp[] = {\n", label); |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
489 some = 1; |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
490 } |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
491 map[start] = start; |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
492 fprintf(out, "\t0x%.4x, 0x%.4x, %d,\n", start, stop - 2, delta); |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
493 } |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
494 |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
495 start = stop; |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
496 } |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
497 if(some) { |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
498 fprintf(out, "};\n\n"); |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
499 } |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
500 |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
501 return some; |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
502 } |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
503 |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
504 /* |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
505 * generate a mapping array for singletons, clearing those entries covered. |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
506 */ |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
507 static int |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
508 mktosingle(const char* label, int* map) |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
509 { |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
510 int start, delta, some; |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
511 |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
512 some = 0; |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
513 for(start = 0; start < NRUNES; start++) { |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
514 if(map[start] == start){ |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
515 continue; |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
516 } |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
517 |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
518 delta = TO_DELTA(map[start], start); |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
519 if(delta != (Rune)delta) |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
520 fatal("bad map delta %d", delta); |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
521 if(!some){ |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
522 fprintf(out, "static const uint32_t to%ss[] = {\n", label); |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
523 some = 1; |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
524 } |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
525 map[start] = start; |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
526 fprintf(out, "\t0x%.4x, %d,\n", start, delta); |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
527 } |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
528 if(some) { |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
529 fprintf(out, "};\n\n"); |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
530 } |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
531 |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
532 return some; |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
533 } |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
534 |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
535 /* |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
536 * generate tables and a function for to<label>rune |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
537 */ |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
538 static void |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
539 mkto(const char* label, int* map, int usepairs) |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
540 { |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
541 int tor, top, tos; |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
542 |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
543 tor = mktorange(label, map, 0); |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
544 top = 0; |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
545 if(usepairs) |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
546 top = mktopair(label, map); |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
547 tos = mktosingle(label, map); |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
548 |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
549 fprintf(out, |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
550 "uint32_t\n" |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
551 "uni_to%s(uint32_t c)\n" |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
552 "{\n" |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
553 "\tconst uint32_t *p;\n" |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
554 "\n", |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
555 label); |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
556 |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
557 if(tor) |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
558 fprintf(out, |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
559 "\tp = search(c, to%sr, nelem (to%sr) / 3, 3);\n\n" |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
560 "\tif (p && c >= p[0] && c <= p[1])\n" |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
561 "\t\treturn c + p[2] - %d;\n", |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
562 label, label, TO_OFFSET); |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
563 |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
564 if(top) |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
565 fprintf(out, |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
566 "\n" |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
567 "\tp = search(c, to%sp, nelem (to%sp) / 3, 3);\n\n" |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
568 "\tif (p && c >= p[0] && c <= p[1] && !((c - p[0]) & 1))\n" |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
569 "\t\treturn c + p[2] - %d;\n", |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
570 label, label, TO_OFFSET); |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
571 |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
572 if(tos) |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
573 fprintf(out, |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
574 "\n" |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
575 "\tp = search(c, to%ss, nelem (to%ss) / 2, 2);\n\n" |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
576 "\tif (p && c == p[0])\n" |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
577 "\t\treturn c + p[1] - %d;\n\n", |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
578 label, label, TO_OFFSET); |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
579 |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
580 fprintf(out, |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
581 "\treturn c;\n" |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
582 "}\n" |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
583 "\n" |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
584 ); |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
585 } |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
586 |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
587 // Make only range tables and a function for is<label>rune. |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
588 static void |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
589 mkisronly(const char* label, char* prop) |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
590 { |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
591 mkisrange(label, prop, 1); |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
592 fprintf(out, |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
593 "bool\n" |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
594 "uni_is%s(uint32_t c)\n" |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
595 "{\n" |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
596 "\tconst uint32_t *p;\n" |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
597 "\n" |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
598 "\tp = search(c, is%sr, nelem (is%sr) / 2, 2);\n\n" |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
599 "\tif (p && c >= p[0] && c <= p[1])\n" |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
600 "\t\treturn true;\n\n" |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
601 "\treturn false;\n" |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
602 "}\n" |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
603 "\n", |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
604 label, label, label); |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
605 } |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
606 |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
607 /* |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
608 * generate the body of runetype. |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
609 * assumes there is a function Rune* search(Rune c, Rune *t, int n, int ne); |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
610 */ |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
611 static void |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
612 mktables(char *src, int usepairs) |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
613 { |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
614 /* Add nelem macro */ |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
615 fprintf(out, |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
616 "#define nelem(x) (sizeof (x) / sizeof ((x)[0]))\n\n" |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
617 ); |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
618 |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
619 /* Add the search function */ |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
620 fprintf(out, |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
621 "static const uint32_t *\n" |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
622 "search(uint32_t c, const uint32_t *t, int n, int ne)\n" |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
623 "{\n" |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
624 "\tconst uint32_t *p;\n" |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
625 "\tint m;\n\n" |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
626 "\twhile (n > 1) {\n" |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
627 "\t\tm = n >> 1;\n" |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
628 "\t\tp = t + m * ne;\n\n" |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
629 "\t\tif (c >= p[0]) {\n" |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
630 "\t\t\tt = p;\n" |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
631 "\t\t\tn = n - m;\n" |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
632 "\t\t} else\n" |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
633 "\t\t\tn = m;\n" |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
634 "\t}\n\n" |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
635 "\tif (n && c >= t[0])\n" |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
636 "\t\treturn t;\n\n" |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
637 "\treturn NULL;\n" |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
638 "}\n\n" |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
639 ); |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
640 |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
641 /* |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
642 * we special case the space and digit tables, since they are assumed |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
643 * to be small with several ranges. |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
644 */ |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
645 mkisronly("space", myisspace); |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
646 mkisronly("digit", myisdigit); |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
647 |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
648 mkis("alpha", myisalpha, 0); |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
649 mkis("upper", myisupper, usepairs); |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
650 mkis("lower", myislower, usepairs); |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
651 mkis("title", myistitle, usepairs); |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
652 |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
653 mkto("upper", mytoupper, usepairs); |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
654 mkto("lower", mytolower, usepairs); |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
655 mkto("title", mytotitle, usepairs); |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
656 } |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
657 |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
658 static int |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
659 mygetfields(char **fields, int nfields, char *str, const char *delim) |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
660 { |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
661 int nf; |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
662 |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
663 fields[0] = str; |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
664 nf = 1; |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
665 if(nf >= nfields) |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
666 return nf; |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
667 |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
668 for(; *str; str++){ |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
669 if(strchr(delim, *str) != NULL){ |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
670 *str = '\0'; |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
671 fields[nf++] = str + 1; |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
672 if(nf >= nfields) |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
673 break; |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
674 } |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
675 } |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
676 return nf; |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
677 } |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
678 |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
679 static int |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
680 getunicodeline(FILE *in, char **fields, char *buf) |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
681 { |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
682 char *p; |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
683 |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
684 if(fgets(buf, MAX_LINE, in) == NULL) |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
685 return 0; |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
686 |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
687 p = strchr(buf, '\n'); |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
688 if (p == NULL) |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
689 fatal("line too long"); |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
690 *p = '\0'; |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
691 |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
692 if (mygetfields(fields, NFIELDS + 1, buf, ";") != NFIELDS) |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
693 fatal("bad number of fields"); |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
694 |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
695 return 1; |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
696 } |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
697 |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
698 static int |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
699 getcode(char *s) |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
700 { |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
701 int i, code; |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
702 |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
703 code = 0; |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
704 i = 0; |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
705 /* Parse a hex number */ |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
706 while(s[i]) { |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
707 code <<= 4; |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
708 if(s[i] >= '0' && s[i] <= '9') |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
709 code += s[i] - '0'; |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
710 else if(s[i] >= 'A' && s[i] <= 'F') |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
711 code += s[i] - 'A' + 10; |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
712 else |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
713 fatal("bad code char '%c'", s[i]); |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
714 i++; |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
715 } |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
716 return code; |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
717 } |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
718 |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
719 static void |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
720 fatal(const char *fmt, ...) |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
721 { |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
722 va_list arg; |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
723 |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
724 fprintf(stderr, "mkunicode: fatal error: "); |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
725 va_start(arg, fmt); |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
726 vfprintf(stderr, fmt, arg); |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
727 va_end(arg); |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
728 fprintf(stderr, "\n"); |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
729 |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
730 exit(1); |
ae1003c2a284
misc: extreme simplification
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
731 } |