void* mem_realloc(void *p, size_t size, const char *source, uint line, uint id) { ASSERT(g_mem); void* ptr; if (g_mem->trace) { mt_mutex_lock(&g_mem->lock); if (g_mem->stats.limit_bytes != 0 && (size + g_mem->stats.alloc_bytes) > g_mem->stats.limit_bytes) { return NULL; } ptr = mem_realloc_withtrace(p, size); if (ptr != NULL) { struct mem_trace_data* trace = get_trace_data(ptr); #if defined(_DEBUG_) path_getfullfilename(trace->filename, source); trace->line = line; #endif trace->size = size; trace->mem_id = id; mem_addto_ids(id, size); } mt_mutex_unlock(&g_mem->lock); } else { ptr = malloc_withsize(size); } return ptr; }
void load_pak(struct paki_args* args) { result_t r; struct pak_file pak; char filename[DH_PATH_MAX]; path_norm(args->pakfile, args->pakfile); path_tounix(args->path, args->path); r = pak_open(&pak, mem_heap(), args->pakfile, 0); if (IS_FAIL(r)) { err_sendtolog(FALSE); return; } uint file_id = pak_findfile(&pak, args->path); if (file_id == INVALID_INDEX) { printf(TERM_BOLDRED "Extract failed: file '%s' not found in pak.\n" TERM_RESET, args->path); pak_close(&pak); return; } path_getfullfilename(filename, args->path); file_t f = fio_createdisk(filename); if (f == NULL) { printf(TERM_BOLDRED "Extract failed: could not create '%s' for writing.\n" TERM_RESET, filename); pak_close(&pak); err_sendtolog(FALSE); return; } file_t src_file = pak_getfile(&pak, mem_heap(), mem_heap(), file_id, 0); if (src_file == NULL) { pak_close(&pak); fio_close(f); err_sendtolog(FALSE); return; } size_t size; struct allocator* alloc; void* buffer = fio_detachmem(src_file, &size, &alloc); fio_write(f, buffer, size, 1); A_FREE(alloc, buffer); fio_close(f); pak_close(&pak); if (BIT_CHECK(args->usage, PAKI_USAGE_VERBOSE)) { printf(TERM_WHITE "%s -> %s\n" TERM_RESET, args->path, filename); } args->file_cnt ++; // report printf(TERM_BOLDWHITE "Finished: total %d file(s) - %d error(s), %d warning(s)\n" TERM_RESET, args->file_cnt, args->err_cnt, args->warn_cnt); }