Make genlang faster by doing better regexes.

With this change generating all languages takes only two-thirds the
time. It changes the acceptable syntax for target wildcards in language
files, however: instead of a comma-separated list of glob-style
wildcards it requires that it be a comma-separated list of prefix
matches, i.e. the * can only appear at the end of each wildcard, and ?
cannot be used. This does not require any changes to existing language
files as they are all already in this form.

git-svn-id: svn://svn.rockbox.org/rockbox/trunk@30481 a1c6a512-1295-4272-9138-f99709370657
This commit is contained in:
Thomas Martitz 2011-09-08 14:37:50 +00:00
parent 87daeae7c2
commit 82acdd3e1c

View file

@ -121,7 +121,23 @@ if(!$target && !$update && !$sortfile) {
print STDERR "Please specify a target (with -t)!\n"; print STDERR "Please specify a target (with -t)!\n";
exit; exit;
} }
my @target_parts = split ':', $target;
# Build up a regex which can be applied to target wildcard lists. We only need
# to support prefix matches, so a target parameter of foo:bar can be expanded
# to the regex "\*|f\*|fo\*|foo|b\*|ba\*|bar" and applied to the wildcard list
# (plus end-of-string or commas on either side). The regex engine should
# discard any duplicates generated for us in the process of constructing the
# state machine, so we don't bother to check.
my $target_regex = "(?:^|,) *(?:\\*";
foreach my $target_part (split ':', $target) {
for (my $c=1; $c<length $target_part; $c++) {
my $partial = substr $target_part, 0, $c;
$target_regex .= "|$partial\\*";
}
$target_regex .= "|$target_part";
}
$target_regex .= ") *(?:,|\$)";
$target_regex = qr/$target_regex/;
my $binpath = ""; my $binpath = "";
if ($binary =~ m|(.*)/[^/]+|) { if ($binary =~ m|(.*)/[^/]+|) {
@ -178,21 +194,10 @@ sub options {
sub parsetarget { sub parsetarget {
my ($debug, $strref, $full, $n, $v)=@_; my ($debug, $strref, $full, $n, $v)=@_;
my $string; my $string;
my @all= split(" *, *", $n); if ($n =~ $target_regex) {
my $test; $string = $v;
for $test (@all) { $$strref = $string;
$test =~ s/\*/.*/g; return $string;
$test =~ s/\?/./g;
# print "TEST ($debug) $target for $test\n";
for my $part (@target_parts) {
if($part =~ /^$test\z/) {
$string = $v;
# print "MATCH: $test => $v\n";
$$strref = $string;
return $string;
}
}
} }
} }