---
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