#include "internal.h" /* 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 ·bufdel(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--; }