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];
};
$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)##) {
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;
next;
} elsif ($2 eq '}') {
next if --$ddbl;
- $pop_nest->('Eval');
+ $pop_nest->('eval');
od '}}';
next;
}
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='';
od $_;
$_ = '';
} else {
- err "bad &-escape \`$$esclitr$_'";
+ m{^.{0,5}};
+ err "bad &-escape \`$$esclitr$&'";
}
}
if (defined $buffering_output) {
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";
}