X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ian/git?p=subdirmk.git;a=blobdiff_plain;f=generate;h=b564260dea4c02e4385fc0b36974e04efbddf718;hp=22789281b5e8b620cf8f2b843f5aab2e02b67308;hb=2c8db0f89fdcb949f0e8f82a223bca194a7a28c8;hpb=4f0ba0e06ccac804cf0dcc9b9d8c3628e35d2336 diff --git a/generate b/generate index 2278928..b564260 100755 --- a/generate +++ b/generate @@ -3,6 +3,7 @@ # subdirmk - &-filter (makefile generation program) # Copyright 2019 Ian Jackson # SPDX-License-Identifier: LGPL-2.0-or-later +# There is NO WARRANTY. # # $(srcdir)/subdirmk/generate [--srcdir=SRCDIR] [--] SUBDIR... # @@ -187,7 +188,9 @@ our %warn_unk; sub err ($) { my ($m) = @_; - die "subdirmk: ${err_file}:$.: $m\n"; + die defined $err_file + ? "subdirmk: ${err_file}:$.: $m\n" + : "subdirmk: $m\n"; } sub wrncore ($$) { @@ -263,8 +266,8 @@ 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; + my $exp = !!$varref_exp{$vn}{$amp}; + $varref{$vn}{$exp}{$amp}{"$f:$."} = 1; }; while (<$input>) { @@ -296,8 +299,9 @@ sub process_input_mk ($$$$) { next; } elsif (s#^\s*$esc\:local\+global\s+(\S.*)$##) { foreach my $vn (split /\s+/, $1) { + my $pos = !($vn =~ s{^!}{}); my $amp = $vn =~ s{^$esc}{}; - $varref_exp{$vn}{!!$amp} = 1; + $varref_exp{$vn}{!!$amp} = $pos; } next; } elsif (s#^\s*$esc\:(?=(-?)include|macro)##) { @@ -367,11 +371,13 @@ sub process_input_mk ($$$$) { $note_varref->($2,!!$1) if m{^($esc)?([^()\$]+\))}; } elsif (s{^\$(\d+)}{}) { ddbl_only($&); oud "\${$1}"; } - elsif (s{^\$\{}{}) { + elsif (s{^\(\s*$esc(?=$lc_re)}{}) { od "\$(call ${var_prefix}" } + elsif (s{^\(\s*(?=\S)}{} ) { od "\$(call " } + elsif (s{^\{}{}) { err 'macro invocation cannot be re-$-doubled' if $ddbl; od '${eval ${call '; $evalcall_brackets = 1; - $push_nest->('eval',1, '&${...}'); + $push_nest->('eval',1, '&{...}'); $note_varref->($2,!!$1) if m{^\s*($esc)?([^,{}\$]+)}; } elsif (s{^([~^]?)(?=[ \t])}{}) { my $prefix = $pfxmap{$1} // die "internal error ($1?)"; @@ -529,15 +535,20 @@ sub flmap ($) { local ($_) = @_; s{:(\d+)$}{ sprintf ":%10d", $1 }e; $_; } sub print_varref_warnings () { foreach my $vn (sort keys %varref) { my $vv = $varref{$vn}; - next unless $vv->{''} && $vv->{1}; + next unless $vv->{''}{''} && $vv->{''}{1}; wrncore 'local+global', "saw both $vn and &$vn" or return; + foreach my $exp ('', 1) { foreach my $amp ('', 1) { - printf STDERR " saw %s%s at %s\n", + printf STDERR + ($exp + ? " expectedly saw %s%s at %s\n" + : " saw %s%s at %s\n"), ($amp ? '&' : ''), $vn, $_ foreach sort { flmap($a) cmp flmap($b) } - keys %{ $vv->{$amp} }; + keys %{ $vv->{$exp}{$amp} }; } + } } }