#!/usr/bin/perl use strict; my $range = shift; # 0, 0x8..0xF my $Table; while (<>) { if (/^0x(\S+)\s+U\+(\S+)/) { $Table->{hex $1} = hex $2; } } my $table3 = { 0x88B1 => 0xE9CB, 0x89A7 => 0xE9F2, 0x8A61 => 0xE579, 0x8A68 => 0x9D98, 0x8A96 => 0xE27D, 0x8AC1 => 0x9FF3, 0x8AD0 => 0xE67C, 0x8C7A => 0xE8F2, 0x8D7B => 0xE1E6, 0x8EC7 => 0xE541, 0x9078 => 0xE8D5, 0x9147 => 0xE6CB, 0x92D9 => 0x9AE2, 0x9376 => 0xE1E8, 0x938E => 0x9E8D, 0x9393 => 0x9FB7, 0x93F4 => 0xE78E, 0x9488 => 0xE5A2, 0x954F => 0x9E77, 0x9699 => 0x98D4, 0x96F7 => 0xE54D, 0x9855 => 0xE2C4, }; $table3 = {%$table3, reverse %$table3}; my $table4 = { 0x81B8 => 1, 0x81B9 => 1, 0x81BA => 1, 0x81BB => 1, 0x81BC => 1, 0x81BD => 1, 0x81BE => 1, 0x81BF => 1, 0x81C8 => 1, 0x81C9 => 1, 0x81CA => 1, 0x81CB => 1, 0x81CC => 1, 0x81CD => 1, 0x81CE => 1, 0x81DA => 1, 0x81DB => 1, 0x81DC => 1, 0x81DD => 1, 0x81DE => 1, 0x81DF => 1, 0x81E0 => 1, 0x81E1 => 1, 0x81E2 => 1, 0x81E3 => 1, 0x81E4 => 1, 0x81E5 => 1, 0x81E6 => 1, 0x81E7 => 1, 0x81E8 => 1, 0x81F0 => 1, 0x81F1 => 1, 0x81F2 => 1, 0x81F3 => 1, 0x81F4 => 1, 0x81F5 => 1, 0x81F6 => 1, 0x81FC => 1, 0x849F => 1, 0x84A0 => 1, 0x84A1 => 1, 0x84A2 => 1, 0x84A3 => 1, 0x84A4 => 1, 0x84A5 => 1, 0x84A6 => 1, 0x84A7 => 1, 0x84A8 => 1, 0x84A9 => 1, 0x84AA => 1, 0x84AB => 1, 0x84AC => 1, 0x84AD => 1, 0x84AE => 1, 0x84AF => 1, 0x84B0 => 1, 0x84B1 => 1, 0x84B2 => 1, 0x84B3 => 1, 0x84B4 => 1, 0x84B5 => 1, 0x84B6 => 1, 0x84B7 => 1, 0x84B8 => 1, 0x84B9 => 1, 0x84BA => 1, 0x84BB => 1, 0x84BC => 1, 0x84BD => 1, 0x84BE => 1, }; my $table5 = { 0x8BC4 => 0xEA9F, 0x968A => 0xEAA0, 0x9779 => 0xEAA1, 0xE0F4 => 0xEAA2, 0xEAA4 => 0xE086, }; $table5 = {%$table5, reverse %$table5}; my $table6 = { 0xEAA3 => 1, }; ## NOTE: JIS X 0208:1997 Annex 1 2. b) is difficult to understand ## and I don't know what it means exactly. print <<'EOH'; Shift JIS Decoding Test

FAIL (not executed)

EOH print ""; my $i = 0; $Table->{0x00} = 0xFFFD; $Table->{0x0D} = 0x000A; $Table->{0x8150} = 0xFFFD; # FULLWIDTH OVERLINE if ($range == 0) { for (0x00..0x7F, 0xA1..0xDF) { printf q[], $_, chr $_, $Table->{$_}; $i++; } } my @range; if ($range < 0x10 and $range > 0x7) { push @range, $range * 0x10 + $_ for 0x0..0xF; } if ($range == 0xA) { @range = (0xA0) } for my $s1 (@range) { for my $s2 (0x00..0xFF) { if ($s1 == 0x80 or $s1 == 0xA0 or $s1 > 0xEF) { if ($s2 < 0x40 or $s2 == 0x7F or (0xA1 <= $s2 and $s2 <= 0xDF)) { ## PASS: ($s1=undefined)($s2)(@) ## PASS if documented: ($s1=char)($s2)(@) ## PASS if documented: ($s1,$s2=undefined/char)(@) printf q[], $s1, $s2, (pack 'C', $s1), (pack 'C', $s2), $Table->{$s2}; } elsif ($s2 > 0xFC) { ## PASS: ($s1=undefined)($s2=undefined)(@) ## PASS if documented: ($s1=undefined/char)($s2=undefined/char)(@) ## PASS if documented: ($s1=undefined/char)($s2,0x40=undefined/char) ## PASS if documented: ($s1,$s2=undefined/char)(@) printf q[], $s1, $s2, (pack 'C', $s1), (pack 'C', $s2); } elsif ($s2 == 0x80 or $s2 > 0xEF) { ## PASS: ($s1=undefined)($s2=undefined)(@) ## PASS if documented: ($s1=undefined/char)($s2=undefined/char)(@) ## PASS if documented: ($s1=undefined/char)($s2,0x40=undefined/char) ## PASS if documented: ($s1,$s2=undefined/char)(@) printf q[], $s1, $s2, (pack 'C', $s1), (pack 'C', $s2); } elsif ($s2 < 0x7F) { ## PASS: ($s1=undefined)($s2=char)(@) ## PASS if documented: ($s1=char)($s2=char)(@) ## PASS if documented: ($s1,$s2=undefined/char)(@) printf q[], $s1, $s2, (pack 'C', $s1), (pack 'C', $s2), $Table->{$s2}; } else { # $s2 in [0x81, 0x9F] or [0xE0, 0xEF] ## PASS: ($s1=undefined)($s2,0x40=undefined/char) ## PASS if documented: ($s1=char)($s2,0x40=undefined/char) ## PASS if documented: ($s1,$s2=undefined/char)(@) printf q[], $s1, $s2, (pack 'C', $s1), (pack 'C', $s2), $Table->{$s2 * 0x100 + 0x40} ? '&#' . $Table->{$s2 * 0x100 + 0x40} . ';' : ''; ## NOTE: $table3..$table6 has no entry with 0x??40 } } else { if ($s2 < 0x40 or $s2 == 0x7F or $s2 > 0xFC) { ## PASS: ($s1,$s2=undefined/char)(@) printf q[], $s1, $s2, (pack 'C', $s1), (pack 'C', $s2); } else { if ($table3->{$s1 * 0x100 + $s2}) { ## PASS: ($s1,$s2=char)(@) ## PASS if documented: ($s1,$s2=alternate)(@) printf q[], $s1, $s2, (pack 'C', $s1), (pack 'C', $s2), $Table->{$table3->{$s1 * 0x100 + $s2}}, $Table->{$s1 * 0x100 + $s2}; } elsif ($table5->{$s1 * 0x100 + $s2}) { ## PASS: ($s1,$s2=char)(@) ## PASS if documented: ($s1,$s2=alternate)(@) ## PASS if documented: ($s1,$s2=undefined)(@) printf q[], $s1, $s2, (pack 'C', $s1), (pack 'C', $s2), $Table->{$table5->{$s1 * 0x100 + $s2}}, $Table->{$s1 * 0x100 + $s2}; } elsif ($table4->{$s1 * 0x100 + $s2} or $table5->{$s1 * 0x100 + $s2}) { ## PASS: ($s1,$s2=char)(@) ## PASS if documented: ($s1,$s2=undefined)(@) printf q[], $s1, $s2, (pack 'C', $s1), (pack 'C', $s2), $Table->{$s1 * 0x100 + $s2}; } else { ## PASS: ($s1,$s2=undefined/char)(@) printf q[], $s1, $s2, (pack 'C', $s1), (pack 'C', $s2), $Table->{$s1 * 0x100 + $s2} ? '&#'.$Table->{$s1 * 0x100 + $s2}.';@' : ''; } } } $i++; } } print <<"EOH";
0x%02X%s&#%d;
0x%02X%02X%s%s@&#%d;@
0x%02X%02X%s%s@
0x%02X%02X%s%s@
0x%02X%02X%s%s@&#%d;@
0x%02X%02X%s%s@%s
0x%02X%02X%s%s@
0x%02X%02X%s%s@&#%s;@
0x%02X%02X%s%s@&#%s;@
0x%02X%02X%s%s@&#%s;@
0x%02X%02X%s%s@%s
EOH