home *** CD-ROM | disk | FTP | other *** search
/ The World of Computer Software / World_Of_Computer_Software-02-387-Vol-3of3.iso / p / perl4036.zip / perly.fixer < prev    next >
Text File  |  1993-02-08  |  4KB  |  155 lines

  1. #!/bin/sh
  2.  
  3. #  Hacks to make it work with Interactive's SysVr3 Version 2.2
  4. #   doughera@lafvax.lafayette.edu (Andy Dougherty)   3/23/91
  5. #
  6. # Additional information to make the BSD section work with SunOS 4.0.2
  7. #   tdinger@East.Sun.COM (Tom Dinger)    4/15/1991
  8.  
  9. input=$1
  10. output=$2
  11. tmp=/tmp/f$$
  12.  
  13. plan="unknown"
  14.  
  15. #  Test for BSD 4.3 version.
  16. #  Also tests for the SunOS 4.0.2 version
  17. egrep 'YYSTYPE[     ]*yyv\[ *YYMAXDEPTH *\];
  18. short[  ]*yys\[ *YYMAXDEPTH *\] *;
  19. yyps *= *&yys\[ *-1 *\];
  20. yypv *= *&yyv\[ *-1 *\];
  21. if *\( *\+\+yyps *>=* *&yys\[ *YYMAXDEPTH *\] *\)' $input >$tmp
  22.  
  23. set `wc -l $tmp`
  24. if test "$1" = "5"; then
  25.       plan="bsd43"
  26. fi
  27.  
  28. if test "$plan" = "unknown"; then
  29.     #   Test for ISC 2.2 version.
  30. egrep 'YYSTYPE[     ]*yyv\[ *YYMAXDEPTH *\];
  31. int[    ]*yys\[ *YYMAXDEPTH *\] *;
  32. yyps *= *&yys\[ *-1 *\];
  33. yypv *= *&yyv\[ *-1 *\];
  34. if *\( *\+\+yy_ps *>= *&yys\[ *YYMAXDEPTH *\] *\)' $input >$tmp
  35.  
  36.     set `wc -l $tmp`
  37.     if test "$1" = "5"; then
  38.     plan="isc"
  39.     fi
  40. fi
  41.  
  42. case "$plan" in
  43.     ##################################################################
  44.     # The SunOS 4.0.2 version has the comparison fixed already.
  45.     # Also added are out of memory checks (makes porting the generated
  46.     # code easier) For most systems, it can't hurt. -- TD
  47.     "bsd43")
  48.     echo "Patching perly.c to allow dynamic yacc stack allocation"
  49.     echo "Assuming bsd4.3 yaccpar"
  50.     cat >$tmp <<'END'
  51. /YYSTYPE[     ]*yyv\[ *YYMAXDEPTH *\];/c\
  52. int yymaxdepth = YYMAXDEPTH;\
  53. YYSTYPE *yyv; /* where the values are stored */\
  54. short *yys;\
  55. short *maxyyps;
  56.  
  57. /short[     ]*yys\[ *YYMAXDEPTH *\] *;/d
  58.  
  59. /yyps *= *&yys\[ *-1 *\];/d
  60.  
  61. /yypv *= *&yyv\[ *-1 *\];/c\
  62. \    if (!yyv) {\
  63. \        yyv = (YYSTYPE*) malloc(yymaxdepth * sizeof(YYSTYPE));\
  64. \        yys = (short*) malloc(yymaxdepth * sizeof(short));\
  65. \        if ( !yyv || !yys ) {\
  66. \        yyerror( "out of memory" );\
  67. \        return(1);\
  68. \        }\
  69. \        maxyyps = &yys[yymaxdepth];\
  70. \    }\
  71. \    yyps = &yys[-1];\
  72. \    yypv = &yyv[-1];
  73.  
  74.  
  75. /if *( *\+\+yyps *>=* *&yys\[ *YYMAXDEPTH *\] *)/c\
  76. \        if( ++yyps >= maxyyps ) {\
  77. \            int tv = yypv - yyv;\
  78. \            int ts = yyps - yys;\
  79. \
  80. \            yymaxdepth *= 2;\
  81. \            yyv = (YYSTYPE*)realloc((char*)yyv,\
  82. \              yymaxdepth*sizeof(YYSTYPE));\
  83. \            yys = (short*)realloc((char*)yys,\
  84. \              yymaxdepth*sizeof(short));\
  85. \            if ( !yyv || !yys ) {\
  86. \            yyerror( "yacc stack overflow" );\
  87. \            return(1);\
  88. \            }\
  89. \            yyps = yys + ts;\
  90. \            yypv = yyv + tv;\
  91. \            maxyyps = &yys[yymaxdepth];\
  92. \        }
  93.  
  94. /yacc stack overflow.*}/d
  95. /yacc stack overflow/,/}/d
  96. END
  97.     sed -f $tmp <$input >$output ;;
  98.  
  99.     #######################################################
  100.     "isc") # Interactive Systems 2.2  version
  101.     echo "Patching perly.c to allow dynamic yacc stack allocation"
  102.     echo "Assuming Interactive SysVr3 2.2 yaccpar"
  103.     # Easier to simply put whole script here than to modify the
  104.     # bsd script with sed.
  105.     # Main changes:  yaccpar sometimes uses yy_ps and yy_pv
  106.     # which are local register variables.
  107.     #  if(++yyps > YYMAXDEPTH) had opening brace on next line.
  108.     # I've kept that brace in along with a call to yyerror if
  109.     # realloc fails. (Actually, I just don't know how to do
  110.     # multi-line matches in sed.)
  111.     cat > $tmp << 'END'
  112. /YYSTYPE[     ]*yyv\[ *YYMAXDEPTH *\];/c\
  113. int yymaxdepth = YYMAXDEPTH;\
  114. YYSTYPE *yyv; /* where the values are stored */\
  115. int *yys;\
  116. int *maxyyps;
  117.  
  118. /int[     ]*yys\[ *YYMAXDEPTH *\] *;/d
  119.  
  120. /yyps *= *&yys\[ *-1 *\];/d
  121.  
  122. /yypv *= *&yyv\[ *-1 *\];/c\
  123. \    if (!yyv) {\
  124. \        yyv = (YYSTYPE*) malloc(yymaxdepth * sizeof(YYSTYPE));\
  125. \        yys = (int*) malloc(yymaxdepth * sizeof(int));\
  126. \        maxyyps = &yys[yymaxdepth];\
  127. \    }\
  128. \    yyps = &yys[-1];\
  129. \    yypv = &yyv[-1];
  130.  
  131. /if *( *\+\+yy_ps *>= *&yys\[ *YYMAXDEPTH *\] *)/c\
  132. \        if( ++yy_ps >= maxyyps ) {\
  133. \            int tv = yy_pv - yyv;\
  134. \            int ts = yy_ps - yys;\
  135. \
  136. \            yymaxdepth *= 2;\
  137. \            yyv = (YYSTYPE*)realloc((char*)yyv,\
  138. \              yymaxdepth*sizeof(YYSTYPE));\
  139. \            yys = (int*)realloc((char*)yys,\
  140. \              yymaxdepth*sizeof(int));\
  141. \            yy_ps = yyps = yys + ts;\
  142. \            yy_pv = yypv = yyv + tv;\
  143. \            maxyyps = &yys[yymaxdepth];\
  144. \        }\
  145. \        if (yyv == NULL || yys == NULL)
  146. END
  147.     sed -f $tmp < $input > $output ;;
  148.  
  149.     ######################################################
  150.     # Plan still unknown
  151.     *) mv $input $output;
  152. esac
  153.  
  154. rm -rf $tmp $input
  155.