Blame glib/glib/gen-script-table.pl

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