|
21 | 21 | #endif |
22 | 22 |
|
23 | 23 | unsigned int enable_log = 0x3; |
24 | | -bool expansions_specified = false; |
25 | 24 | std::vector<std::wstring> expansions_list; |
26 | 25 | std::vector<std::wstring> extra_script_list; |
27 | 26 | #ifndef YGOPRO_SERVER_MODE |
@@ -86,36 +85,59 @@ int main(int argc, char* argv[]) { |
86 | 85 | ygo::Game _game; |
87 | 86 | #ifdef YGOPRO_SERVER_MODE |
88 | 87 | enable_log = 1; |
89 | | - bool expansions_specified = false; |
90 | 88 |
|
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 | + }; |
92 | 106 |
|
| 107 | + auto get_env_wstr = [&](const char* env_name) -> std::wstring { |
93 | 108 | #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(); |
95 | 115 | #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; |
101 | 124 | #endif |
| 125 | + }; |
102 | 126 |
|
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()) { |
114 | 134 | expansions_list.push_back(L"./expansions"); |
115 | 135 | #if defined(SERVER_PRO3_SUPPORT) && !defined(_WIN32) && !defined(__APPLE__) |
116 | 136 | expansions_list.push_back(L"./Expansions"); |
117 | 137 | #endif |
118 | 138 | } |
| 139 | + load_env_list("YGOPRO_EXTRA_SCRIPT", extra_script_list); |
| 140 | + |
119 | 141 | ygo::server_port = 7911; |
120 | 142 | ygo::replay_mode = 0; |
121 | 143 | ygo::duel_flags = 0; |
|
0 commit comments