🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

1 total messages Started by Guy Harris Thu, 15 May 1986 22:15
"egrep" is too slow and has lousy error checking
#308
Author: Guy Harris
Date: Thu, 15 May 1986 22:15
266 lines
6140 bytes
1) "egrep" tests whether the "-i" flag was set on every character.  It
doesn't have to do this; it could test it when it builds the goto function
and modify the goto function if set.

2) "egrep" thinks an I/O error is equivalent to an EOF, and has various
other problems similar to the ones mentioned in an earlier posting on
"fgrep".

Here's a context diff of the fixes:

*** egrep.slow.y	Thu May 15 15:06:27 1986
--- egrep.fast.y	Thu May 15 15:06:09 1986
***************
*** 42,47 ****
--- 42,49 ----
  int icount;
  char *input;
  
+ void exit();
+ 
  long	lnum;
  int	bflag;
  int	cflag;
***************
*** 61,66 ****
--- 63,69 ----
  int	nsucc;
  
  int	f;
+ char	*fname;
  %}
  
  %%
***************
*** 166,172 ****
  nextch() {
  	register int c;
  	if (fflag) {
! 		if ((c = getc(expfile)) == EOF) return(0);
  	}
  	else c = *input++;
  	return(c);
--- 169,183 ----
  nextch() {
  	register int c;
  	if (fflag) {
! 		if ((c = getc(expfile)) == EOF) {
! 			if (ferror(expfile)) {
! 				fprintf(stderr, "egrep: Read error on ");
! 				perror(fname);
! 				exit(1);
! 			}
! 			fclose(expfile);
! 			return(0);
! 		}
  	}
  	else c = *input++;
  	return(c);
***************
*** 320,325 ****
--- 331,342 ----
  				}
  			}
  		}
+ 		if (iflag) {
+ 			for (c=0; c<NCHARS; c++) {
+ 				if (isupper(c))
+ 					gotofn[s][c] = gotofn[s][tolower(c)];
+ 			}
+ 		}
  	}
  }
  
***************
*** 446,457 ****
  			continue;
  
  		case 'f':
! 			fflag++;
! 			expfile = fopen(optarg,"r");
! 			if (expfile == NULL) {
! 				fprintf(stderr, "egrep: can't open %s\n", optarg);
  				exit(2);
  			}
  			continue;
  
  		case 'l':
--- 463,474 ----
  			continue;
  
  		case 'f':
! 			if (fflag) {
! 				fprintf(stderr, "egrep: Only one \"-f\" option allowed\n");
  				exit(2);
  			}
+ 			fflag++;
+ 			fname = optarg;
  			continue;
  
  		case 'l':
***************
*** 471,501 ****
  	}
  
  	argc -= optind;
! 	if (errflg || ((argc <= 0) && !fflag)) {
  		printf("usage: egrep %s\n",usage);
  		exit(2);
  	}
- 	if ( !eflag  && !fflag ) {
- 		input = argv[optind];
- 		optind++;
- 		argc--;
- 	}
  
! 	if (iflag) {
! 		for (arg = input; *arg != NULL; ++arg)
! 			*arg = (char)tolower((int)(*arg));
! 	}
! 
! 	argv = &argv[optind];
! 	if(argc > 0)
! 		if (access(*argv, 0) != 0) {
! 			fprintf(stderr, "egrep: %s does not exist\n", *argv);
  			exit(2);
  		}
  	yyparse();
  
  	cfoll(line-1);
  	cgotofn();
  	nfile = argc;
  	if (argc<=0) {
  		if (lflag) exit(1);
--- 488,527 ----
  	}
  
  	argc -= optind;
! 	if (errflg || ((argc <= 0) && !fflag && !eflag)) {
  		printf("usage: egrep %s\n",usage);
  		exit(2);
  	}
  
! 	if (fflag) {
! 		expfile = fopen(fname, "r");
! 		if (expfile == (FILE *)0) {
! 			fprintf(stderr, "egrep: ");
! 			perror(fname);
  			exit(2);
  		}
+ 	} else {
+ 		if (!eflag) {
+ 			input = argv[optind];
+ 			optind++;
+ 			argc--;
+ 		}
+ 		if (iflag) {
+ 			arg = input;
+ 			while ((c = *arg) != '\0') {
+ 				if (isupper(c))
+ 					*arg++ = tolower(c);
+ 				else
+ 					arg++;
+ 			}
+ 		}
+ 	}
+ 
  	yyparse();
  
  	cfoll(line-1);
  	cgotofn();
+ 	argv = &argv[optind];
  	nfile = argc;
  	if (argc<=0) {
  		if (lflag) exit(1);
***************
*** 521,527 ****
  	int in_line;
  	if (file) {
  		if ((fptr = fopen(file, "r")) == NULL) {
! 			fprintf(stderr, "egrep: can't open %s\n", file);
  			nsucc = 2;
  			return;
  		}
--- 547,554 ----
  	int in_line;
  	if (file) {
  		if ((fptr = fopen(file, "r")) == NULL) {
! 			fprintf(stderr, "egrep: ");
! 			perror(file);
  			nsucc = 2;
  			return;
  		}
***************
*** 535,549 ****
  	blkno = 0;
  	p = buf;
  	nlp = p;
! 	if ((ccount = fread(p, sizeof(char), BUFSIZ, fptr)) <= 0) goto done;
  	in_line = 1;
  	istat = cstat = gotofn[0]['\n'];
  	if (out[cstat]) goto found;
  	for (;;) {
! 		if (!iflag)
! 			cstat = gotofn[cstat][*p&0377];	/* all input chars made positive */
! 		else
! 			cstat = gotofn[cstat][tolower((int)*p&0377)]; /* for -i option*/
  		if (out[cstat]) {
  		found:	for(;;) {
  				if (*p++ == '\n') {
--- 562,577 ----
  	blkno = 0;
  	p = buf;
  	nlp = p;
! 
! 	if ((ccount = fread(p, sizeof(char), BUFSIZ, fptr)) < 0)
! 		goto readerr;
! 	else if (ccount == 0)
! 		goto done;
  	in_line = 1;
  	istat = cstat = gotofn[0]['\n'];
  	if (out[cstat]) goto found;
  	for (;;) {
! 		cstat = gotofn[cstat][*p&0377];	/* all input chars made positive */
  		if (out[cstat]) {
  		found:	for(;;) {
  				if (*p++ == '\n') {
***************
*** 584,589 ****
--- 612,619 ----
  						ccount = fread(p, sizeof(char), &buf[2*BUFSIZ] - p, fptr);
  					}
  					if (ccount <= 0) {
+ 						if (ccount < 0)
+ 							goto readerr;
  						if (in_line && (vflag == 0)) {
  							in_line = 0;
  							goto succeed;
***************
*** 617,622 ****
--- 647,654 ----
  				ccount = fread(p, sizeof(char), &buf[2*BUFSIZ] - p, fptr);
  			}
  			if (ccount <= 0) {
+ 				if (ccount < 0)
+ 					goto readerr;
  				if (in_line && vflag) {
  					in_line = 0;
  					goto succeed;
***************
*** 633,636 ****
--- 665,675 ----
  			printf("%s:", file);
  		printf("%ld\n", tln);
  	}
+ 	return;
+ 
+ readerr:
+ 	fprintf(stderr, "egrep: Read error on ");
+ 	perror(file ? file : "standard input");
+ 	nsucc = 2;
+ 	fclose(fptr);
  }
-- 
	Guy Harris
	{ihnp4, decvax, seismo, decwrl, ...}!sun!guy
	guy@sun.arpa
Thread Navigation

This is a paginated view of messages in the thread with full content displayed inline.

Messages are displayed in chronological order, with the original post highlighted in green.

Use pagination controls to navigate through all messages in large threads.

Back to All Threads