]> git.ipfire.org Git - thirdparty/curl.git/commitdiff
curl: make warnings and other messages aware of terminal width
authorDaniel Stenberg <daniel@haxx.se>
Tue, 28 May 2024 07:44:27 +0000 (09:44 +0200)
committerDaniel Stenberg <daniel@haxx.se>
Tue, 28 May 2024 21:12:32 +0000 (23:12 +0200)
This removes unnecessary line wraps when the terminal is wider than 79
columns and it also makes messages look better in narrower terminals.

The get_terminal_columns() function is not split out into its own source
file.

Suggested-by: Elliott Balsley
Fixes #13804
Closes #13808

src/Makefile.inc
src/terminal.c [new file with mode: 0644]
src/terminal.h [new file with mode: 0644]
src/tool_cb_prg.c
src/tool_cb_prg.h
src/tool_help.c
src/tool_msgs.c

index c1d202a06192e6212d19bf3171599ad1e81f0f56..92efa2756aff78fa7b778593541829f9e4cedb21 100644 (file)
@@ -59,6 +59,7 @@ CURLX_HFILES = \
 
 CURL_CFILES = \
   slist_wc.c \
+  terminal.c \
   tool_binmode.c \
   tool_bname.c \
   tool_cb_dbg.c \
@@ -103,6 +104,7 @@ CURL_CFILES = \
 
 CURL_HFILES = \
   slist_wc.h \
+  terminal.h \
   tool_binmode.h \
   tool_bname.h \
   tool_cb_dbg.h \
diff --git a/src/terminal.c b/src/terminal.c
new file mode 100644 (file)
index 0000000..08b1bdd
--- /dev/null
@@ -0,0 +1,91 @@
+/***************************************************************************
+ *                                  _   _ ____  _
+ *  Project                     ___| | | |  _ \| |
+ *                             / __| | | | |_) | |
+ *                            | (__| |_| |  _ <| |___
+ *                             \___|\___/|_| \_\_____|
+ *
+ * Copyright (C) Daniel Stenberg, <daniel@haxx.se>, et al.
+ *
+ * This software is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution. The terms
+ * are also available at https://curl.se/docs/copyright.html.
+ *
+ * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+ * copies of the Software, and permit persons to whom the Software is
+ * furnished to do so, under the terms of the COPYING file.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ * SPDX-License-Identifier: curl
+ *
+ ***************************************************************************/
+#include "tool_setup.h"
+
+#ifdef HAVE_SYS_IOCTL_H
+#include <sys/ioctl.h>
+#endif
+
+#include "terminal.h"
+
+#include "memdebug.h" /* keep this as LAST include */
+
+#ifdef HAVE_TERMIOS_H
+#  include <termios.h>
+#elif defined(HAVE_TERMIO_H)
+#  include <termio.h>
+#endif
+
+/*
+ * get_terminal_columns() returns the number of columns in the current
+ * terminal. It will return 79 on failure. Also, the number can be very big.
+ */
+
+unsigned int get_terminal_columns(void)
+{
+  unsigned int width = 0;
+  char *colp = curl_getenv("COLUMNS");
+  if(colp) {
+    char *endptr;
+    long num = strtol(colp, &endptr, 10);
+    if((endptr != colp) && (endptr == colp + strlen(colp)) && (num > 20) &&
+       (num < 10000))
+      width = (unsigned int)num;
+    curl_free(colp);
+  }
+
+  if(!width) {
+    int cols = 0;
+
+#ifdef TIOCGSIZE
+    struct ttysize ts;
+    if(!ioctl(STDIN_FILENO, TIOCGSIZE, &ts))
+      cols = ts.ts_cols;
+#elif defined(TIOCGWINSZ)
+    struct winsize ts;
+    if(!ioctl(STDIN_FILENO, TIOCGWINSZ, &ts))
+      cols = (int)ts.ws_col;
+#elif defined(_WIN32)
+    {
+      HANDLE  stderr_hnd = GetStdHandle(STD_ERROR_HANDLE);
+      CONSOLE_SCREEN_BUFFER_INFO console_info;
+
+      if((stderr_hnd != INVALID_HANDLE_VALUE) &&
+         GetConsoleScreenBufferInfo(stderr_hnd, &console_info)) {
+        /*
+         * Do not use +1 to get the true screen-width since writing a
+         * character at the right edge will cause a line wrap.
+         */
+        cols = (int)
+          (console_info.srWindow.Right - console_info.srWindow.Left);
+      }
+    }
+#endif /* TIOCGSIZE */
+    if(cols >= 0 && cols < 10000)
+      width = (unsigned int)cols;
+  }
+  if(!width)
+    width = 79;
+  return width; /* 79 for unknown, might also be very small or very big */
+}
diff --git a/src/terminal.h b/src/terminal.h
new file mode 100644 (file)
index 0000000..dbd4abe
--- /dev/null
@@ -0,0 +1,30 @@
+#ifndef HEADER_CURL_TERMINAL_H
+#define HEADER_CURL_TERMINAL_H
+/***************************************************************************
+ *                                  _   _ ____  _
+ *  Project                     ___| | | |  _ \| |
+ *                             / __| | | | |_) | |
+ *                            | (__| |_| |  _ <| |___
+ *                             \___|\___/|_| \_\_____|
+ *
+ * Copyright (C) Daniel Stenberg, <daniel@haxx.se>, et al.
+ *
+ * This software is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution. The terms
+ * are also available at https://curl.se/docs/copyright.html.
+ *
+ * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+ * copies of the Software, and permit persons to whom the Software is
+ * furnished to do so, under the terms of the COPYING file.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ * SPDX-License-Identifier: curl
+ *
+ ***************************************************************************/
+#include "tool_setup.h"
+
+unsigned int get_terminal_columns(void);
+
+#endif /* HEADER_CURL_TERMINAL_H */
index 8e50908ddd76579bc7b9e38fb9a7c14b3cda592d..1c06b14d992fc6de628ad06ae398479c3afe7fd0 100644 (file)
  ***************************************************************************/
 #include "tool_setup.h"
 
-#ifdef HAVE_SYS_IOCTL_H
-#include <sys/ioctl.h>
-#endif
-
 #define ENABLE_CURLX_PRINTF
 /* use our own printf() functions */
 #include "curlx.h"
 #include "tool_cb_prg.h"
 #include "tool_util.h"
 #include "tool_operate.h"
+#include "terminal.h"
 
 #include "memdebug.h" /* keep this as LAST include */
 
 #define MAX_BARLENGTH 256
 
-#ifdef HAVE_TERMIOS_H
-#  include <termios.h>
-#elif defined(HAVE_TERMIO_H)
-#  include <termio.h>
-#endif
-
 /* 200 values generated by this perl code:
 
    my $pi = 3.1415;
@@ -229,59 +220,6 @@ int tool_progress_cb(void *clientp,
   return 0;
 }
 
-/*
- * get_terminal_columns() returns the number of columns in the current
- * terminal. It will return 79 on failure. Also, the number can be very big.
- */
-
-unsigned int get_terminal_columns(void)
-{
-  unsigned int width = 0;
-  char *colp = curl_getenv("COLUMNS");
-  if(colp) {
-    char *endptr;
-    long num = strtol(colp, &endptr, 10);
-    if((endptr != colp) && (endptr == colp + strlen(colp)) && (num > 20) &&
-       (num < 10000))
-      width = (unsigned int)num;
-    curl_free(colp);
-  }
-
-  if(!width) {
-    int cols = 0;
-
-#ifdef TIOCGSIZE
-    struct ttysize ts;
-    if(!ioctl(STDIN_FILENO, TIOCGSIZE, &ts))
-      cols = ts.ts_cols;
-#elif defined(TIOCGWINSZ)
-    struct winsize ts;
-    if(!ioctl(STDIN_FILENO, TIOCGWINSZ, &ts))
-      cols = (int)ts.ws_col;
-#elif defined(_WIN32)
-    {
-      HANDLE  stderr_hnd = GetStdHandle(STD_ERROR_HANDLE);
-      CONSOLE_SCREEN_BUFFER_INFO console_info;
-
-      if((stderr_hnd != INVALID_HANDLE_VALUE) &&
-         GetConsoleScreenBufferInfo(stderr_hnd, &console_info)) {
-        /*
-         * Do not use +1 to get the true screen-width since writing a
-         * character at the right edge will cause a line wrap.
-         */
-        cols = (int)
-          (console_info.srWindow.Right - console_info.srWindow.Left);
-      }
-    }
-#endif /* TIOCGSIZE */
-    if(cols >= 0 && cols < 10000)
-      width = (unsigned int)cols;
-  }
-  if(!width)
-    width = 79;
-  return width; /* 79 for unknown, might also be very small or very big */
-}
-
 void progressbarinit(struct ProgressData *bar,
                      struct OperationConfig *config)
 {
index b012457dfa6bfe53d2093bad372edda716167fac..dc10f2a5ccc813394c5e54d674867b2a82c8f3d3 100644 (file)
@@ -45,8 +45,6 @@ struct OperationConfig;
 void progressbarinit(struct ProgressData *bar,
                      struct OperationConfig *config);
 
-unsigned int get_terminal_columns(void);
-
 /*
 ** callback for CURLOPT_PROGRESSFUNCTION
 */
index f74033d0adf7ee2d4838e3bfb5f2727f2ce172c3..6d29fd8f6668169673aacf6aa45d3811bf2bb8e2 100644 (file)
@@ -31,6 +31,7 @@
 #include "tool_util.h"
 #include "tool_version.h"
 #include "tool_cb_prg.h"
+#include "terminal.h"
 
 #include "memdebug.h" /* keep this as LAST include */
 
index 09c9310a523dd4fe24c50fb83cce9f638a1e99c0..47e625c1e3f05a4f215476d1424a3c6860c73b17 100644 (file)
@@ -29,6 +29,8 @@
 
 #include "tool_cfgable.h"
 #include "tool_msgs.h"
+#include "tool_cb_prg.h"
+#include "terminal.h"
 
 #include "memdebug.h" /* keep this as LAST include */
 
@@ -46,7 +48,7 @@ static void voutf(struct GlobalConfig *config,
                   const char *fmt,
                   va_list ap)
 {
-  size_t width = (79 - strlen(prefix));
+  size_t width = (get_terminal_columns() - strlen(prefix));
   DEBUGASSERT(!strchr(fmt, '\n'));
   if(!config->silent) {
     size_t len;