home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
OS/2 Shareware BBS: 10 Tools
/
10-Tools.zip
/
PERL4036.ZIP
/
perly.fixer
< prev
next >
Wrap
Text File
|
1993-02-08
|
4KB
|
155 lines
#!/bin/sh
# 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$$
plan="unknown"
# 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
set `wc -l $tmp`
if test "$1" = "5"; then
plan="bsd43"
fi
if test "$plan" = "unknown"; then
# Test for ISC 2.2 version.
egrep 'YYSTYPE[ ]*yyv\[ *YYMAXDEPTH *\];
int[ ]*yys\[ *YYMAXDEPTH *\] *;
yyps *= *&yys\[ *-1 *\];
yypv *= *&yyv\[ *-1 *\];
if *\( *\+\+yy_ps *>= *&yys\[ *YYMAXDEPTH *\] *\)' $input >$tmp
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*) malloc(yymaxdepth * sizeof(YYSTYPE));\
\ yys = (short*) malloc(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*) malloc(yymaxdepth * sizeof(YYSTYPE));\
\ yys = (int*) malloc(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
*) mv $input $output;
esac
rm -rf $tmp $input