/* 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; }