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
Doug Coleman 2020-03-06 23:57:57 -06:00
parent 34029cf1e4
commit fe83a4a164
3 changed files with 35 additions and 2 deletions

View File

@ -232,9 +232,9 @@ void factor_vm::load_image(vm_parameters* p) {
FILE* file = OPEN_READ(p->image_path); FILE* file = OPEN_READ(p->image_path);
if (file == NULL) { 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); char *msg = threadsafe_strerror(errno);
std::cout << "strerror:2: " << msg << std::endl; std::cout << "strerror: " << msg << std::endl;
free(msg); free(msg);
exit(1); exit(1);
} }

View File

@ -53,4 +53,5 @@ void check_ENOMEM(const char* msg);
static inline void breakpoint() { __builtin_trap(); } static inline void breakpoint() { __builtin_trap(); }
#define AS_UTF8(ptr) ptr
} }

View File

@ -92,4 +92,36 @@ inline static void breakpoint() { DebugBreak(); }
extern HANDLE boot_thread; 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)
} }