aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorShauren <shauren.trinity@gmail.com>2019-01-12 18:03:50 +0100
committerShauren <shauren.trinity@gmail.com>2021-11-21 15:03:48 +0100
commita9018d1609d9baf7ddf1d10a224523b4771ec127 (patch)
tree678e6acd0df22a23ea7204c171646724475e3e47
parent6f958e38686f0784ec2c28bb5f0ffa08be2acbf7 (diff)
Core/CLI: Fixed utf-8 console input on windows
(cherry picked from commit 901af6546bed3e707b81c272774c414baaf8dd50)
-rw-r--r--src/server/worldserver/CommandLine/CliRunnable.cpp53
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))