use GNUmakefile, since we depend on GNU stuff
[mkp224o.git] / vec.c
blob73f84465da22543cc93d4ad09c2ffc822aac4a15
1 #include <string.h>
2 #include <stdint.h>
3 #include <stdlib.h>
4 #include "vec.h"
6 void vec_add1(struct vec_basestruct *ctl,size_t sz)
8 if (!ctl->alen) {
9 ctl->alen = 8;
10 if (SIZE_MAX / 8 < sz)
11 ctl->alen = 1;
12 ctl->buf = malloc(ctl->alen * sz);
13 if (!ctl->buf)
14 abort();
15 } else if (ctl->len >= ctl->alen) {
16 ctl->alen *= 2;
17 if (SIZE_MAX / ctl->alen < sz)
18 abort();
19 ctl->buf = realloc(ctl->buf,ctl->alen * sz);
20 if (!ctl->buf)
21 abort();
23 ++ctl->len;
26 void vec_addn(struct vec_basestruct *ctl,size_t sz,size_t n)
28 if (!ctl->alen) {
29 if (SIZE_MAX / 8 >= sz)
30 ctl->alen = 8;
31 else
32 ctl->alen = 1;
34 size_t nlen = ctl->alen;
35 ctl->len += n;
36 while (ctl->len > nlen)
37 nlen *= 2;
38 if (nlen > ctl->alen) {
39 ctl->alen = nlen;
40 if (SIZE_MAX / nlen < sz)
41 abort();
42 ctl->buf = realloc(ctl->buf,nlen * sz);
43 if (!ctl->buf)
44 abort();
45 } else if (!ctl->buf) {
46 ctl->buf = malloc(ctl->alen * sz);
47 if (!ctl->buf)
48 abort();