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
This commit is contained in:
Rich Turner 2018-06-28 15:25:00 -07:00 committed by Daniel Stenberg
parent 454fa3fd7b
commit becfe1233f
No known key found for this signature in database
GPG Key ID: 5CC908FDB71E12C2
3 changed files with 70 additions and 0 deletions

View File

@ -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();

12
winbuild/makedebug.cmd Normal file
View File

@ -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")
)

2
winbuild/rundebug.cmd Normal file
View File

@ -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