3 package GenericPrepTemplate;
7 # use vars qw($VERSION @ISA @EXPORT @EXPORT_OK %EXPORT_TAGS);
10 # @EXPORT= qw(&process_input);
23 $fh->fdopen(fileno(STDIN),'r') or die;
24 process_fh($fh,'<standard input>');
25 close STDOUT or die "gpt: close stdout: $!\n";
28 sub err ($) { die "gpt: $fn:$lno: $_[0]\n"; }
32 if (@oplist>1) { $substr.= $str; }
33 else { $expr.= $str; }
38 if (@oplist) { $substr.=$str; }
39 else { output($str); }
42 sub process_input () {
43 my ($esc,$top,$want,$fh,$value);
45 print DEBUG "L $fn:$lno:",join('',@oplist),
46 ":`$l' e\`$expr' s\`$substr'\n";
47 if (@oplist & 1) { # scanning perl
48 if ($l =~ m/(.)\@\@/m || $l =~ m/^()\@\@/m) {
49 ($to,$op,$esc,$l) = ($`,$1,$&,$');
51 if ($op =~ m/[ 0-9a-zA-Z_\;\)\}]/ || $op eq '') {
57 print DEBUG "E $fn:$lno:e\`$expr'\n";
60 eval $GenericPrepTemplate::expr;
63 chomp $@; err("error: $@");
65 print DEBUG "E $fn:$lno:v\`$value'\n";
67 $fh= new IO::File $value,'r'
68 or err("cannot open file \`$value': $!");
69 process_fh($fh,$value);
71 } elsif ($top ne '-') {
78 } elsif ($op =~ m/[\(\{]/) {
79 if (@oplist>1) { $substr.= $esc; }
82 err("bad escape sequence $op\@\@ in perl part");
88 } else { # scanning text
89 if ($l =~ m/\@\@(.|\n)/) {
90 ($to,$op,$esc,$l) = ($`,$1,$&,$');
92 if ($op =~ m/[-< \$]/) {
93 $substr.= $esc if @oplist;
95 } elsif ($op =~ m/[\)\}]/) {
96 err("unmatched closing \@\@$op") unless @oplist;
98 $want= $oplist[$#oplist] eq '(' ? ')' : '}';
99 err("found \@\@$op but wanted \@\@$want")
103 # Just finished a substr.
105 $substrs[$substri]= $substr;
106 print DEBUG "S $fn:$lno:S$substri\`$substr'\n";
107 $expr.= ' GenericPrepTemplate::output(' if $op eq '}';
108 $expr.= " GenericPrepTemplate::process_i($substri) ";
109 $expr.= " );\n" if $op eq '}';
115 err("bad escape sequence \@\@$op in text part");
125 sub process_fh ($$) {
126 local ($fh,$fn) = @_;
127 local ($l,$lno, @oplist,$substr,$expr,$to,$op);
129 while (defined ($l= $fh->getline)) {
130 next if $l =~ m,^\#\! ?/\S+/gpt\b, && $.==1;
134 die "gpt: $fn: read error: $!" if $fh->error;
138 if (defined $outbuf) {
139 print DEBUG "O \`$outbuf'+\`$_[0]'\n";
142 print DEBUG "O w\`$_[0]'\n";
143 print STDOUT $_[0] or err("write stdout: $!");
149 local ($l,$fn,$lno) = ($substrs[$i], "$fn<sub#$i>", '');
150 local ($outbuf, @oplist,$substr,$expr,$to,$op);