summaryrefslogtreecommitdiff
path: root/distribute.c
blob: d2d1eff23e9cb2dd63d5719199f94214ddd0a5a4 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <stddef.h>

#include "common.h"

void distribute_buffer(char *base, size_t bufnmel, size_t sortnmel, size_t width, cmpfun cmp)
{
	while (bufnmel && sortnmel) {
		char  *sorted    = base + bufnmel * width;
		size_t insertpos = binary_search(base, sorted, sortnmel, width, cmp);
		if (insertpos > 0) {
			rotate(base, (bufnmel + insertpos) * width, bufnmel * width);
		}

		base     += (insertpos + 1) * width;
		bufnmel  -= 1;
		sortnmel -= insertpos;
	}
}