chiark / gitweb /
i18n: i18n-diff-auditor: bugfixes
[dgit.git] / i18n-diff-auditor
index 43e1c10953eda12dbfe457c2635b1979738582f1..61d7330f21d03c135355ef157b885e6b08303a71 100755 (executable)
@@ -132,7 +132,7 @@ sub semiparse ($) {
                 (             .* \n    )
                 ( (?: (?! $d) .* \n )* )
                           $d     \n
-              }{ $1 }x or die "missing end of here doc $d\n";
+              }{ $1 }xe or die "missing end of here doc $d\n";
            $o[$#o]{V} = $2;
        } elsif (s{^ (["'])( (?: [^\\'"]
                                | \\ [^"']
@@ -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 },
@@ -217,7 +217,15 @@ sub analyse_chunk_core () {
            and $ys[0]{E} eq '('
            and is_trans($ys[1])) {
            $next_y->(); # (
-           $next_y->(); # __ f_
+           $next_y->(); # __ f_ i_
+           @y_expect_suffix = ')';
+       } elsif ($y->{E} eq '('
+           and @ys > 2
+           and is_trans($ys[0])
+           and @analysed_y
+           and (grep { $_ eq $analysed_y[-1] } (qw( => [ { ? : . ),
+                                                '(', ',') )) {
+           $next_y->(); # __ f_ i_
            @y_expect_suffix = ')';
        }
        my $string_changed;
@@ -225,7 +233,7 @@ sub analyse_chunk_core () {
        if (is_trans($y)) {
            $next_y->();
            die "__ on non-string $y->{P}\n"     unless is_string($y);
-           die "__ on was non-string $y->{P}\n" unless is_string($x);
+           die "__ on was non-string $x->{P}\n" unless is_string($x);
            if ($y->{Q} ne "'") {
                die "var subst in new string\n"
                    if $y->{V} =~ m{(?<!\\) [\$\@]};
@@ -267,6 +275,7 @@ sub analyse_chunk_core () {
                if ($fmt !~ m{\%[^\%]}) {
                    $exactly->($fmt, '(tail)');
                    $fmt = '';
+                   die "text deleted from end of string\n" if length $xs;
                    last;
                }
                $exactly->($`, '(literal)');
@@ -310,6 +319,10 @@ sub analyse_chunk_core () {
                        last;
                    }
                    $xs =~ s{^\s+}{} if $bras;
+                   if (is_string($y) and $y->{Q} eq '"') {
+                       $exactly->($y->{V}, $y->{P});
+                       next;
+                   }
                    $exactly->($y->{E}, $y->{P});
                    if ($y->{T} eq 'bra' or $y->{E} eq '?') {
                        $bras++;