Unverified Commit becfe123 authored by Rich Turner's avatar Rich Turner Committed by Daniel Stenberg
Browse files

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
parent 454fa3fd
Loading
Loading
Loading
Loading
+56 −0
Original line number Diff line number Diff line
@@ -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();

winbuild/makedebug.cmd

0 → 100644
+12 −0
Original line number Diff line number Diff line
@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")
)

winbuild/rundebug.cmd

0 → 100644
+2 −0
Original line number Diff line number Diff line
@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