chiark / gitweb /
generate: Nested scope: Change `Eval' to `eval'
[subdirmk.git] / generate
index 49038dfbe0ca5a57ca69221eb9f38f2f5b1fc6ef..747a79b8441a740dedeb641886849111c5077c27 100755 (executable)
--- a/generate
+++ b/generate
@@ -218,14 +218,14 @@ sub process_input_mk ($$$$) {
     my @nest = (['']);
 
     my $push_nest = sub {
-       my ($nk, $nndbl) = @_;
-       unshift @nest, [ $nk, $ddbl ];
+       my ($nk, $nndbl, $what) = @_;
+       unshift @nest, [ $nk, $ddbl, $what, $. ];
        $ddbl = $nndbl;
     };
     my $pop_nest = sub {
        my ($nk) = @_;
-       die unless $nest[0][0] eq $nk;
-       # ^ xxx need better message
+       err "unexpectedly closed $nk in middle of $nest[0][0] ($nest[0][2])"
+           unless $nest[0][0] eq $nk;
        $ddbl = (shift @nest)[1];
     };
 
@@ -235,7 +235,7 @@ sub process_input_mk ($$$$) {
            $set_esc->();
            next;
        } elsif (s#^\s*$esc\:endm\s+$##) {
-           $pop_nest->('Macro');
+           $pop_nest->('macro');
            od "endef\n";
            next;
        } elsif (s#^\s*$esc\:(?=(-?)include|macro)##) {
@@ -250,7 +250,7 @@ sub process_input_mk ($$$$) {
        for (;;) {
            err 'cannot $-double &-processed RHS of directive'
                if $ddbl && defined $buffering_output;
-           unless ($nest[0][0] eq 'Eval'
+           unless ($nest[0][0] eq 'eval'
                    ? s{^(.*?)($esc|[{}])}{}
                    : s{^(.*?)($esc)}{}) { od $_; last; }
            od $1;
@@ -259,7 +259,7 @@ sub process_input_mk ($$$$) {
                next;
            } elsif ($2 eq '}') {
                next if --$ddbl;
-               $pop_nest->('Eval');
+               $pop_nest->('eval');
                od '}}';
                next;
            }
@@ -282,7 +282,7 @@ sub process_input_mk ($$$$) {
            elsif (s{^\$\{}{}) {
                err 'macro invocation cannot be re-$-doubled' if $ddbl;
                od '${eval ${call ';
-               $push_nest->('Eval',1);
+               $push_nest->('eval',1, '&${...}');
            } elsif (s{^([~^]?)(?=[ \t])}{}) {
                my $prefix = $pfxmap{$1} // die "internal error ($1?)";
                my $after='';
@@ -296,7 +296,8 @@ sub process_input_mk ($$$$) {
                od $_;
                $_ = '';
            } else {
-               err "bad &-escape \`$$esclitr$_'";
+               m{^.{0,5}};
+               err "bad &-escape \`$$esclitr$&'";
            }
        }
        if (defined $buffering_output) {
@@ -308,13 +309,14 @@ sub process_input_mk ($$$$) {
                od "\n";
            } elsif (m#^macro\s+(\S+)\s+$#) {
                od "define $1\n";
-               $push_nest->('Macro', 1);
+               $push_nest->('macro', 1, '&:macro');
            } else {
                die "internal error ($_?)";
            }
        }
     }
-    die "unclosed $nest[0][0]" if $nest[0][0];
+    die "subdirmk: $f:$nest[0][3]: unclosed $nest[0][0] ($nest[0][2])\n"
+       if $nest[0][0];
     $input->error and die "read $f: $!\n";
     close $input or die "close $f: $!\n";
 }