There may be more places to add AS_UTF8 calls--anywhere that prints a
wchar_t string in the Windows vm.
Fixes #992.
FILE* file = OPEN_READ(p->image_path);
if (file == NULL) {
- std::cout << "Cannot open image file: " << p->image_path << std::endl;
+ std::cout << "Cannot open image file: " << AS_UTF8(p->image_path) << std::endl;
char *msg = threadsafe_strerror(errno);
- std::cout << "strerror:2: " << msg << std::endl;
+ std::cout << "strerror: " << msg << std::endl;
free(msg);
exit(1);
}
static inline void breakpoint() { __builtin_trap(); }
+#define AS_UTF8(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)
+
}