[net.sources.bugs] patches for patch

chris@umcp-cs.UUCP (Chris Torek) (11/25/84)

"patch" looks like a useful program.  However, try running "lint" on it
. . . !  Here's a patch to make it pass lint (with one warning about a
"possible pointer alignment problem" from a typecast on malloc; big
deal).  I don't claim it's any less buggy; I didn't make any real
substantive changes.

RCS file: RCS/patch.c,v
retrieving revision 1.1
diff -c1 -r1.1 patch.c
*** /tmp/,RCSt1022548	Sun Nov 25 02:19:48 1984
--- patch.c	Sun Nov 25 02:19:42 1984
***************
*** 59,60
  
  char buf[MAXLINELEN];			/* general purpose buffer */

--- 59,61 -----
  
+ char serrbuf[BUFSIZ];			/* buffer for stderr */
  char buf[MAXLINELEN];			/* general purpose buffer */
***************
*** 102,103
  char *strcpy();
  int my_exit();

--- 103,106 -----
  char *strcpy();
+ char *strcat();
+ char *sprintf();		/* usually */
  int my_exit();
***************
*** 105,106
  char *fetchname();
  

--- 108,112 -----
  char *fetchname();
+ long atol();
+ long lseek();
+ char *mktemp();
  
***************
*** 113,115
  LINENUM patch_first();
! int patch_lines();
  char patch_char();

--- 119,121 -----
  LINENUM patch_first();
! LINENUM patch_lines();
  char patch_char();
***************
*** 133,135
  
!     setbuf(stderr,malloc(BUFSIZ));
      for (i = 0; i<MAXFILEC; i++)

--- 139,141 -----
  
!     setbuf(stderr,serrbuf);
      for (i = 0; i<MAXFILEC; i++)
***************
*** 200,202
  	move_file(TMPOUTNAME,outname);
! 	fclose(rejfp);
  	rejfp = Nullfp;

--- 206,208 -----
  	move_file(TMPOUTNAME,outname);
! 	(void)fclose(rejfp);
  	rejfp = Nullfp;
***************
*** 204,207
  	    if (!*rejname) {
! 		strcpy(rejname, outname);
! 		strcat(rejname, ".rej");
  	    }

--- 210,213 -----
  	    if (!*rejname) {
! 		(void)strcpy(rejname, outname);
! 		(void)strcat(rejname, ".rej");
  	    }
***************
*** 251,253
      register char *s;
-     register int i;
  

--- 257,258 -----
      register char *s;
  
***************
*** 291,293
  	    case 'r':
! 		strcpy(rejname,Argv[1]);
  		Argc--,Argv++;

--- 296,298 -----
  	    case 'r':
! 		(void)strcpy(rejname,Argv[1]);
  		Argc--,Argv++;
***************
*** 354,356
  {
!     register int i;
      register int pat_last = patch_last();

--- 359,361 -----
  {
!     register LINENUM i;
      register int pat_last = patch_last();
***************
*** 378,382
  {
!     register int old = 1;
!     register int lastline = patch_lines();
!     register int new = lastline+1;
  

--- 383,387 -----
  {
!     register LINENUM old = 1;
!     register LINENUM lastline = patch_lines();
!     register LINENUM new = lastline+1;
  
***************
*** 437,439
      bool this_line_is_command = FALSE;
!     register char *s, *t;
      long beginning_of_this_line;

--- 442,444 -----
      bool this_line_is_command = FALSE;
!     register char *t;
      long beginning_of_this_line;
***************
*** 440,442
  
!     unlink(TMPOUTNAME);
      copy_file(filearg[0],TMPOUTNAME);

--- 445,447 -----
  
!     (void)unlink(TMPOUTNAME);
      copy_file(filearg[0],TMPOUTNAME);
***************
*** 442,444
      copy_file(filearg[0],TMPOUTNAME);
!     sprintf(buf,"/bin/ed %s",TMPOUTNAME);
      pipefp = popen(buf,"w");

--- 447,449 -----
      copy_file(filearg[0],TMPOUTNAME);
!     (void)sprintf(buf,"/bin/ed %s",TMPOUTNAME);
      pipefp = popen(buf,"w");
***************
*** 470,473
      fprintf(pipefp,"q\n");
!     fflush(pipefp);
!     pclose(pipefp);
      ignore_signals();

--- 475,478 -----
      fprintf(pipefp,"q\n");
!     (void)fflush(pipefp);
!     (void)pclose(pipefp);
      ignore_signals();
***************
*** 480,482
  {
!     mktemp(name);
      ofp = fopen(name,"w");

--- 485,487 -----
  {
!     (void)mktemp(name);
      ofp = fopen(name,"w");
***************
*** 489,491
  {
!     mktemp(name);
      rejfp = fopen(name,"w");

--- 494,496 -----
  {
!     (void)mktemp(name);
      rejfp = fopen(name,"w");
***************
*** 496,498
  move_file(from,to)
! char *to;
  {

--- 501,503 -----
  move_file(from,to)
! char *from, *to;
  {
***************
*** 514,517
  	while ((i=read(fromfd,buf,sizeof buf)) > 0)
! 	    write(1,buf,i);
! 	close(fromfd);
  	return;

--- 519,523 -----
  	while ((i=read(fromfd,buf,sizeof buf)) > 0)
! 	    if (write(1,buf,i) != 1)
! 		fatal("patch: write failed\n");
! 	(void)close(fromfd);
  	return;
***************
*** 519,522
  
!     strcpy(bakname,to);
!     strcat(bakname,origext?origext:ORIGEXT);
      if (stat(to,&filestat) >= 0) {	/* output file exists */

--- 525,528 -----
  
!     (void)strcpy(bakname,to);
!     (void)strcat(bakname,origext?origext:ORIGEXT);
      if (stat(to,&filestat) >= 0) {	/* output file exists */
***************
*** 537,539
  	    else
! 		strcpy(simplename, simplename+1);
  	}

--- 543,545 -----
  	    else
! 		(void)strcpy(simplename, simplename+1);
  	}
***************
*** 568,572
  	while ((i=read(fromfd,buf,sizeof buf)) > 0)
! 	    write(tofd,buf,i);
! 	close(fromfd);
! 	close(tofd);
      }

--- 574,579 -----
  	while ((i=read(fromfd,buf,sizeof buf)) > 0)
! 	    if (write(tofd,buf,i) != i)
! 		fatal("patch: write failed\n");
! 	(void)close(fromfd);
! 	(void)close(tofd);
      }
***************
*** 572,574
      }
!     unlink(from);
  }

--- 579,581 -----
      }
!     (void)unlink(from);
  }
***************
*** 576,577
  copy_file(from,to)
  {

--- 583,585 -----
  copy_file(from,to)
+ char *from, *to;
  {
***************
*** 588,592
      while ((i=read(fromfd,buf,sizeof buf)) > 0)
! 	write(tofd,buf,i);
!     close(fromfd);
!     close(tofd);
  }

--- 596,601 -----
      while ((i=read(fromfd,buf,sizeof buf)) > 0)
! 	if (write(tofd,buf,i) != i)
! 	    fatal("patch: write (%s) failed\n", to);
!     (void)close(fromfd);
!     (void)close(tofd);
  }
***************
*** 606,608
      copy_till(input_lines);		/* dump remainder of file */
!     fclose(ofp);
      ofp = Nullfp;

--- 615,617 -----
      copy_till(input_lines);		/* dump remainder of file */
!     (void)fclose(ofp);
      ofp = Nullfp;
***************
*** 625,627
  {
!     register int pline;
      register LINENUM iline;

--- 634,636 -----
  {
!     register LINENUM pline;
      register LINENUM iline;
***************
*** 627,629
      register LINENUM iline;
!     register int pat_lines = patch_lines();
  

--- 636,638 -----
      register LINENUM iline;
!     register LINENUM pat_lines = patch_lines();
  
***************
*** 655,657
  	i_size = 0;
! 	free(i_ptr);
  	free(i_womp);

--- 664,666 -----
  	i_size = 0;
! 	free((char *)i_ptr);
  	free(i_womp);
***************
*** 662,664
  	using_plan_a = TRUE;		/* maybe the next one is smaller */
! 	close(tifd);
  	tifd = -1;

--- 671,673 -----
  	using_plan_a = TRUE;		/* maybe the next one is smaller */
! 	(void)close(tifd);
  	tifd = -1;
***************
*** 692,694
      if (stat(filename,&filestat) < 0) {
! 	sprintf(buf,"RCS/%s%s",filename,RCSSUFFIX);
  	if (stat(buf,&filestat) >= 0 || stat(buf+4,&filestat) >= 0) {

--- 701,703 -----
      if (stat(filename,&filestat) < 0) {
! 	(void)sprintf(buf,"RCS/%s%s",filename,RCSSUFFIX);
  	if (stat(buf,&filestat) >= 0 || stat(buf+4,&filestat) >= 0) {
***************
*** 694,696
  	if (stat(buf,&filestat) >= 0 || stat(buf+4,&filestat) >= 0) {
! 	    sprintf(buf,CHECKOUT,filename);
  	    if (verbose)

--- 703,705 -----
  	if (stat(buf,&filestat) >= 0 || stat(buf+4,&filestat) >= 0) {
! 	    (void)sprintf(buf,CHECKOUT,filename);
  	    if (verbose)
***************
*** 702,704
  	else {
! 	    sprintf(buf,"%s%s",SCCSPREFIX,filename);
  	    if (stat(buf,&filestat) >= 0) {

--- 711,713 -----
  	else {
! 	    (void)sprintf(buf,"%s%s",SCCSPREFIX,filename);
  	    if (stat(buf,&filestat) >= 0) {
***************
*** 704,706
  	    if (stat(buf,&filestat) >= 0) {
! 		sprintf(buf,GET,filename);
  		if (verbose)

--- 713,715 -----
  	    if (stat(buf,&filestat) >= 0) {
! 		(void)sprintf(buf,GET,filename);
  		if (verbose)
***************
*** 716,718
      i_size = filestat.st_size;
!     i_womp = malloc(i_size+2);
      if (i_womp == Nullch)

--- 725,727 -----
      i_size = filestat.st_size;
!     i_womp = malloc((unsigned)(i_size+2));
      if (i_womp == Nullch)
***************
*** 721,723
  	fatal("Can't open file %s\n",filename);
!     if (read(ifd,i_womp,i_size) < i_size)
  	fatal("Can't read file %s\n",filename);

--- 730,732 -----
  	fatal("Can't open file %s\n",filename);
!     if (read(ifd,i_womp,(int)i_size) < i_size)/* but what if i_size>32767? */
  	fatal("Can't read file %s\n",filename);
***************
*** 723,725
  	fatal("Can't read file %s\n",filename);
!     close(ifd);
      if (i_womp[i_size-1] != '\n')

--- 732,734 -----
  	fatal("Can't read file %s\n",filename);
!     (void)close(ifd);
      if (i_womp[i_size-1] != '\n')
***************
*** 735,737
      }
!     i_ptr = (char **)malloc((iline + 1) * sizeof(char *));
      if (i_ptr == Null(char **)) {	/* shucks, it was a near thing */

--- 744,746 -----
      }
!     i_ptr = (char **)malloc((unsigned)((iline + 1) * sizeof(char *)));
      if (i_ptr == Null(char **)) {	/* shucks, it was a near thing */
***************
*** 737,739
      if (i_ptr == Null(char **)) {	/* shucks, it was a near thing */
! 	free(i_womp);
  	return FALSE;

--- 746,748 -----
      if (i_ptr == Null(char **)) {	/* shucks, it was a near thing */
! 	free((char *)i_womp);
  	return FALSE;
***************
*** 780,782
  	fatal("Can't open file %s\n",filename);
!     mktemp(TMPINNAME);
      if ((tifd = creat(TMPINNAME,0666)) < 0)

--- 789,791 -----
  	fatal("Can't open file %s\n",filename);
!     (void)mktemp(TMPINNAME);
      if ((tifd = creat(TMPINNAME,0666)) < 0)
***************
*** 800,802
      }
!     fseek(ifp,0L,0);			/* rewind file */
      lines_per_buf = BUFFERSIZE / maxlen;

--- 809,811 -----
      }
!     (void)fseek(ifp,0L,0);		/* rewind file */
      lines_per_buf = BUFFERSIZE / maxlen;
***************
*** 803,806
      tireclen = maxlen;
!     tibuf[0] = malloc(BUFFERSIZE + 1);
!     tibuf[1] = malloc(BUFFERSIZE + 1);
      if (tibuf[1] == Nullch)

--- 812,815 -----
      tireclen = maxlen;
!     tibuf[0] = malloc((unsigned)(BUFFERSIZE + 1));
!     tibuf[1] = malloc((unsigned)(BUFFERSIZE + 1));
      if (tibuf[1] == Nullch)
***************
*** 809,811
  	if (! (i % lines_per_buf))	/* new block */
! 	    write(tifd,tibuf[0],BUFFERSIZE);
  	if (fgets(tibuf[0] + maxlen * (i%lines_per_buf), maxlen + 1, ifp)

--- 818,820 -----
  	if (! (i % lines_per_buf))	/* new block */
! 	    (void)write(tifd,tibuf[0],BUFFERSIZE);
  	if (fgets(tibuf[0] + maxlen * (i%lines_per_buf), maxlen + 1, ifp)
***************
*** 814,816
  	    if (i % lines_per_buf)
! 		write(tifd,tibuf[0],BUFFERSIZE);
  	    break;

--- 823,825 -----
  	    if (i % lines_per_buf)
! 		(void)write(tifd,tibuf[0],BUFFERSIZE);
  	    break;
***************
*** 818,821
      }
!     fclose(ifp);
!     close(tifd);
      if ((tifd = open(TMPINNAME,0)) < 0) {

--- 827,830 -----
      }
!     (void)fclose(ifp);
!     (void)close(tifd);
      if ((tifd = open(TMPINNAME,0)) < 0) {
***************
*** 845,847
  	    tiline[whichbuf] = baseline;
! 	    lseek(tifd,(long)baseline / lines_per_buf * BUFFERSIZE,0);
  	    if (read(tifd,tibuf[whichbuf],BUFFERSIZE) < 0)

--- 854,856 -----
  	    tiline[whichbuf] = baseline;
! 	    (void)lseek(tifd,(long)baseline / lines_per_buf * BUFFERSIZE,0);
  	    if (read(tifd,tibuf[whichbuf],BUFFERSIZE) < 0)
***************
*** 882,884
      if (filename == Nullch || !*filename || strEQ(filename,"-")) {
! 	mktemp(TMPPATNAME);
  	pfp = fopen(TMPPATNAME,"w");

--- 891,893 -----
      if (filename == Nullch || !*filename || strEQ(filename,"-")) {
! 	(void)mktemp(TMPPATNAME);
  	pfp = fopen(TMPPATNAME,"w");
***************
*** 888,890
  	    fputs(buf,pfp);
! 	fclose(pfp);
  	filename = TMPPATNAME;

--- 897,899 -----
  	    fputs(buf,pfp);
! 	(void)fclose(pfp);
  	filename = TMPPATNAME;
***************
*** 894,896
  	fatal("patch file %s not found\n",filename);
!     fstat(pfp->_file,&filestat);
      p_filesize = filestat.st_size;

--- 903,905 -----
  	fatal("patch file %s not found\n",filename);
!     (void)fstat(pfp->_file,&filestat);
      p_filesize = filestat.st_size;
***************
*** 953,955
      register char *s, *t;
-     char *ret;
      char *oldname = Nullch;

--- 962,963 -----
      register char *s, *t;
      char *oldname = Nullch;
***************
*** 958,960
  
!     fseek(pfp,p_base,0);
      for (;;) {

--- 966,968 -----
  
!     (void)fseek(pfp,p_base,0);
      for (;;) {
***************
*** 1050,1053
      register char *t;
!     char *test;
!     char tmpbuf[64];
  

--- 1058,1060 -----
      register char *t;
!     char tmpbuf[200];
  
***************
*** 1060,1062
      name = savestr(name);
!     sprintf(tmpbuf,"RCS/%s",name);
      free(s);

--- 1067,1069 -----
      name = savestr(name);
!     (void)sprintf(tmpbuf,"RCS/%s",name);
      free(s);
***************
*** 1063,1065
      if (stat(name,&filestat) < 0) {
! 	strcat(tmpbuf,RCSSUFFIX);
  	if (stat(tmpbuf,&filestat) < 0 && stat(tmpbuf+4,&filestat) < 0) {

--- 1070,1072 -----
      if (stat(name,&filestat) < 0) {
! 	(void)strcat(tmpbuf,RCSSUFFIX);
  	if (stat(tmpbuf,&filestat) < 0 && stat(tmpbuf+4,&filestat) < 0) {
***************
*** 1065,1067
  	if (stat(tmpbuf,&filestat) < 0 && stat(tmpbuf+4,&filestat) < 0) {
! 	    sprintf(tmpbuf,"%s%s",SCCSPREFIX,name);
  	    if (stat(tmpbuf,&filestat) < 0) {

--- 1072,1074 -----
  	if (stat(tmpbuf,&filestat) < 0 && stat(tmpbuf+4,&filestat) < 0) {
! 	    (void)sprintf(tmpbuf,"%s%s",SCCSPREFIX,name);
  	    if (stat(tmpbuf,&filestat) < 0) {
***************
*** 1088,1090
      if (verbose && p_base < file_pos) {
! 	fseek(pfp,p_base,0);
  	say("The text leading up to this was:\n--------------------------\n");

--- 1095,1097 -----
      if (verbose && p_base < file_pos) {
! 	(void)fseek(pfp,p_base,0);
  	say("The text leading up to this was:\n--------------------------\n");
***************
*** 1097,1099
      else
! 	fseek(pfp,file_pos,0);
  }

--- 1104,1106 -----
      else
! 	(void)fseek(pfp,file_pos,0);
  }
***************
*** 1126,1128
  		if (p_max - p_last < 4)
! 		    strcpy(buf,"  \n");	/* assume blank lines got chopped */
  		else

--- 1133,1135 -----
  		if (p_max - p_last < 4)
! 		    (void)strcpy(buf,"  \n");	/* assume blank lines got chopped */
  		else
***************
*** 1232,1234
  	}
! 	sprintf(buf,"*** %d,%d\n", p_first, p_first + p_lines - 1);
  	p_line[0] = savestr(buf);

--- 1239,1241 -----
  	}
! 	(void)sprintf(buf,"*** %d,%d\n", p_first, p_first + p_lines - 1);
  	p_line[0] = savestr(buf);
***************
*** 1256,1258
  	}
! 	sprintf(buf,"--- %d,%d\n",min,max);
  	p_line[i] = savestr(buf);

--- 1263,1265 -----
  	}
! 	(void)sprintf(buf,"--- %d,%d\n",min,max);
  	p_line[i] = savestr(buf);
***************
*** 1307,1309
  	if (buf != s)
! 	    strcpy(buf,s);
      }

--- 1314,1316 -----
  	if (buf != s)
! 	    (void)strcpy(buf,s);
      }
***************
*** 1318,1319
  
  patch_lines()

--- 1325,1327 -----
  
+ LINENUM
  patch_lines()
***************
*** 1359,1362
  char *
! savestr(string)
! char *string;
  {

--- 1367,1370 -----
  char *
! savestr(s)
! register char *s;
  {
***************
*** 1362,1364
  {
!     return strcpy(malloc(strlen(string)+1),string);
  }

--- 1370,1382 -----
  {
!     register char  *rv,
!                    *t;
! 
!     t = s;
!     while (*t++);
!     rv = malloc ((unsigned) (t - s));
!     if (rv == NULL)
! 	fatal ("patch: out of memory (savestr)\n");
!     t = rv;
!     while (*t++ = *s++);
!     return rv;
  }
***************
*** 1368,1373
  {
!     unlink(TMPINNAME);
!     unlink(TMPOUTNAME);
!     unlink(TMPREJNAME);
!     unlink(TMPPATNAME);
      exit(status);

--- 1386,1391 -----
  {
!     (void)unlink(TMPINNAME);
!     (void)unlink(TMPOUTNAME);
!     (void)unlink(TMPREJNAME);
!     (void)unlink(TMPPATNAME);
      exit(status);
***************
*** 1375,1376
  
  say(pat,arg1,arg2,arg3)

--- 1393,1405 -----
  
+ #ifdef lint
+ 
+ /*VARARGS ARGSUSED*/
+ say(pat) char *pat; { ; }
+ /*VARARGS ARGSUSED*/
+ fatal(pat) char *pat; { ; }
+ /*VARARGS ARGSUSED*/
+ ask(pat) char *pat; { ; }
+ 
+ #else lint
+ 
  say(pat,arg1,arg2,arg3)
***************
*** 1380,1382
      fprintf(stderr,pat,arg1,arg2,arg3);
!     fflush(stderr);
  }

--- 1409,1411 -----
      fprintf(stderr,pat,arg1,arg2,arg3);
!     (void)fflush(stderr);
  }
***************
*** 1396,1397
      int ttyfd = open("/dev/tty",2);
  

--- 1425,1427 -----
      int ttyfd = open("/dev/tty",2);
+     int r;
  
***************
*** 1398,1401
      say(pat,arg1,arg2,arg3);
!     read((ttyfd < 0 ? 2 : ttyfd), buf, sizeof buf);
!     close(ttyfd);
  }

--- 1428,1437 -----
      say(pat,arg1,arg2,arg3);
!     if (ttyfd >= 0) {
! 	r = read(ttyfd, buf, sizeof buf);
! 	(void)close(ttyfd);
!     }
!     else
! 	r = read(2, buf, sizeof buf);
!     if (r <= 0)
! 	buf[0] = 0;
  }
***************
*** 1401,1402
  }
  

--- 1437,1439 -----
  }
+ #endif lint
  
***************
*** 1423,1426
  {
!     signal(SIGHUP,my_exit);
!     signal(SIGINT,my_exit);
  }

--- 1460,1465 -----
  {
!     if (signal(SIGHUP, SIG_IGN) != SIG_IGN)
! 	(void) signal(SIGHUP, my_exit);
!     if (signal(SIGINT, SIG_IGN) != SIG_IGN)
! 	(void) signal(SIGINT, my_exit);
  }
***************
*** 1429,1432
  {
!     signal(SIGHUP, SIG_IGN);
!     signal(SIGINT, SIG_IGN);
  }

--- 1468,1471 -----
  {
!     (void) signal(SIGHUP, SIG_IGN);
!     (void) signal(SIGINT, SIG_IGN);
  }
-- 
(This line accidently left nonblank.)

In-Real-Life: Chris Torek, Univ of MD Comp Sci Dept (301) 454-7690
UUCP:	{seismo,allegra,brl-bmd}!umcp-cs!chris
CSNet:	chris@umcp-cs		ARPA:	chris@maryland

dorab@neptune.cs.ucla.edu (Dorab Patel) (05/15/86)

here are context diffs to Larry Wall's "patch" program to fix some
minor bugs. the version that i applied these fixes to was obtained
from the UCI MH distribution which already had been modified for the
new "diff -c" that comes with 4.3bsd. thus, your line numbers may
vary. the change from (long) to (off_t) for the lseeks is not
critical ... in fact, may be undesirable if off_t is not defined on
your system.

'dorab


*** /tmp/,RCSt1016181   Wed May 14 18:01:10 1986
--- /tmp/,RCSt2016181   Wed May 14 18:01:14 1986
***************
*** 1,10 ****
  #ifndef lint
! static char RCSid[] = "@(#)patch.c    $Revision: 1.4 $";
  #endif not lint
     
  /* patch - a program to apply diffs to original files
   *
!  * $Header: patch.c,v 1.4 85/08/15 15:00:00 van Exp $
   *
   * Copyright 1984, Larry Wall
   *
--- 1,10 ----
  #ifndef lint
! static char RCSid[] = "@(#)patch.c    $Revision: 1.5 $";
  #endif not lint
     
  /* patch - a program to apply diffs to original files
   *
!  * $Header: patch.c,v 1.5 86/05/12 22:56:00 dorab Exp $
   *
   * Copyright 1984, Larry Wall
   *
***************
*** 12,17 ****
--- 12,24 ----
   * money off of it, or pretend that you wrote it.
   *
   * $Log:      patch.c,v $
+  * Revision 1.5  86/05/12  22:56:00  dorab
+  * changed (long) to (off_t) for lseeks.
+  * check_before was using max_pos_offset rather than max_neg_offset so
+  * changed that.
+  * the calculation of max_neg_offset should use ... + pch_context()
+  * rather than ... - pch_context().
+  *
   * Revision 1.4  85/08/15  15:00:00  van
   * initial revision as modified at berkeley
   *
***************
*** 186,192 ****
  bool rev_in_string();
  char *fetchname();
  long atol();
! long lseek();
  char *mktemp();
     
  /* patch type */
--- 193,199 ----
  bool rev_in_string();
  char *fetchname();
  long atol();
! off_t lseek();
  char *mktemp();
     
  /* patch type */
***************
*** 447,453 ****
      register LINENUM max_pos_offset = input_lines - first_guess
                                - pat_lines + 1;
      register LINENUM max_neg_offset = first_guess - last_frozen_line - 1
!                               - pch_context();
     
      if (!pat_lines)                   /* null range matches always */
        return first_guess;
--- 454,460 ----
      register LINENUM max_pos_offset = input_lines - first_guess
                                - pat_lines + 1;
      register LINENUM max_neg_offset = first_guess - last_frozen_line - 1
!                               + pch_context();
     
      if (!pat_lines)                   /* null range matches always */
        return first_guess;
***************
*** 457,463 ****
        return first_guess;
      for (offset = 1; ; offset++) {
        bool check_after = (offset <= max_pos_offset);
!       bool check_before = (offset <= max_pos_offset);
     
        if (check_after && patch_match(first_guess,offset)) {
  #ifdef DEBUGGING
--- 464,470 ----
        return first_guess;
      for (offset = 1; ; offset++) {
        bool check_after = (offset <= max_pos_offset);
!       bool check_before = (offset <= max_neg_offset);
     
        if (check_after && patch_match(first_guess,offset)) {
  #ifdef DEBUGGING
***************
*** 1088,1094 ****
            whichbuf = 1;
        else {
            tiline[whichbuf] = baseline;
!           Lseek(tifd,(long)baseline / lines_per_buf * BUFFERSIZE,0);
            if (read(tifd,tibuf[whichbuf],BUFFERSIZE) < 0)
                fatal("Error reading tmp file %s.\n",TMPINNAME);
        }
--- 1095,1101 ----
            whichbuf = 1;
        else {
            tiline[whichbuf] = baseline;
!           Lseek(tifd,(off_t)(baseline / lines_per_buf * BUFFERSIZE),0);
            if (read(tifd,tibuf[whichbuf],BUFFERSIZE) < 0)
                fatal("Error reading tmp file %s.\n",TMPINNAME);
        }