X-Git-Url: https://git.xonotic.org/?p=xonotic%2Fgmqcc.git;a=blobdiff_plain;f=util.c;h=c8d50f5b5fbc15fbff326efbaa45a40f4f734d49;hp=b7e3c7c7295625ac395fdccb49656edccb7b8491;hb=69b55ccc03b56af1f6c05eb45866ab198307487f;hpb=685fa54daf0b3fdd92d9424e7fcab1ded9fb3c29 diff --git a/util.c b/util.c index b7e3c7c..c8d50f5 100644 --- a/util.c +++ b/util.c @@ -26,12 +26,12 @@ #include "gmqcc.h" /* TODO: remove globals ... */ -uint64_t mem_ab = 0; -uint64_t mem_db = 0; -uint64_t mem_at = 0; -uint64_t mem_dt = 0; -uint64_t mem_pk = 0; -uint64_t mem_hw = 0; +static uint64_t mem_ab = 0; +static uint64_t mem_db = 0; +static uint64_t mem_at = 0; +static uint64_t mem_dt = 0; +static uint64_t mem_pk = 0; +static uint64_t mem_hw = 0; struct memblock_t { const char *file; @@ -465,8 +465,7 @@ GMQCC_INLINE size_t util_hthash(hash_table_t *ht, const char *key) { const unsigned char *data = (const unsigned char*)key; while (size >= 4) { - alias = *(uint32_t*)data; - + alias = (data[0] | (data[1] << 8) | (data[2] << 16) | (data[3] << 24)); alias *= mix; alias ^= alias >> rot; alias *= mix; @@ -688,14 +687,13 @@ int util_vasprintf(char **dat, const char *fmt, va_list args) { * will return the required amount to allocate. */ #ifdef _MSC_VER - char *str; if ((len = _vscprintf(fmt, args)) < 0) { *dat = NULL; return -1; } - tmp = mem_a(len + 1); - if ((ret = _vsnprintf(tmp, len+1, fmt, args)) != len) { + tmp = (char*)mem_a(len + 1); + if ((ret = _vsnprintf_s(tmp, len+1, len+1, fmt, args)) != len) { mem_d(tmp); *dat = NULL; return -1; @@ -742,6 +740,92 @@ int util_asprintf(char **ret, const char *fmt, ...) { return read; } +/* + * These are various re-implementations (wrapping the real ones) of + * string functions that MSVC consideres unsafe. We wrap these up and + * use the safe varations on MSVC. + */ +#ifdef _MSC_VER + static char **util_strerror_allocated() { + static char **data = NULL; + return data; + } + + static void util_strerror_cleanup(void) { + size_t i; + char **data = util_strerror_allocated(); + for (i = 0; i < vec_size(data); i++) + mem_d(data[i]); + vec_free(data); + } + + const char *util_strerror(int num) { + char *allocated = NULL; + static bool install = false; + static size_t tries = 0; + char **vector = util_strerror_allocated(); + + /* try installing cleanup handler */ + while (!install) { + if (tries == 32) + return "(unknown)"; + + install = !atexit(&util_strerror_cleanup); + tries ++; + } + + allocated = (char*)mem_a(4096); /* A page must be enough */ + strerror_s(allocated, 4096, num); + + vec_push(vector, allocated); + return (const char *)allocated; + } + + int util_snprintf(char *src, size_t bytes, const char *format, ...) { + int rt; + va_list va; + va_start(va, format); + + rt = vsprintf_s(src, bytes, format, va); + va_end (va); + + return rt; + } + + char *util_strcat(char *dest, const char *src) { + strcat_s(dest, strlen(src), src); + return dest; + } + + char *util_strncpy(char *dest, const char *src, size_t num) { + strncpy_s(dest, num, src, num); + return dest; + } +#else + const char *util_strerror(int num) { + return strerror(num); + } + + int util_snprintf(char *src, size_t bytes, const char *format, ...) { + int rt; + va_list va; + va_start(va, format); + rt = vsnprintf(src, bytes, format, va); + va_end (va); + + return rt; + } + + char *util_strcat(char *dest, const char *src) { + return strcat(dest, src); + } + + char *util_strncpy(char *dest, const char *src, size_t num) { + return strncpy(dest, src, num); + } + +#endif /*! _MSC_VER */ + /* * Implementation of the Mersenne twister PRNG (pseudo random numer * generator). Implementation of MT19937. Has a period of 2^19937-1