#include <ctype.h>
#ifndef wcslen
-/* for cygwin */
+// for cygwin
#include <wchar.h>
#endif
+#if _WIN32_WINNT != 0x0600
#undef _WIN32_WINNT
-#define _WIN32_WINNT 0x0501 // For AddVectoredExceptionHandler
+#define _WIN32_WINNT 0x0501 // For AddVectoredExceptionHandler, WinXP support
+//#define _WIN32_WINNT 0x0600 // For CancelSynchronousIo
+#endif
#ifndef UNICODE
#define UNICODE
#undef max
#endif
-/* Difference between Jan 1 00:00:00 1601 and Jan 1 00:00:00 1970 */
+// Difference between Jan 1 00:00:00 1601 and Jan 1 00:00:00 1970
#define EPOCH_OFFSET 0x019db1ded53e8000LL
namespace factor {
#ifdef _MSC_VER
#define FTELL ftell
#define FSEEK fseek
-#define SNPRINTF _snprintf
#else
#define FTELL ftello64
#define FSEEK fseeko64
-#define SNPRINTF snprintf
#endif
#define FACTOR_OS_STRING "windows"
#define OPEN_READ(path) _wfopen((path), L"rb")
#define OPEN_WRITE(path) _wfopen((path), L"wb")
+#define THREADSAFE_STRERROR(errnum, buf, buflen) strerror_s(buf, buflen, errnum)
inline static void early_init() {}
uint64_t nano_count();
void sleep_nanos(uint64_t nsec);
long getpagesize();
-void move_file(const vm_char* path1, const vm_char* path2);
VM_C_API LONG exception_handler(PEXCEPTION_RECORD e, void* frame, PCONTEXT c,
void* dispatch);
THREADHANDLE start_thread(void* (*start_routine)(void*), void* args);
#define FUNCTION_TOC_POINTER(ptr) ptr
extern HANDLE boot_thread;
+
+inline static std::string to_utf8(const wchar_t* buffer, int len) {
+ int nChars = ::WideCharToMultiByte(
+ CP_UTF8,
+ 0,
+ buffer,
+ len,
+ NULL,
+ 0,
+ NULL,
+ NULL);
+ if (nChars == 0) return "";
+
+ std::string newbuffer;
+ newbuffer.resize(nChars) ;
+ ::WideCharToMultiByte(
+ CP_UTF8,
+ 0,
+ buffer,
+ len,
+ const_cast<char*>(newbuffer.c_str()),
+ nChars,
+ NULL,
+ NULL);
+ return newbuffer;
+}
+
+inline static std::string to_utf8(const std::wstring& str) {
+ return to_utf8(str.c_str(), (int)str.size());
+}
+
+#define AS_UTF8(ptr) to_utf8(ptr)
+
}