// panics on memory exhausted, undefined on heap corruption or other unreliably-detected malady (see http://stackoverflow.com/questions/28761680/is-there-a-windows-api-memory-allocator-deallocator-i-can-use-that-will-just-giv)
// new memory is set to zero
// passing NULL to tableRealloc() acts like tableAlloc()
// passing NULL to tableFree() is a no-op
void*uiAlloc(size_tsize,constchar*type)
{
void*out;
out=malloc(size);
if(out==NULL){
fprintf(stderr,"memory exhausted in uiAlloc() allocating %s\n",type);
abort();
}
ZeroMemory(out,size);
if(options.debugLogAllocations)
fprintf(stderr,"%p alloc %s\n",out,type);
returnout;
}
void*uiRealloc(void*p,size_tsize,constchar*type)
{
void*out;
if(p==NULL)
returnuiAlloc(size,type);
out=realloc(p,size);
if(out==NULL){
fprintf(stderr,"memory exhausted in uiRealloc() reallocating %s\n",type);