chiark / gitweb /
Syntax: Rescope effect of &:local+global
[secnet.git] / generate
index bae0995bef30dc90fbd19e7cb511d61a0887b99a..22789281b5e8b620cf8f2b843f5aab2e02b67308 100755 (executable)
--- a/generate
+++ b/generate
@@ -153,6 +153,7 @@ END
 }
 
 our %varref;
+our %varref_exp;
 
 our ($dir_prefix, $dir_suffix, $dir_name,
      $var_prefix, $var_prefix_name);
@@ -177,6 +178,7 @@ our @warn_ena_dfl = map { $_ => 1 } qw(
     local+global
     single-char-var
     unknown-warning
+    broken-var-ref
 );
 our %warn_ena = @warn_ena_dfl;
 
@@ -233,8 +235,8 @@ sub process_input_mk ($$$$) {
     local $err_file=$f;
 
     my %srcdirmap = (
-                 '^' => "\$(top_srcdir)${dir_suffix}",
-                 '~' => "\$(top_srcdir)",
+                 '^' => "\${top_srcdir}${dir_suffix}",
+                 '~' => "\${top_srcdir}",
                    );
     my %pfxmap = (
                  ''  => $dir_prefix,
@@ -261,6 +263,7 @@ sub process_input_mk ($$$$) {
     # accurate, since it is only going to be used for advice to the user.
     my $note_varref = sub {
        my ($vn,$amp) = @_;
+       return if $varref_exp{$vn}{$amp};
        $varref{$vn}{$amp}{"$f:$."} = 1;
     };
 
@@ -293,8 +296,8 @@ sub process_input_mk ($$$$) {
            next;
        } elsif (s#^\s*$esc\:local\+global\s+(\S.*)$##) {
            foreach my $vn (split /\s+/, $1) {
-               $vn =~ s{^$esc}{};
-               $varref{$vn}{NoWarn} = 1;
+               my $amp = $vn =~ s{^$esc}{};
+               $varref_exp{$vn}{!!$amp} = 1;
            }
            next;
        } elsif (s#^\s*$esc\:(?=(-?)include|macro)##) {
@@ -332,6 +335,10 @@ sub process_input_mk ($$$$) {
                    wrn 'single-char-var',
                    'possibly confusing unbracketed single-char $-expansion';
                }
+               elsif (m{^$esc}) {
+                   wrn 'broken-var-ref',
+                   'broken $&... expansion; you probably meant &$';
+               }
                elsif (m{^\(($esc)?([^()\$]+)\)} ||
                       m{^\{($esc)?([^{}\$]+)\}}) {
                    $note_varref->($2,!!$1);
@@ -345,7 +352,7 @@ sub process_input_mk ($$$$) {
            elsif (m{^(?=$caps_re)}) { od $var_prefix }
            elsif (s{^\$([A-Za-z]\w+)}{}) {
                $note_varref->($1,1);
-               od "\$(${var_prefix}$1)";
+               od "\${${var_prefix}$1}";
            }
            elsif (s{^([~^]?)(?=$lc_re)}{}) { od $pfxmap{$1} }
            elsif (s{^_}{}) { od $var_prefix }
@@ -356,10 +363,10 @@ sub process_input_mk ($$$$) {
            elsif (s{^\$\-}{}) { $ddbl=undef; }
            elsif (s{^\$\+}{}) { $ddbl=1; }
            elsif (s{^\$\(}{}) {
-               ddbl_only($&); oud "\$(";
+               ddbl_only($&); oud "\${";
                $note_varref->($2,!!$1) if m{^($esc)?([^()\$]+\))};
            }
-           elsif (s{^\$(\d+)}{}) { ddbl_only($&); oud "\$($1)"; }
+           elsif (s{^\$(\d+)}{}) { ddbl_only($&); oud "\${$1}"; }
            elsif (s{^\$\{}{}) {
                err 'macro invocation cannot be re-$-doubled' if $ddbl;
                od '${eval ${call ';
@@ -430,6 +437,8 @@ sub process_subtree ($$) {
     #use Data::Dumper;
     #print STDERR Dumper(\@_);
 
+    local %varref_exp;
+
     my $dir_prefix = dir_prefix($path);
     # ^ this is the only var which we need before we come back from
     #   the recursion.
@@ -521,7 +530,6 @@ sub print_varref_warnings () {
     foreach my $vn (sort keys %varref) {
        my $vv = $varref{$vn};
        next unless $vv->{''} && $vv->{1};
-       next if $vv->{NoWarn};
        wrncore 'local+global', "saw both $vn and &$vn" or return;
        foreach my $amp ('', 1) {
            printf STDERR " saw %s%s at %s\n",