X-Git-Url: https://git.xonotic.org/?p=xonotic%2Fgmqcc.git;a=blobdiff_plain;f=util.c;h=02ac1a1247fdcb925f6db56a664add8c0fa5427e;hp=4adcb4a9d13132d381c862b59be52ca668263176;hb=42b3640bc56b5d90d69f391e84e0813c787577f8;hpb=783b7b6594cb3fde2b9bf945df7a68cb3afa2d5f diff --git a/util.c b/util.c index 4adcb4a..02ac1a1 100644 --- a/util.c +++ b/util.c @@ -21,10 +21,9 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ -#define GMQCC_PLATFORM_HEADER #include +#include #include "gmqcc.h" -#include "platform.h" /* * Initially this was handled with a table in the gmqcc.h header, but @@ -519,7 +518,7 @@ static const uint16_t util_crc16_table[8][256] = {{ /* Non - Reflected */ uint16_t util_crc16(uint16_t current, const char *GMQCC_RESTRICT k, size_t len) { - register uint16_t h = current; + uint16_t h = current; /* don't load twice */ const uint8_t *GMQCC_RESTRICT data = (const uint8_t *GMQCC_RESTRICT)k; @@ -584,64 +583,144 @@ size_t util_optimizationtostr(const char *in, char *out, size_t outsz) { return util_strtransform(in, out, outsz, "_ ", 'a'-'A'); } +static int util_vasprintf(char **dat, const char *fmt, va_list args) { + int ret; + int len; + char *tmp = NULL; + char buf[128]; + va_list cpy; + + va_copy(cpy, args); + len = vsnprintf(buf, sizeof(buf), fmt, cpy); + va_end (cpy); + + if (len < 0) + return len; + + if (len < (int)sizeof(buf)) { + *dat = util_strdup(buf); + return len; + } + + tmp = (char*)mem_a(len + 1); + if ((ret = vsnprintf(tmp, len + 1, fmt, args)) != len) { + mem_d(tmp); + *dat = NULL; + return -1; + } + + *dat = tmp; + return len; +} + int util_snprintf(char *str, size_t size, const char *fmt, ...) { va_list arg; - int ret; - + int ret; va_start(arg, fmt); - ret = platform_vsnprintf(str, size, fmt, arg); + ret = vsnprintf(str, size, fmt, arg); va_end(arg); - return ret; } int util_asprintf(char **ret, const char *fmt, ...) { va_list args; - int read; - + int read; va_start(args, fmt); - read = platform_vasprintf(ret, fmt, args); - va_end (args); - + read = util_vasprintf(ret, fmt, args); + va_end(args); return read; } int util_sscanf(const char *str, const char *format, ...) { va_list args; - int read; - + int read; va_start(args, format); - read = platform_vsscanf(str, format, args); + read = vsscanf(str, format, args); va_end(args); - return read; } char *util_strncpy(char *dest, const char *src, size_t n) { - return platform_strncpy(dest, src, n); + return strncpy(dest, src, n); } + char *util_strncat(char *dest, const char *src, size_t n) { - return platform_strncat(dest, src, n); + return strncat(dest, src, n); } + char *util_strcat(char *dest, const char *src) { - return platform_strcat(dest, src); + return strcat(dest, src); } + const char *util_strerror(int err) { - return platform_strerror(err); + return strerror(err); } const struct tm *util_localtime(const time_t *timer) { - return platform_localtime(timer); + return localtime(timer); } + const char *util_ctime(const time_t *timer) { - return platform_ctime(timer); + return ctime(timer); } -bool util_isatty(fs_file_t *file) { - if (file == (fs_file_t*)stdout) return !!platform_isatty(STDOUT_FILENO); - if (file == (fs_file_t*)stderr) return !!platform_isatty(STDERR_FILENO); +int util_getline(char **lineptr, size_t *n, FILE *stream) { + int chr; + int ret; + char *pos; + + if (!lineptr || !n || !stream) + return -1; + if (!*lineptr) { + if (!(*lineptr = (char*)mem_a((*n=64)))) + return -1; + } + + chr = *n; + pos = *lineptr; + + for (;;) { + int c = getc(stream); + + if (chr < 2) { + *n += (*n > 16) ? *n : 64; + chr = *n + *lineptr - pos; + if (!(*lineptr = (char*)mem_r(*lineptr,*n))) + return -1; + pos = *n - chr + *lineptr; + } + + if (ferror(stream)) + return -1; + if (c == EOF) { + if (pos == *lineptr) + return -1; + else + break; + } + + *pos++ = c; + chr--; + if (c == '\n') + break; + } + *pos = '\0'; + return (ret = pos - *lineptr); +} + +#ifndef _WIN32 +#include +bool util_isatty(FILE *file) { + if (file == stdout) return !!isatty(STDOUT_FILENO); + if (file == stderr) return !!isatty(STDERR_FILENO); + return false; +} +#else +bool util_isatty(FILE *file) { return false; } +#endif + /* * A small noncryptographic PRNG based on: * http://burtleburtle.net/bob/rand/smallprng.html @@ -679,3 +758,16 @@ void util_seed(uint32_t value) { (void)util_rand(); } +size_t hash(const char *string) { + size_t hash = 0; + for(; *string; ++string) { + hash += *string; + hash += (hash << 10); + hash ^= (hash >> 6); + } + hash += hash << 3; + hash ^= hash >> 11; + hash += hash << 15; + return hash; +} +