/*************************************************************************** * _ _ ____ _ * Project ___| | | | _ \| | * / __| | | | |_) | | * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * * Copyright (C) Daniel Stenberg, , 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 #endif #include "terminal.h" #include "memdebug.h" /* keep this as LAST include */ #ifdef HAVE_TERMIOS_H # include #elif defined(HAVE_TERMIO_H) # include #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) && !defined(CURL_WINDOWS_UWP) { 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 */ }