]> gitweb.factorcode.org Git - factor.git/blobdiff - vm/os-windows.hpp
io.streams.256color: faster by caching styles
[factor.git] / vm / os-windows.hpp
index 2dab596c4da41d8d200979608efa0102f82a0633..a21a67361b692a3f7ec9c9e10490cc230303912b 100644 (file)
@@ -1,7 +1,7 @@
 #include <ctype.h>
 
 #ifndef wcslen
-/* for cygwin */
+// for cygwin
 #include <wchar.h>
 #endif
 
@@ -23,7 +23,7 @@
 #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 {
@@ -44,11 +44,9 @@ typedef HANDLE THREADHANDLE;
 #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"
@@ -66,12 +64,12 @@ typedef HANDLE THREADHANDLE;
 
 #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);
@@ -93,4 +91,37 @@ inline static void breakpoint() { DebugBreak(); }
 #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)
+
 }