-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathdumpout.def
117 lines (106 loc) · 3.42 KB
/
dumpout.def
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
include: macros_util/debug.def
# include: macros_util/makestring.def
page: dumpout
type: pm
output_dir: lib/MyDef
package: MyDef::dumpout
$sub dumpout
my $dump=shift;
my $f=$dump->{f};
my $out=$dump->{out};
my $custom=$dump->{custom};
$if !$out
die "missing \$out\n";
$call dumpout
# ---------------
1;
#----------------------------------------
#---- dumpout: @$out --> @$f ------
subcode: dumpout
my @source_stack;
my $indentation=0
my @indentation_stack
DUMP_STUB dumpout_init
$while 1
$if !@$out
$out=pop @source_stack;
$if !$out
last;
$else
next;
my $l=shift @$out;
$if $l=~/^\s*\\x[0-9a-f]+\b/
$l=~s/\\x([0-9a-f]+)\b/chr(hex($1))/ie # use leading \x23 to passthru # comments
# $call @debug_dumpout, 50
$case $l =~/^INCLUDE_FILE (\S+)/
# used to insert long docs with the functions
&call open_r, $1
push @$f, $_
next
$elif $l =~/^INCLUDE_BLOCK (\S+)/
push @source_stack, $out
$out=$dump->{$1}
$elif $l =~ /^DUMP_STUB\s+([\w\-]+)/
my $source=$MyDef::compileutil::named_blocks{$1}
$if $source
push @source_stack, $out
$out=$source
$elif $l =~ /^INSERT_STUB\[(.*)\]\s+([\w\-]+)/ -> $sep, $name
my $source=$MyDef::compileutil::named_blocks{$name}
$if $source
my $i=$#$f
$while $i>=0 && $f->[$i]!~/\{STUB\}/
$i--
$if $i>=0
my $t = join ($sep, @$source)
$f->[$i]=~s/\{STUB\}/$t/g
$elif $l=~/^(INDENT|DEDENT|PUSHDENT|POPDENT)\b(.*)/
$if $1 eq "INDENT"
$indentation++;
$elif $1 eq "DEDENT"
$indentation-- if $indentation;
$elif $1 eq "PUSHDENT"
push @indentation_stack, $indentation
$indentation=0
$elif $1 eq "POPDENT"
$indentation=pop @indentation_stack
$l=$2;
$if $l=~/^\s*;?$/
next;
$else
unshift @$out, $l;
next;
$elif $l=~/^SOURCE_INDENT/
$indentation++;
$elif $l=~/^SOURCE_DEDENT/
$indentation-- if $indentation;
$elif $l=~/^BLOCK_(\d+)/
push @source_stack, $out;
$out=MyDef::compileutil::fetch_output($1);
#$elif $l=~/^SCOPE:/
$elif $l=~/^SUBBLOCK (BEGIN|END)/
# messages from compileutil.pm
$elif $l=~/^NOOP/
# messages from compileutil.pm
$call @dumpout_make_string
$else NoWarn
$call print_line
subcode: print_line
$if $l=~/^\s*(NEWLINE\b.*)?$/
$if $1 eq "NEWLINE?"
# prevent multiple empty lines
$if $f->[-1] ne "\n"
push @$f, "\n"
$elif $1
push @$f, "\n"
$else
# likely from template
push @$f, $l
$elif $l=~/^<-\|(.*)/ # e.g. C preprocessing
push @$f, "$1\n"
$else
chomp $l
push @$f, " "x$indentation."$l\n"
subcode: debug_dumpout(N)
$if $#$f <$(N)
$print dumpout $out: [$l]