From f453b313f62ba42d748f00628be7b3750c797c86 Mon Sep 17 00:00:00 2001 From: lemon Date: Thu, 29 Jun 2023 09:59:30 +0200 Subject: add initializers (only static for initialier list rn) and other fixes --- mem.c | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) (limited to 'mem.c') diff --git a/mem.c b/mem.c index 9820f0a..f53ba05 100644 --- a/mem.c +++ b/mem.c @@ -46,7 +46,9 @@ vpush_(void **p, int *pcap, uint *pn, uint siz) { if (*pcap >= 0 && *pn >= *pcap) { /* empty or inline buffer */ int cap = *pcap ? *pcap * 2 : 8; + void *old = *p; *p = xrealloc(NULL, cap * siz); + if (old) memcpy(*p, old, *pcap * siz); *pcap = -cap; } else if (*pcap < 0 && *pn >= -*pcap) { /* dyn buf */ *p = xrealloc(*p, -(*pcap *= 2) * siz); @@ -72,8 +74,17 @@ vpushn_(void **p, int *pcap, uint *pn, uint siz, const void *dat, uint ndat) void vresize_(void **p, int *pcap, uint *pn, uint siz, uint N) { - while (*pcap < N) - vpush_(p, pcap, pn, siz); + if (N <= *pn) { + } else if (*pcap > 0 && *pcap < N) { + void *old = *p; + *p = xrealloc(NULL, -(*pcap = -(N * siz))); + if (old) memcpy(*p, old, *pcap * siz); + } else if (*pcap <= 0 && -*pcap < N) { + *pcap = *pcap ? *pcap : -1; + do *pcap *= 2; while (-*pcap < N); + *p = xrealloc(*p, -*pcap * siz); + memset((char *)*p + *pn*siz, 0, (N - *pn) * siz); + } *pn = N; } -- cgit v1.2.3