Path: utzoo!utgpu!news-server.csri.toronto.edu!cs.utexas.edu!sun-barr!newstop!eastapps!hiredgun!tdinger From: tdinger@hiredgun.East.Sun.COM (Tom Dinger - Sun BOS SPA) Newsgroups: comp.lang.perl Subject: perly.fixer fixes Summary: Fixes for some SunOS versions Message-ID: <5051@eastapps.East.Sun.COM> Date: 23 Mar 91 07:03:49 GMT References: <5050@eastapps.East.Sun.COM> Sender: news@East.Sun.COM Reply-To: tdinger@east.sun.com (Tom Dinger - Sun BOS SPA) Organization: Sun Microsystems, Billerica MA Lines: 99 "Fix" perly.fixer for SunOS yacc, and add memory exhaustion test For Perl 4.000 22 March 1991 Tom Dinger (tdinger@East.SUN.COM) The perly.fixer as distributed "almost" works with the YACC output on SunOS (at least one version: 4.0.2 on the Sun386i). The overflow comparison as checked in perly.fixer looks for a "buggy" version of the comparison: it check for ">" when the correct comparison is ">=". This patch fixes the comparison check, by matching either version. In addition, this patch adds out-of-memory checking to the malloc() and realloc() calls; unlikely to occurr for UNIX, but much more likely for limited-memory architectures, like DOS. Incidentally, it seems that in SunOS 4.1 (and later), the YACC parser already uses this same dynamic allocation scheme, and it _has_ the out-of-memory test in it. Apply with the patch program ("patch -p -N < thisfile"). *** orig/perly.fixer Fri Mar 22 20:32:12 1991 --- perly.fixer Fri Mar 22 20:32:52 1991 *************** *** 8,14 **** short[ ]*yys\[ *YYMAXDEPTH *\] *; yyps *= *&yys\[ *-1 *\]; yypv *= *&yyv\[ *-1 *\]; ! if *\( *\+\+yyps *> *&yys\[ *YYMAXDEPTH *\] *\)' $input >$tmp set `wc -l $tmp` case "$1" in --- 8,14 ---- short[ ]*yys\[ *YYMAXDEPTH *\] *; yyps *= *&yys\[ *-1 *\]; yypv *= *&yyv\[ *-1 *\]; ! if *\( *\+\+yyps *>=* *&yys\[ *YYMAXDEPTH *\] *\)' $input >$tmp set `wc -l $tmp` case "$1" in *************** *** 31,36 **** --- 31,40 ---- \ 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];\ *************** *** 37,52 **** \ 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];\ --- 41,64 ---- \ yypv = &yyv[-1]; ! /if *( *\+\+yyps *>=* *&yys\[ *YYMAXDEPTH *\] *)/c\ \ if( ++yyps >= maxyyps ) {\ + \ YYSTYPE * temp_yyv;\ + \ short * temp_yys;\ \ int tv = yypv - yyv;\ \ int ts = yyps - yys;\ \ \ yymaxdepth *= 2;\ ! \ temp_yyv = (YYSTYPE*)realloc((char*)yyv,\ \ yymaxdepth*sizeof(YYSTYPE));\ ! \ temp_yys = (short*)realloc((char*)yys,\ \ yymaxdepth*sizeof(short));\ + \ if ( ! temp_yyv || ! temp_yys ) {\ + \ yyerror( "yacc stack overflow" );\ + \ return(1);\ + \ }\ + \ yyv = temp_yyv;\ + \ yys = temp_yys;\ \ yyps = yys + ts;\ \ yypv = yyv + tv;\ \ maxyyps = &yys[yymaxdepth];\ Tom Dinger consulting at: TechnoLogics, Inc. Sun Microsystems Internet: tdinger@East.Sun.COM (508)486-8500 (508)671-0521 UUCP: ...!sun!suneast!tdinger