aboutsummaryrefslogtreecommitdiffhomepage
path: root/mem.c
diff options
context:
space:
mode:
authorlemon <lsof@mailbox.org>2023-06-29 09:59:30 +0200
committerlemon <lsof@mailbox.org>2023-06-29 09:59:30 +0200
commitf453b313f62ba42d748f00628be7b3750c797c86 (patch)
treee654029d425dee2adf30c0fa2adba31d0266db1c /mem.c
parent3b96204593b9812674126bad8de14419009682c8 (diff)
add initializers (only static for initialier list rn)
and other fixes
Diffstat (limited to 'mem.c')
-rw-r--r--mem.c15
1 files changed, 13 insertions, 2 deletions
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;
}