diff options
| author | Shauren <shauren.trinity@gmail.com> | 2019-01-12 18:03:50 +0100 | 
|---|---|---|
| committer | Shauren <shauren.trinity@gmail.com> | 2019-01-12 18:03:50 +0100 | 
| commit | 901af6546bed3e707b81c272774c414baaf8dd50 (patch) | |
| tree | b9e15ead9283078ab2d94186e3c4b71ab80c2c07 | |
| parent | d431ce3bb7ffcd47374a0f00bae6c3c92c359ce3 (diff) | |
Core/CLI: Fixed utf-8 console input on windows
| -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 ec7400e00fa..8078f577e58 100644 --- a/src/server/worldserver/CommandLine/CliRunnable.cpp +++ b/src/server/worldserver/CommandLine/CliRunnable.cpp @@ -144,51 +144,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))  | 
