Skip to content

Instantly share code, notes, and snippets.

@RogerGee
Created April 29, 2019 23:35
Show Gist options
  • Save RogerGee/da33e5946dfc86f5c2ca0c6be237f48d to your computer and use it in GitHub Desktop.
Save RogerGee/da33e5946dfc86f5c2ca0c6be237f48d to your computer and use it in GitHub Desktop.
Generic dynamic resize routine
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