eval 'exec /usr/contrib/bin/perl -S $0 ${1+"$@"}'
if $running_under_some_shell;
$bin = '/usr/contrib/bin';
# $RCSfile: s2p.SH,v $$Revision: 4.0.1.2 $$Date: 92/06/08 17:26:31 $
# Revision 4.0.1.2 92/06/08 17:26:31 lwall
# patch20: s2p didn't output portable startup code
# patch20: added ... as variant on ..
# patch20: s2p didn't translate s/pat/\&/ or s/pat/\$/ or s/pat/\\1/ right
# Revision 4.0.1.1 91/06/07 12:19:18 lwall
# patch4: s2p now handles embedded newlines better and optimizes common idioms
# Revision 4.0 91/03/20 01:57:59 lwall
while ($ARGV[0] =~ /^-/) {
die "I don't recognize this switch: $_\n";
open(BODY,">/tmp/sperl$$") ||
&Die("Can't open temp file: $!\n");
if (!$assumen && !$assumep) {
: while ($ARGV[0] =~ /^-/) {
: die "I don't recognize this switch: $_\\n";
: $printit++ unless $nflag;
: $\ = "\n"; # automatically add newline on print
: while (chop($_ = <>)) {
# Wipe out surrounding whitespace.
# Perhaps it's a label/comment.
$label = &make_label($_);
if (/^(top|(re)?start|redo|begin(ning)|again|input)$/i) {
redo LINE; # Never referenced, so delete it if not a comment.
if ($lastlinewaslabel++) {
# Look for one or two address clauses
$addr1 = "\$. == $addr1" unless /^,/;
&Die("Invalid second address at line $.\n");
# Now we check for metacommands {, }, and ! and worry
if (s/^{//) { # a } to keep vi happy
$space = ' ' x $shiftwidth;
# See if we can optimize to modifier form.
if ($_ !~ /[\n{}]/ && $rmaybe && !$change &&
$_ !~ / if / && $_ !~ / unless /) {
$_ = substr($_,$shiftwidth,1000);
$_ = "$if ($addr1) $l\n$change$_$rmaybe";
if ($lastlinewaslabel++) {
if ($appendseen || $tseen || !$assumen) {
$printit++ if $dseen || (!$assumen && !$assumep);
: { $printit++ unless $nflag; }
: if ($atext) { chop $atext; print $atext; $atext = ''; }
open(HEAD,">/tmp/sperl2$$.c")
|| &Die("Can't open temp file 2: $!\n");
print HEAD "#define PRINTIT\n" if $printit;
print HEAD "#define APPENDSEEN\n" if $appendseen;
print HEAD "#define TSEEN\n" if $tseen;
print HEAD "#define DSEEN\n" if $dseen;
print HEAD "#define ASSUMEN\n" if $assumen;
print HEAD "#define ASSUMEP\n" if $assumep;
print HEAD "#define TOPLABEL\n" if $toplabel;
print HEAD "#define SAWNEXT\n" if $sawnext;
if ($opens) {print HEAD "$opens\n";}
open(BODY,"/tmp/sperl$$")
|| &Die("Can't reopen temp file: $!\n");
: eval 'exec $bin/perl -S \$0 \${1+"\$@"}'
: if \$running_under_some_shell;
open(BODY,"cc -E /tmp/sperl2$$.c |") ||
&Die("Can't reopen temp file: $!\n");
unlink "sperl$$", "sperl2$$", "sperl2$$.c";
"\t" x ($indent / 8) . ' ' x ($indent % 8);
$_ = "FH_" . $_ if /^\d/;
for ($tmp = "a"; $fhseen{"$_$tmp"}; $a++) {}
: open($_, '>$fname') || die "Can't create $fname: \$!";
$label =~ s/[^a-zA-Z0-9]/_/g;
if ($label =~ /^[0-9_]/) { $label = 'L' . $label; }
$label = substr($label,0,8);
# Could be a reserved word, so capitalize it.
substr($label,0,1) =~ y/a-z/A-Z/
: { $printit++ unless $nflag; }
: if ($atext) {chop $atext; print $atext; $atext = '';}
$command = $space . "\$atext .= <<'End_Of_Text';\n<<--";
unless (s|\\$||) { $lastline = 1;}
$_ = $command . "End_Of_Text";
if (/^c/) { $change = 1; }
$addr1 = 1 if $addr1 eq '';
$addr1 = '$iter = (' . $addr1 . ')';
" if (\$iter == 1) { print <<'End_Of_Text'; }\n<<--";
unless (s/\\$//) { $lastline = 1;}
$_ = $command . "End_Of_Text";
for ($i = 2; $i < $len; $i++) {
substr($_, $i, 0) = '\\';
$_ = substr($_,0,--$len);
elsif (substr($_,$i,1) =~ /^[n]$/) {
substr($_,$i,1) =~ /^[(){}\w]$/) {
substr($_,$i,1) =~ /^[<>]$/) {
elsif ($repl && substr($_,$i,1) =~ /^\d$/) {
elsif ($c eq '&' && $repl) {
elsif ($c eq '$' && $repl) {
substr($_, $i, 0) = '\\';
elsif ($c eq '[' && !$repl) {
$i++ if substr($_,$i,1) eq '^';
$i++ if substr($_,$i,1) eq ']';
substr($_, $i, 1) = '\\t';
elsif (!$repl && index("()+",$c) >= 0) {
substr($_, $i, 0) = '\\';
&Die("Malformed substitution at line $.\n")
$pat = substr($_, 0, $repl + 1);
$repl = substr($_, $repl+1, $end-$repl-1);
$end = substr($_, $end + 1, 1000);
$subst = "$pat$repl$delim";
if ($end =~ s/^w[ \t]*//) {
$fh = &make_filehandle($end);
$cmd .= " && (print $fh \$_)";
&Die("Unrecognized substitution command".
: $subst && \$tflag++$cmd;
$fh = &make_filehandle($_);
$_ = "\$atext .= `cat $file 2>/dev/null`;";
$_ = 'print $1 if /^(.*)/;';
: chop if $len1 < length;
$_ = '$hold .= "\n"; $hold .= $_;';
$_ = '$_ .= "\n"; $_ .= $hold;';
$_ = '($_, $hold) = ($hold, $_);';
$_ = 'next LINE if $tflag;';
$_ = q/if ($tflag) {$tflag = 0; /;
s/abcdefghijklmnopqrstuvwxyz/a-z/g;
s/ABCDEFGHIJKLMNOPQRSTUVWXYZ/A-Z/g;
local($prefix,$delim,$ch);
# Process pattern one potential delimiter at a time.
DELIM: while (s#^([^\]+(|)[\\/]*)([]+(|)[\\/])##) {
$delim = '' if $ch =~ /^[(){}A-Za-mo-z]$/;
$ch = 'b' if $ch =~ /^[<>]$/;
s/^\^// && ($delim .= '^');
s/^]// && ($delim .= ']');
elsif ($inbracket || $delim ne $outer) {
if ($delim eq $outer && !$inbracket) {
$_[0] =~ s/_a-za-z0-9/\\w/ig;
$_[0] =~ s/a-z_a-z0-9/\\w/ig;
$_[0] =~ s/a-za-z_0-9/\\w/ig;
$_[0] =~ s/a-za-z0-9_/\\w/ig;
$_[0] =~ s/_0-9a-za-z/\\w/ig;
$_[0] =~ s/0-9_a-za-z/\\w/ig;
$_[0] =~ s/0-9a-z_a-z/\\w/ig;
$_[0] =~ s/0-9a-za-z_/\\w/ig;
$_[0] =~ s/\[\\w\]/\\w/g;
$_[0] =~ s/\[^\\w\]/\\W/g;
$_[0] =~ s/\[0-9\]/\\d/g;
$_[0] =~ s/\[^0-9\]/\\D/g;
$_[0] =~ s/\\d\\d\*/\\d+/g;
$_[0] =~ s/\\D\\D\*/\\D+/g;
$_[0] =~ s/\\w\\w\*/\\w+/g;
$_[0] =~ s/\\t\\t\*/\\t+/g;
$_[0] =~ s/(\[.[^]]*\])\1\*/$1+/g;
$_[0] =~ s/([\w\s!@#%^&-=,:;'"])\1\*/$1+/g;