]> gitweb.factorcode.org Git - factor.git/blobdiff - vm/os-windows.hpp
audio.engine.test: cleanup using
[factor.git] / vm / os-windows.hpp
old mode 100755 (executable)
new mode 100644 (file)
index 30352c1..a21a673
@@ -1,12 +1,15 @@
 #include <ctype.h>
 
 #ifndef wcslen
-       /* for cygwin */
-       #include <wchar.h>
+// 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
 #include <shellapi.h>
 
 #ifdef _MSC_VER
-       #undef min
-       #undef max
+#undef min
+#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
-{
+namespace factor {
 
 typedef wchar_t vm_char;
 typedef char symbol_char;
@@ -40,59 +42,86 @@ typedef HANDLE THREADHANDLE;
 #define STRDUP _wcsdup
 
 #ifdef _MSC_VER
-       #define FTELL ftell
-       #define FSEEK fseek
-       #define SNPRINTF _snprintf
+#define FTELL ftell
+#define FSEEK fseek
 #else
-       #define FTELL ftello64
-       #define FSEEK fseeko64
-       #define SNPRINTF snprintf
+#define FTELL ftello64
+#define FSEEK fseeko64
 #endif
 
 #define FACTOR_OS_STRING "windows"
 
-#define FACTOR_DLL NULL
-
-// SSE traps raise these exception codes, which are defined in internal NT headers
+// SSE traps raise these exception codes, which are defined in internal NT
+// headers
 // but not winbase.h
 #ifndef STATUS_FLOAT_MULTIPLE_FAULTS
 #define STATUS_FLOAT_MULTIPLE_FAULTS 0xC00002B4
 #endif
 
 #ifndef STATUS_FLOAT_MULTIPLE_TRAPS
-#define STATUS_FLOAT_MULTIPLE_TRAPS  0xC00002B5
+#define STATUS_FLOAT_MULTIPLE_TRAPS 0xC00002B5
 #endif
 
-#define OPEN_READ(path) _wfopen((path),L"rb")
-#define OPEN_WRITE(path) _wfopen((path),L"wb")
+#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() {}
-u64 nano_count();
-void sleep_nanos(u64 nsec);
+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);
-
-inline static THREADHANDLE thread_id()
-{
-       DWORD id = GetCurrentThreadId();
-       HANDLE threadHandle = OpenThread(
-               THREAD_GET_CONTEXT | THREAD_SET_CONTEXT | THREAD_SUSPEND_RESUME,
-               FALSE,
-               id
-       );
-       FACTOR_ASSERT(threadHandle != NULL);
-       return threadHandle;
+VM_C_API LONG exception_handler(PEXCEPTION_RECORD e, void* frame, PCONTEXT c,
+                                void* dispatch);
+THREADHANDLE start_thread(void* (*start_routine)(void*), void* args);
+
+inline static THREADHANDLE thread_id() {
+  DWORD id = GetCurrentThreadId();
+  HANDLE threadHandle = OpenThread(
+      THREAD_GET_CONTEXT | THREAD_SET_CONTEXT | THREAD_SUSPEND_RESUME, FALSE,
+      id);
+  FACTOR_ASSERT(threadHandle != NULL);
+  return threadHandle;
 }
 
-inline static void breakpoint()
-{
-       DebugBreak();
-}
+inline static void breakpoint() { DebugBreak(); }
 
 #define CODE_TO_FUNCTION_POINTER(code) (void)0
 #define CODE_TO_FUNCTION_POINTER_CALLBACK(vm, code) (void)0
 #define FUNCTION_CODE_POINTER(ptr) ptr
 #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)
+
 }