[hackers] [sbase][PATCH] patch: improvments suggested by Silvan

From: Mattias Andrée <maandree_AT_kth.se>
Date: Sun, 24 Sep 2017 18:31:43 +0200

Signed-off-by: Mattias Andrée <maandree_AT_kth.se>
---
 patch.c | 182 +++++++++++++++++++++++++++++++++-------------------------------
 1 file changed, 95 insertions(+), 87 deletions(-)
diff --git a/patch.c b/patch.c
index c118dc9..caf34be 100644
--- a/patch.c
+++ b/patch.c
_AT_@ -41,7 +41,7 @@
 #define linecpy2mem(d, s)  (memcpy(d, (s).data, (s).len + 1))
 #define missinglf(l)       ((l).len && (l).data[(l).len - 1] != '\n')
 #define fwriteline(f, l)   (fwrite((l).data, 1, (l).len, f))
-#define enmemdup(f, s, n)  ((n) ? memcpy(enmalloc(f, n), s, n) : 0)
+#define enmemdup(f, s, n)  ((n) ? memcpy(enmalloc(f, n), s, n) : NULL)
 
 enum { REJECTED = 1, FAILURE = 2 };
 enum applicability { APPLICABLE, APPLIED, INAPPLICABLE };
_AT_@ -104,10 +104,10 @@ struct patched_file {
 };
 
 static enum format specified_format = GUESS;
-static const char *patchfile = 0;
-static char *rejectfile = 0;
-static const char *outfile = 0;
-static char *apply_patches_to = 0;
+static const char *patchfile = NULL;
+static char *rejectfile = NULL;
+static const char *outfile = NULL;
+static char *apply_patches_to = NULL;
 static size_t pflag = SIZE_MAX;
 static int bflag = 0;
 static int fflag = 0;
_AT_@ -115,16 +115,16 @@ static int lflag = 0;
 static int Rflag = 0;
 static int Nflag = 0;
 static int Uflag = 0;
-static char *dflag = 0;
+static char *dflag = NULL;
 static int rejected = 0;
-static struct patched_file *prevpatch = 0;
+static struct patched_file *prevpatch = NULL;
 static size_t prevpatchn = 0;
-static struct patched_file *prevout = 0;
+static struct patched_file *prevout = NULL;
 static size_t prevoutn = 0;
 static char stdin_dash[sizeof("-")];
 static char stdout_dash[sizeof("-")];
-static char *ifdef = 0;
-static char *ifndef = 0;
+static char *ifdef = NULL;
+static char *ifndef = NULL;
 
 static void
 usage(void)
_AT_@ -134,7 +134,7 @@ usage(void)
 }
 
 static void
-load_lines(const char *path, struct file_data *out, int skip_lf, int orig)
+load_lines(struct file_data *out, const char *path, int skip_lf, int orig)
 {
 	FILE *f;
 	struct linebuf b = EMPTY_LINEBUF;
_AT_@ -165,12 +165,12 @@ static char *
 ask(const char *instruction)
 {
 	FILE *f;
-	char *answer = 0;
+	char *answer = NULL;
 	size_t size = 0;
 	ssize_t n;
 
 	if (fflag)
-		return 0;
+		return NULL;
 
 	if (!(f = fopen("/dev/tty", "r+")))
 		enprintf(FAILURE, "fopen /dev/tty:");
_AT_@ -180,13 +180,13 @@ ask(const char *instruction)
 	fflush(stdout);
 
 	if ((n = getline(&answer, &size, f)) <= 0) {
-		answer = 0;
+		answer = NULL;
 	} else {
 		n -= (answer[n - 1] == '\n');
-		answer[n] = 0;
+		answer[n] = '\0';
 		if (!*answer) {
 			free(answer);
-			answer = 0;
+			answer = NULL;
 		}
 	}
 
_AT_@ -202,13 +202,13 @@ adjust_filename(const char *filename)
 	const char *stripped = filename;
 	char *rc;
 
-	if (p == filename || p[-1] == '/')
-		return 0;
+	if (p == filename || *(p - 1) == '/')
+		return NULL;
 
 	for (; strips && (p = strchr(stripped, '/')); strips--)
 		for (stripped = p; *stripped == '/'; stripped++);
 	if (strips && pflag != SIZE_MAX)
-		return 0;
+		return NULL;
 
 	if (dflag && *stripped != '/')
 		enasprintf(FAILURE, &rc, "%s/%s", dflag, stripped);
_AT_@ -283,7 +283,7 @@ unquote(char *str)
 		}
 	}
 
-	str[w] = 0;
+	str[w] = '\0';
 	return 0;
 }
 
_AT_@ -302,7 +302,7 @@ parse_diff_line(char *str, char **old, char **new)
 	char *s = strchr(str, '\0');
 	int ret = 0;
 
-	*new = 0;
+	*new = NULL;
 	if (s == str)
 		return -1;
 
_AT_@ -313,7 +313,7 @@ again:
 				goto found;
 	} else {
 		while (--s != str && s - 1 != str)
-			if (s[-1] == ' ' && s[0] == '"')
+			if (*(s - 1) == ' ' && s[0] == '"')
 				goto found;
 	}
 
_AT_@ -348,19 +348,24 @@ ask_for_filename(struct patchset *patchset)
 {
 	size_t i;
 	char *answer;
+	int missing = 0;
 
-	for (i = 0; i < patchset->npatches; i++)
-		if (!patchset->patches[i].path)
-			goto found_unset;
-	return;
+	for (i = 0; i < patchset->npatches; i++) {
+		if (!patchset->patches[i].path) {
+			missing = 1;
+			break;
+		}
+	}
+
+	if (!missing)
+		return;
 
-found_unset:
 	if (!(answer = ask("please enter name of file to patch")))
 		exit(FAILURE);
 
-	/* Two assumtions are made here. (1) if there are multiple
-	 * patches to unnamed failes, they are all to the same file,
-	 * (with the specifications for -o to justify this assumption,)
+	/* Two assumptions are made here. (1) if there are multiple
+	 * patches to unnamed files, they are all to the same file,
+	 * (with the specifications for -o to justify this assumption)
 	 * and (2) no developer is going to free the filenames. */
 
 	if (access(answer, F_OK)) {
_AT_@ -387,7 +392,7 @@ reverse_hunk(struct parsed_hunk *hunk)
 {
 	struct hunk_content cont;
 	char *annot;
-	cont = hunk->old, hunk->old  = hunk->new, hunk->new = cont;
+	cont = hunk->old, hunk->old = hunk->new, hunk->new = cont;
 	annot = hunk->annot, hunk->annot = hunk->rannot, hunk->rannot = annot;
 }
 
_AT_@ -400,7 +405,7 @@ get_last_patch(const char *path)
 
 	if (!outfile && !ifdef) {
 		data = enmalloc(FAILURE, sizeof(*data));
-		load_lines(path, data, 0, 0);
+		load_lines(data, path, 0, 0);
 		return data;
 	}
 
_AT_@ -423,7 +428,7 @@ get_last_patch(const char *path)
 	prevpatch[prevpatchn++].data = data = enmalloc(FAILURE, sizeof(*prevpatch->data));
 
 load_data:
-	load_lines(path, data, 0, 1);
+	load_lines(data, path, 0, 1);
 	return data;
 }
 
_AT_@ -442,7 +447,7 @@ is_first_patch(const char *path)
 
 	prevpatch = enrealloc(FAILURE, prevpatch, (prevpatchn + 1) * sizeof(*prevpatch));
 	storefile(prevpatch + prevpatchn, attr);
-	prevpatch[prevpatchn].data = 0;
+	prevpatch[prevpatchn].data = NULL;
 	prevpatchn++;
 
 	return 1;
_AT_@ -487,7 +492,7 @@ start_over:
 
 	prevout = enrealloc(FAILURE, prevout, (prevoutn + 1) * sizeof(*prevout));
 	storefile(prevout + prevoutn, attr);
-	prevout[prevoutn].data = 0;
+	prevout[prevoutn].data = NULL;
 	prevoutn++;
 
 	return "w";
_AT_@ -534,11 +539,11 @@ get_filename_from_context_header(char *line)
 			break;
 	}
 
-	old_end = *end, *end = 0;
+	old_end = *end, *end = '\0';
 	rc = enstrdup(FAILURE, line);
 	*end = old_end;
 
-	return unquote(rc) ? 0 : rc;
+	return unquote(rc) ? NULL : rc;
 }
 
 static int
_AT_@ -574,7 +579,7 @@ parse_range(char *str, size_t *first, size_t *last, int *have_last)
 	errno = 0;
 	*first = strtoul(str, &str, 10);
 	if (errno)
-		return 0;
+		return NULL;
 	*last = 1;
 	if (have_last)
 		*have_last = *str == ',';
_AT_@ -582,7 +587,7 @@ parse_range(char *str, size_t *first, size_t *last, int *have_last)
 		errno = 0;
 		*last = strtoul(str + 1, &str, 10);
 		if (errno)
-			return 0;
+			return NULL;
 	}
 	return str;
 }
_AT_@ -597,7 +602,7 @@ parse_patch_normal(struct patch *patch, struct line *lines)
 	struct hunk hunk;
 
 	patch->nhunks = 0;
-	patch->hunks = 0;
+	patch->hunks = NULL;
 
 	while (guess_format(lines) == NORMAL) {
 		added = deleted = 0;
_AT_@ -663,9 +668,8 @@ out:
 		lines = patch->hunks[patch->nhunks - 1].lines;
 		lines += patch->hunks[patch->nhunks - 1].nlines;
 		return lines - lines_orig;
-	} else {
-		return 0;
 	}
+	return 0;
 }
 
 static size_t
_AT_@ -673,12 +677,12 @@ parse_patch_copied(struct patch *patch, struct line *lines)
 {
 	struct line *lines_orig = lines;
 	char *p;
-	size_t n, first, last = 0;
+	size_t n, first = 0, last = 0;
 	int have_last;
 	struct hunk hunk;
 
 	patch->nhunks = 0;
-	patch->hunks = 0;
+	patch->hunks = NULL;
 
 	if (parse_context_header(patch, lines, "***", "---"))
 		return 0;
_AT_@ -751,9 +755,8 @@ out:
 		lines = patch->hunks[patch->nhunks - 1].lines;
 		lines += patch->hunks[patch->nhunks - 1].nlines;
 		return lines - lines_orig;
-	} else {
-		return 0;
 	}
+	return 0;
 }
 
 static size_t
_AT_@ -767,7 +770,7 @@ parse_patch_unified(struct patch *patch, struct line *lines)
 	(void) unused;
 
 	patch->nhunks = 0;
-	patch->hunks = 0;
+	patch->hunks = NULL;
 
 	if (parse_context_header(patch, lines, "---", "+++"))
 		return 0;
_AT_@ -777,9 +780,9 @@ parse_patch_unified(struct patch *patch, struct line *lines)
 		hunk.head = lines++;
 		hunk.lines = lines;
 
-		if (!(p = parse_range(hunk.head->data + 4, &unused, &a_count, 0)) ||
+		if (!(p = parse_range(hunk.head->data + 4, &unused, &a_count, NULL)) ||
 		    !strstart(p, " +") ||
-		    !(p = parse_range(p + 2, &unused, &b_count, 0)) ||
+		    !(p = parse_range(p + 2, &unused, &b_count, NULL)) ||
 		    !strstart(p, " _AT_@") || !isnulblank(p[3]))
 			goto out;
 
_AT_@ -813,9 +816,8 @@ out:
 		lines = patch->hunks[patch->nhunks - 1].lines;
 		lines += patch->hunks[patch->nhunks - 1].nlines;
 		return lines - lines_orig;
-	} else {
-		return 0;
 	}
+	return 0;
 }
 
 static size_t
_AT_@ -828,7 +830,7 @@ parse_patch_ed(struct patch *patch, struct line *lines)
 			lines_last = ++lines;
 			continue;
 		}
-		last_addition = 0;
+		last_addition = NULL;
 	again:
 		while ((++lines)->data && !lineeq(*lines, "."))
 			last_addition = lines;
_AT_@ -838,7 +840,7 @@ parse_patch_ed(struct patch *patch, struct line *lines)
 			if ((!lineeq(*lines, "s/.//")  && !lineeq(*lines, "s/\\.//") &&
 			     !lineeq(*lines, "s/^.//") && !lineeq(*lines, "s/^\\.//")) ||
 			    !last_addition || !last_addition->len || last_addition->data[0] != '.') {
-				/* This is just so parse_ed_script does not have too be overkill. */
+				/* This is just so parse_ed_script does not have to be overkill. */
 				weprintf("suspicious line in ed-script, treating hunk as garbage: ");
 				fwriteline(stderr, *lines);
 				fprintf(stderr, "\n");
_AT_@ -857,7 +859,7 @@ parse_patch_ed(struct patch *patch, struct line *lines)
 
 	patch->nhunks = 1;
 	patch->hunks = enmalloc(FAILURE, sizeof(*(patch->hunks)));
-	patch->hunks->head = 0;
+	patch->hunks->head = NULL;
 	patch->hunks->lines = lines_orig;
 	patch->hunks->nlines = (size_t)(lines_last - lines_orig);
 
_AT_@ -906,12 +908,12 @@ parse_patchfile(struct patchset *ps, struct line *lines)
 			continue;
 		}
 
-		diff_line = index_line = 0;
+		diff_line = index_line = NULL;
 		for (i = 1; i <= garbage_since_last_patch; i++) {
-			if (!diff_line && linestart(lines[-i], "diff ") && !containsnul(lines[-i]))
-				diff_line = lines[-i].data;
-			if (!index_line && linestart(lines[-i], "Index:") && !containsnul(lines[-i]))
-				index_line = lines[-i].data;
+			if (!diff_line && linestart(*(lines - i), "diff ") && !containsnul(*(lines - i)))
+				diff_line = (lines - i)->data;
+			if (!index_line && linestart(*(lines - i), "Index:") && !containsnul(*(lines - i)))
+				index_line = (lines - i)->data;
 		}
 		old_garbage = garbage_since_last_patch;
 		garbage_since_last_patch = 0;
_AT_@ -981,8 +983,10 @@ save_file_cpp(FILE *f, struct file_data *file)
 			}
 			annot = '-';
 		}
+
 		if (i == file->n)
 			break;
+
 		if (annot == '-')
 			fprintf(f, "%s\n", file->d[i].new ? "#else" : "#endif");
 		else if (annot == ' ' && file->d[i].new)
_AT_@ -1012,10 +1016,19 @@ save_file(FILE *f, struct file_data *file)
 static void
 save_rejected_line(FILE *f, int annot, int copied, struct line *line)
 {
-	fprintf(f, "%c%s",
-	        copied ? (strchr("<>", annot) ? '!' : annot)
-	               : (annot == '<' ? '-' : annot == '>' ? '+' : annot),
-	        copied ? " " : "");
+	if (copied) {
+		if (strchr("<>", annot))
+			fprintf(f, "! ");
+		else
+			fprintf(f, "%c ", annot);
+	} else {
+		if (annot == '<')
+			fprintf(f, "-");
+		else if (annot == '>')
+			fprintf(f, "+");
+		else
+			fprintf(f, "%c", annot);
+	}
 	fwriteline(f, *line);
 	if (line->len && line->data[line->len - 1] != '\n')
 		fprintf(f, "\n%s\n", NO_LF_MARK);
_AT_@ -1151,7 +1164,7 @@ parse_hunk_normal(struct hunk *hunk, struct parsed_hunk *parsed)
 			parsed->annot[j++] = action == 'c' ? '>' : '+';
 		}
 	}
-	parsed->annot[j] = 0;
+	parsed->annot[j] = '\0';
 }
 
 static void
_AT_@ -1178,24 +1191,19 @@ parse_hunk_copied(struct hunk *hunk, struct parsed_hunk *parsed)
 	new->start = strtoul(p, &p, 10);
 	new->len = 0;
 
-	if (old->len) {
-		for (; i < hunk->nlines; i++)
-			subline(new->lines + new->len++, hunk->lines + i, 2);
-	} else {
-		for (; i < hunk->nlines; i++) {
-			subline(new->lines + new->len++, hunk->lines + i, 2);
-			if (hunk->lines[i].data[0] != '+')
-				subline(old->lines + old->len++, hunk->lines + i, 2);
-		}
+	for (; i < hunk->nlines; i++) {
+		subline(new->lines + new->len++, hunk->lines + i, 2);
+		if (!old->len && hunk->lines[i].data[0] != '+')
+			subline(old->lines + old->len++, hunk->lines + i, 2);
 	}
 
 	if (!new->len)
 		for (i = 0; i < old->len; i++)
-			if (old->lines[i].data[-2] != '-')
+			if (*(old->lines[i].data - 2) != '-')
 				new->lines[new->len++] = old->lines[i];
 
-#define OLDLINE  a < old->len && old->lines[a].data[-2]
-#define NEWLINE  b < new->len && new->lines[b].data[-2]
+#define OLDLINE  a < old->len && *(old->lines[a].data - 2)
+#define NEWLINE  b < new->len && *(new->lines[b].data - 2)
 
 	for (i = a = b = 0; a < old->len || b < new->len;) {
 		if (OLDLINE == '-')  parsed->annot[i++] = '-', a++;
_AT_@ -1205,7 +1213,7 @@ parse_hunk_copied(struct hunk *hunk, struct parsed_hunk *parsed)
 		while (OLDLINE == '!')  parsed->annot[i++] = '<', a++;
 		while (NEWLINE == '!')  parsed->annot[i++] = '>', b++;
 	}
-	parsed->annot[i] = 0;
+	parsed->annot[i] = '\0';
 }
 
 static void
_AT_@ -1237,7 +1245,7 @@ parse_hunk_unified(struct hunk *hunk, struct parsed_hunk *parsed)
 
 	for (i = 0; i < hunk->nlines; i++)
 		parsed->annot[i] = hunk->lines[i].data[0];
-	parsed->annot[i] = 0;
+	parsed->annot[i] = '\0';
 	for (;;) {
 		p = strstr(parsed->annot, "-+");
 		q = strstr(parsed->annot, "+-");
_AT_@ -1245,7 +1253,7 @@ parse_hunk_unified(struct hunk *hunk, struct parsed_hunk *parsed)
 			break;
 		if (!p || (q && p > q))
 			p = q;
-		for (; p != parsed->annot && strchr("-+", p[-1]); p--);
+		for (; p != parsed->annot && strchr("-+", *(p - 1)); p--);
 		for (; *p == '-' || *p == '+'; p++)
 			*p = "<>"[*p == '+'];
 	}
_AT_@ -1285,7 +1293,7 @@ parse_hunk(struct hunk *hunk, enum format format, struct parsed_hunk *parsed)
 		default:   parsed->rannot[i] = ' ';  break;
 		}
 	}
-	parsed->rannot[n] = 0;
+	parsed->rannot[n] = '\0';
 }
 
 static int
_AT_@ -1497,7 +1505,7 @@ rejected:
 static int
 parse_ed_script(struct patch *patch, struct file_data *file)
 {
-	/* Not relying on ed(1p) lets us implemented -D for
+	/* Not relying on ed(1p) lets us implement -D for
 	 * ed-scripts too without diff(1p):ing afterwards.
 	 * This is not significantly more complex than
 	 * relying on ed(1p) anyways. */
_AT_@ -1600,7 +1608,7 @@ parse_ed_script(struct patch *patch, struct file_data *file)
 		start = strtoul(hunk->head->data + 4, &p, 10);
 		count = strtoul(p + 1, &p, 10);
 		p = strchr(q = p + 2, ',') + 1;
-		added = strtoul(p, 0, 10);
+		added = strtoul(p, NULL, 10);
 		q += sprintf(q, "%zu", start + offset - !added + !count);
 		*q++ = ',';
 		memmove(q, p, strlen(p) + 1);
_AT_@ -1624,7 +1632,7 @@ fuzzstr(ssize_t fuzz)
 }
 
 static void
-apply_patch(struct patch *patch, size_t patch_index)
+apply_patch(struct patch *patch)
 {
 	struct file_data *file;
 	struct parsed_hunk hunk;
_AT_@ -1633,7 +1641,7 @@ apply_patch(struct patch *patch, size_t patch_index)
 	int firstrej = 1, edscript = patch->format == ED;
 	ssize_t offset = 0, fuzz;
 	size_t i;
-	FILE *f = 0;
+	FILE *f = NULL;
 
 	if (!rejectfile)
 		enasprintf(FAILURE, &rejfile, "%s.rej", path);
_AT_@ -1708,7 +1716,7 @@ apply_patchset(struct patchset *ps)
 {
 	size_t i = 0;
 	for (i = 0; i < ps->npatches; i++)
-		apply_patch(ps->patches + i, i);
+		apply_patch(ps->patches + i);
 	free(ps->patches);
 }
 
_AT_@ -1727,7 +1735,7 @@ main(int argc, char *argv[])
 {
 	struct patchset patchset;
 	struct file_data patchfile_data;
-	char *p, *Dflag = 0;
+	char *p, *Dflag = NULL;
 
 	stdin_dash[0] = stdout_dash[0] = '-';
 	stdin_dash[1] = stdout_dash[1] = '\0';
_AT_@ -1825,7 +1833,7 @@ main(int argc, char *argv[])
 			p = ifdef, ifdef = ifndef, ifndef = p;
 	}
 
-	load_lines(patchfile, &patchfile_data, 1, 0);
+	load_lines(&patchfile_data, patchfile, 1, 0);
 	parse_patchfile(&patchset, get_lines(&patchfile_data));
 	ask_for_filename(&patchset);
 	apply_patchset(&patchset);
-- 
2.11.1
Received on Sun Sep 24 2017 - 18:31:43 CEST

This archive was generated by hypermail 2.3.0 : Sun Sep 24 2017 - 18:36:28 CEST