xdl_fill_merge_buffer(): separate out a too deeply nested function

This simply moves code around to make a separate function that prepares
a single conflicted hunk with markers into the buffer.

Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Junio C Hamano
2008-08-28 01:04:00 -07:00
parent 53d1589ff6
commit f2b25dd81f

View File

@ -113,65 +113,84 @@ static int xdl_recs_copy(xdfenv_t *xe, int i, int count, int add_nl, char *dest)
return size; return size;
} }
static int xdl_fill_merge_buffer(xdfenv_t *xe1, const char *name1, static int fill_conflict_hunk(xdfenv_t *xe1, const char *name1,
xdfenv_t *xe2, const char *name2, xdmerge_t *m, char *dest) xdfenv_t *xe2, const char *name2,
int size, int i,
xdmerge_t *m, char *dest)
{ {
const int marker_size = 7; const int marker_size = 7;
int marker1_size = (name1 ? strlen(name1) + 1 : 0); int marker1_size = (name1 ? strlen(name1) + 1 : 0);
int marker2_size = (name2 ? strlen(name2) + 1 : 0); int marker2_size = (name2 ? strlen(name2) + 1 : 0);
int conflict_marker_size = 3 * (marker_size + 1) int j;
+ marker1_size + marker2_size;
int size, i1, j;
for (size = i1 = 0; m; m = m->next) { /* Before conflicting part */
if (m->mode == 0) { size += xdl_recs_copy(xe1, i, m->i1 - i, 0,
size += xdl_recs_copy(xe1, i1, m->i1 - i1, 0, dest ? dest + size : NULL);
dest ? dest + size : NULL);
if (dest) { if (!dest) {
for (j = 0; j < marker_size; j++) size += marker_size + 1 + marker1_size;
dest[size++] = '<'; } else {
if (marker1_size) { for (j = 0; j < marker_size; j++)
dest[size] = ' '; dest[size++] = '<';
memcpy(dest + size + 1, name1, if (marker1_size) {
marker1_size - 1); dest[size] = ' ';
size += marker1_size; memcpy(dest + size + 1, name1, marker1_size - 1);
} size += marker1_size;
dest[size++] = '\n'; }
} else dest[size++] = '\n';
size += conflict_marker_size; }
size += xdl_recs_copy(xe1, m->i1, m->chg1, 1,
dest ? dest + size : NULL); /* Postimage from side #1 */
if (dest) { size += xdl_recs_copy(xe1, m->i1, m->chg1, 1,
for (j = 0; j < marker_size; j++) dest ? dest + size : NULL);
dest[size++] = '='; if (!dest) {
dest[size++] = '\n'; size += marker_size + 1;
} } else {
size += xdl_recs_copy(xe2, m->i2, m->chg2, 1, for (j = 0; j < marker_size; j++)
dest ? dest + size : NULL); dest[size++] = '=';
if (dest) { dest[size++] = '\n';
for (j = 0; j < marker_size; j++) }
dest[size++] = '>';
if (marker2_size) { /* Postimage from side #2 */
dest[size] = ' '; size += xdl_recs_copy(xe2, m->i2, m->chg2, 1,
memcpy(dest + size + 1, name2, dest ? dest + size : NULL);
marker2_size - 1); if (!dest) {
size += marker2_size; size += marker_size + 1 + marker2_size;
} } else {
dest[size++] = '\n'; for (j = 0; j < marker_size; j++)
} dest[size++] = '>';
} else if (m->mode == 1) if (marker2_size) {
size += xdl_recs_copy(xe1, i1, m->i1 + m->chg1 - i1, 0, dest[size] = ' ';
dest ? dest + size : NULL); 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) else if (m->mode == 2)
size += xdl_recs_copy(xe2, m->i2 - m->i1 + i1, size += xdl_recs_copy(xe2, m->i2 - m->i1 + i,
m->i1 + m->chg2 - i1, 0, m->i1 + m->chg2 - i, 0,
dest ? dest + size : NULL); dest ? dest + size : NULL);
else else
continue; continue;
i1 = m->i1 + m->chg1; i = m->i1 + m->chg1;
} }
size += xdl_recs_copy(xe1, i1, xe1->xdf2.nrec - i1, 0, size += xdl_recs_copy(xe1, i, xe1->xdf2.nrec - i, 0,
dest ? dest + size : NULL); dest ? dest + size : NULL);
return size; return size;
} }