1 /*
2 * Copyright (C) Tildeslash Ltd. All rights reserved.
3 *
4 * This program is free software: you can redistribute it and/or modify
5 * it under the terms of the GNU Affero General Public License version 3.
6 *
7 * This program is distributed in the hope that it will be useful,
8 * but WITHOUT ANY WARRANTY; without even the implied warranty of
9 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10 * GNU Affero General Public License for more details.
11 *
12 * You should have received a copy of the GNU Affero General Public License
13 * along with this program. If not, see <http://www.gnu.org/licenses/>.
14 *
15 * In addition, as a special exception, the copyright holders give
16 * permission to link the code of portions of this program with the
17 * OpenSSL library under certain conditions as described in each
18 * individual source file, and distribute linked combinations
19 * including the two.
20 *
21 * You must obey the GNU Affero General Public License in all respects
22 * for all of the code used other than OpenSSL.
23 */
24
25
26 #include "config.h"
27
28 #ifdef HAVE_STDLIB_H
29 #include <stdlib.h>
30 #endif
31
32 #ifdef HAVE_UNISTD_H
33 #include <unistd.h>
34 #endif
35
36 #include "monit.h"
37 #include "TextColor.h"
38
39 // libmonit
40 #include "util/Str.h"
41
42
43 /**
44 * Implementation of the Terminal color interface
45 *
46 * @author http://www.tildeslash.com/
47 * @see http://www.mmonit.com/
48 * @file
49 */
50
51
52 /* -------------------------------------------------------- Public Methods */
53
54
TextColor_support()55 bool TextColor_support() {
56 if (! (Run.flags & Run_Batch) && isatty(STDOUT_FILENO)) {
57 if (getenv("COLORTERM")) {
58 return true;
59 } else {
60 char *term = getenv("TERM");
61 if (term && (Str_startsWith(term, "screen") || Str_startsWith(term, "xterm") || Str_startsWith(term, "vt100") || Str_startsWith(term, "ansi") || Str_startsWith(term, "linux") || Str_startsWith(term, "rxvt") || Str_sub(term, "color")))
62 return true;
63 }
64 }
65 return false;
66 }
67
68
TextColor_length(char * s)69 int TextColor_length(char *s) {
70 if (STR_DEF(s)) {
71 int length = 0;
72 bool ansi = false;
73 for (int i = 0; s[i]; i++) {
74 if (s[i] == '\033' && s[i + 1] == '[') {
75 // Escape sequence start
76 ansi = true;
77 length += 2;
78 i++;
79 } else if (ansi) {
80 length++;
81 // Escape sequence stop
82 if (s[i] >= 64 && s[i] <= 126)
83 ansi = false;
84 }
85 }
86 return length;
87 }
88 return 0;
89 }
90
91
TextColor_strip(char * s)92 char *TextColor_strip(char *s) {
93 if (STR_DEF(s)) {
94 int x, y;
95 bool ansi = false;
96 for (x = 0, y = 0; s[y]; y++) {
97 if (s[y] == '\033' && s[y + 1] == '[') {
98 // Escape sequence start
99 ansi = true;
100 y++; // ++ to skip 'ESC['
101 } else if (ansi) {
102 // Escape sequence stop
103 if (s[y] >= 64 && s[y] <= 126)
104 ansi = false;
105 } else {
106 s[x++] = s[y];
107 }
108 }
109 s[x] = 0;
110 }
111 return s;
112 }
113
114