summaryrefslogtreecommitdiff
path: root/perly.fixer
blob: b91c0e099b1165ca73d3f66e094fb91035d87ff3 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
#!/bin/sh

input=$1
output=$2
tmp=/tmp/f$$

egrep 'YYSTYPE[ 	]*yyv\[ *YYMAXDEPTH *\];
short[ 	]*yys\[ *YYMAXDEPTH *\] *;
yyps *= *&yys\[ *-1 *\];
yypv *= *&yyv\[ *-1 *\];
if *\( *\+\+yyps *> *&yys\[ *YYMAXDEPTH *\] *\)' $input >$tmp
set `wc -l $tmp`

case "$1" in
5) echo "Patching perly.c to allow dynamic yacc stack allocation";;
*) mv $input $output; rm -f $tmp; exit;;
esac

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));\
\	    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));\
\		    yyps = yys + ts;\
\		    yypv = yyv + tv;\
\		    maxyyps = &yys[yymaxdepth];\
\		}

/yacc stack overflow.*}/d
/yacc stack overflow/,/}/d
END

sed -f $tmp <$input >$output
rm -rf $tmp $input