builtin-apply.c: do not feed copy_wsfix() leading '+'
authorJunio C Hamano <gitster@pobox.com>
Wed, 30 Jan 2008 22:27:50 +0000 (14:27 -0800)
committerJunio C Hamano <gitster@pobox.com>
Tue, 5 Feb 2008 08:38:41 +0000 (00:38 -0800)
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>
builtin-apply.c

index d0d008fde14df5346a8e593443aa196728908714..0bc33bdd523d3edd56f4be30f9cd5fc741f24a7a 100644 (file)
@@ -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));