diff options
author | Junio C Hamano <gitster@pobox.com> | 2008-01-31 01:27:50 +0300 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2008-02-05 11:38:41 +0300 |
commit | 42ab241cfacdcbae910d51c06fa2870cc94b0af3 (patch) | |
tree | 569d5e16ad260dcfd494aa67eb8bb41a21a21a25 | |
parent | 8441a9a84278718e9bfd49112dcc55136cea394f (diff) |
builtin-apply.c: do not feed copy_wsfix() leading '+'
The "patch" parameter used to include leading '+' of an added
line in the patch, and the array was treated as 1-based. Make
it accept the contents of the line alone and simplify the code.
Signed-off-by: Junio C Hamano <gitster@pobox.com>
-rw-r--r-- | builtin-apply.c | 38 |
1 files changed, 18 insertions, 20 deletions
diff --git a/builtin-apply.c b/builtin-apply.c index d0d008fde1..0bc33bdd52 100644 --- a/builtin-apply.c +++ b/builtin-apply.c @@ -1646,16 +1646,15 @@ static int copy_wsfix(char *output, const char *patch, int plen, unsigned ws_rule) { /* - * plen is number of bytes to be copied from patch, - * starting at patch+1 (patch[0] is '+'). Typically - * patch[plen] is '\n', unless this is the incomplete - * last line. + * plen is number of bytes to be copied from patch, starting + * at patch. Typically patch[plen-1] is '\n', unless this is + * the incomplete last line. */ int i; int add_nl_to_tail = 0; int fixed = 0; - int last_tab_in_indent = 0; - int last_space_in_indent = 0; + int last_tab_in_indent = -1; + int last_space_in_indent = -1; int need_fix_leading_space = 0; char *buf; @@ -1663,11 +1662,11 @@ static int copy_wsfix(char *output, const char *patch, int plen, * Strip trailing whitespace */ if ((ws_rule & WS_TRAILING_SPACE) && - (1 < plen && isspace(patch[plen-1]))) { - if (patch[plen] == '\n') + (2 < plen && isspace(patch[plen-2]))) { + if (patch[plen-1] == '\n') add_nl_to_tail = 1; plen--; - while (0 < plen && isspace(patch[plen])) + while (0 < plen && isspace(patch[plen-1])) plen--; fixed = 1; } @@ -1675,25 +1674,25 @@ static int copy_wsfix(char *output, const char *patch, int plen, /* * Check leading whitespaces (indent) */ - for (i = 1; i < plen; i++) { + for (i = 0; i < plen; i++) { char ch = patch[i]; if (ch == '\t') { last_tab_in_indent = i; if ((ws_rule & WS_SPACE_BEFORE_TAB) && - 0 < last_space_in_indent) + 0 <= last_space_in_indent) need_fix_leading_space = 1; } else if (ch == ' ') { last_space_in_indent = i; if ((ws_rule & WS_INDENT_WITH_NON_TAB) && 8 <= i - last_tab_in_indent) need_fix_leading_space = 1; - } - else + } else break; } buf = output; if (need_fix_leading_space) { + /* Process indent ourselves */ int consecutive_spaces = 0; int last = last_tab_in_indent + 1; @@ -1706,10 +1705,10 @@ static int copy_wsfix(char *output, const char *patch, int plen, } /* - * between patch[1..last], strip the funny spaces, + * between patch[0..last-1], strip the funny spaces, * updating them to tab as needed. */ - for (i = 1; i < last; i++, plen--) { + for (i = 0; i < last; i++) { char ch = patch[i]; if (ch != ' ') { consecutive_spaces = 0; @@ -1724,13 +1723,12 @@ static int copy_wsfix(char *output, const char *patch, int plen, } while (0 < consecutive_spaces--) *output++ = ' '; + plen -= last; + patch += last; fixed = 1; - i = last; } - else - i = 1; - memcpy(output, patch + i, plen); + memcpy(output, patch, plen); if (add_nl_to_tail) output[plen++] = '\n'; if (fixed) @@ -1871,7 +1869,7 @@ static int apply_one_fragment(struct image *img, struct fragment *frag, added = plen; } else { - added = copy_wsfix(new, patch, plen, ws_rule); + added = copy_wsfix(new, patch + 1, plen, ws_rule); } add_line_info(&postimage, new, added, (first == '+' ? 0 : LINE_COMMON)); |