]> granicus.if.org Git - curl/commitdiff
curl: enabled Windows VT Support and UTF-8 output
authorRich Turner <richturn@microsoft.com>
Thu, 28 Jun 2018 22:25:00 +0000 (15:25 -0700)
committerDaniel Stenberg <daniel@haxx.se>
Sat, 29 Sep 2018 10:39:41 +0000 (12:39 +0200)
Enabled Console VT support (if running OS supports VT) in tool_main.c.

Fixes #3008
Closes #3011

src/tool_main.c
winbuild/makedebug.cmd [new file with mode: 0644]
winbuild/rundebug.cmd [new file with mode: 0644]

index b9f7eae2c4b4e12291ac28994d5c4951de30804a..3a9f0cdff503481a43f8f236afd5062d55abba67 100644 (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();
diff --git a/winbuild/makedebug.cmd b/winbuild/makedebug.cmd
new file mode 100644 (file)
index 0000000..b4a917c
--- /dev/null
@@ -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 (file)
index 0000000..4b02413
--- /dev/null
@@ -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