/usr/share/ada/adainclude/gnatcoll/terminals.c is in libgnatcoll1.6-dev 1.6gpl2014-6.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 | #ifdef _WIN32
#include <windows.h>
#include <wincon.h>
#else
#include <unistd.h>
#ifdef HAVE_TERMIOS_H
#include <termios.h> // for TIOCGWINSZ on some systems
#endif
#include <sys/ioctl.h>
#include <stdio.h>
#endif
int gnatcoll_get_console_screen_buffer_info(int forStderr) {
#ifdef _WIN32
const HANDLE handle =
GetStdHandle (forStderr ? STD_ERROR_HANDLE : STD_OUTPUT_HANDLE);
CONSOLE_SCREEN_BUFFER_INFO csbiInfo;
if (GetConsoleScreenBufferInfo (handle, &csbiInfo)) {
return csbiInfo.wAttributes;
}
#else
return -1;
#endif
}
void gnatcoll_set_console_text_attribute(int forStderr, int attrs) {
#ifdef _WIN32
const HANDLE handle =
GetStdHandle (forStderr ? STD_ERROR_HANDLE : STD_OUTPUT_HANDLE);
SetConsoleTextAttribute (handle, (WORD)attrs);
#endif
}
int gnatcoll_terminal_has_colors(int fd) {
#ifdef _WIN32
return 0; // Unix only
#else
// Ideally, we should check the terminfo database and check the
// max_colors fields (from the command line, this is done with
// "tput colors"). However, this is fairly complex, and would
// drag in the curses library.
// For now, let's just assume that a tty always supports colors,
// which is true in this day and age for interactive terminals on
// all Unix platforms. A pipe will return 0 below, so will not have
// colors by default.
// ??? We could also check the value of the TERM environment variable,
// but this is very approximate at best.
return isatty(fd);
#endif
}
void gnatcoll_beginning_of_line(int forStderr) {
#ifdef _WIN32
const HANDLE handle =
GetStdHandle (forStderr ? STD_ERROR_HANDLE : STD_OUTPUT_HANDLE);
CONSOLE_SCREEN_BUFFER_INFO csbiInfo;
if (GetConsoleScreenBufferInfo (handle, &csbiInfo)) {
csbiInfo.dwCursorPosition.X = 0;
SetConsoleCursorPosition(handle, csbiInfo.dwCursorPosition);
}
#else
// struct winsize ws;
// ioctl(forStderr ? 2 : 1, TIOCGWINSZ, &ws);
write(forStderr ? 2 : 1, "\r", 1);
#endif
}
void gnatcoll_clear_to_end_of_line(int forStderr) {
#ifdef _WIN32
const HANDLE handle =
GetStdHandle (forStderr ? STD_ERROR_HANDLE : STD_OUTPUT_HANDLE);
CONSOLE_SCREEN_BUFFER_INFO csbiInfo;
if (GetConsoleScreenBufferInfo (handle, &csbiInfo)) {
DWORD numberOfCharsWritten;
FillConsoleOutputCharacter(
handle, ' ',
csbiInfo.dwSize.X - csbiInfo.dwCursorPosition.X + 1, // length
csbiInfo.dwCursorPosition, // dWriteCoord
&numberOfCharsWritten);
}
#else
write(forStderr ? 2 : 1, "\033[0K", 4);
#endif
}
int gnatcoll_terminal_width(int forStderr) {
#ifdef _WIN32
const HANDLE handle =
GetStdHandle (forStderr ? STD_ERROR_HANDLE : STD_OUTPUT_HANDLE);
CONSOLE_SCREEN_BUFFER_INFO csbiInfo;
if (GetConsoleScreenBufferInfo (handle, &csbiInfo)) {
return (int)csbiInfo.dwSize.X;
}
return -1;
#else
#ifdef TIOCGWINSZ
struct winsize w;
ioctl(forStderr ? 1 : 0, TIOCGWINSZ, &w);
return w.ws_col;
#else
return -1;
#endif
#endif
}
|