vm: Add AS_UTF and use it to print wchar_t in Windows terminal.
There may be more places to add AS_UTF8 calls--anywhere that prints a wchar_t string in the Windows vm. Fixes #992.master
parent
34029cf1e4
commit
fe83a4a164
|
@ -232,9 +232,9 @@ void factor_vm::load_image(vm_parameters* p) {
|
|||
|
||||
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);
|
||||
}
|
||||
|
|
|
@ -53,4 +53,5 @@ void check_ENOMEM(const char* msg);
|
|||
|
||||
static inline void breakpoint() { __builtin_trap(); }
|
||||
|
||||
#define AS_UTF8(ptr) ptr
|
||||
}
|
||||
|
|
|
@ -92,4 +92,36 @@ inline static void breakpoint() { DebugBreak(); }
|
|||
|
||||
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)
|
||||
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue