/* * CS5600 University of Utah * Charles McGarvey * mcgarvey@eng.utah.edu */ #include #include #include #include #include #include "common.h" static void* (*_mem_fn)(void*, size_t) = NULL; static int _mem_blocks = 0; /* * Check the result of the allocation function and call the callback function * if it failed. */ __fast__ void* _mem_check(void* mem, void* old, size_t size) { if (mem == NULL && size != 0) { if (_mem_fn) { mem = _mem_fn(old, size); if (mem != NULL) { goto done; } } fprintf(stderr, "Memory allocation failed: %s\n", strerror(errno)); abort(); } done: if (old == NULL) { ++_mem_blocks; } return mem; } void* mem_alloc(size_t size) { void* mem = _mem_check(malloc(size), NULL, size); #ifdef MEM_TRACE fprintf(stderr, " ALLOC %6d %18p %10zd\n", _mem_blocks - 1, mem, size); #endif return mem; } void* mem_realloc(void* mem, size_t size) { void* old = mem; mem = _mem_check(realloc(mem, size), mem, size); #ifdef MEM_TRACE fprintf(stderr, " REALLOC %6d %18p %10zd (was %p)\n", _mem_blocks - 1, mem, size, old); #endif return mem; } void mem_free(void* mem) { --_mem_blocks; #ifdef MEM_TRACE fprintf(stderr, " FREE %6d %18p\n", _mem_blocks, mem); #endif free(mem); } void mem_set_fn(void* (*fn)(void*, size_t)) { _mem_fn = fn; } int mem_blocks() { return _mem_blocks; } void rtrim(char *str) { char *m; for (m = str + strlen(str) - 1; str <= m && isspace((int)*m); --m); m[1] = '\0'; } void ltrim(char *str) { char *m; for (m = str; *m && isspace((int)*m); ++m); memmove(str, m, strlen(m) + 1); }