Source code of Windows XP (NT5)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

823 lines
15 KiB

  1. @rem = '--*-Perl-*--
  2. @echo off
  3. if "%OS%" == "Windows_NT" goto WinNT
  4. perl -x -S "%0" %1 %2 %3 %4 %5 %6 %7 %8 %9
  5. goto endofperl
  6. :WinNT
  7. perl -x -S "%0" %*
  8. if NOT "%COMSPEC%" == "%SystemRoot%\system32\cmd.exe" goto endofperl
  9. if %errorlevel% == 9009 echo You do not have Perl in your PATH.
  10. goto endofperl
  11. @rem ';
  12. #!perl
  13. #line 14
  14. eval 'exec P:\Apps\ActivePerl\temp\bin\MSWin32-x86-object\perl.exe -S $0 ${1+"$@"}'
  15. if $running_under_some_shell;
  16. $startperl = "#!perl";
  17. $perlpath = "P:\Apps\ActivePerl\temp\bin\MSWin32-x86-object\perl.exe";
  18. # $RCSfile: s2p.SH,v $$Revision: 4.1 $$Date: 92/08/07 18:29:23 $
  19. #
  20. # $Log: s2p.SH,v $
  21. =head1 NAME
  22. s2p - Sed to Perl translator
  23. =head1 SYNOPSIS
  24. B<s2p [options] filename>
  25. =head1 DESCRIPTION
  26. I<S2p> takes a sed script specified on the command line (or from
  27. standard input) and produces a comparable I<perl> script on the
  28. standard output.
  29. =head2 Options
  30. Options include:
  31. =over 5
  32. =item B<-DE<lt>numberE<gt>>
  33. sets debugging flags.
  34. =item B<-n>
  35. specifies that this sed script was always invoked with a B<sed -n>.
  36. Otherwise a switch parser is prepended to the front of the script.
  37. =item B<-p>
  38. specifies that this sed script was never invoked with a B<sed -n>.
  39. Otherwise a switch parser is prepended to the front of the script.
  40. =back
  41. =head2 Considerations
  42. The perl script produced looks very sed-ish, and there may very well
  43. be better ways to express what you want to do in perl. For instance,
  44. s2p does not make any use of the split operator, but you might want
  45. to.
  46. The perl script you end up with may be either faster or slower than
  47. the original sed script. If you're only interested in speed you'll
  48. just have to try it both ways. Of course, if you want to do something
  49. sed doesn't do, you have no choice. It's often possible to speed up
  50. the perl script by various methods, such as deleting all references to
  51. $\ and chop.
  52. =head1 ENVIRONMENT
  53. S2p uses no environment variables.
  54. =head1 AUTHOR
  55. Larry Wall E<lt>F<[email protected]>E<gt>
  56. =head1 FILES
  57. =head1 SEE ALSO
  58. perl The perl compiler/interpreter
  59. a2p awk to perl translator
  60. =head1 DIAGNOSTICS
  61. =head1 BUGS
  62. =cut
  63. $indent = 4;
  64. $shiftwidth = 4;
  65. $l = '{'; $r = '}';
  66. while ($ARGV[0] =~ /^-/) {
  67. $_ = shift;
  68. last if /^--/;
  69. if (/^-D/) {
  70. $debug++;
  71. open(BODY,'>-');
  72. next;
  73. }
  74. if (/^-n/) {
  75. $assumen++;
  76. next;
  77. }
  78. if (/^-p/) {
  79. $assumep++;
  80. next;
  81. }
  82. die "I don't recognize this switch: $_\n";
  83. }
  84. unless ($debug) {
  85. open(BODY,"+>/tmp/sperl$$") ||
  86. &Die("Can't open temp file: $!\n");
  87. }
  88. if (!$assumen && !$assumep) {
  89. print BODY &q(<<'EOT');
  90. : while ($ARGV[0] =~ /^-/) {
  91. : $_ = shift;
  92. : last if /^--/;
  93. : if (/^-n/) {
  94. : $nflag++;
  95. : next;
  96. : }
  97. : die "I don't recognize this switch: $_\\n";
  98. : }
  99. :
  100. EOT
  101. }
  102. print BODY &q(<<'EOT');
  103. : #ifdef PRINTIT
  104. : #ifdef ASSUMEP
  105. : $printit++;
  106. : #else
  107. : $printit++ unless $nflag;
  108. : #endif
  109. : #endif
  110. : <><>
  111. : $\ = "\n"; # automatically add newline on print
  112. : <><>
  113. : #ifdef TOPLABEL
  114. : LINE:
  115. : while (chop($_ = <>)) {
  116. : #else
  117. : LINE:
  118. : while (<>) {
  119. : chop;
  120. : #endif
  121. EOT
  122. LINE:
  123. while (<>) {
  124. # Wipe out surrounding whitespace.
  125. s/[ \t]*(.*)\n$/$1/;
  126. # Perhaps it's a label/comment.
  127. if (/^:/) {
  128. s/^:[ \t]*//;
  129. $label = &make_label($_);
  130. if ($. == 1) {
  131. $toplabel = $label;
  132. if (/^(top|(re)?start|redo|begin(ning)|again|input)$/i) {
  133. $_ = <>;
  134. redo LINE; # Never referenced, so delete it if not a comment.
  135. }
  136. }
  137. $_ = "$label:";
  138. if ($lastlinewaslabel++) {
  139. $indent += 4;
  140. print BODY &tab, ";\n";
  141. $indent -= 4;
  142. }
  143. if ($indent >= 2) {
  144. $indent -= 2;
  145. $indmod = 2;
  146. }
  147. next;
  148. } else {
  149. $lastlinewaslabel = '';
  150. }
  151. # Look for one or two address clauses
  152. $addr1 = '';
  153. $addr2 = '';
  154. if (s/^([0-9]+)//) {
  155. $addr1 = "$1";
  156. $addr1 = "\$. == $addr1" unless /^,/;
  157. }
  158. elsif (s/^\$//) {
  159. $addr1 = 'eof()';
  160. }
  161. elsif (s|^/||) {
  162. $addr1 = &fetchpat('/');
  163. }
  164. if (s/^,//) {
  165. if (s/^([0-9]+)//) {
  166. $addr2 = "$1";
  167. } elsif (s/^\$//) {
  168. $addr2 = "eof()";
  169. } elsif (s|^/||) {
  170. $addr2 = &fetchpat('/');
  171. } else {
  172. &Die("Invalid second address at line $.\n");
  173. }
  174. if ($addr2 =~ /^\d+$/) {
  175. $addr1 .= "..$addr2";
  176. }
  177. else {
  178. $addr1 .= "...$addr2";
  179. }
  180. }
  181. # Now we check for metacommands {, }, and ! and worry
  182. # about indentation.
  183. s/^[ \t]+//;
  184. # a { to keep vi happy
  185. if ($_ eq '}') {
  186. $indent -= 4;
  187. next;
  188. }
  189. if (s/^!//) {
  190. $if = 'unless';
  191. $else = "$r else $l\n";
  192. } else {
  193. $if = 'if';
  194. $else = '';
  195. }
  196. if (s/^{//) { # a } to keep vi happy
  197. $indmod = 4;
  198. $redo = $_;
  199. $_ = '';
  200. $rmaybe = '';
  201. } else {
  202. $rmaybe = "\n$r";
  203. if ($addr2 || $addr1) {
  204. $space = ' ' x $shiftwidth;
  205. } else {
  206. $space = '';
  207. }
  208. $_ = &transmogrify();
  209. }
  210. # See if we can optimize to modifier form.
  211. if ($addr1) {
  212. if ($_ !~ /[\n{}]/ && $rmaybe && !$change &&
  213. $_ !~ / if / && $_ !~ / unless /) {
  214. s/;$/ $if $addr1;/;
  215. $_ = substr($_,$shiftwidth,1000);
  216. } else {
  217. $_ = "$if ($addr1) $l\n$change$_$rmaybe";
  218. }
  219. $change = '';
  220. next LINE;
  221. }
  222. } continue {
  223. @lines = split(/\n/,$_);
  224. for (@lines) {
  225. unless (s/^ *<<--//) {
  226. print BODY &tab;
  227. }
  228. print BODY $_, "\n";
  229. }
  230. $indent += $indmod;
  231. $indmod = 0;
  232. if ($redo) {
  233. $_ = $redo;
  234. $redo = '';
  235. redo LINE;
  236. }
  237. }
  238. if ($lastlinewaslabel++) {
  239. $indent += 4;
  240. print BODY &tab, ";\n";
  241. $indent -= 4;
  242. }
  243. if ($appendseen || $tseen || !$assumen) {
  244. $printit++ if $dseen || (!$assumen && !$assumep);
  245. print BODY &q(<<'EOT');
  246. : #ifdef SAWNEXT
  247. : }
  248. : continue {
  249. : #endif
  250. : #ifdef PRINTIT
  251. : #ifdef DSEEN
  252. : #ifdef ASSUMEP
  253. : print if $printit++;
  254. : #else
  255. : if ($printit)
  256. : { print; }
  257. : else
  258. : { $printit++ unless $nflag; }
  259. : #endif
  260. : #else
  261. : print if $printit;
  262. : #endif
  263. : #else
  264. : print;
  265. : #endif
  266. : #ifdef TSEEN
  267. : $tflag = 0;
  268. : #endif
  269. : #ifdef APPENDSEEN
  270. : if ($atext) { chop $atext; print $atext; $atext = ''; }
  271. : #endif
  272. EOT
  273. print BODY &q(<<'EOT');
  274. : }
  275. EOT
  276. }
  277. unless ($debug) {
  278. print &q(<<"EOT");
  279. : $startperl
  280. : eval 'exec $perlpath -S \$0 \${1+"\$@"}'
  281. : if \$running_under_some_shell;
  282. :
  283. EOT
  284. print"$opens\n" if $opens;
  285. seek(BODY, 0, 0) || die "Can't rewind temp file: $!\n";
  286. while (<BODY>) {
  287. /^[ \t]*$/ && next;
  288. /^#ifdef (\w+)/ && ((${lc $1} || &skip), next);
  289. /^#else/ && (&skip, next);
  290. /^#endif/ && next;
  291. s/^<><>//;
  292. print;
  293. }
  294. }
  295. &Cleanup;
  296. exit;
  297. sub Cleanup {
  298. unlink "/tmp/sperl$$";
  299. }
  300. sub Die {
  301. &Cleanup;
  302. die $_[0];
  303. }
  304. sub tab {
  305. "\t" x ($indent / 8) . ' ' x ($indent % 8);
  306. }
  307. sub make_filehandle {
  308. local($_) = $_[0];
  309. local($fname) = $_;
  310. if (!$seen{$fname}) {
  311. $_ = "FH_" . $_ if /^\d/;
  312. s/[^a-zA-Z0-9]/_/g;
  313. s/^_*//;
  314. $_ = "\U$_";
  315. if ($fhseen{$_}) {
  316. for ($tmp = "a"; $fhseen{"$_$tmp"}; $a++) {}
  317. $_ .= $tmp;
  318. }
  319. $fhseen{$_} = 1;
  320. $opens .= &q(<<"EOT");
  321. : open($_, '>$fname') || die "Can't create $fname: \$!";
  322. EOT
  323. $seen{$fname} = $_;
  324. }
  325. $seen{$fname};
  326. }
  327. sub make_label {
  328. local($label) = @_;
  329. $label =~ s/[^a-zA-Z0-9]/_/g;
  330. if ($label =~ /^[0-9_]/) { $label = 'L' . $label; }
  331. $label = substr($label,0,8);
  332. # Could be a reserved word, so capitalize it.
  333. substr($label,0,1) =~ y/a-z/A-Z/
  334. if $label =~ /^[a-z]/;
  335. $label;
  336. }
  337. sub transmogrify {
  338. { # case
  339. if (/^d/) {
  340. $dseen++;
  341. chop($_ = &q(<<'EOT'));
  342. : <<--#ifdef PRINTIT
  343. : $printit = 0;
  344. : <<--#endif
  345. : next LINE;
  346. EOT
  347. $sawnext++;
  348. next;
  349. }
  350. if (/^n/) {
  351. chop($_ = &q(<<'EOT'));
  352. : <<--#ifdef PRINTIT
  353. : <<--#ifdef DSEEN
  354. : <<--#ifdef ASSUMEP
  355. : print if $printit++;
  356. : <<--#else
  357. : if ($printit)
  358. : { print; }
  359. : else
  360. : { $printit++ unless $nflag; }
  361. : <<--#endif
  362. : <<--#else
  363. : print if $printit;
  364. : <<--#endif
  365. : <<--#else
  366. : print;
  367. : <<--#endif
  368. : <<--#ifdef APPENDSEEN
  369. : if ($atext) {chop $atext; print $atext; $atext = '';}
  370. : <<--#endif
  371. : $_ = <>;
  372. : chop;
  373. : <<--#ifdef TSEEN
  374. : $tflag = 0;
  375. : <<--#endif
  376. EOT
  377. next;
  378. }
  379. if (/^a/) {
  380. $appendseen++;
  381. $command = $space . "\$atext .= <<'End_Of_Text';\n<<--";
  382. $lastline = 0;
  383. while (<>) {
  384. s/^[ \t]*//;
  385. s/^[\\]//;
  386. unless (s|\\$||) { $lastline = 1;}
  387. s/^([ \t]*\n)/<><>$1/;
  388. $command .= $_;
  389. $command .= '<<--';
  390. last if $lastline;
  391. }
  392. $_ = $command . "End_Of_Text";
  393. last;
  394. }
  395. if (/^[ic]/) {
  396. if (/^c/) { $change = 1; }
  397. $addr1 = 1 if $addr1 eq '';
  398. $addr1 = '$iter = (' . $addr1 . ')';
  399. $command = $space .
  400. " if (\$iter == 1) { print <<'End_Of_Text'; }\n<<--";
  401. $lastline = 0;
  402. while (<>) {
  403. s/^[ \t]*//;
  404. s/^[\\]//;
  405. unless (s/\\$//) { $lastline = 1;}
  406. s/'/\\'/g;
  407. s/^([ \t]*\n)/<><>$1/;
  408. $command .= $_;
  409. $command .= '<<--';
  410. last if $lastline;
  411. }
  412. $_ = $command . "End_Of_Text";
  413. if ($change) {
  414. $dseen++;
  415. $change = "$_\n";
  416. chop($_ = &q(<<"EOT"));
  417. : <<--#ifdef PRINTIT
  418. : $space\$printit = 0;
  419. : <<--#endif
  420. : ${space}next LINE;
  421. EOT
  422. $sawnext++;
  423. }
  424. last;
  425. }
  426. if (/^s/) {
  427. $delim = substr($_,1,1);
  428. $len = length($_);
  429. $repl = $end = 0;
  430. $inbracket = 0;
  431. for ($i = 2; $i < $len; $i++) {
  432. $c = substr($_,$i,1);
  433. if ($c eq $delim) {
  434. if ($inbracket) {
  435. substr($_, $i, 0) = '\\';
  436. $i++;
  437. $len++;
  438. }
  439. else {
  440. if ($repl) {
  441. $end = $i;
  442. last;
  443. } else {
  444. $repl = $i;
  445. }
  446. }
  447. }
  448. elsif ($c eq '\\') {
  449. $i++;
  450. if ($i >= $len) {
  451. $_ .= 'n';
  452. $_ .= <>;
  453. $len = length($_);
  454. $_ = substr($_,0,--$len);
  455. }
  456. elsif (substr($_,$i,1) =~ /^[n]$/) {
  457. ;
  458. }
  459. elsif (!$repl &&
  460. substr($_,$i,1) =~ /^[(){}\w]$/) {
  461. $i--;
  462. $len--;
  463. substr($_, $i, 1) = '';
  464. }
  465. elsif (!$repl &&
  466. substr($_,$i,1) =~ /^[<>]$/) {
  467. substr($_,$i,1) = 'b';
  468. }
  469. elsif ($repl && substr($_,$i,1) =~ /^\d$/) {
  470. substr($_,$i-1,1) = '$';
  471. }
  472. }
  473. elsif ($c eq '&' && $repl) {
  474. substr($_, $i, 0) = '$';
  475. $i++;
  476. $len++;
  477. }
  478. elsif ($c eq '$' && $repl) {
  479. substr($_, $i, 0) = '\\';
  480. $i++;
  481. $len++;
  482. }
  483. elsif ($c eq '[' && !$repl) {
  484. $i++ if substr($_,$i,1) eq '^';
  485. $i++ if substr($_,$i,1) eq ']';
  486. $inbracket = 1;
  487. }
  488. elsif ($c eq ']') {
  489. $inbracket = 0;
  490. }
  491. elsif ($c eq "\t") {
  492. substr($_, $i, 1) = '\\t';
  493. $i++;
  494. $len++;
  495. }
  496. elsif (!$repl && index("()+",$c) >= 0) {
  497. substr($_, $i, 0) = '\\';
  498. $i++;
  499. $len++;
  500. }
  501. }
  502. &Die("Malformed substitution at line $.\n")
  503. unless $end;
  504. $pat = substr($_, 0, $repl + 1);
  505. $repl = substr($_, $repl+1, $end-$repl-1);
  506. $end = substr($_, $end + 1, 1000);
  507. &simplify($pat);
  508. $subst = "$pat$repl$delim";
  509. $cmd = '';
  510. while ($end) {
  511. if ($end =~ s/^g//) {
  512. $subst .= 'g';
  513. next;
  514. }
  515. if ($end =~ s/^p//) {
  516. $cmd .= ' && (print)';
  517. next;
  518. }
  519. if ($end =~ s/^w[ \t]*//) {
  520. $fh = &make_filehandle($end);
  521. $cmd .= " && (print $fh \$_)";
  522. $end = '';
  523. next;
  524. }
  525. &Die("Unrecognized substitution command".
  526. "($end) at line $.\n");
  527. }
  528. chop ($_ = &q(<<"EOT"));
  529. : <<--#ifdef TSEEN
  530. : $subst && \$tflag++$cmd;
  531. : <<--#else
  532. : $subst$cmd;
  533. : <<--#endif
  534. EOT
  535. next;
  536. }
  537. if (/^p/) {
  538. $_ = 'print;';
  539. next;
  540. }
  541. if (/^w/) {
  542. s/^w[ \t]*//;
  543. $fh = &make_filehandle($_);
  544. $_ = "print $fh \$_;";
  545. next;
  546. }
  547. if (/^r/) {
  548. $appendseen++;
  549. s/^r[ \t]*//;
  550. $file = $_;
  551. $_ = "\$atext .= `cat $file 2>/dev/null`;";
  552. next;
  553. }
  554. if (/^P/) {
  555. $_ = 'print $1 if /^(.*)/;';
  556. next;
  557. }
  558. if (/^D/) {
  559. chop($_ = &q(<<'EOT'));
  560. : s/^.*\n?//;
  561. : redo LINE if $_;
  562. : next LINE;
  563. EOT
  564. $sawnext++;
  565. next;
  566. }
  567. if (/^N/) {
  568. chop($_ = &q(<<'EOT'));
  569. : $_ .= "\n";
  570. : $len1 = length;
  571. : $_ .= <>;
  572. : chop if $len1 < length;
  573. : <<--#ifdef TSEEN
  574. : $tflag = 0;
  575. : <<--#endif
  576. EOT
  577. next;
  578. }
  579. if (/^h/) {
  580. $_ = '$hold = $_;';
  581. next;
  582. }
  583. if (/^H/) {
  584. $_ = '$hold .= "\n", $hold .= $_;';
  585. next;
  586. }
  587. if (/^g/) {
  588. $_ = '$_ = $hold;';
  589. next;
  590. }
  591. if (/^G/) {
  592. $_ = '$_ .= "\n", $_ .= $hold;';
  593. next;
  594. }
  595. if (/^x/) {
  596. $_ = '($_, $hold) = ($hold, $_);';
  597. next;
  598. }
  599. if (/^b$/) {
  600. $_ = 'next LINE;';
  601. $sawnext++;
  602. next;
  603. }
  604. if (/^b/) {
  605. s/^b[ \t]*//;
  606. $lab = &make_label($_);
  607. if ($lab eq $toplabel) {
  608. $_ = 'redo LINE;';
  609. } else {
  610. $_ = "goto $lab;";
  611. }
  612. next;
  613. }
  614. if (/^t$/) {
  615. $_ = 'next LINE if $tflag;';
  616. $sawnext++;
  617. $tseen++;
  618. next;
  619. }
  620. if (/^t/) {
  621. s/^t[ \t]*//;
  622. $lab = &make_label($_);
  623. $_ = q/if ($tflag) {$tflag = 0; /;
  624. if ($lab eq $toplabel) {
  625. $_ .= 'redo LINE;}';
  626. } else {
  627. $_ .= "goto $lab;}";
  628. }
  629. $tseen++;
  630. next;
  631. }
  632. if (/^y/) {
  633. s/abcdefghijklmnopqrstuvwxyz/a-z/g;
  634. s/ABCDEFGHIJKLMNOPQRSTUVWXYZ/A-Z/g;
  635. s/abcdef/a-f/g;
  636. s/ABCDEF/A-F/g;
  637. s/0123456789/0-9/g;
  638. s/01234567/0-7/g;
  639. $_ .= ';';
  640. }
  641. if (/^=/) {
  642. $_ = 'print $.;';
  643. next;
  644. }
  645. if (/^q/) {
  646. chop($_ = &q(<<'EOT'));
  647. : close(ARGV);
  648. : @ARGV = ();
  649. : next LINE;
  650. EOT
  651. $sawnext++;
  652. next;
  653. }
  654. } continue {
  655. if ($space) {
  656. s/^/$space/;
  657. s/(\n)(.)/$1$space$2/g;
  658. }
  659. last;
  660. }
  661. $_;
  662. }
  663. sub fetchpat {
  664. local($outer) = @_;
  665. local($addr) = $outer;
  666. local($inbracket);
  667. local($prefix,$delim,$ch);
  668. # Process pattern one potential delimiter at a time.
  669. DELIM: while (s#^([^\]+(|)[\\/]*)([]+(|)[\\/])##) {
  670. $prefix = $1;
  671. $delim = $2;
  672. if ($delim eq '\\') {
  673. s/(.)//;
  674. $ch = $1;
  675. $delim = '' if $ch =~ /^[(){}A-Za-mo-z]$/;
  676. $ch = 'b' if $ch =~ /^[<>]$/;
  677. $delim .= $ch;
  678. }
  679. elsif ($delim eq '[') {
  680. $inbracket = 1;
  681. s/^\^// && ($delim .= '^');
  682. s/^]// && ($delim .= ']');
  683. }
  684. elsif ($delim eq ']') {
  685. $inbracket = 0;
  686. }
  687. elsif ($inbracket || $delim ne $outer) {
  688. $delim = '\\' . $delim;
  689. }
  690. $addr .= $prefix;
  691. $addr .= $delim;
  692. if ($delim eq $outer && !$inbracket) {
  693. last DELIM;
  694. }
  695. }
  696. $addr =~ s/\t/\\t/g;
  697. &simplify($addr);
  698. $addr;
  699. }
  700. sub q {
  701. local($string) = @_;
  702. local($*) = 1;
  703. $string =~ s/^:\t?//g;
  704. $string;
  705. }
  706. sub simplify {
  707. $_[0] =~ s/_a-za-z0-9/\\w/ig;
  708. $_[0] =~ s/a-z_a-z0-9/\\w/ig;
  709. $_[0] =~ s/a-za-z_0-9/\\w/ig;
  710. $_[0] =~ s/a-za-z0-9_/\\w/ig;
  711. $_[0] =~ s/_0-9a-za-z/\\w/ig;
  712. $_[0] =~ s/0-9_a-za-z/\\w/ig;
  713. $_[0] =~ s/0-9a-z_a-z/\\w/ig;
  714. $_[0] =~ s/0-9a-za-z_/\\w/ig;
  715. $_[0] =~ s/\[\\w\]/\\w/g;
  716. $_[0] =~ s/\[^\\w\]/\\W/g;
  717. $_[0] =~ s/\[0-9\]/\\d/g;
  718. $_[0] =~ s/\[^0-9\]/\\D/g;
  719. $_[0] =~ s/\\d\\d\*/\\d+/g;
  720. $_[0] =~ s/\\D\\D\*/\\D+/g;
  721. $_[0] =~ s/\\w\\w\*/\\w+/g;
  722. $_[0] =~ s/\\t\\t\*/\\t+/g;
  723. $_[0] =~ s/(\[.[^]]*\])\1\*/$1+/g;
  724. $_[0] =~ s/([\w\s!@#%^&-=,:;'"])\1\*/$1+/g;
  725. }
  726. sub skip {
  727. local($level) = 0;
  728. while(<BODY>) {
  729. /^#ifdef/ && $level++;
  730. /^#else/ && !$level && return;
  731. /^#endif/ && !$level-- && return;
  732. }
  733. die "Unterminated `#ifdef' conditional\n";
  734. }
  735. __END__
  736. :endofperl