changeset 377:15ca7e49b6ff

The @@ -1,2 +3,4 @@ lines treat ,1 as implied, so the format isn't regular. (Yes, this was designed by the FSF, what gave it away?)
author Rob Landley <rob@landley.net>
date Sat, 21 May 2011 22:54:21 -0500
parents 35c8beb54800
children a9adc1ae0f6c
files toys/patch.c
diffstat 1 files changed, 13 insertions(+), 7 deletions(-) [+]
line wrap: on
line diff
--- a/toys/patch.c	Sun Feb 28 14:11:41 2010 -0600
+++ b/toys/patch.c	Sat May 21 22:54:21 2011 -0500
@@ -51,7 +51,8 @@
 	long prefix;
 
 	struct double_list *current_hunk;
-	long oldline, oldlen, newline, newlen, linenum;
+	long oldline, oldlen, newline, newlen;
+	long linenum;
 	int context, state, filein, fileout, filepatch, hunknum;
 	char *tempname;
 )
@@ -308,14 +309,19 @@
 			// way the patch man page says, so you have to read the first hunk
 			// and _guess_.
 
-		// Start a new hunk?
+		// Start a new hunk?  Usually @@ -oldline,oldlen +newline,newlen @@
+		// but a missing ,value means the value is 1.
 		} else if (state == 1 && !strncmp("@@ -", patchline, 4)) {
 			int i;
+			char *s = patchline+4;
 
-			i = sscanf(patchline+4, "%ld,%ld +%ld,%ld", &TT.oldline,
-						&TT.oldlen, &TT.newline, &TT.newlen);
-			if (i != 4)
-				error_exit("Corrupt hunk %d at %ld\n", TT.hunknum, TT.linenum);
+			// Read oldline[,oldlen] +newline[,newlen]
+
+			TT.oldlen = TT.newlen = 1;
+			TT.oldline = strtol(s, &s, 10);
+			if (*s == ',') TT.oldlen=strtol(s+1, &s, 10);
+			TT.newline = strtol(s+2, &s, 10);
+			if (*s == ',') TT.newlen = strtol(s+1, &s, 10);
 
 			TT.context = 0;
 			state = 2;
@@ -323,7 +329,7 @@
 			// If this is the first hunk, open the file.
 			if (TT.filein == -1) {
 				int oldsum, newsum, del = 0;
-				char *s, *name;
+				char *name;
 
  				oldsum = TT.oldline + TT.oldlen;
 				newsum = TT.newline + TT.newlen;