diff options
author | Rich Turner <richturn@microsoft.com> | 2018-06-28 15:25:00 -0700 |
---|---|---|
committer | Daniel Stenberg <daniel@haxx.se> | 2018-09-29 12:39:41 +0200 |
commit | becfe1233ff2b6b0c3e1b6a10048b55b68c2539f (patch) | |
tree | 57bd7b06e8af6e730570e9bb26d15f0682309416 | |
parent | 454fa3fd7be9b4a8d51d19d3515a3a935c3bf400 (diff) |
curl: enabled Windows VT Support and UTF-8 output
Enabled Console VT support (if running OS supports VT) in tool_main.c.
Fixes #3008
Closes #3011
-rw-r--r-- | src/tool_main.c | 56 | ||||
-rw-r--r-- | winbuild/makedebug.cmd | 12 | ||||
-rw-r--r-- | winbuild/rundebug.cmd | 2 |
3 files changed, 70 insertions, 0 deletions
diff --git a/src/tool_main.c b/src/tool_main.c index b9f7eae2c..3a9f0cdff 100644 --- a/src/tool_main.c +++ b/src/tool_main.c @@ -236,6 +236,56 @@ static void main_free(struct GlobalConfig *config) config->last = NULL; } +#ifdef _WIN32 +/* TerminalSettings for Windows */ +struct TerminalSettings { + HANDLE hStdOut; + DWORD dwOutputMode; + UINT nCodepage; +}TerminalSettings; +#endif + +static void configure_terminal(void) +{ +#ifdef _WIN32 + /* + * If we're running Windows, enable VT output & set codepage to UTF-8. + * Note: VT mode flag can be set on any version of Windows, but VT + * processing only performed on Win10 >= Creators Update) + */ + + /* Define the VT flags in case we're building with an older SDK */ +#ifndef ENABLE_VIRTUAL_TERMINAL_PROCESSING + #define ENABLE_VIRTUAL_TERMINAL_PROCESSING 0x0004 +#endif + + /* Cache current codepage (will restore on exit) & set codepage to UTF-8 */ + memset(&TerminalSettings, 0, sizeof(TerminalSettings)); + TerminalSettings.nCodepage = GetConsoleOutputCP(); + SetConsoleOutputCP(65001); + + /* Enable VT output */ + TerminalSettings.hStdOut = GetStdHandle(STD_OUTPUT_HANDLE); + if((TerminalSettings.hStdOut != INVALID_HANDLE_VALUE) + && (GetConsoleMode(TerminalSettings.hStdOut, + &TerminalSettings.dwOutputMode))) { + SetConsoleMode(TerminalSettings.hStdOut, + TerminalSettings.dwOutputMode + | ENABLE_VIRTUAL_TERMINAL_PROCESSING); + } +#endif +} + +static void restore_terminal(void) +{ +#ifdef _WIN32 + /* Restore Console output mode and codepage to whatever they were + * when Curl started */ + SetConsoleMode(TerminalSettings.hStdOut, TerminalSettings.dwOutputMode); + SetConsoleOutputCP(TerminalSettings.nCodepage); +#endif +} + /* ** curl tool main function. */ @@ -245,6 +295,9 @@ int main(int argc, char *argv[]) struct GlobalConfig global; memset(&global, 0, sizeof(global)); + /* Perform any platform-specific terminal configuration */ + configure_terminal(); + main_checkfds(); #if defined(HAVE_SIGNAL) && defined(SIGPIPE) @@ -270,6 +323,9 @@ int main(int argc, char *argv[]) main_free(&global); } + /* Return the terminal to its original state */ + restore_terminal(); + #ifdef __NOVELL_LIBC__ if(getenv("_IN_NETWARE_BASH_") == NULL) tool_pressanykey(); diff --git a/winbuild/makedebug.cmd b/winbuild/makedebug.cmd new file mode 100644 index 000000000..b4a917c34 --- /dev/null +++ b/winbuild/makedebug.cmd @@ -0,0 +1,12 @@ +@echo off + +where.exe nmake.exe >nul 2>&1 + +IF %ERRORLEVEL == 1 ( + ECHO Error: Can't find `nmake.exe` - be sure to run this script from within a Developer Command-Prompt + ECHO. +) ELSE ( + nmake /f Makefile.vc mode=static DEBUG=yes GEN_PDB=yes + IF %ERRORLEVEL% NEQ 0 (ECHO "Error: Build Failed") +) + diff --git a/winbuild/rundebug.cmd b/winbuild/rundebug.cmd new file mode 100644 index 000000000..4b0241392 --- /dev/null +++ b/winbuild/rundebug.cmd @@ -0,0 +1,2 @@ +@echo off +start cmd /k ..\builds\libcurl-vc-x86-debug-static-ipv6-sspi-winssl\bin\curl.exe https://wttr.in/seattle
\ No newline at end of file |