xdl_fill_merge_buffer(): separate out a too deeply nested function
[gitweb.git] / xdiff / xmerge.c
index 82b3573e7ada8c6df13ac24a78650b80af91ea73..6ffaa4f9e5ae10e9690a611fc849e3a95a256c10 100644 (file)
@@ -113,65 +113,84 @@ static int xdl_recs_copy(xdfenv_t *xe, int i, int count, int add_nl, char *dest)
        return size;
 }
 
-static int xdl_fill_merge_buffer(xdfenv_t *xe1, const char *name1,
-               xdfenv_t *xe2, const char *name2, xdmerge_t *m, char *dest)
+static int fill_conflict_hunk(xdfenv_t *xe1, const char *name1,
+                             xdfenv_t *xe2, const char *name2,
+                             int size, int i,
+                             xdmerge_t *m, char *dest)
 {
        const int marker_size = 7;
        int marker1_size = (name1 ? strlen(name1) + 1 : 0);
        int marker2_size = (name2 ? strlen(name2) + 1 : 0);
-       int conflict_marker_size = 3 * (marker_size + 1)
-               + marker1_size + marker2_size;
-       int size, i1, j;
-
-       for (size = i1 = 0; m; m = m->next) {
-               if (m->mode == 0) {
-                       size += xdl_recs_copy(xe1, i1, m->i1 - i1, 0,
-                                       dest ? dest + size : NULL);
-                       if (dest) {
-                               for (j = 0; j < marker_size; j++)
-                                       dest[size++] = '<';
-                               if (marker1_size) {
-                                       dest[size] = ' ';
-                                       memcpy(dest + size + 1, name1,
-                                                       marker1_size - 1);
-                                       size += marker1_size;
-                               }
-                               dest[size++] = '\n';
-                       } else
-                               size += conflict_marker_size;
-                       size += xdl_recs_copy(xe1, m->i1, m->chg1, 1,
-                                       dest ? dest + size : NULL);
-                       if (dest) {
-                               for (j = 0; j < marker_size; j++)
-                                       dest[size++] = '=';
-                               dest[size++] = '\n';
-                       }
-                       size += xdl_recs_copy(xe2, m->i2, m->chg2, 1,
-                                       dest ? dest + size : NULL);
-                       if (dest) {
-                               for (j = 0; j < marker_size; j++)
-                                       dest[size++] = '>';
-                               if (marker2_size) {
-                                       dest[size] = ' ';
-                                       memcpy(dest + size + 1, name2,
-                                                       marker2_size - 1);
-                                       size += marker2_size;
-                               }
-                               dest[size++] = '\n';
-                       }
-               } else if (m->mode == 1)
-                       size += xdl_recs_copy(xe1, i1, m->i1 + m->chg1 - i1, 0,
-                                       dest ? dest + size : NULL);
+       int j;
+
+       /* Before conflicting part */
+       size += xdl_recs_copy(xe1, i, m->i1 - i, 0,
+                             dest ? dest + size : NULL);
+
+       if (!dest) {
+               size += marker_size + 1 + marker1_size;
+       } else {
+               for (j = 0; j < marker_size; j++)
+                       dest[size++] = '<';
+               if (marker1_size) {
+                       dest[size] = ' ';
+                       memcpy(dest + size + 1, name1, marker1_size - 1);
+                       size += marker1_size;
+               }
+               dest[size++] = '\n';
+       }
+
+       /* Postimage from side #1 */
+       size += xdl_recs_copy(xe1, m->i1, m->chg1, 1,
+                             dest ? dest + size : NULL);
+       if (!dest) {
+               size += marker_size + 1;
+       } else {
+               for (j = 0; j < marker_size; j++)
+                       dest[size++] = '=';
+               dest[size++] = '\n';
+       }
+
+       /* Postimage from side #2 */
+       size += xdl_recs_copy(xe2, m->i2, m->chg2, 1,
+                             dest ? dest + size : NULL);
+       if (!dest) {
+               size += marker_size + 1 + marker2_size;
+       } else {
+               for (j = 0; j < marker_size; j++)
+                       dest[size++] = '>';
+               if (marker2_size) {
+                       dest[size] = ' ';
+                       memcpy(dest + size + 1, name2, marker2_size - 1);
+                       size += marker2_size;
+               }
+               dest[size++] = '\n';
+       }
+       return size;
+}
+
+static int xdl_fill_merge_buffer(xdfenv_t *xe1, const char *name1,
+               xdfenv_t *xe2, const char *name2, xdmerge_t *m, char *dest)
+{
+       int size, i;
+
+       for (size = i = 0; m; m = m->next) {
+               if (m->mode == 0)
+                       size = fill_conflict_hunk(xe1, name1, xe2, name2,
+                                                 size, i, m, dest);
+               else if (m->mode == 1)
+                       size += xdl_recs_copy(xe1, i, m->i1 + m->chg1 - i, 0,
+                                             dest ? dest + size : NULL);
                else if (m->mode == 2)
-                       size += xdl_recs_copy(xe2, m->i2 - m->i1 + i1,
-                                       m->i1 + m->chg2 - i1, 0,
-                                       dest ? dest + size : NULL);
+                       size += xdl_recs_copy(xe2, m->i2 - m->i1 + i,
+                                             m->i1 + m->chg2 - i, 0,
+                                             dest ? dest + size : NULL);
                else
                        continue;
-               i1 = m->i1 + m->chg1;
+               i = m->i1 + m->chg1;
        }
-       size += xdl_recs_copy(xe1, i1, xe1->xdf2.nrec - i1, 0,
-                       dest ? dest + size : NULL);
+       size += xdl_recs_copy(xe1, i, xe1->xdf2.nrec - i, 0,
+                             dest ? dest + size : NULL);
        return size;
 }