/*
- * 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
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
+#define GMQCC_PLATFORM_HEADER
#include <string.h>
#include <stdlib.h>
-#include <io.h>
#include "platform.h"
}
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) {
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.
}
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);
}