Skip to content

Commit 1372207

Browse files
read YGOPRO_EXTRA_SCRIPT
1 parent 1ae7b39 commit 1372207

File tree

1 file changed

+42
-20
lines changed

1 file changed

+42
-20
lines changed

gframe/gframe.cpp

Lines changed: 42 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,6 @@
2121
#endif
2222

2323
unsigned int enable_log = 0x3;
24-
bool expansions_specified = false;
2524
std::vector<std::wstring> expansions_list;
2625
std::vector<std::wstring> extra_script_list;
2726
#ifndef YGOPRO_SERVER_MODE
@@ -86,36 +85,59 @@ int main(int argc, char* argv[]) {
8685
ygo::Game _game;
8786
#ifdef YGOPRO_SERVER_MODE
8887
enable_log = 1;
89-
bool expansions_specified = false;
9088

91-
wchar_t* expansions_env_val = nullptr;
89+
auto trim = [](std::wstring& s) {
90+
const wchar_t* ws = L" \t\r\n";
91+
auto b = s.find_first_not_of(ws);
92+
auto e = s.find_last_not_of(ws);
93+
if (b == std::wstring::npos) { s.clear(); return; }
94+
s = s.substr(b, e - b + 1);
95+
};
96+
97+
auto parse_wcsv = [&](const std::wstring& wcsv, std::vector<std::wstring>& out) {
98+
if (wcsv.empty()) return;
99+
std::wstringstream ss(wcsv);
100+
std::wstring item;
101+
while (std::getline(ss, item, L',')) {
102+
trim(item);
103+
if (!item.empty()) out.push_back(item);
104+
}
105+
};
92106

107+
auto get_env_wstr = [&](const char* env_name) -> std::wstring {
93108
#ifdef _WIN32
94-
expansions_env_val = _wgetenv(L"YGOPRO_EXPANSIONS");
109+
auto envname_w_len = std::strlen(env_name) + 1;
110+
wchar_t* envname_w = new wchar_t[envname_w_len];
111+
BufferIO::DecodeUTF8String(env_name, envname_w, envname_w_len);
112+
const wchar_t* wval = _wgetenv(envname_w);
113+
delete[] envname_w;
114+
return (wval && wval[0]) ? std::wstring(wval) : std::wstring();
95115
#else
96-
const char* env_utf8 = std::getenv("YGOPRO_EXPANSIONS");
97-
if(env_utf8) {
98-
expansions_env_val = (wchar_t*)malloc(1024 * sizeof(wchar_t));
99-
BufferIO::DecodeUTF8String(env_utf8, expansions_env_val, 1024);
100-
}
116+
const char* env_utf8 = std::getenv(env_name);
117+
if (!env_utf8 || !env_utf8[0]) return {};
118+
auto env_w_len = std::strlen(env_utf8) + 1;
119+
wchar_t* env_w = new wchar_t[env_w_len];
120+
BufferIO::DecodeUTF8String(env_utf8, env_w, env_w_len);
121+
auto res = std::wstring(env_w);
122+
delete[] env_w;
123+
return res;
101124
#endif
125+
};
102126

103-
if (expansions_env_val && expansions_env_val[0] != L'\0') {
104-
expansions_specified = true;
105-
std::wstringstream ss(expansions_env_val);
106-
std::wstring item;
107-
while (std::getline(ss, item, L',')) {
108-
if (!item.empty()) {
109-
expansions_list.push_back(item);
110-
}
111-
}
112-
} else {
113-
expansions_specified = false;
127+
auto load_env_list = [&](const char* env_name, std::vector<std::wstring>& out) {
128+
std::wstring val = get_env_wstr(env_name);
129+
parse_wcsv(val, out);
130+
};
131+
132+
load_env_list("YGOPRO_EXPANSIONS", expansions_list);
133+
if (expansions_list.empty()) {
114134
expansions_list.push_back(L"./expansions");
115135
#if defined(SERVER_PRO3_SUPPORT) && !defined(_WIN32) && !defined(__APPLE__)
116136
expansions_list.push_back(L"./Expansions");
117137
#endif
118138
}
139+
load_env_list("YGOPRO_EXTRA_SCRIPT", extra_script_list);
140+
119141
ygo::server_port = 7911;
120142
ygo::replay_mode = 0;
121143
ygo::duel_flags = 0;

0 commit comments

Comments
 (0)