home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Geek Gadgets 1
/
ADE-1.bin
/
ade-dist
/
perl-5.003-src.tgz
/
tar.out
/
fsf
/
perl
/
perly.fixer
< prev
next >
Wrap
Text File
|
1996-09-28
|
5KB
|
189 lines
#!/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