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,11 +1,16 @@
use std.runtime;
# do nothing if platform is not windows
runtime.windows.set_utf8_output();
var unicode测试 = func() {
var 输出=print;
var 测试成功=[
"unicode: utf-8支持测试成功",
"目前仅支持utf-8以及ascii格式文件",
"注意: windows系统请开启chcp 65001代码页"
"unicode: utf-8 支持测试成功",
"目前仅支持 utf-8 以及 ascii 格式文件",
"注意: windows 系统请开启 chcp 65001 代码页"
];
foreach(var 内容;测试成功)
foreach(var 内容; 测试成功)
输出(内容~"\n");
}
@ -41,10 +46,10 @@ var emoji测试 = func() {
🍾:🍾,
🐘:🐘
};
foreach(var 📄;📁)
💻(📄,🎤);
foreach(var 📄;keys(🗄️))
💻(📄,🗄️[📄],🎤);
foreach(var 📄; 📁)
💻(📄, 🎤);
foreach(var 📄; keys(🗄️))
💻(📄, 🗄️[📄], 🎤);
}
var dotsgen = func() {