From dca72268ae6bcbd411aa8660604451226f76b4eb Mon Sep 17 00:00:00 2001 From: Nicholas Noll Date: Fri, 17 Apr 2020 18:14:35 -0700 Subject: chore: basic maintenance --- src/memory.c | 49 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) create mode 100644 src/memory.c (limited to 'src/memory.c') diff --git a/src/memory.c b/src/memory.c new file mode 100644 index 0000000..3d35299 --- /dev/null +++ b/src/memory.c @@ -0,0 +1,49 @@ +#include + +// ------------------------------------------------------------------------- +// 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--; +} + -- cgit v1.2.1