X-Git-Url: https://git.xonotic.org/?p=xonotic%2Fgmqcc.git;a=blobdiff_plain;f=msvc.c;h=b565cfaf9da8c0fef7aa9cef4797d6bda3b5e991;hp=2c6a3ed6656d28bc5d81f1983a2c00e1e6c91f85;hb=faacfa018a192f880719fac4abca4479b9bbb5e3;hpb=e8955f17eaa5600ce533fb6dd0c3f7b39dc160bd diff --git a/msvc.c b/msvc.c index 2c6a3ed..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,28 +76,13 @@ 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); - - return rt; -} - /* * TODO: this isn't exactly 'accurate' for MSVC but it seems to work, * at least to some extent. @@ -191,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); }