Support colors in eterm
[asterisk/asterisk.git] / term.c
1 /*
2  * Asterisk -- A telephony toolkit for Linux.
3  *
4  * Channel Management
5  * 
6  * Copyright (C) 1999, Mark Spencer
7  *
8  * Mark Spencer <markster@linux-support.net>
9  *
10  * This program is free software, distributed under the terms of
11  * the GNU General Public License
12  */
13
14 #include <stdio.h>
15 #include <stdlib.h>
16 #include <string.h>
17 #include <sys/time.h>
18 #include <signal.h>
19 #include <errno.h>
20 #include <unistd.h>
21 #include <asterisk/term.h>
22 #include <asterisk/options.h>
23 #include <asterisk/lock.h>
24 #include "asterisk.h"
25
26 static int vt100compat = 0;
27
28 static char prepdata[80] = "";
29 static char enddata[80] = "";
30 static char quitdata[80] = "";
31
32 int term_init(void)
33 {
34         char *term = getenv("TERM");
35         if (!term)
36                 return 0;
37         if (!option_console || option_nocolor || !option_nofork)
38                 return 0;
39         if (!strncasecmp(term, "linux", 5)) 
40                 vt100compat = 1; else
41         if (!strncasecmp(term, "xterm", 5))
42                 vt100compat = 1; else
43         if (!strncasecmp(term, "Eterm", 5))
44                 vt100compat = 1; else
45         if (!strncasecmp(term, "crt", 3))
46                 vt100compat = 1; else
47         if (!strncasecmp(term, "vt", 2))
48                 vt100compat = 1;
49         if (vt100compat) {
50                 /* Make commands show up in nice colors */
51                 snprintf(prepdata, sizeof(prepdata), "%c[%d;%d;%dm", ESC, ATTR_BRIGHT, COLOR_BROWN, COLOR_BLACK + 10);
52                 snprintf(enddata, sizeof(enddata), "%c[%d;%d;%dm", ESC, ATTR_RESET, COLOR_WHITE, COLOR_BLACK + 10);
53                 snprintf(quitdata, sizeof(quitdata), "%c[0m", ESC);
54         }
55         return 0;
56 }
57
58 char *term_color(char *outbuf, const char *inbuf, int fgcolor, int bgcolor, int maxout)
59 {
60         int attr=0;
61         char tmp[40];
62         if (!vt100compat) {
63                 strncpy(outbuf, inbuf, maxout -1);
64                 return outbuf;
65         }
66         if (!fgcolor && !bgcolor) {
67                 strncpy(outbuf, inbuf, maxout - 1);
68                 return outbuf;
69         }
70         if ((fgcolor & 128) && (bgcolor & 128)) {
71                 /* Can't both be highlighted */
72                 strncpy(outbuf, inbuf, maxout - 1);
73                 return outbuf;
74         }
75         if (!bgcolor)
76                 bgcolor = COLOR_BLACK;
77
78         if (bgcolor) {
79                 bgcolor &= ~128;
80                 bgcolor += 10;
81         }
82         if (fgcolor & 128) {
83                 attr = ATTR_BRIGHT;
84                 fgcolor &= ~128;
85         }
86         if (fgcolor && bgcolor) {
87                 snprintf(tmp, sizeof(tmp), "%d;%d", fgcolor, bgcolor);
88         } else if (bgcolor) {
89                 snprintf(tmp, sizeof(tmp), "%d", bgcolor);
90         } else if (fgcolor) {
91                 snprintf(tmp, sizeof(tmp), "%d", fgcolor);
92         }
93         if (attr) {
94                 snprintf(outbuf, maxout, "%c[%d;%sm%s%c[0;%d;%dm", ESC, attr, tmp, inbuf, ESC, COLOR_WHITE, COLOR_BLACK + 10);
95         } else {
96                 snprintf(outbuf, maxout, "%c[%sm%s%c[0;%d;%dm", ESC, tmp, inbuf, ESC, COLOR_WHITE, COLOR_BLACK + 10);
97         }
98         return outbuf;
99 }
100
101 char *term_color_code(char *outbuf, int fgcolor, int bgcolor, int maxout)
102 {
103         int attr=0;
104         char tmp[40];
105         if ((!vt100compat) || (!fgcolor && !bgcolor)) {
106                 *outbuf = '\0';
107                 return outbuf;
108         }
109         if ((fgcolor & 128) && (bgcolor & 128)) {
110                 /* Can't both be highlighted */
111                 *outbuf = '\0';
112                 return outbuf;
113         }
114         if (!bgcolor)
115                 bgcolor = COLOR_BLACK;
116
117         if (bgcolor) {
118                 bgcolor &= ~128;
119                 bgcolor += 10;
120         }
121         if (fgcolor & 128) {
122                 attr = ATTR_BRIGHT;
123                 fgcolor &= ~128;
124         }
125         if (fgcolor && bgcolor) {
126                 snprintf(tmp, sizeof(tmp), "%d;%d", fgcolor, bgcolor);
127         } else if (bgcolor) {
128                 snprintf(tmp, sizeof(tmp), "%d", bgcolor);
129         } else if (fgcolor) {
130                 snprintf(tmp, sizeof(tmp), "%d", fgcolor);
131         }
132         if (attr) {
133                 snprintf(outbuf, maxout, "%c[%d;%sm", ESC, attr, tmp);
134         } else {
135                 snprintf(outbuf, maxout, "%c[%sm", ESC, tmp);
136         }
137         return outbuf;
138 }
139
140 char *term_strip(char *outbuf, char *inbuf, int maxout)
141 {
142         char *outbuf_ptr = outbuf, *inbuf_ptr = inbuf;
143
144         while (outbuf_ptr < outbuf + maxout) {
145                 switch (*inbuf_ptr) {
146                         case ESC:
147                                 while (*inbuf_ptr && (*inbuf_ptr != 'm'))
148                                         inbuf_ptr++;
149                                 break;
150                         default:
151                                 *outbuf_ptr = *inbuf_ptr;
152                                 outbuf_ptr++;
153                 }
154                 if (! *inbuf_ptr)
155                         break;
156                 inbuf_ptr++;
157         }
158         return outbuf;
159 }
160
161 char *term_prompt(char *outbuf, const char *inbuf, int maxout)
162 {
163         if (!vt100compat) {
164                 strncpy(outbuf, inbuf, maxout -1);
165                 return outbuf;
166         }
167         snprintf(outbuf, maxout, "%c[%d;%d;%dm%c%c[%d;%d;%dm%s",
168                 ESC, ATTR_BRIGHT, COLOR_BLUE, COLOR_BLACK + 10,
169                 inbuf[0],
170                 ESC, 0, COLOR_WHITE, COLOR_BLACK + 10,
171                 inbuf + 1);
172         return outbuf;
173 }
174
175 char *term_prep(void)
176 {
177         return prepdata;
178 }
179
180 char *term_end(void)
181 {
182         return enddata;
183 }
184
185 char *term_quit(void)
186 {
187         return quitdata;
188 }