X-Git-Url: https://git.xonotic.org/?a=blobdiff_plain;f=util.c;h=a900889e57b90f983d776c44326e02935d9eee7b;hb=b771695e0debb323834c8ef0891b54ddf5211d4b;hp=ec115cdddb4097897e49d6fd0bf64ca914f35506;hpb=b5ea787044f51809efd6af40a6b079a48e2aec9c;p=xonotic%2Fgmqcc.git diff --git a/util.c b/util.c index ec115cd..a900889 100644 --- a/util.c +++ b/util.c @@ -32,14 +32,14 @@ uint64_t mem_dt = 0; struct memblock_t { const char *file; unsigned int line; - unsigned int byte; + size_t byte; struct memblock_t *next; struct memblock_t *prev; }; static struct memblock_t *mem_start = NULL; -void *util_memory_a(unsigned int byte, unsigned int line, const char *file) { +void *util_memory_a(size_t byte, unsigned int line, const char *file) { struct memblock_t *info = malloc(sizeof(struct memblock_t) + byte); void *data = (void*)(info+1); if (!info) return NULL; @@ -79,7 +79,7 @@ void util_memory_d(void *ptrn, unsigned int line, const char *file) { free(info); } -void *util_memory_r(void *ptrn, unsigned int byte, unsigned int line, const char *file) { +void *util_memory_r(void *ptrn, size_t byte, unsigned int line, const char *file) { struct memblock_t *oldinfo = NULL; struct memblock_t *newinfo; @@ -92,7 +92,7 @@ void *util_memory_r(void *ptrn, unsigned int byte, unsigned int line, const char } oldinfo = ((struct memblock_t*)ptrn - 1); - newinfo = malloc(sizeof(struct memblock_t) + byte); + newinfo = ((struct memblock_t*)malloc(sizeof(struct memblock_t) + byte)); util_debug("MEM", "reallocation: % 8u -> %u (bytes) address 0x%08X -> 0x%08X @ %s:%u\n", oldinfo->byte, byte, ptrn, (void*)(newinfo+1), file, line); @@ -101,23 +101,33 @@ void *util_memory_r(void *ptrn, unsigned int byte, unsigned int line, const char util_memory_d(oldinfo+1, line, file); return NULL; } + + /* copy old */ + memcpy(newinfo+1, oldinfo+1, oldinfo->byte); + + /* free old */ + if (oldinfo->prev) + oldinfo->prev->next = oldinfo->next; + if (oldinfo->next) + oldinfo->next->prev = oldinfo->prev; + if (oldinfo == mem_start) + mem_start = oldinfo->next; + + /* fill info */ newinfo->line = line; newinfo->byte = byte; newinfo->file = file; - newinfo->next = oldinfo->next; - newinfo->prev = oldinfo->prev; - if (mem_start == oldinfo) - mem_start = newinfo; + newinfo->prev = NULL; + newinfo->next = mem_start; + if (mem_start) + mem_start->prev = newinfo; + mem_start = newinfo; - /* copy old */ - memcpy(newinfo+1, oldinfo+1, oldinfo->byte); + mem_ab -= oldinfo->byte; + mem_ab += newinfo->byte; - /* drop old */ - mem_db += newinfo->byte; - mem_db -= oldinfo->byte; free(oldinfo); - /* update */ return newinfo+1; } @@ -242,11 +252,8 @@ void util_debug(const char *area, const char *ms, ...) { return; va_start(va, ms); - fprintf (stdout, "DEBUG: "); - fputc ('[', stdout); - fprintf(stdout, "%s", area); - fputs ("] ", stdout); - vfprintf(stdout, ms, va); + con_out ("[%s] ", area); + con_vout(ms, va); va_end (va); } @@ -514,3 +521,20 @@ FILE *util_fopen(const char *filename, const char *mode) #endif } +bool util_filexists(const char *file) { + FILE *fp = fopen(file, "rb"); + if (!fp) return false; + + /* it exists */ + fclose(fp); + return true; +} + +void _util_vec_grow(void **a, size_t i, size_t s) { + size_t m = *a ? 2*_vec_beg(*a)+i : i+1; + void *p = mem_r((*a ? _vec_raw(*a) : NULL), s * m + sizeof(size_t)*2); + if (!*a) + ((size_t*)p)[1] = 0; + *a = (void*)((size_t*)p + 2); + _vec_beg(*a) = m; +}