Created
April 29, 2019 23:35
-
-
Save RogerGee/da33e5946dfc86f5c2ca0c6be237f48d to your computer and use it in GitHub Desktop.
Generic dynamic resize routine
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
void dynarray_ensure_size(size_t num,size_t* pcap,void** buf,size_t szof) | |
{ | |
void* newbuf; | |
size_t newsz; | |
size_t cap = *pcap; | |
if (cap == 0) { | |
if (16 > num) { | |
*pcap = cap = 16; | |
} | |
else { | |
size_t rem = num % 8; | |
*pcap = cap = (num + (rem ? 8-rem : 0)); | |
} | |
newsz = cap * szof; | |
*buf = newbuf = srp_malloc(newsz); | |
memset(newbuf,0,newsz); | |
} | |
else if (num >= cap) { | |
size_t oldsz; | |
void* oldbuf; | |
size_t newcap = cap; | |
do { | |
newcap *= 2; | |
} while (newcap < num); | |
newsz = newcap * szof; | |
oldsz = szof * cap; | |
newbuf = srp_malloc(newsz); | |
oldbuf = *buf; | |
memcpy(newbuf,oldbuf,oldsz); | |
memset((char*)newbuf + oldsz,0,newsz - oldsz); | |
free(oldbuf); | |
*buf = newbuf; | |
*pcap = newcap; | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment