1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
|
#include <u.h>
// -------------------------------------------------------------------------
// Dynamic buffer.
/* Grow to particular size */
void*
bufgrow(void* buf, vlong newLen, vlong eltsize)
{
Assert(bufcap(buf) <= (SIZE_MAX - 1) / 2);
vlong newCap = MAX(16, MAX(1 + 2 * bufcap(buf), newLen));
Assert(newLen <= newCap);
Assert(newCap <= (SIZE_MAX - offsetof(bufHdr, buf)) / eltsize);
vlong newSize = offsetof(bufHdr, buf) + newCap * eltsize;
bufHdr* newHdr;
if (buf) {
newHdr = _bufHdr(buf);
newHdr = (bufHdr*)realloc((void*)newHdr, newSize);
} else {
newHdr = (bufHdr*)malloc(newSize);
newHdr->len = 0;
}
newHdr->cap = newCap;
return (void*)newHdr->buf;
}
/* Pop out a value */
void
_bufpop(void *buf, int i, vlong eltsize)
{
int n;
byte *b;
byte stk[1024];
Assert(eltsize < sizeof(stk));
b = (byte*) buf;
if (n = buflen(buf), i < n) {
memcpy(stk, b+eltsize*i, eltsize);
memcpy(b+eltsize*i, b+eltsize*(i+1), eltsize*(n-i-1));
memcpy(b+eltsize*(n-1), stk, eltsize);
}
_bufHdr(buf)->len--;
}
|