X-Git-Url: https://git.xonotic.org/?a=blobdiff_plain;f=util.c;h=a900889e57b90f983d776c44326e02935d9eee7b;hb=b771695e0debb323834c8ef0891b54ddf5211d4b;hp=3c2e4d38870c7732099faccf4540061d6a09a681;hpb=906f319673f6a2eddb62e59acc970b9497f3e96a;p=xonotic%2Fgmqcc.git diff --git a/util.c b/util.c index 3c2e4d3..a900889 100644 --- a/util.c +++ b/util.c @@ -92,7 +92,7 @@ void *util_memory_r(void *ptrn, size_t byte, unsigned int line, const char *file } 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,27 +101,33 @@ void *util_memory_r(void *ptrn, size_t byte, unsigned int line, const char *file 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 (newinfo->next) - newinfo->next->prev = newinfo; - if (newinfo->prev) - newinfo->prev->next = newinfo; - 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; } @@ -515,6 +521,15 @@ 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);