3 # the generated tables mostly have NOT been chcked so far!
12 my ($a, $l, $h, $b) = @_;
14 return unless defined $a->[$_] && $a->[$_] == $_ + ($b - $l);
21 $res .= "$1\n " while $_[0] =~ /\G(.{90}\S*?)\s+/gc;
22 $res .= "$1" if $_[0] =~ /\G(.*)$/;
26 my $last_tab_full; # hack
29 my ($enc, $l, $h, $f, $rep) = @_;
35 defined $enc->[$_] ? $enc->[$_] : $last_tab_full++ * 0 + $rep
41 my ($enc, $base, $ch) = @_;
46 for (255, 159, 127, 126, 125) {
47 if (linear $enc, 0, $_, 0) {
48 undef $enc->[$_] for 0..$_;
49 $fun .= sprintf "if (· <= 0x%04x) return ·;\n", $_;
54 if (linear $enc, $_, 159, $_) {
55 undef $enc->[$_] for $_..159;
56 $fun .= sprintf "if (0x%04x <= · && · <= 0x%04x) return ·;\n", $_, 159;
61 next unless defined $enc->[$_];
62 $fun .= sprintf "if (· == 0x%04x) return 0x%04x;\n", $_, delete $enc->[$_];
69 if (defined $enc->[$_]) {
70 $map[$_] = $enc->[$_];
80 for my $i (0..255) { $l = $i, last if defined $map[$b + $i]; }
81 for my $i (0..255) { $h = 255 - $i, last if defined $map[$b + 255 - $i]; }
85 next unless defined $enc->[$b + $_];
86 $fun .= sprintf "if (· == 0x%04x) return 0x%04x;\n", $b + $_, $enc->[$b + $_];
88 } elsif (linear $enc, $b + $l, $b + $h, $enc->[$b + $l]) {
89 my $dif = $enc->[$b + $l] - ($b + $l);
90 $dif = $dif < 0 ? sprintf "- 0x%04x", -$dif : sprintf "+ 0x%04x", $dif;
91 $fun .= sprintf "if (· <= 0x%04x && 0x%04x <= ·) return · %s;\n", $b + $l, $b + $h, $dif;
92 } elsif ($map2[$p] <= 5) { # defunct
93 $fun .= "switch (·)\n {\n";
95 next unless defined $enc->[$b + $_];
96 $fun .= sprintf " case 0x%04x: return 0x%04x;\n", $b + $_, $enc->[$b + $_];
100 my ($i, $t, $f) = (0, "uint8_t", "%02x");
102 if ($enc->[$b + $_] > 255) {
103 ($i, $t, $f) = (1, "uint16_t", "%04x");
108 $i ? push @t2, [$p, $l, $h, $t, $f]
109 : push @t1, [$b, $l, $h, $t, $f];
121 my ($b, $l, $h, $t, $f) = @$_;
122 my $rep = $b + $l == 0 ? 128 : 0;
123 $tab .= "static const $t $base\_$b\[]" . gentab $enc, $b + $l, $b + $h, $f;
124 $fun .= sprintf "if (0x%04x <= · && · <= 0x%04x)\n"
125 . " return %s$base\_$b\[· - 0x%04x];\n",
127 ($last_tab_full ? sprintf "$base\_$b\[· - 0x%04x] == $rep ? NOCHAR : ", $b + $l : ""),
132 my ($min, $max) = (255, 0);
133 my ($l, $h) = (255, 0);
135 my ($p, $L, $H, $t, $f) = @$_;
136 $max = $p if $p > $max;
137 $min = $p if $p < $min;
142 $fun .= "uint8_t l = ·;\n";
143 $fun .= "uint16_t h = · >> 8;\n";
149 for $p ($min .. $max) {
151 $enc[($p - $min) * $d + $i - $l] = $enc->[$p * 256 + $i];
154 $tab .= "static const uint16_t $base\_m[]" . gentab \@enc, 0, $#enc, "%04x";
156 if ($last_tab_full) {
157 $fun .= sprintf "if (0x%02x <= h && h <= 0x%02x\n"
158 . " && 0x%02x <= l && l <= 0x%02x)\n"
159 . " return $base\_m\[h * 0x%02x + l - 0x%04x]\n"
160 . " ? $base\_m\[h * 0x%02x + l - 0x%04x]\n"
163 ($d, $min * $d + $l) x 2;
165 $fun .= sprintf "if (0x%02x <= h && h <= 0x%02x\n"
166 . " && 0x%02x <= l && l <= 0x%02x)\n"
167 . " return $base\_m\[h * 0x%02x + l - 0x%04x];\n",
173 my @tab = (0) x ($max - $min);
175 my ($p, undef, undef, $t, $f) = @$_;
176 $tab .= "static const $t $base\_$p\[]" . gentab $enc, $p * 256 + $l, $p * 256 + $h, $f, 0;
177 $tab[$p - $min] = "$base\_$p";
180 $tab .= "const uint16_t *$base\_i[] = {\n"
181 . (wrap join ", ", @tab)
184 $fun .= sprintf "if (0x%02x <= h && h <= 0x%02x\n"
185 . " && 0x%02x <= l && l <= 0x%02x\n"
186 . " && $base\_i[h - 0x%02x])\n"
187 . " return $base\_i\[h - 0x%02x][l - 0x%02x]\n"
188 . " ? $base\_i\[h - 0x%02x][l - 0x%02x]\n"
191 $min, ($min, $l) x 2;
195 $fun .= "return NOCHAR;\n";
203 my ($group, $base, $cs, $type) = split /\s+/;
209 my $enc = encode $cs, (chr $_), Encode::FB_QUIET;
212 my $code = hex unpack "H*", $enc;
214 $enc2[$code] = $_ unless defined $enc2[$code];
218 my ($tab1, $fun1) = gen \@enc1, "$base\_f", "unicode";
219 my ($tab2, $fun2) = gen \@enc2, "$base\_t", "enc";
227 open OUT, ">table/$base.h" or die;
231 // AUTOMATICALLLY GENERATED by gentables
233 #ifdef ENCODING_$group
236 struct rxvt_codeset_conv_$base : rxvt_codeset_conv {
237 uint32_t from_unicode (uint32_t unicode) const {
239 uint32_t to_unicode (uint32_t enc) const {
241 } rxvt_codeset_conv_$base;
245 #define rxvt_codeset_conv_$base rxvt_codeset_conv_unknown
255 KR ksc5601_1987_0 ksc5601-raw
256 CN gb2312_1980_0 gb2312-raw
257 CN_EXT cns11643_1992_1 cns11643-1
258 CN_EXT cns11643_1992_2 cns11643-2
259 CN_EXT cns11643_1992_3 cns11643-3
260 CN_EXT cns11643_1992_4 cns11643-4
261 CN_EXT cns11643_1992_5 cns11643-5
262 CN_EXT cns11643_1992_6 cns11643-6
263 CN_EXT cns11643_1992_7 cns11643-7
264 CN_EXT cns11643_1992_f cns11643-f
265 CN_EXT big5_ext big5ext
266 CN_EXT big5_plus big5plus
269 DEFAULT iso8859_1 iso-8859-1
270 EU iso8859_2 iso-8859-2
271 EU iso8859_3 iso-8859-3
272 EU iso8859_4 iso-8859-4
273 EU iso8859_5 iso-8859-5
274 EU iso8859_6 iso-8859-6
275 EU iso8859_7 iso-8859-7
276 EU iso8859_8 iso-8859-8
277 EU iso8859_9 iso-8859-9
278 EU iso8859_10 iso-8859-10
279 EU iso8859_11 iso-8859-11
280 EU iso8859_13 iso-8859-13
281 EU iso8859_14 iso-8859-14
282 DEFAULT iso8859_15 iso-8859-15
283 EU iso8859_16 iso-8859-16
284 JP jis0201_1976_0 jis0201-raw
285 JP jis0208_1983_0 jis0208-raw
286 JP jis0212_1990_0 jis0212-raw
287 JP_EXT jis0213_1 jis0213-1-raw
288 JP_EXT jis0213_2 jis0213-2-raw