correction to lex bug fix

stewart at seismo.UUCP stewart at seismo.UUCP
Fri May 25 03:32:13 AEST 1984


This is a correction to the lex bug fix reported 23 May 84.
Yesterday's "fix" caused lex to break in a different way.
Sorry.

Lex versions:  version 7, Berkeley 2.8 and 4.1 (probably
won't be visible on 32-bit machines, however).

This bug is not in lex itself, but in the boilerplate
lex pulls out of its library to make lex.yy.c.
The original cast two pointers to type int before
comparing them.  Needless to say, on our 16-bit int pdp11
this causes errors when the addresses creep past 0x8000.
Yesterday I didn't know why the casts were inserted.
Here is the reason:
yycrank is a constant.  yyt takes on values of yycrank+<int>,
where <int> may be negative (if YYOPTIM is defined).  yyt
may, in fact, be a negative address!  The cast is supposed to
turn this "negative address" into a negative number.
This construction is still terribly unportable, I'm sure.
It depends on ints and pointers being the same length.

John Stewart

*** /usr/lib/lex/ncform	Thu May 24 13:08:49 1984
--- /usr/lib/lex/ncform.4.1	Thu Aug 11 23:51:26 1983
***************
*** 54,68
  				}
  # endif
  			yyr = yyt;
! 			/* Fix from John Stewart, Teledyne Geotech, 24 May 1984:
! 			 * yyt may be so far below yycrank that it wraps around,
! 			 * appearing as large positive address, in which case
! 			 * (yyt - yycrank) will be positive.
! 			 * The original expression, ((int)yyt > (int)yycrank),
! 			 * breaks on 16-bit machines if the yycrank array
! 			 * straddles the address 0x8000.
! 			 */
! 			if (((int)yyt - (int)yycrank) > 0){
  				yyt = yyr + yych;
  				if (yyt <= yytop && yyt->verify+yysvec == yystate){
  					if(yyt->advance+yysvec == YYLERR)	/* error transitions */

--- 54,60 -----
  				}
  # endif
  			yyr = yyt;
! 			if ( (int)yyt > (int)yycrank){
  				yyt = yyr + yych;
  				if (yyt <= yytop && yyt->verify+yysvec == yystate){
  					if(yyt->advance+yysvec == YYLERR)	/* error transitions */
***************
*** 72,78
  					}
  				}
  # ifdef YYOPTIM
! 			else if(((int)yyt - (int)yycrank) < 0) {		/* r < yycrank */
  				yyt = yyr = yycrank+(yycrank-yyt);
  # ifdef LEXDEBUG
  				if(debug)fprintf(yyout,"compressed state\n");

--- 64,70 -----
  					}
  				}
  # ifdef YYOPTIM
! 			else if((int)yyt < (int)yycrank) {		/* r < yycrank */
  				yyt = yyr = yycrank+(yycrank-yyt);
  # ifdef LEXDEBUG
  				if(debug)fprintf(yyout,"compressed state\n");



More information about the Comp.unix.wizards mailing list