home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / perl560.zip / vms / vms_yfix.pl < prev    next >
Text File  |  1999-07-20  |  2KB  |  68 lines

  1. # This script takes the output produced from perly.y by byacc and
  2. # the perly.fixer shell script (i.e. the perly.c and perly.h built
  3. # for Unix systems) and patches them to produce copies containing
  4. # appropriate declarations for VMS handling of global symbols.
  5. #
  6. # If it finds that the input files are already patches for VMS,
  7. # it just copies the input to the output.
  8. #
  9. # Revised 20-Dec-1996 by Charles Bailey  bailey@newman.upenn.edu
  10.  
  11. $VERSION = '1.11';
  12.  
  13. push(@ARGV,(qw[ perly.c perly.h vms/perly_c.vms vms/perly_h.vms])[@ARGV..4])
  14.     if @ARGV < 4;
  15. ($cinfile,$hinfile,$coutfile,$houtfile) = @ARGV;
  16.  
  17. open C,$cinfile or die "Can't read $cinfile: $!\n";
  18. open COUT, ">$coutfile" or die "Can't create $coutfile: $!\n";
  19. print COUT <<EOH;
  20. /* Postprocessed by vms_yfix.pl $VERSION to add VMS declarations of globals */
  21. EOH
  22. while (<C>) {
  23.   # "y.tab.c" is illegal as a VMS filename; DECC 5.2/VAX preprocessor
  24.   # doesn't like this.
  25.   if ( s/^#line\s+(\d+)\s+"y.tab.c"/#line $1 "y_tab.c"/ ) { 1; }
  26.   elsif (/char \*getenv/) {
  27.     # accomodate old VAXC's macro susbstitution pecularities
  28.     $_ = "#   ifndef getenv\n$_#   endif\n";
  29.   }
  30.   elsif ( /getenv\("YYDEBUG"\)/ ) {
  31.     # Reset the "error" status if an optional lookup fails
  32.     while (not /^\s+\}/) { print COUT; $_ = <C>; }
  33.     $_ .= "\telse SETERRNO(0,SS\$_NORMAL);\n";
  34.   }
  35.   else {
  36.     # add the dEXT tag to definitions of global vars, so we'll insert
  37.     # a globaldef when perly.c is compiled
  38.     s/^(short|int|YYSTYPE|char \*)\s*yy/dEXT $1 yy/;
  39.   }
  40.   print COUT;
  41. }
  42. close C;
  43. close COUT;
  44.  
  45. open H,$hinfile  or die "Can't read $hinfile: $!\n";
  46. open HOUT, ">$houtfile" or die "Can't create $houtfile: $!\n";
  47. print HOUT <<EOH;
  48. /* Postprocessed by vms_yfix.pl $VERSION to add VMS declarations of globals */
  49. EOH
  50. $hfixed = 0;  # keep -w happy
  51. while (<H>) {
  52.   $hfixed = /globalref/ unless $hfixed;  # we've already got a fixed copy
  53.   next if /^extern YYSTYPE yylval/;  # we've got a Unix version, and this
  54.                                      # is what we want to replace
  55.   print HOUT;
  56. }
  57. close H;
  58.  
  59. print HOUT <<'EODECL' unless $hfixed;
  60. #ifndef vax11c
  61.   extern YYSTYPE yylval;
  62. #else
  63.   globalref YYSTYPE yylval;
  64. #endif
  65. EODECL
  66.  
  67. close HOUT;
  68.