aboutsummaryrefslogtreecommitdiff
path: root/lib/dynarr/daextend.c
blob: efa96d55af5d1f21f239c42099463e6c9e8b6d46 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <errno.h>
#include <stdbit.h>
#include <stdint.h>
#include <string.h>

#include "dynarr.h"

void *
(daextend)(void *da, void *xs, size_t n, size_t sz, size_t align)
{
	dynarr(uint8_t) cpy;
	memcpy(&cpy, da, sizeof(cpy));

	if ((cpy.len += n) > cpy.cap) {
		size_t ncap = stdc_bit_ceil(cpy.len);
		cpy.buf = cpy.alloc(cpy.ctx, cpy.buf, cpy.cap, ncap, sz, align);
		cpy.cap = ncap;
	}

	memcpy(cpy.buf + cpy.len * sz - n * sz, xs, n * sz);
	return memcpy(da, &cpy, sizeof(cpy));
}