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>
This commit is contained in:
Junio C Hamano 2008-01-30 14:27:50 -08:00
parent 8441a9a842
commit 42ab241cfa

View File

@ -1646,16 +1646,15 @@ static int copy_wsfix(char *output, const char *patch, int plen,
unsigned ws_rule) unsigned ws_rule)
{ {
/* /*
* plen is number of bytes to be copied from patch, * plen is number of bytes to be copied from patch, starting
* starting at patch+1 (patch[0] is '+'). Typically * at patch. Typically patch[plen-1] is '\n', unless this is
* patch[plen] is '\n', unless this is the incomplete * the incomplete last line.
* last line.
*/ */
int i; int i;
int add_nl_to_tail = 0; int add_nl_to_tail = 0;
int fixed = 0; int fixed = 0;
int last_tab_in_indent = 0; int last_tab_in_indent = -1;
int last_space_in_indent = 0; int last_space_in_indent = -1;
int need_fix_leading_space = 0; int need_fix_leading_space = 0;
char *buf; char *buf;
@ -1663,11 +1662,11 @@ static int copy_wsfix(char *output, const char *patch, int plen,
* Strip trailing whitespace * Strip trailing whitespace
*/ */
if ((ws_rule & WS_TRAILING_SPACE) && if ((ws_rule & WS_TRAILING_SPACE) &&
(1 < plen && isspace(patch[plen-1]))) { (2 < plen && isspace(patch[plen-2]))) {
if (patch[plen] == '\n') if (patch[plen-1] == '\n')
add_nl_to_tail = 1; add_nl_to_tail = 1;
plen--; plen--;
while (0 < plen && isspace(patch[plen])) while (0 < plen && isspace(patch[plen-1]))
plen--; plen--;
fixed = 1; fixed = 1;
} }
@ -1675,25 +1674,25 @@ static int copy_wsfix(char *output, const char *patch, int plen,
/* /*
* Check leading whitespaces (indent) * Check leading whitespaces (indent)
*/ */
for (i = 1; i < plen; i++) { for (i = 0; i < plen; i++) {
char ch = patch[i]; char ch = patch[i];
if (ch == '\t') { if (ch == '\t') {
last_tab_in_indent = i; last_tab_in_indent = i;
if ((ws_rule & WS_SPACE_BEFORE_TAB) && if ((ws_rule & WS_SPACE_BEFORE_TAB) &&
0 < last_space_in_indent) 0 <= last_space_in_indent)
need_fix_leading_space = 1; need_fix_leading_space = 1;
} else if (ch == ' ') { } else if (ch == ' ') {
last_space_in_indent = i; last_space_in_indent = i;
if ((ws_rule & WS_INDENT_WITH_NON_TAB) && if ((ws_rule & WS_INDENT_WITH_NON_TAB) &&
8 <= i - last_tab_in_indent) 8 <= i - last_tab_in_indent)
need_fix_leading_space = 1; need_fix_leading_space = 1;
} } else
else
break; break;
} }
buf = output; buf = output;
if (need_fix_leading_space) { if (need_fix_leading_space) {
/* Process indent ourselves */
int consecutive_spaces = 0; int consecutive_spaces = 0;
int last = last_tab_in_indent + 1; 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. * updating them to tab as needed.
*/ */
for (i = 1; i < last; i++, plen--) { for (i = 0; i < last; i++) {
char ch = patch[i]; char ch = patch[i];
if (ch != ' ') { if (ch != ' ') {
consecutive_spaces = 0; consecutive_spaces = 0;
@ -1724,13 +1723,12 @@ static int copy_wsfix(char *output, const char *patch, int plen,
} }
while (0 < consecutive_spaces--) while (0 < consecutive_spaces--)
*output++ = ' '; *output++ = ' ';
plen -= last;
patch += last;
fixed = 1; fixed = 1;
i = last;
} }
else
i = 1;
memcpy(output, patch + i, plen); memcpy(output, patch, plen);
if (add_nl_to_tail) if (add_nl_to_tail)
output[plen++] = '\n'; output[plen++] = '\n';
if (fixed) if (fixed)
@ -1871,7 +1869,7 @@ static int apply_one_fragment(struct image *img, struct fragment *frag,
added = plen; added = plen;
} }
else { else {
added = copy_wsfix(new, patch, plen, ws_rule); added = copy_wsfix(new, patch + 1, plen, ws_rule);
} }
add_line_info(&postimage, new, added, add_line_info(&postimage, new, added,
(first == '+' ? 0 : LINE_COMMON)); (first == '+' ? 0 : LINE_COMMON));