static int fill_conflict_hunk()

in src/xdiff/xmerge.c [205:308]


static int fill_conflict_hunk(size_t *out, xdfenv_t *xe1, const char *name1,
			      xdfenv_t *xe2, const char *name2,
			      const char *name3,
			      size_t size, int i, int style,
			      xdmerge_t *m, char *dest, int marker_size)
{
	int marker1_size = (name1 ? (int)strlen(name1) + 1 : 0);
	int marker2_size = (name2 ? (int)strlen(name2) + 1 : 0);
	int marker3_size = (name3 ? (int)strlen(name3) + 1 : 0);
	int needs_cr = is_cr_needed(xe1, xe2, m);
	size_t copied;

	*out = 0;

	if (marker_size <= 0)
		marker_size = DEFAULT_CONFLICT_MARKER_SIZE;

	/* Before conflicting part */
	if (xdl_recs_copy(&copied, xe1, i, m->i1 - i, 0, 0,
			      dest ? dest + size : NULL) < 0)
		return -1;

	GIT_ERROR_CHECK_ALLOC_ADD(&size, size, copied);

	if (!dest) {
		GIT_ERROR_CHECK_ALLOC_ADD5(&size, size, marker_size, 1, needs_cr,  marker1_size);
	} else {
		memset(dest + size, '<', marker_size);
		size += marker_size;
		if (marker1_size) {
			dest[size] = ' ';
			memcpy(dest + size + 1, name1, marker1_size - 1);
			size += marker1_size;
		}
		if (needs_cr)
			dest[size++] = '\r';
		dest[size++] = '\n';
	}

	/* Postimage from side #1 */
	if (xdl_recs_copy(&copied, xe1, m->i1, m->chg1, needs_cr, 1,
			      dest ? dest + size : NULL) < 0)
		return -1;

	GIT_ERROR_CHECK_ALLOC_ADD(&size, size, copied);

	if (style == XDL_MERGE_DIFF3) {
		/* Shared preimage */
		if (!dest) {
			GIT_ERROR_CHECK_ALLOC_ADD5(&size, size, marker_size, 1, needs_cr, marker3_size);
		} else {
			memset(dest + size, '|', marker_size);
			size += marker_size;
			if (marker3_size) {
				dest[size] = ' ';
				memcpy(dest + size + 1, name3, marker3_size - 1);
				size += marker3_size;
			}
			if (needs_cr)
				dest[size++] = '\r';
			dest[size++] = '\n';
		}

		if (xdl_orig_copy(&copied, xe1, m->i0, m->chg0, needs_cr, 1,
				      dest ? dest + size : NULL) < 0)
			return -1;
		GIT_ERROR_CHECK_ALLOC_ADD(&size, size, copied);
	}

	if (!dest) {
		GIT_ERROR_CHECK_ALLOC_ADD4(&size, size, marker_size, 1, needs_cr);
	} else {
		memset(dest + size, '=', marker_size);
		size += marker_size;
		if (needs_cr)
			dest[size++] = '\r';
		dest[size++] = '\n';
	}

	/* Postimage from side #2 */

	if (xdl_recs_copy(&copied, xe2, m->i2, m->chg2, needs_cr, 1,
			      dest ? dest + size : NULL) < 0)
		return -1;
	GIT_ERROR_CHECK_ALLOC_ADD(&size, size, copied);

	if (!dest) {
		GIT_ERROR_CHECK_ALLOC_ADD5(&size, size, marker_size, 1, needs_cr, marker2_size);
	} else {
		memset(dest + size, '>', marker_size);
		size += marker_size;
		if (marker2_size) {
			dest[size] = ' ';
			memcpy(dest + size + 1, name2, marker2_size - 1);
			size += marker2_size;
		}
		if (needs_cr)
			dest[size++] = '\r';
		dest[size++] = '\n';
	}

	*out = size;
	return 0;
}