X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=i18n-diff-auditor;h=42ebe00d9dbc85f6c1937ad1df92ee89d29921cc;hb=3863dba15266045f598312bb14306f4b43a3ca13;hp=853dccea8b4ab009d7584a9f33e5b573a4430d44;hpb=67b53825cca42bd6dd3514a8625b77ed2c94ecc2;p=dgit.git diff --git a/i18n-diff-auditor b/i18n-diff-auditor index 853dccea..42ebe00d 100755 --- a/i18n-diff-auditor +++ b/i18n-diff-auditor @@ -144,9 +144,9 @@ sub semiparse ($) { Q => $q, V => $v}; } elsif (s{^$perlop_re|^\;}{}) { push @o, { T => 'op', E => $&, P => $& }; - } elsif (s/[[{(]//) { + } elsif (s/^[[{(]//) { push @o, { T => 'bra', E => $&, P => $& }; - } elsif (s/[]})]//) { + } elsif (s/^[]})]//) { push @o, { T => 'ket', E => $&, P => $& }; } elsif (s/^( [\$\@\%] )( \{ )//x) { push @o, { T => 'deref', E => $1, P => $1 }, @@ -160,9 +160,10 @@ sub semiparse ($) { die "cannot tokenise \`$&'"; } } - for (my $i=@o-2; $i>0; --$i) { + for (my $i=0; $i+2 < @o; $i++) { next unless $o[$i+1]{E} eq '.'; my @inputs = @o[$i, $i+2]; + #print STDERR Dumper(\@inputs); next if grep { !is_string($_) } @inputs; my $q = $inputs[0]{Q}; next if grep { $_->{Q} ne $q } @inputs; @@ -173,6 +174,7 @@ sub semiparse ($) { Q => $q, }; @o = (@o[0..$i-1], $new, @o[$i+3..$#o]); + $i--; # counteracts $i++ } debug $ichunkstart, "semiparsed: ".join ' ', map { $_->{P} } @o; return @o; @@ -208,6 +210,8 @@ sub analyse_chunk_core () { $next_x->(); $next_y->(); next if $x->{E} eq $y->{E}; + next if $x->{E} eq 'sprintf' and $y->{E} eq 'f_'; + next if $x->{E} eq 'die' and $y->{E} eq 'confess'; if ($y->{E} eq '+' and @ys >= 3 and $ys[0]{E} eq '(' @@ -252,8 +256,8 @@ sub analyse_chunk_core () { my ($lit, $what) = @_; my $xl = substr($xs, 0, length($lit)); if ($xl ne $lit) { - debug $ichunkstart, "not exactly x: ..\"$xs\""; - debug $ichunkstart, "not exactly y: $lit"; + debug $ichunkstart, "not exactly x: \"..$xs\""; + debug $ichunkstart, "not exactly y: $lit"; my $next = @ys ? $ys[0]{P} : '(end)'; die "string contents mismatch near $what before $next\n"; } @@ -271,6 +275,15 @@ sub analyse_chunk_core () { elsif ($& ne '%s') { die "unhandled %-subst $&\n"; } $next_y->(); die "expected comma, got $y->{P}\n" unless $y->{E} eq ','; + if (!length $fmt and + !length $xs and + @xs and + $xs[0]{E} eq '.') { + # X has "" . + # Y has "%s" [other args] , + $next_x->(); # eat the '.' + next; + } if ($xs =~ m{^\@}) { $next_y->(); die "\@... => not string" unless is_string($y); @@ -296,7 +309,7 @@ sub analyse_chunk_core () { pop @analysed_y; last; } - $xs =~ s{^\s+}{}; + $xs =~ s{^\s+}{} if $bras; $exactly->($y->{E}, $y->{P}); if ($y->{T} eq 'bra' or $y->{E} eq '?') { $bras++;