X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=dgit.git;a=blobdiff_plain;f=i18n-diff-auditor;h=6868ca7d2c8df16f3b6fee1169a3b7c04903e06c;hp=341733b41e43cd9b908db75da2a215ace49e67c6;hb=3193ca2bad512d2563797eca11ceb9d707a65004;hpb=85d9ed1859b0ca7d223f9d2d9077290d69617675 diff --git a/i18n-diff-auditor b/i18n-diff-auditor index 341733b4..6868ca7d 100755 --- a/i18n-diff-auditor +++ b/i18n-diff-auditor @@ -220,6 +220,7 @@ sub semiparse ($) { push @o, { T => 'specvar', E => $&, P => $& }; } elsif (!length) { last; + } elsif (s{^\#.*\n}{}) { } else { m{^.{0,10}}; die "cannot tokenise \`$&'"; @@ -251,8 +252,8 @@ our @analysed_x; our @analysed_y; sub analyse_chunk_core () { + $before //= ''; die "plain deletion\n" unless defined $after; - die "plain insertion\n" unless defined $before; my @xs = semiparse $before; my @ys = semiparse $after; @analysed_x = @analysed_y = (); @@ -267,6 +268,7 @@ sub analyse_chunk_core () { my $next_x = sub { $next_something->(\@xs, \@analysed_x, \$x, 'before'); }; my $next_y = sub { $next_something->(\@ys, \@analysed_y, \$y, 'after' ); }; our @y_expect_suffix = (); + ANALYSE: for (;;) { while (my $e = shift @y_expect_suffix) { $next_y->(); @@ -280,6 +282,24 @@ sub analyse_chunk_core () { next if $x->{E} eq 'sprintf' and $y->{E} eq 'f_'; next if $x->{E} eq 'die' and $y->{E} eq 'confess'; next if $x->{E} eq 'die' and $y->{E} eq 'fail'; + foreach my $with_fh (qw(0 1)) { + next unless $x->{E} eq 'printf'; + next unless $y->{E} eq 'print'; + next unless @xs >= $with_fh; + next unless @ys > $with_fh; + if ($with_fh) { + next unless $xs[0]{E} eq $ys[0]{E}; + next unless + $xs[0]{E} =~ m{^[A-Z]+$} or + $xs[0]{T} eq 'ident' && $xs[0]{E} =~ m{^\$}; + } + next unless $ys[$with_fh]{E} eq 'f_'; + # yay! + $next_x->() if $with_fh; + $next_y->() if $with_fh; + $next_y->(); # f_ + next ANALYSE; + } if ($y->{E} eq '+' and @ys >= 3 and $ys[0]{E} eq '('