void * OCI_MemAlloc ( int ptr_type, size_t block_size, size_t block_count, boolean zero_fill ) { OCI_MemoryBlock * mem_block = NULL; size_t size = sizeof(OCI_MemoryBlock) + (block_size * block_count); mem_block = (OCI_MemoryBlock *)malloc(size); if (mem_block) { if (zero_fill) { memset(mem_block, 0, size); } mem_block->type = ptr_type; mem_block->size = (unsigned int) size; OCI_MemUpdateBytes(mem_block->type, mem_block->size); } else { OCI_ExceptionMemory(ptr_type, size, NULL, NULL); } return ((unsigned char *) mem_block) + sizeof(*mem_block); }
void * OCI_MemRealloc ( void * ptr_mem, int ptr_type, size_t block_size, size_t block_count ) { OCI_MemoryBlock * mem_block = NULL; size_t size = 0; if (ptr_mem) { mem_block = (OCI_MemoryBlock *) (((unsigned char*)ptr_mem) - sizeof(*mem_block)); } size = sizeof(OCI_MemoryBlock) + (block_size * block_count); if (!mem_block || mem_block->size < size) { void *ptr_new = realloc(mem_block, size); if (ptr_new) { big_int size_diff = 0; mem_block = (OCI_MemoryBlock *) ptr_new; size_diff = (big_int) size - mem_block->size; mem_block->type = ptr_type; mem_block->size = (unsigned int) size; OCI_MemUpdateBytes(mem_block->type, size_diff); } else if (ptr_mem) { OCI_MemFree(ptr_mem); OCI_ExceptionMemory(ptr_type, size, NULL, NULL); mem_block = NULL; } } return mem_block ? ((unsigned char *)mem_block) + sizeof(*mem_block) : NULL; }