[comp.bugs.4bsd] lex bugs - with fixes

wescott@sauron.Columbia.NCR.COM (Mike Wescott) (10/13/88)

The following patch fixes these bugs in lex:

1. If lex is invoked with multiple files on the command line, files after
	the first are not properly handled; every other one is opened until
	garbage is found as a filename.  Both the index (fptr) and the base
	pointer (sargv) were being incremented.

2. If a warning message is printed early enough, the file pointer fout may
	not be initialized, but warning() will do fflush(fout) anyway, and
	may dump core.

3. If there is no rules section in the input (a syntax error) processing
	continues, lex.yy.c won't compile, lex may dump core or it may
	terminate gracefully with exit value 0.  This patch errors out
	if EOF is detected before a rules section, exit value is 1 so
	as to make "make" unhappy.

4. The DEBUG code, not usually compiled in, has an anachronism, =+ is
	changed to +=

diff -cr lex.orig/main.c lex/main.c
*** lex.orig/main.c	Fri Sep 20 16:28:25 1985
--- lex/main.c	Wed Oct 12 17:52:56 1988
***************
*** 57,63 ****
  	if (argc > 1){
  		fin = fopen(argv[++fptr], "r");		/* open argv[1] */
  		sargc--;
- 		sargv++;
  		}
  	else fin = stdin;
  	if(fin == NULL)
--- 57,62 ----
diff -cr lex.orig/parser.y lex/parser.y
*** lex.orig/parser.y	Fri Sep 20 16:28:25 1985
--- lex/parser.y	Wed Oct 12 17:12:47 1988
***************
*** 429,434 ****
--- 429,435 ----
  				return(freturn(STR));
  				}
  			}
+ 			error("No rules section");
  		/* end of section one processing */
  		}
  	else if(sect == RULESECTION){		/* rules and actions */
diff -cr lex.orig/sub1.c lex/sub1.c
*** lex.orig/sub1.c	Mon Nov  4 13:43:26 1985
--- lex/sub1.c	Wed Oct 12 17:56:41 1988
***************
*** 67,73 ****
  	fprintf(errorf,s,p,d);
  	putc('\n',errorf);
  	fflush(errorf);
! 	fflush(fout);
  	fflush(stdout);
  	}
  index(a,s)
--- 67,74 ----
  	fprintf(errorf,s,p,d);
  	putc('\n',errorf);
  	fflush(errorf);
! 	if (fout != NULL)
! 		fflush(fout);
  	fflush(stdout);
  	}
  index(a,s)
***************
*** 379,385 ****
  	prev = pres;
  	c = pres = peek;
  	peek = pushptr > pushc ? *--pushptr : getc(fin);
! 	if(peek == EOF && sargc > 1){
  		fclose(fin);
  		fin = fopen(sargv[++fptr],"r");
  		if(fin == NULL)
--- 380,386 ----
  	prev = pres;
  	c = pres = peek;
  	peek = pushptr > pushc ? *--pushptr : getc(fin);
! 	while(peek == EOF && sargc > 1){
  		fclose(fin);
  		fin = fopen(sargv[++fptr],"r");
  		if(fin == NULL)
***************
*** 386,392 ****
  			error("Cannot open file %s",sargv[fptr]);
  		peek = getc(fin);
  		sargc--;
- 		sargv++;
  		}
  	if(c == EOF) {
  		eof = TRUE;
--- 387,392 ----
***************
*** 561,567 ****
  		default:
  			if(!printable(c)){
  				printf("\\%-3o",c);
! 				charc =+ 3;
  				}
  			else 
  				putchar(c);
--- 561,567 ----
  		default:
  			if(!printable(c)){
  				printf("\\%-3o",c);
! 				charc += 3;
  				}
  			else 
  				putchar(c);
-- 
	-Mike Wescott
	 mike.wescott@ncrcae.Columbia.NCR.COM