5 usage: mkutable [-n] [-f#] type... [--] [<] UnicodeData.txt
6 -n = take non-matching types
7 -f = zero-based type field (default 2)
10 use vars qw( $opt_f $opt_n );
14 exit (main() ? 0 : 1);
19 my $args = join ' ', @ARGV;
20 my $header = "/* Generated by \"$0 $args\" on $date */\n";
22 die $USAGE if not getopts('f:n');
23 $type_field = $opt_f if $opt_f;
26 while ($arg = shift @ARGV) {
30 my %out = ( 'types' => \%types );
37 my @fields = split /;/;
39 my ($lo_code, $hi_code);
40 my $codes = $fields[0];
41 if ($codes =~ /(\w+)\.\.(\w+)/) {
45 $lo_code = $hi_code = hex $fields[0];
47 my $type = $fields[$type_field];
49 for ($last_code = $lo_code; $last_code <= $hi_code; ++$last_code) {
50 output(\%out, $last_code, $type);
53 output(\%out, $last_code);
58 my ($out, $code, $type) = @_;
59 my $type_ok = ($type and ${${$out}{types}}{$type});
60 $type_ok = not $type_ok if $opt_n;
61 my $prev_code = $$out{prev_code};
64 end_run($out, $prev_code);
65 } elsif (not $$out{in_run} or $type ne $$out{run_type} or $code != $prev_code+1) {
66 end_run($out, $prev_code);
67 start_run($out, $code, $type);
69 $$out{prev_code} = $code;
73 my ($out, $code, $type) = @_;
74 $$out{start_code} = $code;
75 $$out{prev_code} = $code;
76 $$out{run_type} = $type;
81 my ($out, $code) = @_;
82 return if not $$out{in_run};
83 printf "\t{ 0x%04x, 0x%04x }, /* %s */\n", $$out{start_code}, $code, $$out{run_type};