summaryrefslogtreecommitdiff
path: root/Build/source/texk/dvisvgm/dvisvgm-1.0.10/src/Terminal.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Build/source/texk/dvisvgm/dvisvgm-1.0.10/src/Terminal.cpp')
-rw-r--r--Build/source/texk/dvisvgm/dvisvgm-1.0.10/src/Terminal.cpp191
1 files changed, 191 insertions, 0 deletions
diff --git a/Build/source/texk/dvisvgm/dvisvgm-1.0.10/src/Terminal.cpp b/Build/source/texk/dvisvgm/dvisvgm-1.0.10/src/Terminal.cpp
new file mode 100644
index 00000000000..479e24a7c1b
--- /dev/null
+++ b/Build/source/texk/dvisvgm/dvisvgm-1.0.10/src/Terminal.cpp
@@ -0,0 +1,191 @@
+/*************************************************************************
+** Terminal.cpp **
+** **
+** This file is part of dvisvgm -- the DVI to SVG converter **
+** Copyright (C) 2005-2011 Martin Gieseking <martin.gieseking@uos.de> **
+** **
+** This program is free software; you can redistribute it and/or **
+** modify it under the terms of the GNU General Public License as **
+** published by the Free Software Foundation; either version 3 of **
+** the License, or (at your option) any later version. **
+** **
+** This program is distributed in the hope that it will be useful, but **
+** WITHOUT ANY WARRANTY; without even the implied warranty of **
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the **
+** GNU General Public License for more details. **
+** **
+** You should have received a copy of the GNU General Public License **
+** along with this program; if not, see <http://www.gnu.org/licenses/>. **
+*************************************************************************/
+
+#include "Terminal.h"
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#ifdef HAVE_TERMIOS_H
+#include <termios.h>
+#endif
+
+#ifdef GWINSZ_IN_SYS_IOCTL
+#include <sys/ioctl.h>
+#endif
+
+#ifdef __WIN32__
+#include <windows.h>
+#endif
+
+#include <cstdio>
+
+
+using namespace std;
+
+
+const int Terminal::RED = 1;
+const int Terminal::GREEN = 2;
+const int Terminal::BLUE = 4;
+
+const int Terminal::CYAN = GREEN|BLUE;
+const int Terminal::YELLOW = RED|GREEN;
+const int Terminal::MAGENTA = RED|BLUE;
+const int Terminal::WHITE = RED|GREEN|BLUE;
+const int Terminal::DEFAULT = -1;
+const int Terminal::BLACK = 0;
+
+#ifdef __WIN32__
+int Terminal::_defaultColor;
+#endif
+
+int Terminal::_fgcolor = Terminal::DEFAULT;
+int Terminal::_bgcolor = Terminal::DEFAULT;
+
+
+/** Initializes the terminal. This method should be called before any of the others.
+ * @param[in,out] os terminal output stream (currently unused) */
+void Terminal::init (ostream &os) {
+#ifdef __WIN32__
+ HANDLE h = GetStdHandle(STD_OUTPUT_HANDLE);
+ if (h != INVALID_HANDLE_VALUE) {
+ CONSOLE_SCREEN_BUFFER_INFO info;
+ GetConsoleScreenBufferInfo(h, &info);
+ _defaultColor = (info.wAttributes & 0xff);
+ }
+#endif
+}
+
+
+/** Finishes the terminal output. Should be called after last terminal action.
+ * @param[in,out] os terminal output stream */
+void Terminal::finish (ostream &os) {
+ fgcolor(DEFAULT, os);
+ bgcolor(DEFAULT, os);
+}
+
+
+/** Returns the number of terminal columns (number of characters per row).
+ * If it's not possible to retrieve information about the terminal size, 0 is returned. */
+int Terminal::columns () {
+#if defined(TIOCGWINSZ)
+ struct winsize ws;
+ if (ioctl(fileno(stderr), TIOCGWINSZ, &ws) < 0)
+ return 0;
+ return ws.ws_col;
+#elif defined(__WIN32__)
+ CONSOLE_SCREEN_BUFFER_INFO info;
+ if (!GetConsoleScreenBufferInfo(GetStdHandle(STD_ERROR_HANDLE), &info))
+ return 0;
+ return info.dwSize.X;
+#else
+ return 0;
+#endif
+}
+
+
+/** Returns the number of terminal rows.
+ * If it's not possible to retrieve information about the terminal size, 0 is returned. */
+int Terminal::rows () {
+#if defined(TIOCGWINSZ)
+ struct winsize ws;
+ if (ioctl(fileno(stderr), TIOCGWINSZ, &ws) < 0)
+ return 0;
+ return ws.ws_row;
+#elif defined(__WIN32__)
+ CONSOLE_SCREEN_BUFFER_INFO info;
+ if (!GetConsoleScreenBufferInfo(GetStdHandle(STD_ERROR_HANDLE), &info))
+ return 0;
+ return info.dwSize.Y;
+#else
+ return 0;
+#endif
+}
+
+
+/** Sets the foreground color.
+ * @param[in] color color code
+ * @param[in] os terminal output stream */
+void Terminal::fgcolor (int color, ostream &os) {
+ _fgcolor = color;
+
+#ifdef __WIN32__
+ HANDLE h = GetStdHandle(STD_OUTPUT_HANDLE);
+ if (h != INVALID_HANDLE_VALUE) {
+ CONSOLE_SCREEN_BUFFER_INFO info;
+ GetConsoleScreenBufferInfo(h, &info);
+ if (_fgcolor == DEFAULT)
+ color = _defaultColor & 0x0f;
+ else {
+ // swap red and blue bits
+ color = (color & 0x0a) | ((color & 1) << 2) | ((color & 4) >> 2);
+ }
+ color = (info.wAttributes & 0xf0) | (color & 0x0f);
+ SetConsoleTextAttribute(h, (DWORD)color);
+ }
+#else
+ bool light = false;
+ if (color != DEFAULT && color > 7) {
+ light = true;
+ color %= 8;
+ }
+ if (color == DEFAULT) {
+ os << "\x1B[0m";
+ if (_bgcolor != DEFAULT)
+ bgcolor(_bgcolor, os);
+ }
+ else
+ os << "\x1B[" << (light ? '1': '0') << ';' << (30+(color & 0x07)) << 'm';
+#endif
+}
+
+
+/** Sets the background color.
+ * @param[in] color color code
+ * @param[in] os terminal output stream */
+void Terminal::bgcolor (int color, ostream &os) {
+ _bgcolor = color;
+#ifdef __WIN32__
+ HANDLE h = GetStdHandle(STD_OUTPUT_HANDLE);
+ if (h != INVALID_HANDLE_VALUE) {
+ CONSOLE_SCREEN_BUFFER_INFO info;
+ GetConsoleScreenBufferInfo(h, &info);
+ if (_bgcolor == DEFAULT)
+ color = (_defaultColor & 0xf0) >> 4;
+ else {
+ // swap red and blue bits
+ color = (color & 0x0a) | ((color & 1) << 2) | ((color & 4) >> 2);
+ }
+ color = (info.wAttributes & 0x0f) | ((color & 0x0f) << 4);
+ SetConsoleTextAttribute(h, (DWORD)color);
+ }
+#else
+ if (color != DEFAULT && color > 7)
+ color %= 8;
+ if (color == DEFAULT) {
+ os << "\x1B[0m";
+ if (_fgcolor != DEFAULT)
+ fgcolor(_fgcolor, os);
+ }
+ else
+ os << "\x1B[" << (40+(color & 0x07)) << 'm';
+#endif
+}