chiark / gitweb /
doctests: Rename `desc' etc. in extract-doctest from `rubric'
[subdirmk.git] / generate
index c608e8c6947366711f0c79f345cdbadbae01c0a4..ec478665e89f954385f3ea5df1d2f8e3fcc49e7a 100755 (executable)
--- 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,6 +179,8 @@ sub process_input_mk ($$$$) {
                 );
     $pfxmap{$_} = $srcdirmap{$_}.'/' foreach keys %srcdirmap;
 
+    local $ddbl;
+
     while (<$input>) {
        if (s#^\s*$esc\:changequote\s+(\S+)\s+$##) {
            $$esclitr = $1;
@@ -180,10 +196,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 +211,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='';