X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ian/git?p=subdirmk.git;a=blobdiff_plain;f=generate;h=3ccfa0dd090673a2f4a04d1bd799450a191fd025;hp=c608e8c6947366711f0c79f345cdbadbae01c0a4;hb=3177fb7abb48479332cce56b02b6407968fb2d27;hpb=c5f8817d9d03784e0da59d7957ec49d3dbd8ea48 diff --git a/generate b/generate index c608e8c..3ccfa0d 100755 --- a/generate +++ b/generate @@ -74,7 +74,7 @@ sub oraw { print O @_ or die "error writing $writing_output.tmp: $!\n"; } -sub od { # maybe $-doubled +sub oud { # undoubled if (defined $buffering_output) { $buffering_output .= $_ foreach @_; return; @@ -82,6 +82,20 @@ sub od { # maybe $-doubled oraw @_; } +our $ddbl; + +sub od { # maybe $-doubled + if (!$ddbl) { + oud @_; + return; + } + foreach (@_) { + my $e = $_; + $e =~ s{\$}{\$\$}g; + oud $e; + } +} + sub start_output_file ($) { close_any_output_file(); ($writing_output) = @_; @@ -165,12 +179,30 @@ sub process_input_mk ($$$$) { ); $pfxmap{$_} = $srcdirmap{$_}.'/' foreach keys %srcdirmap; + local $ddbl; + my @nest; + + my $push_nest = sub { + my ($nk, $nndbl) = @_; + unshift @nest, [ $nk, $ddbl ]; + $ddbl = $nndbl; + }; + my $pop_nest = sub { + my ($nk) = @_; + die unless $nest[0][0] eq $nk; + $ddbl = (shift @nest)[1]; + }; + while (<$input>) { if (s#^\s*$esc\:changequote\s+(\S+)\s+$##) { $$esclitr = $1; $set_esc->(); next; - } elsif (s#^\s*$esc\:(?=(-?)include)##) { + } elsif (s#^\s*$esc\:endm\s+$##) { + $pop_nest->('Macro'); + od "endef\n"; + next; + } elsif (s#^\s*$esc\:(?=(-?)include|macro)##) { $buffering_output=''; } elsif (m#^\s*$esc\:([a-z][-0-9a-z_]*)#) { die "unknown directive $1"; @@ -180,10 +212,11 @@ sub process_input_mk ($$$$) { $targets->{$t} //= [ ]; } for (;;) { + die if $ddbl && defined $buffering_output; unless (s{^(.*?)$esc}{}) { od $_; last; } od $1; if (s{^\\$esc}{}) { od "$$esclitr" } - elsif (s{^\\\$}{}) { od '$' } + elsif (s{^\\\$}{}) { oud '$' } elsif (s{^\\\s+$}{}) { } elsif (s{^$esc}{}) { od "$$esclitr$$esclitr" } elsif (m{^(?=$caps_re)}) { od $var_prefix } @@ -194,6 +227,10 @@ sub process_input_mk ($$$$) { elsif (s{^([~^]?)/}{}) { od $pfxmap{$1} } elsif (s{^\.}{}) { od $dir_name } elsif (s{^([~^])\.}{}) { od $srcdirmap{$1} } + elsif (s{^\$\-}{}) { $ddbl=undef; } + elsif (s{^\$\+}{}) { $ddbl=1; } + elsif (s{^\$\(}{}) { die unless $ddbl; oud "\$("; } + elsif (s{^\$(\d+)}{}) { die unless $ddbl; oud "\$($1)"; } elsif (s{^([~^]?)(?=[ \t])}{}) { my $prefix = $pfxmap{$1} // die; my $after=''; @@ -217,6 +254,9 @@ sub process_input_mk ($$$$) { my $subf = "$srcdir/$2"; process_input_mk($targets, $subf, $esclitr, $1); od "\n"; + } elsif (m#^macro\s+(\S+)\s+$#) { + od "define $1\n"; + $push_nest->('Macro', 1); } else { die "internal error buffering directive $_ "; }