X-Git-Url: https://git.xonotic.org/?p=xonotic%2Fgmqcc.git;a=blobdiff_plain;f=msvc.c;h=b565cfaf9da8c0fef7aa9cef4797d6bda3b5e991;hp=54543ffafeb142e0a892be11d92d9a200acafa32;hb=6424ebaf98262bfd65a48b644b57fdf99b7866a9;hpb=5138a25420ce56408486f14778dba17f252411c7 diff --git a/msvc.c b/msvc.c index 54543ff..b565cfa 100644 --- a/msvc.c +++ b/msvc.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2012, 2013 + * Copyright (C) 2012, 2013, 2014 * Dale Weiler * * Permission is hereby granted, free of charge, to any person obtaining a copy of @@ -20,9 +20,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 #include "platform.h" @@ -52,21 +52,18 @@ static void *platform_mem_allocate(size_t bytes) { } int platform_vsnprintf(char *buffer, size_t bytes, const char *format, va_list arg) { - vsnprintf_s(buffer, bytes, bytes, format, arg); + return vsnprintf_s(buffer, bytes, bytes, format, arg); } -int platform_sscanf(const char *str, const char *format, ...) { - va_list va; - va_start(va, format); - vsscanf_s(str, format, va); - va_end(va); +int platform_vsscanf(const char *str, const char *format, va_list va) { + return vsscanf_s(str, format, va); } const struct tm *platform_localtime(const time_t *timer) { struct tm *t; t = (struct tm*)platform_mem_allocate(sizeof(struct tm)); localtime_s(&t, timer); - return &t; + return t; } const char *platform_ctime(const time_t *timer) { @@ -79,26 +76,35 @@ char *platform_strncat(char *dest, const char *src, size_t num) { return strncat_s(dest, num, src, _TRUNCATE); } -const char *platform_tmpnam(char *str) { - return tmpnam_s(str, L_tmpnam); -} - -const char *platform_getenv(char *var) { +const char *platform_getenv(const char *var) { char *buffer = (char *)platform_mem_allocate(GETENV_BUFFER); size_t size; getenv_s(&size, buffer, GETENV_BUFFER, var); return buffer; } -int platform_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); +/* + * TODO: this isn't exactly 'accurate' for MSVC but it seems to work, + * at least to some extent. + */ +int platform_vasprintf(char **dat, const char *fmt, va_list args) { + int ret; + int len; + char *tmp = NULL; + + if ((len = _vscprintf(fmt, args)) < 0) { + *dat = NULL; + return -1; + } - return rt; + 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; + } + *dat = tmp; + return len; } char *platform_strcat(char *dest, const char *src) { @@ -130,6 +136,10 @@ size_t platform_fwrite(const void *ptr, size_t size, size_t count, FILE *stream) return fwrite(ptr, size, count, stream); } +int platform_fflush(FILE *stream) { + return fflush(stream); +} + int platform_vfprintf(FILE *stream, const char *format, va_list arg) { return vfprintf_s(stream, format, arg); } @@ -163,17 +173,59 @@ int platform_mkdir(const char *path, int mode) { } DIR *platform_opendir(const char *path) { - return opendir(path); + DIR *dir = (DIR*)mem_a(sizeof(DIR) + strlen(path)); + if (!dir) + return NULL; + + platform_strncpy(dir->dd_name, path, strlen(path)); + return dir; } int platform_closedir(DIR *dir) { - return closedir(dir); + FindClose((HANDLE)dir->dd_handle); + mem_d((void*)dir); + return 0; } struct dirent *platform_readdir(DIR *dir) { - return readdir(dir); + WIN32_FIND_DATA info; + struct dirent *data; + int ret; + + if (!dir->dd_handle) { + char *dirname; + if (*dir->dd_name) { + size_t n = strlen(dir->dd_name); + if ((dir = (char*)mem_a(n+5))) { + platform_strncpy(dirname, dir->dd_name, n); + platform_strncpy(dirname + n, "\\*.*", 4); + } + } else { + if (!(dirname = util_strdup("\\*.*"))) + return NULL; + } + + dir->dd_handle = (long)FindFirstFile(dirname, &info); + mem_d(dirname); + ret = !(!dir->dd_handle); + } else if (dir->dd_handle != -11) { + ret = FindNextFile((HANDLE)dir->dd_handle, &info); + } else { + ret = 0; + } + + if (!ret) + return NULL; + + if ((data = (struct dirent*)mem_a(sizeof(struct dirent)))) { + platform_strncpy(data->d_name, info.cFileName, FILENAME_MAX - 1); + data->d_name[FILENAME_MAX - 1] = '\0'; + data->d_namelen = strlen(data->d_name); + } + + return data; } int platform_istty(int fd) { - return _istty(fd); + return _isatty(fd); }