void *DebugRealloc(void *vp, size_t sz) { if(!vp) return DebugAlloc(sz); if(!sz) { DebugFree(vp); return NULL; } return _DebugRealloc(vp, sz); }
void * DebugRealloc(void * old_blk,size_t size) { void * new_blk; Memory * Block; if(lout_memory==NULL) ErrorInternal("Realloc:Кучи еще нет!"); if(size == 0) return NULL; if(old_blk==NULL){ new_blk=DebugMalloc(size); return new_blk; } if((Block=FindMem(old_blk))==NULL) ErrorInternal("\nИсходный буфер для REALLOC не найден!"); if(Block->size <= size + sizeof(Memory)){ // требуется блок больших размеров new_blk=DebugMalloc(size); if(new_blk!=NULL && old_blk!=NULL) memcpy(new_blk,old_blk,(Block->size<=size ? Block->size:size)); if(old_blk!=NULL) DebugFree(old_blk); } else { // требуется блок меньших размеров Memory * NewBlock = (Memory *)((char *)Block + size + sizeof(Memory)); NewBlock->id = MEMFREE; NewBlock->size= Block->size-(size+sizeof(Memory)); SizeFree += NewBlock->size; Block->size = size; new_blk = old_blk; #ifdef DebugFile if(FileError){ fprintf(FileError,"\nRealloc \t= %8li\tRunning \t= %li\tAll %li", (long)Block->size, SizeAllocate-SizeFree, SizeMemory); } #endif } return new_blk; }