Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 19 Jul 2012 17:30:44 +0000
From:      jhagewood@FreeBSD.org
To:        svn-soc-all@FreeBSD.org
Subject:   socsvn commit: r239582 - in soc2012/jhagewood/diff3: . diff3
Message-ID:  <20120719173044.65A4D1065673@hub.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: jhagewood
Date: Thu Jul 19 17:30:43 2012
New Revision: 239582
URL: http://svnweb.FreeBSD.org/socsvn/?view=rev&rev=239582

Log:
  Fixed file open bug in diff3

Modified:
  soc2012/jhagewood/diff3/TODO
  soc2012/jhagewood/diff3/diff3/diff3prog.c
  soc2012/jhagewood/diff3/hagewood-diff3.patch

Modified: soc2012/jhagewood/diff3/TODO
==============================================================================
--- soc2012/jhagewood/diff3/TODO	Thu Jul 19 15:36:36 2012	(r239581)
+++ soc2012/jhagewood/diff3/TODO	Thu Jul 19 17:30:43 2012	(r239582)
@@ -5,3 +5,9 @@
 --strip-trailing-cr	COMPLETE
 --diff-program		INCOMPLETE
 Fixed binary detection	COMPLETE
+Test script		COMPLETE
+
+- BUG: Goes to usage when argc < 5 FIX: argc < 3
+- BUG: Would not open files correctly FIX: change which argv[] is passed 
+to fopen()
+- BUG: Seg faults. 

Modified: soc2012/jhagewood/diff3/diff3/diff3prog.c
==============================================================================
--- soc2012/jhagewood/diff3/diff3/diff3prog.c	Thu Jul 19 15:36:36 2012	(r239581)
+++ soc2012/jhagewood/diff3/diff3/diff3prog.c	Thu Jul 19 17:30:43 2012	(r239582)
@@ -165,6 +165,8 @@
         DIFFPROG_OPT,
 };
 
+#define MAX_CHECK 768	/* 3 kilobytes of chars. */
+
 #define OPTIONS "3aAeEiL:mTvxX"
 static struct option longopts[] = {
         { "ed",    		no_argument,		NULL,   'e' },
@@ -189,7 +191,7 @@
 int
 main(int argc, char **argv)
 {
-	int ch, i, m, n;
+	int ch, i, j, m, n;
 
 	eflag = 0;
 	oflag = 0;
@@ -245,8 +247,7 @@
 	}
 	argc -= optind;
 	argv += optind;
-	/* XXX - argc usage seems wrong here */
-	if (argc < 5)
+	if (argc < 3)
 		usage();
 	if (oflag) {
 		(void)snprintf(f1mark, sizeof(f1mark), "<<<<<<< %s",
@@ -262,11 +263,13 @@
 	increase();
 	m = readin(argv[0], &d13);
 	n = readin(argv[1], &d23);
-	for (i = 0; i <= 2; i++) {
-		if ((fp[i] = fopen(argv[i + 2], "r")) == NULL)
-			err(EXIT_FAILURE, "can't open %s", argv[i + 2]);
+	j = 0;
+	for (i = 2; i >= 0; i++) {
+		if ((fp[j] = fopen(argv[(argc-1)-i], "r")) == NULL)
+			err(EXIT_FAILURE, "Can't open %s", argv[(argc-1)-i]);
 		if (strip_cr)
-			remove_cr(fp[i]);
+			remove_cr(fp[j]);
+		j++;
 	}
 	merge(m, n);
 	exit(EXIT_SUCCESS);

Modified: soc2012/jhagewood/diff3/hagewood-diff3.patch
==============================================================================
--- soc2012/jhagewood/diff3/hagewood-diff3.patch	Thu Jul 19 15:36:36 2012	(r239581)
+++ soc2012/jhagewood/diff3/hagewood-diff3.patch	Thu Jul 19 17:30:43 2012	(r239582)
@@ -11,7 +11,7 @@
  .include <bsd.prog.mk>
 diff -rupN jhagewood/diff3/diff3-orig/diff3prog.c jhagewood/diff3/diff3/diff3prog.c
 --- jhagewood/diff3/diff3-orig/diff3prog.c	2012-07-18 16:22:12.000000000 -0400
-+++ jhagewood/diff3/diff3/diff3prog.c	2012-07-18 16:23:30.267560000 -0400
++++ jhagewood/diff3/diff3/diff3prog.c	2012-07-19 17:13:54.000000000 -0400
 @@ -64,19 +64,23 @@
   *	@(#)diff3.c	8.1 (Berkeley) 6/6/93
   */
@@ -52,7 +52,7 @@
   * is stored in last[1-3];
   */
  int last[4];
-@@ -134,29 +138,31 @@ int strip_cr;
+@@ -134,31 +138,35 @@ int strip_cr;
  int debug  = 0;
  char f1mark[40], f2mark[40], f3mark[40];	/* markers for -E and -X */
  
@@ -102,8 +102,12 @@
 +        DIFFPROG_OPT,
  };
  
++#define MAX_CHECK 768	/* 3 kilobytes of chars. */
++
  #define OPTIONS "3aAeEiL:mTvxX"
-@@ -166,19 +172,20 @@ static struct option longopts[] = {
+ static struct option longopts[] = {
+         { "ed",    		no_argument,		NULL,   'e' },
+@@ -166,23 +174,24 @@ static struct option longopts[] = {
  	{ "overlap-only",	no_argument,		NULL,	'x' },
  	{ "initial-tab",	no_argument,		NULL,	'T' },
  	{ "text",		no_argument,		NULL,	'a' },
@@ -129,7 +133,12 @@
  int
  main(int argc, char **argv)
  {
-@@ -216,12 +223,18 @@ main(int argc, char **argv)
+-	int ch, i, m, n;
++	int ch, i, j, m, n;
+ 
+ 	eflag = 0;
+ 	oflag = 0;
+@@ -216,12 +225,18 @@ main(int argc, char **argv)
  		case 'X':
  			oflag = eflag = 1;
  			break;
@@ -148,15 +157,19 @@
  		case STRIPCR_OPT:
  			strip_cr = 1;
  			break;
-@@ -235,7 +248,6 @@ main(int argc, char **argv)
- 	/* XXX - argc usage seems wrong here */
- 	if (argc < 5)
+@@ -232,10 +247,8 @@ main(int argc, char **argv)
+ 	}
+ 	argc -= optind;
+ 	argv += optind;
+-	/* XXX - argc usage seems wrong here */
+-	if (argc < 5)
++	if (argc < 3)
  		usage();
 -
  	if (oflag) {
  		(void)snprintf(f1mark, sizeof(f1mark), "<<<<<<< %s",
  		    labels[0] != NULL ? labels[0] :  
-@@ -247,13 +259,14 @@ main(int argc, char **argv)
+@@ -247,13 +260,16 @@ main(int argc, char **argv)
  		    labels[2] != NULL ? labels[2] :
  				argc >= 7 ? argv[6] : argv[4]);
  	}
@@ -164,15 +177,20 @@
  	increase();
  	m = readin(argv[0], &d13);
  	n = readin(argv[1], &d23);
- 	for (i = 0; i <= 2; i++) {
- 		if ((fp[i] = fopen(argv[i + 2], "r")) == NULL)
- 			err(EXIT_FAILURE, "can't open %s", argv[i + 2]);
+-	for (i = 0; i <= 2; i++) {
+-		if ((fp[i] = fopen(argv[i + 2], "r")) == NULL)
+-			err(EXIT_FAILURE, "can't open %s", argv[i + 2]);
++	j = 0;
++	for (i = 2; i >= 0; i++) {
++		if ((fp[j] = fopen(argv[(argc-1)-i], "r")) == NULL)
++			err(EXIT_FAILURE, "Can't open %s", argv[(argc-1)-i]);
 +		if (strip_cr)
-+			remove_cr(fp[i]);
++			remove_cr(fp[j]);
++		j++;
  	}
  	merge(m, n);
  	exit(EXIT_SUCCESS);
-@@ -265,7 +278,7 @@ main(int argc, char **argv)
+@@ -265,7 +281,7 @@ main(int argc, char **argv)
   * since the vector is processed in one sequential pass.
   * The vector could be optimized out of existence)
   */
@@ -181,7 +199,7 @@
  readin(char *name, struct diff **dd)
  {
  	int a, b, c, d, i;
-@@ -307,17 +320,18 @@ readin(char *name, struct diff **dd)
+@@ -307,17 +323,18 @@ readin(char *name, struct diff **dd)
  	return (i);
  }
  
@@ -202,7 +220,7 @@
  getchange(FILE *b)
  {
  	char *line;
-@@ -329,7 +343,7 @@ getchange(FILE *b)
+@@ -329,7 +346,7 @@ getchange(FILE *b)
  	return (NULL);
  }
  
@@ -211,7 +229,7 @@
  getline(FILE *b, size_t *n)
  {
  	char *cp;
-@@ -357,7 +371,7 @@ getline(FILE *b, size_t *n)
+@@ -357,7 +374,7 @@ getline(FILE *b, size_t *n)
  	return (buf);
  }
  
@@ -220,7 +238,7 @@
  merge(int m1, int m2)
  {
  	struct diff *d1, *d2, *d3;
-@@ -367,8 +381,7 @@ merge(int m1, int m2)
+@@ -367,8 +384,7 @@ merge(int m1, int m2)
  	d2 = d23;
  	j = 0;
  
@@ -230,7 +248,7 @@
  		printf("Binary file detected; comparison failed\n");
  		exit(EXIT_FAILURE);
  	}
-@@ -464,31 +477,29 @@ merge(int m1, int m2)
+@@ -464,31 +480,29 @@ merge(int m1, int m2)
  }
  
  static int
@@ -239,12 +257,12 @@
  {
 -        wint_t   ch = L'\0';
 -        size_t   i;
+-
+-        if (aflag || f == NULL)
+-                return (1);
 +	int	i, check_size;
 +	char ch;
  
--        if (aflag || f == NULL)
--                return (1);
--
 -        rewind(f);
 -        errno = 0;
 -        for (i = 0; i <= BUFSIZ; i++) {
@@ -279,7 +297,7 @@
  	printf("====%s\n", s);
  }
  
-@@ -497,9 +508,10 @@ separate(const char *s)
+@@ -497,9 +511,10 @@ separate(const char *s)
   * It is to be printed only if it does not duplicate something to be
   * printed later.
   */
@@ -291,7 +309,7 @@
  	printf("%d:", i);
  	last[i] = rold->to;
  	prange(rold);
-@@ -510,12 +522,14 @@ change(int i, struct range *rold, int du
+@@ -510,12 +525,14 @@ change(int i, struct range *rold, int du
  	(void)skip(i, rold->to, "  ");
  }
  
@@ -309,7 +327,7 @@
  	if (rold->to <= rold->from)
  		printf("%da\n", rold->from - 1);
  	else {
-@@ -531,7 +545,7 @@ prange(struct range *rold)
+@@ -531,7 +548,7 @@ prange(struct range *rold)
   * and an artificial dummy difference (trange) must be ginned up to
   * correspond to the change reported in the other file.
   */
@@ -318,7 +336,7 @@
  keep(int i, struct range *rnew)
  {
  	int delta;
-@@ -547,7 +561,7 @@ keep(int i, struct range *rnew)
+@@ -547,7 +564,7 @@ keep(int i, struct range *rnew)
   * skip to just before line number from in file "i".  If "pr" is non-NULL,
   * print all skipped stuff with string pr as a prefix.
   */
@@ -327,7 +345,7 @@
  skip(int i, int from, char *pr)
  {
  	size_t j, n;
-@@ -558,7 +572,6 @@ skip(int i, int from, char *pr)
+@@ -558,7 +575,6 @@ skip(int i, int from, char *pr)
  			trouble();
  		if (pr != NULL)
  			printf("%s%s", Tflag == 1? "\t" : pr, line);
@@ -335,7 +353,7 @@
  		cline[i]++;
  	}
  	return ((int) n);
-@@ -568,10 +581,10 @@ skip(int i, int from, char *pr)
+@@ -568,10 +584,10 @@ skip(int i, int from, char *pr)
   * Return 1 or 0 according as the old range (in file 1) contains exactly
   * the same data as the new range (in file 2).
   */
@@ -348,7 +366,7 @@
  	int nchar;
  	int nline;
  
-@@ -597,7 +610,7 @@ duplicate(struct range *r1, struct range
+@@ -597,7 +613,7 @@ duplicate(struct range *r1, struct range
  	return (1);
  }
  
@@ -357,7 +375,7 @@
  repos(int nchar)
  {
  	int i;
-@@ -606,18 +619,43 @@ repos(int nchar)
+@@ -606,18 +622,43 @@ repos(int nchar)
  		(void)fseek(fp[i], (long)-nchar, SEEK_CUR);
  }
  
@@ -403,7 +421,7 @@
  	if (((dup + 1) & eflag) == 0)
  		return (j);
  	j++;
-@@ -632,10 +670,10 @@ edit(struct diff *diff, int dup, int j)
+@@ -632,10 +673,10 @@ edit(struct diff *diff, int dup, int j)
  }
  
  /* regurgitate */
@@ -416,7 +434,7 @@
  	char block[BUFSIZ];
  
  	for (n = n; n > 0; n--) {
-@@ -657,14 +695,13 @@ edscript(int n)
+@@ -657,14 +698,13 @@ edscript(int n)
  			printf("%da\n%s\n.\n", de[n].old.from - 1, f1mark);
  		}
  	}
@@ -433,7 +451,7 @@
  increase(void)
  {
  	struct diff *p;
-@@ -698,13 +735,29 @@ increase(void)
+@@ -698,13 +738,29 @@ increase(void)
  	szchanges = newsz;
  }
  



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20120719173044.65A4D1065673>