From ee810b715912347775fa06a0d5b16092b4908d66 Mon Sep 17 00:00:00 2001 From: Junio C Hamano Date: Wed, 30 Jan 2008 15:11:23 -0800 Subject: [PATCH] builtin-apply.c: move copy_wsfix() function a bit higher. I'll be calling this from match_fragment() in later rounds. Signed-off-by: Junio C Hamano --- builtin-apply.c | 188 ++++++++++++++++++++++++------------------------ 1 file changed, 94 insertions(+), 94 deletions(-) diff --git a/builtin-apply.c b/builtin-apply.c index 0bc33bdd52..2af625a435 100644 --- a/builtin-apply.c +++ b/builtin-apply.c @@ -1515,6 +1515,100 @@ static int read_old_data(struct stat *st, const char *path, struct strbuf *buf) } } +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. 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 = -1; + int last_space_in_indent = -1; + int need_fix_leading_space = 0; + char *buf; + + /* + * Strip trailing whitespace + */ + if ((ws_rule & WS_TRAILING_SPACE) && + (2 < plen && isspace(patch[plen-2]))) { + if (patch[plen-1] == '\n') + add_nl_to_tail = 1; + plen--; + while (0 < plen && isspace(patch[plen-1])) + plen--; + fixed = 1; + } + + /* + * Check leading whitespaces (indent) + */ + 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) + 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 + break; + } + + buf = output; + if (need_fix_leading_space) { + /* Process indent ourselves */ + int consecutive_spaces = 0; + int last = last_tab_in_indent + 1; + + if (ws_rule & WS_INDENT_WITH_NON_TAB) { + /* have "last" point at one past the indent */ + if (last_tab_in_indent < last_space_in_indent) + last = last_space_in_indent + 1; + else + last = last_tab_in_indent + 1; + } + + /* + * between patch[0..last-1], strip the funny spaces, + * updating them to tab as needed. + */ + for (i = 0; i < last; i++) { + char ch = patch[i]; + if (ch != ' ') { + consecutive_spaces = 0; + *output++ = ch; + } else { + consecutive_spaces++; + if (consecutive_spaces == 8) { + *output++ = '\t'; + consecutive_spaces = 0; + } + } + } + while (0 < consecutive_spaces--) + *output++ = ' '; + plen -= last; + patch += last; + fixed = 1; + } + + memcpy(output, patch, plen); + if (add_nl_to_tail) + output[plen++] = '\n'; + if (fixed) + applied_after_fixing_ws++; + return output + plen - buf; +} + static int match_fragment(struct image *img, struct image *preimage, struct image *postimage, @@ -1642,100 +1736,6 @@ static void remove_last_line(struct image *img) img->len -= img->line[--img->nr].len; } -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. 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 = -1; - int last_space_in_indent = -1; - int need_fix_leading_space = 0; - char *buf; - - /* - * Strip trailing whitespace - */ - if ((ws_rule & WS_TRAILING_SPACE) && - (2 < plen && isspace(patch[plen-2]))) { - if (patch[plen-1] == '\n') - add_nl_to_tail = 1; - plen--; - while (0 < plen && isspace(patch[plen-1])) - plen--; - fixed = 1; - } - - /* - * Check leading whitespaces (indent) - */ - 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) - 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 - break; - } - - buf = output; - if (need_fix_leading_space) { - /* Process indent ourselves */ - int consecutive_spaces = 0; - int last = last_tab_in_indent + 1; - - if (ws_rule & WS_INDENT_WITH_NON_TAB) { - /* have "last" point at one past the indent */ - if (last_tab_in_indent < last_space_in_indent) - last = last_space_in_indent + 1; - else - last = last_tab_in_indent + 1; - } - - /* - * between patch[0..last-1], strip the funny spaces, - * updating them to tab as needed. - */ - for (i = 0; i < last; i++) { - char ch = patch[i]; - if (ch != ' ') { - consecutive_spaces = 0; - *output++ = ch; - } else { - consecutive_spaces++; - if (consecutive_spaces == 8) { - *output++ = '\t'; - consecutive_spaces = 0; - } - } - } - while (0 < consecutive_spaces--) - *output++ = ' '; - plen -= last; - patch += last; - fixed = 1; - } - - memcpy(output, patch, plen); - if (add_nl_to_tail) - output[plen++] = '\n'; - if (fixed) - applied_after_fixing_ws++; - return output + plen - buf; -} - static void update_image(struct image *img, int applied_pos, struct image *preimage,