diff options
author | Shauren <shauren.trinity@gmail.com> | 2019-01-12 18:03:50 +0100 |
---|---|---|
committer | Shauren <shauren.trinity@gmail.com> | 2021-11-21 15:03:48 +0100 |
commit | a9018d1609d9baf7ddf1d10a224523b4771ec127 (patch) | |
tree | 678e6acd0df22a23ea7204c171646724475e3e47 | |
parent | 6f958e38686f0784ec2c28bb5f0ffa08be2acbf7 (diff) |
Core/CLI: Fixed utf-8 console input on windows
(cherry picked from commit 901af6546bed3e707b81c272774c414baaf8dd50)
-rw-r--r-- | src/server/worldserver/CommandLine/CliRunnable.cpp | 53 |
1 files changed, 25 insertions, 28 deletions
diff --git a/src/server/worldserver/CommandLine/CliRunnable.cpp b/src/server/worldserver/CommandLine/CliRunnable.cpp index 200f78f0957..b20aafef6a1 100644 --- a/src/server/worldserver/CommandLine/CliRunnable.cpp +++ b/src/server/worldserver/CommandLine/CliRunnable.cpp @@ -148,51 +148,48 @@ void CliThread() { fflush(stdout); - char *command_str ; // = fgets(commandbuf, sizeof(commandbuf), stdin); + std::string command; #if TRINITY_PLATFORM == TRINITY_PLATFORM_WINDOWS - char commandbuf[256]; - command_str = fgets(commandbuf, sizeof(commandbuf), stdin); -#else - command_str = readline("TC>"); - rl_bind_key('\t', rl_complete); -#endif - - if (command_str != nullptr) + wchar_t commandbuf[256]; + if (fgetws(commandbuf, sizeof(commandbuf), stdin)) { - for (int x=0; command_str[x]; ++x) - if (command_str[x] == '\r' || command_str[x] == '\n') - { - command_str[x] = 0; - break; - } - - if (!*command_str) + if (!WStrToUtf8(commandbuf, wcslen(commandbuf), command)) { -#if TRINITY_PLATFORM == TRINITY_PLATFORM_WINDOWS printf("TC>"); -#else - free(command_str); -#endif continue; } + } +#else + char* command_str = readline("TC>"); + rl_bind_key('\t', rl_complete); + if (command_str != nullptr) + { + command = command_str; + free(command_str); + } +#endif - std::string command; - if (!consoleToUtf8(command_str, command)) // convert from console encoding to utf8 + if (!command.empty()) + { + std::size_t nextLineIndex = command.find_first_of("\r\n"); + if (nextLineIndex != std::string::npos) { + if (nextLineIndex == 0) + { #if TRINITY_PLATFORM == TRINITY_PLATFORM_WINDOWS - printf("TC>"); -#else - free(command_str); + printf("TC>"); #endif - continue; + continue; + } + + command.erase(nextLineIndex); } fflush(stdout); sWorld->QueueCliCommand(new CliCommandHolder(nullptr, command.c_str(), &utf8print, &commandFinished)); #if TRINITY_PLATFORM != TRINITY_PLATFORM_WINDOWS add_history(command.c_str()); - free(command_str); #endif } else if (feof(stdin)) |