|
Packit |
db3073 |
#!/usr/bin/perl -w
|
|
Packit |
db3073 |
#
|
|
Packit |
db3073 |
# Script to convert http://www.unicode.org/Public/UNIDATA/Scripts.txt
|
|
Packit |
db3073 |
# into a machine-readable table.
|
|
Packit |
db3073 |
#
|
|
Packit |
db3073 |
######################################################################
|
|
Packit |
db3073 |
|
|
Packit |
db3073 |
if (@ARGV != 1) {
|
|
Packit |
db3073 |
die "Usage: gen-script-table.pl Scripts.txt > gscripttable.h\n";
|
|
Packit |
db3073 |
}
|
|
Packit |
db3073 |
|
|
Packit |
db3073 |
open IN, $ARGV[0] || die "Cannot open $ARGV[0]: $!\n";
|
|
Packit |
db3073 |
|
|
Packit |
db3073 |
my @ranges;
|
|
Packit |
db3073 |
my $file;
|
|
Packit |
db3073 |
my $easy_range;
|
|
Packit |
db3073 |
my $i;
|
|
Packit |
db3073 |
my $start;
|
|
Packit |
db3073 |
my $end;
|
|
Packit |
db3073 |
my $script;
|
|
Packit |
db3073 |
|
|
Packit |
db3073 |
|
|
Packit |
db3073 |
while (<IN>) {
|
|
Packit |
db3073 |
if (/^\#\s+(Scripts-.*.txt)/) {
|
|
Packit |
db3073 |
$file = $1;
|
|
Packit |
db3073 |
}
|
|
Packit |
db3073 |
|
|
Packit |
db3073 |
s/#.*//;
|
|
Packit |
db3073 |
next if /^\s*$/;
|
|
Packit |
db3073 |
if (!/^([0-9A-F]+)(?:\.\.([0-9A-F]+))?\s*;\s*([A-Za-z_]+)\s*$/) {
|
|
Packit |
db3073 |
die "Cannot parse line: '$_'\n";
|
|
Packit |
db3073 |
}
|
|
Packit |
db3073 |
|
|
Packit |
db3073 |
if (defined $2) {
|
|
Packit |
db3073 |
push @ranges, [ hex $1, hex $2, uc $3 ];
|
|
Packit |
db3073 |
} else {
|
|
Packit |
db3073 |
push @ranges, [ hex $1, hex $1, uc $3 ];
|
|
Packit |
db3073 |
}
|
|
Packit |
db3073 |
}
|
|
Packit |
db3073 |
|
|
Packit |
db3073 |
@ranges = sort { $a->[0] <=> $b->[0] } @ranges;
|
|
Packit |
db3073 |
$date = gmtime;
|
|
Packit |
db3073 |
|
|
Packit |
db3073 |
print <<"EOT";
|
|
Packit |
db3073 |
/* gscripttable.h: Generated by gen-script-table.pl
|
|
Packit |
db3073 |
*
|
|
Packit |
db3073 |
* Date: $date
|
|
Packit |
db3073 |
* Source: $file
|
|
Packit |
db3073 |
*
|
|
Packit |
db3073 |
* Do not edit.
|
|
Packit |
db3073 |
*/
|
|
Packit |
db3073 |
|
|
Packit |
db3073 |
EOT
|
|
Packit |
db3073 |
|
|
Packit |
db3073 |
$easy_range = 0x2000;
|
|
Packit |
db3073 |
|
|
Packit |
db3073 |
print <<"EOT";
|
|
Packit |
db3073 |
#define G_EASY_SCRIPTS_RANGE $easy_range
|
|
Packit |
db3073 |
|
|
Packit |
db3073 |
static const guchar g_script_easy_table[$easy_range] = {
|
|
Packit |
db3073 |
EOT
|
|
Packit |
db3073 |
|
|
Packit |
db3073 |
$i = 0;
|
|
Packit |
db3073 |
$end = -1;
|
|
Packit |
db3073 |
|
|
Packit |
db3073 |
for (my $c = 0; $c < $easy_range; $c++) {
|
|
Packit |
db3073 |
|
|
Packit |
db3073 |
if ($c % 3 == 0) {
|
|
Packit |
db3073 |
printf "\n ";
|
|
Packit |
db3073 |
}
|
|
Packit |
db3073 |
|
|
Packit |
db3073 |
if ($c > $end) {
|
|
Packit |
db3073 |
$start = $ranges[$i]->[0];
|
|
Packit |
db3073 |
$end = $ranges[$i]->[1];
|
|
Packit |
db3073 |
$script = $ranges[$i]->[2];
|
|
Packit |
db3073 |
$i++;
|
|
Packit |
db3073 |
}
|
|
Packit |
db3073 |
|
|
Packit |
db3073 |
if ($c < $start) {
|
|
Packit |
db3073 |
printf " G_UNICODE_SCRIPT_UNKNOWN,";
|
|
Packit |
db3073 |
} else {
|
|
Packit |
db3073 |
printf " G_UNICODE_SCRIPT_%s,", $script;
|
|
Packit |
db3073 |
}
|
|
Packit |
db3073 |
}
|
|
Packit |
db3073 |
|
|
Packit |
db3073 |
if ($end >= $easy_range) {
|
|
Packit |
db3073 |
$i--;
|
|
Packit |
db3073 |
$ranges[$i]->[0] = $easy_range;
|
|
Packit |
db3073 |
}
|
|
Packit |
db3073 |
|
|
Packit |
db3073 |
|
|
Packit |
db3073 |
print <<"EOT";
|
|
Packit |
db3073 |
|
|
Packit |
db3073 |
};
|
|
Packit |
db3073 |
|
|
Packit |
db3073 |
static const struct {
|
|
Packit |
db3073 |
gunichar start;
|
|
Packit |
db3073 |
guint16 chars;
|
|
Packit |
db3073 |
guint16 script;
|
|
Packit |
db3073 |
} g_script_table[] = {
|
|
Packit |
db3073 |
EOT
|
|
Packit |
db3073 |
|
|
Packit |
db3073 |
for (; $i <= $#ranges; $i++) {
|
|
Packit |
db3073 |
$start = $ranges[$i]->[0];
|
|
Packit |
db3073 |
$end = $ranges[$i]->[1];
|
|
Packit |
db3073 |
$script = $ranges[$i]->[2];
|
|
Packit |
db3073 |
|
|
Packit |
db3073 |
while ($i <= $#ranges - 1 &&
|
|
Packit |
db3073 |
$ranges[$i + 1]->[0] == $end + 1 &&
|
|
Packit |
db3073 |
$ranges[$i + 1]->[2] eq $script) {
|
|
Packit |
db3073 |
$i++;
|
|
Packit |
db3073 |
$end = $ranges[$i]->[1];
|
|
Packit |
db3073 |
}
|
|
Packit |
db3073 |
|
|
Packit |
db3073 |
printf " { %#06x, %5d, G_UNICODE_SCRIPT_%s },\n", $start, $end - $start + 1, $script;
|
|
Packit |
db3073 |
}
|
|
Packit |
db3073 |
|
|
Packit |
db3073 |
printf "};\n";
|
|
Packit |
db3073 |
|