X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ian/git?a=blobdiff_plain;f=generate;h=84572edc2ef842e0ceffacd884aa306851518831;hb=143bb5d7dfa60aa0549d934a2e9356961d97895a;hp=2e77df3749084dc480b997e9bb83fdcb3329178a;hpb=e8d42d59cf11aaace6b7833ae3274314a15e4250;p=subdirmk.git diff --git a/generate b/generate index 2e77df3..84572ed 100755 --- a/generate +++ b/generate @@ -19,6 +19,22 @@ print "$0 @ARGV\n" or die $!; our $srcdir='.'; +# error handling methods: +# +# Error in input file, while $err_file and $. set, eg in most of +# process_input_mk: +# err "message"; +# +# Other input or usage errors: +# die "$0: $file:$lno: problem\n"; +# die "$0: some problem not locatable in that way\n"; +# +# System call error (not ENOENT) accessing input/output files: +# die "description of problem eg maybe erbing noun: $!\n"; +# +# Bug detedcted in `generate': +# die "internal error (some information)?"; # or similar + while (@ARGV && $ARGV[0] =~ m/^-/) { $_ = shift @ARGV; last if $_ eq '--'; @@ -149,6 +165,19 @@ sub set_dir_vars ($) { $var_prefix = "${var_prefix_name}_"; } +our $err_file; + +sub err ($) { + my ($m) = @_; + die "$0: ${err_file}:$.: $m\n"; +} + +sub ddbl_only ($) { + my ($e) = @_; + return if $ddbl; + err "escape &$e is valid only during \$-doubling"; +} + sub process_input_mk ($$$$); sub process_input_mk ($$$$) { my ($targets, $f, $esclitr, $enoent_ok) = @_; @@ -170,6 +199,8 @@ sub process_input_mk ($$$$) { } $input_files{$f}++; + local $err_file=$f; + my %srcdirmap = ( '^' => "\$(top_srcdir)${dir_suffix}", '~' => "\$(top_srcdir)", @@ -180,7 +211,7 @@ sub process_input_mk ($$$$) { $pfxmap{$_} = $srcdirmap{$_}.'/' foreach keys %srcdirmap; local $ddbl; - my @nest; + my @nest = (['']); my $push_nest = sub { my ($nk, $nndbl) = @_; @@ -213,7 +244,7 @@ sub process_input_mk ($$$$) { } for (;;) { die if $ddbl && defined $buffering_output; - unless (@nest && $nest[0][0] eq 'Eval' + unless ($nest[0][0] eq 'Eval' ? s{^(.*?)($esc|[{}])}{} : s{^(.*?)($esc)}{}) { od $_; last; } od $1; @@ -277,7 +308,7 @@ sub process_input_mk ($$$$) { } } } - die "unclosed $nest[0][0]" if @nest; + die "unclosed $nest[0][0]" if $nest[0][0]; $input->error and die "read $f: $!\n"; close $input or die "close $f: $!\n"; }