3 # the generated tables mostly have NOT been checked so far!
16 $TO_UNICODE = 0; # also generate to_unicode tables
19 my ($a, $l, $h, $b) = @_;
21 return unless defined $a->[$_] && $a->[$_] == $_ + ($b - $l);
28 $res .= "$1\n " while $_[0] =~ /\G(.{90}\S*?)\s+/gc;
29 $res .= "$1" if $_[0] =~ /\G(.*)$/;
33 my $last_tab_full; # hack
36 my ($enc, $l, $h, $f, $rep) = @_;
42 defined $enc->[$_] ? $enc->[$_] : $last_tab_full++ * 0 + $rep
48 my ($enc, $base, $ch) = @_;
53 for (255, 159, 127, 126, 125) {
54 if (linear $enc, 0, $_, 0) {
55 undef $enc->[$_] for 0..$_;
56 $fun .= sprintf "if (· <= 0x%04x) return ·;\n", $_;
61 if (linear $enc, $_, 159, $_) {
62 undef $enc->[$_] for $_..159;
63 $fun .= sprintf "if (0x%04x <= · && · <= 0x%04x) return ·;\n", $_, 159;
68 next unless defined $enc->[$_];
69 $fun .= sprintf "if (· == 0x%04x) return 0x%04x;\n", $_, delete $enc->[$_];
76 if (defined $enc->[$_]) {
77 $map[$_] = $enc->[$_];
87 for my $i (0..255) { $l = $i, last if defined $map[$b + $i]; }
88 for my $i (0..255) { $h = 255 - $i, last if defined $map[$b + 255 - $i]; }
92 next unless defined $enc->[$b + $_];
93 $fun .= sprintf "if (· == 0x%04x) return 0x%04x;\n", $b + $_, $enc->[$b + $_];
95 } elsif (linear $enc, $b + $l, $b + $h, $enc->[$b + $l]) {
96 my $dif = $enc->[$b + $l] - ($b + $l);
97 $dif = $dif < 0 ? sprintf "- 0x%04x", -$dif : sprintf "+ 0x%04x", $dif;
98 $fun .= sprintf "if (· <= 0x%04x && 0x%04x <= ·) return · %s;\n", $b + $l, $b + $h, $dif;
99 } elsif ($map2[$p] <= 5) { # defunct
100 $fun .= "switch (·)\n {\n";
102 next unless defined $enc->[$b + $_];
103 $fun .= sprintf " case 0x%04x: return 0x%04x;\n", $b + $_, $enc->[$b + $_];
107 my ($i, $t, $f) = (0, "uint8_t", "%02x");
109 if ($enc->[$b + $_] > 255) {
110 ($i, $t, $f) = (1, "uint16_t", "%04x");
115 $i ? push @t2, [$p, $l, $h, $t, $f]
116 : push @t1, [$b, $l, $h, $t, $f];
128 my ($b, $l, $h, $t, $f) = @$_;
129 my $rep = $b + $l == 0 ? 128 : 0;
130 $tab .= "static const $t $base\_$b\[]" . gentab $enc, $b + $l, $b + $h, $f;
131 $fun .= sprintf "if (0x%04x <= · && · <= 0x%04x)\n"
132 . " return %s$base\_$b\[· - 0x%04x];\n",
134 ($last_tab_full ? sprintf "$base\_$b\[· - 0x%04x] == $rep ? NOCHAR : ", $b + $l : ""),
139 my ($min, $max) = (255, 0);
140 my ($l, $h) = (255, 0);
142 my ($p, $L, $H, $t, $f) = @$_;
143 $max = $p if $p > $max;
144 $min = $p if $p < $min;
149 $fun .= "uint8_t l = ·;\n";
150 $fun .= "uint16_t h = · >> 8;\n";
156 for $p ($min .. $max) {
158 $enc[($p - $min) * $d + $i - $l] = $enc->[$p * 256 + $i];
161 $tab .= "static const uint16_t $base\_m[]" . gentab \@enc, 0, $#enc, "%04x";
163 if ($last_tab_full) {
164 $fun .= sprintf "if (0x%02x <= h && h <= 0x%02x\n"
165 . " && 0x%02x <= l && l <= 0x%02x)\n"
166 . " return $base\_m\[h * 0x%02x + l - 0x%04x]\n"
167 . " ? $base\_m\[h * 0x%02x + l - 0x%04x]\n"
170 ($d, $min * $d + $l) x 2;
172 $fun .= sprintf "if (0x%02x <= h && h <= 0x%02x\n"
173 . " && 0x%02x <= l && l <= 0x%02x)\n"
174 . " return $base\_m\[h * 0x%02x + l - 0x%04x];\n",
180 my @tab = (0) x ($max - $min);
182 my ($p, undef, undef, $t, $f) = @$_;
183 $tab .= "static const $t $base\_$p\[]" . gentab $enc, $p * 256 + $l, $p * 256 + $h, $f, 0;
184 $tab[$p - $min] = "$base\_$p";
187 $tab .= "const uint16_t *$base\_i[] = {\n"
188 . (wrap join ", ", @tab)
191 $fun .= sprintf "if (0x%02x <= h && h <= 0x%02x\n"
192 . " && 0x%02x <= l && l <= 0x%02x\n"
193 . " && $base\_i[h - 0x%02x])\n"
194 . " return $base\_i\[h - 0x%02x][l - 0x%02x]\n"
195 . " ? $base\_i\[h - 0x%02x][l - 0x%02x]\n"
198 $min, ($min, $l) x 2;
202 $fun .= "return NOCHAR;\n";
210 my ($group, $base, $cs, $type) = split /\s+/;
216 my $enc = encode $cs, (chr $_), Encode::FB_QUIET;
219 my $code = hex unpack "H*", $enc;
221 $enc2[$code] = $_ unless defined $enc2[$code];
228 ($tab1, $fun1) = gen \@enc1, "$base\_f", "unicode";
229 ($tab2, $fun2) = gen \@enc2, "$base\_t", "enc" if $TO_UNICODE;
235 open OUT, ">table/$base.h" or die;
239 // AUTOMATICALLLY GENERATED by gentables
241 #ifdef ENCODING_$group
244 static uint32_t cs_$base\_from_unicode (unicode_t unicode) {
250 #if ENCODING_TO_UNICODE
251 static unicode_t cs_$base\_to_unicode (uint32_t enc) {
261 #define cs_$base\_from_unicode cs_unknown_from_unicode
262 #define cs_$base\_to_unicode cs_unknown_to_unicode
272 KR ksc5601_1987_0 ksc5601-raw
273 ZH gb2312_1980_0 gb2312-raw
274 ZH_EXT cns11643_1992_1 cns11643-1
275 ZH_EXT cns11643_1992_2 cns11643-2
276 ZH_EXT cns11643_1992_3 cns11643-3
277 ZH_EXT cns11643_1992_4 cns11643-4
278 ZH_EXT cns11643_1992_5 cns11643-5
279 ZH_EXT cns11643_1992_6 cns11643-6
280 ZH_EXT cns11643_1992_7 cns11643-7
281 ZH_EXT cns11643_1992_f cns11643-f
283 ZH_EXT big5_ext big5ext
284 ZH_EXT big5_plus big5plus
287 DEFAULT iso8859_1 iso-8859-1
288 EU iso8859_2 iso-8859-2
289 EU iso8859_3 iso-8859-3
290 EU iso8859_4 iso-8859-4
291 EU iso8859_5 iso-8859-5
292 EU iso8859_6 iso-8859-6
293 EU iso8859_7 iso-8859-7
294 EU iso8859_8 iso-8859-8
295 EU iso8859_9 iso-8859-9
296 EU iso8859_10 iso-8859-10
297 EU iso8859_11 iso-8859-11
298 EU iso8859_13 iso-8859-13
299 EU iso8859_14 iso-8859-14
300 DEFAULT iso8859_15 iso-8859-15
301 EU iso8859_16 iso-8859-16
302 JP jis0201_1976_0 jis0201-raw
303 JP jis0208_1990_0 jis0208-raw
304 JP jis0212_1990_0 jis0212-raw
305 JP_EXT jis0213_1 jis0213-1-raw
306 JP_EXT jis0213_2 jis0213-2-raw