home *** CD-ROM | disk | FTP | other *** search
- #!/bin/sh
-
- # Fix up yacc output to allow dynamic allocation. Since perly.c
- # is now provided with the perl source, this should not be necessary.
- #
- # However, if the user wishes to use byacc, or wishes to try another
- # compiler compiler (e.g. bison or yacc), this script will get run.
- #
- # Currently, only byacc version 1.8 is supported.
- #
- # Hacks to make it work with Interactive's SysVr3 Version 2.2
- # doughera@lafvax.lafayette.edu (Andy Dougherty) 3/23/91
- #
- # Additional information to make the BSD section work with SunOS 4.0.2
- # tdinger@East.Sun.COM (Tom Dinger) 4/15/1991
-
- input=$1
- output=$2
- tmp=/tmp/f$$
-
- if grep 'yaccpar 1.8 (Berkeley)' $input >/dev/null 2>&1; then
- cp $input $output
- if test -f perly.c.diff; then
- patch -F3 $output <perly.c.diff
- rm -rf $input
- fi
- exit
- elif grep 'yaccpar 1.9 (Berkeley)' $input >/dev/null 2>&1; then
- if test -f perly.c.dif9; then
- patch -F3 $output <perly.c.dif9
- rm -rf $input
- exit 0
- else
- echo "Diffs from byacc-1.9 are not available."
- echo "If you wish to proceed anyway, do"
- echo "cp $input $output"
- echo "cp y.tab.h perly.h"
- echo "and re-run make. Otherwise, I will use the old perly.c"
- touch perly.c
- # Exit with error status to stop make.
- exit 1
- fi
- fi
-
- plan="unknown"
-
- # Below, we check for various yaccpar outputs.
-
- # Test for BSD 4.3 version.
- # Also tests for the SunOS 4.0.2 version
- egrep 'YYSTYPE[ ]*yyv\[ *YYMAXDEPTH *\];
- short[ ]*yys\[ *YYMAXDEPTH *\] *;
- yyps *= *&yys\[ *-1 *\];
- yypv *= *&yyv\[ *-1 *\];
- if *\( *\+\+yyps *>=* *&yys\[ *YYMAXDEPTH *\] *\)' $input >$tmp 2>/dev/null
-
- set `wc -l $tmp`
- if test "$1" = "5"; then
- plan="bsd43"
- fi
-
- if test "$plan" = "unknown"; then
- # Test for ISC 2.2 version (probably generic SysVr3).
- egrep 'YYSTYPE[ ]*yyv\[ *YYMAXDEPTH *\];
- int[ ]*yys\[ *YYMAXDEPTH *\] *;
- yyps *= *&yys\[ *-1 *\];
- yypv *= *&yyv\[ *-1 *\];
- if *\( *\+\+yy_ps *>= *&yys\[ *YYMAXDEPTH *\] *\)' $input >$tmp 2>/dev/null
-
- set `wc -l $tmp`
- if test "$1" = "5"; then
- plan="isc"
- fi
- fi
-
- case "$plan" in
- ##################################################################
- # The SunOS 4.0.2 version has the comparison fixed already.
- # Also added are out of memory checks (makes porting the generated
- # code easier) For most systems, it can't hurt. -- TD
- "bsd43")
- echo "Patching perly.c to allow dynamic yacc stack allocation"
- echo "Assuming bsd4.3 yaccpar"
- cat >$tmp <<'END'
- /YYSTYPE[ ]*yyv\[ *YYMAXDEPTH *\];/c\
- int yymaxdepth = YYMAXDEPTH;\
- YYSTYPE *yyv; /* where the values are stored */\
- short *yys;\
- short *maxyyps;
-
- /short[ ]*yys\[ *YYMAXDEPTH *\] *;/d
-
- /yyps *= *&yys\[ *-1 *\];/d
-
- /yypv *= *&yyv\[ *-1 *\];/c\
- \ if (!yyv) {\
- \ yyv = (YYSTYPE*) safemalloc(yymaxdepth * sizeof(YYSTYPE));\
- \ yys = (short*) safemalloc(yymaxdepth * sizeof(short));\
- \ if ( !yyv || !yys ) {\
- \ yyerror( "out of memory" );\
- \ return(1);\
- \ }\
- \ maxyyps = &yys[yymaxdepth];\
- \ }\
- \ yyps = &yys[-1];\
- \ yypv = &yyv[-1];
-
-
- /if *( *\+\+yyps *>=* *&yys\[ *YYMAXDEPTH *\] *)/c\
- \ if( ++yyps >= maxyyps ) {\
- \ int tv = yypv - yyv;\
- \ int ts = yyps - yys;\
- \
- \ yymaxdepth *= 2;\
- \ yyv = (YYSTYPE*)realloc((char*)yyv,\
- \ yymaxdepth*sizeof(YYSTYPE));\
- \ yys = (short*)realloc((char*)yys,\
- \ yymaxdepth*sizeof(short));\
- \ if ( !yyv || !yys ) {\
- \ yyerror( "yacc stack overflow" );\
- \ return(1);\
- \ }\
- \ yyps = yys + ts;\
- \ yypv = yyv + tv;\
- \ maxyyps = &yys[yymaxdepth];\
- \ }
-
- /yacc stack overflow.*}/d
- /yacc stack overflow/,/}/d
- END
- sed -f $tmp <$input >$output ;;
-
- #######################################################
- "isc") # Interactive Systems 2.2 version
- echo "Patching perly.c to allow dynamic yacc stack allocation"
- echo "Assuming Interactive SysVr3 2.2 yaccpar"
- # Easier to simply put whole script here than to modify the
- # bsd script with sed.
- # Main changes: yaccpar sometimes uses yy_ps and yy_pv
- # which are local register variables.
- # if(++yyps > YYMAXDEPTH) had opening brace on next line.
- # I've kept that brace in along with a call to yyerror if
- # realloc fails. (Actually, I just don't know how to do
- # multi-line matches in sed.)
- cat > $tmp << 'END'
- /YYSTYPE[ ]*yyv\[ *YYMAXDEPTH *\];/c\
- int yymaxdepth = YYMAXDEPTH;\
- YYSTYPE *yyv; /* where the values are stored */\
- int *yys;\
- int *maxyyps;
-
- /int[ ]*yys\[ *YYMAXDEPTH *\] *;/d
-
- /yyps *= *&yys\[ *-1 *\];/d
-
- /yypv *= *&yyv\[ *-1 *\];/c\
- \ if (!yyv) {\
- \ yyv = (YYSTYPE*) safemalloc(yymaxdepth * sizeof(YYSTYPE));\
- \ yys = (int*) safemalloc(yymaxdepth * sizeof(int));\
- \ maxyyps = &yys[yymaxdepth];\
- \ }\
- \ yyps = &yys[-1];\
- \ yypv = &yyv[-1];
-
- /if *( *\+\+yy_ps *>= *&yys\[ *YYMAXDEPTH *\] *)/c\
- \ if( ++yy_ps >= maxyyps ) {\
- \ int tv = yy_pv - yyv;\
- \ int ts = yy_ps - yys;\
- \
- \ yymaxdepth *= 2;\
- \ yyv = (YYSTYPE*)realloc((char*)yyv,\
- \ yymaxdepth*sizeof(YYSTYPE));\
- \ yys = (int*)realloc((char*)yys,\
- \ yymaxdepth*sizeof(int));\
- \ yy_ps = yyps = yys + ts;\
- \ yy_pv = yypv = yyv + tv;\
- \ maxyyps = &yys[yymaxdepth];\
- \ }\
- \ if (yyv == NULL || yys == NULL)
- END
- sed -f $tmp < $input > $output ;;
-
- ######################################################
- # Plan still unknown
- *) sed -e 's/Received token/ *** Received token/' $input >$output;
- esac
-
- rm -rf $tmp $input
-