support utf8 ast dump on windows

This commit is contained in:
ValKmjolnir 2024-05-22 19:23:09 +08:00
parent b6a7b7f46d
commit 971583b1c7
5 changed files with 52 additions and 8 deletions

View File

@ -2,6 +2,10 @@
#include "ast_visitor.h"
#ifdef _WIN32
#include <windows.h>
#endif
#include <iostream>
#include <cstring>
#include <sstream>
@ -89,7 +93,19 @@ public:
public:
void dump(code_block* root) {
#ifdef _WIN32
// store previous code page
auto cp = GetConsoleOutputCP();
// allow 65001 code page
SetConsoleOutputCP(CP_UTF8);
#endif
root->accept(this);
#ifdef _WIN32
// restore previous code page
SetConsoleOutputCP(cp);
#endif
}
};

View File

@ -1,6 +1,10 @@
#include "natives/nasal_builtin.h"
#include <chrono>
#ifdef _WIN32
#include <windows.h>
#endif
namespace nasal {
var builtin_unsafe(context* ctx, gc* ngc) {
@ -717,6 +721,15 @@ var builtin_ghosttype(context* ctx, gc* ngc) {
return ngc->newstr(name);
}
var builtin_set_utf8_output(context* ctx, gc* ngc) {
#ifdef _WIN32
// allow 65001 code page
SetConsoleOutputCP(CP_UTF8);
#endif
// do nothing on other platforms
return nil;
}
nasal_builtin_table builtin[] = {
{"__print", builtin_print},
{"__println", builtin_println},
@ -763,6 +776,7 @@ nasal_builtin_table builtin[] = {
{"__gcinfo", builtin_gcinfo},
{"__logtime", builtin_logtime},
{"__ghosttype", builtin_ghosttype},
{"__set_utf8_output", builtin_set_utf8_output},
{nullptr, nullptr}
};

View File

@ -81,6 +81,9 @@ var builtin_gcinfo(context*, gc*);
var builtin_logtime(context*, gc*);
var builtin_ghosttype(context*, gc*);
// only useful on windows platform
var builtin_set_utf8_output(context*, gc*);
// register builtin function's name and it's address here in this table below
// this table must end with {nullptr, nullptr}
struct nasal_builtin_table {

View File

@ -27,3 +27,9 @@ var gc = {
},
info: func() {return __gcinfo;}
};
var windows = {
set_utf8_output: func() {
return __set_utf8_output;
}
};

View File

@ -1,3 +1,8 @@
use std.runtime;
# do nothing if platform is not windows
runtime.windows.set_utf8_output();
var unicode测试 = func() {
var 输出=print;
var 测试成功=[