aboutsummaryrefslogblamecommitdiffstats
path: root/libpatch_reverse_hunks__.c
blob: a22e8492be565ad6be83e36de94983e37d854fec (plain) (tree)





































                                                                                      
/* See LICENSE file for copyright and license details. */
#include "common.h"


int
libpatch_reverse_hunks__(struct libpatch_patch *patch, size_t patchlen,
                         const size_t *hunks, size_t nhunks,
                         struct libpatch_patch **patchcopy, size_t *patchcopysize)
{
	size_t i, j, first, count, lines;
	void *new;

	if (nhunks < 2)
		return 0;

	lines = patchlen - hunks[0];
	if (lines > *patchcopysize) {
		new = realloc(*patchcopy, lines * sizeof(**patchcopy));
		if (!new)
			return -1;
		*patchcopy = new;
		*patchcopysize = lines;
	}

	j = lines;
	for (i = 1; i < nhunks; i++) {
		first = hunks[i - 1];
		count = hunks[i] - first;
		memcpy(&patchcopy[j -= count], &patch[first], count * sizeof(*patch));
	}
	first = hunks[i - 1];
	count = patchlen - first;
	memcpy(&patchcopy[j -= count], &patch[first], count * sizeof(*patch));

	memcpy(&patch[hunks[0]], &patchcopy[0], lines * sizeof(*patch));

	return 0;
}