Remove pthread.h from source. We should be using asterisk/lock.h everywhere instead...
[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, "crt", 3))
44                 vt100compat = 1; else
45         if (!strncasecmp(term, "vt", 2))
46                 vt100compat = 1;
47         if (vt100compat) {
48                 /* Make commands show up in nice colors */
49                 snprintf(prepdata, sizeof(prepdata), "%c[%d;%d;%dm", ESC, ATTR_BRIGHT, COLOR_BROWN, COLOR_BLACK + 10);
50                 snprintf(enddata, sizeof(enddata), "%c[%d;%d;%dm", ESC, ATTR_RESET, COLOR_WHITE, COLOR_BLACK + 10);
51                 snprintf(quitdata, sizeof(quitdata), "%c[0m", ESC);
52         }
53         return 0;
54 }
55
56 char *term_color(char *outbuf, const char *inbuf, int fgcolor, int bgcolor, int maxout)
57 {
58         int attr=0;
59         char tmp[40];
60         if (!vt100compat) {
61                 strncpy(outbuf, inbuf, maxout -1);
62                 return outbuf;
63         }
64         if (!fgcolor && !bgcolor) {
65                 strncpy(outbuf, inbuf, maxout - 1);
66                 return outbuf;
67         }
68         if ((fgcolor & 128) && (bgcolor & 128)) {
69                 /* Can't both be highlighted */
70                 strncpy(outbuf, inbuf, maxout - 1);
71                 return outbuf;
72         }
73         if (!bgcolor)
74                 bgcolor = COLOR_BLACK;
75
76         if (bgcolor) {
77                 bgcolor &= ~128;
78                 bgcolor += 10;
79         }
80         if (fgcolor & 128) {
81                 attr = ATTR_BRIGHT;
82                 fgcolor &= ~128;
83         }
84         if (fgcolor && bgcolor) {
85                 snprintf(tmp, sizeof(tmp), "%d;%d", fgcolor, bgcolor);
86         } else if (bgcolor) {
87                 snprintf(tmp, sizeof(tmp), "%d", bgcolor);
88         } else if (fgcolor) {
89                 snprintf(tmp, sizeof(tmp), "%d", fgcolor);
90         }
91         if (attr) {
92                 snprintf(outbuf, maxout, "%c[%d;%sm%s%c[0;%d;%dm", ESC, attr, tmp, inbuf, ESC, COLOR_WHITE, COLOR_BLACK + 10);
93         } else {
94                 snprintf(outbuf, maxout, "%c[%sm%s%c[0;%d;%dm", ESC, tmp, inbuf, ESC, COLOR_WHITE, COLOR_BLACK + 10);
95         }
96         return outbuf;
97 }
98
99 char *term_color_code(char *outbuf, int fgcolor, int bgcolor, int maxout)
100 {
101         int attr=0;
102         char tmp[40];
103         if ((!vt100compat) || (!fgcolor && !bgcolor)) {
104                 *outbuf = '\0';
105                 return outbuf;
106         }
107         if ((fgcolor & 128) && (bgcolor & 128)) {
108                 /* Can't both be highlighted */
109                 *outbuf = '\0';
110                 return outbuf;
111         }
112         if (!bgcolor)
113                 bgcolor = COLOR_BLACK;
114
115         if (bgcolor) {
116                 bgcolor &= ~128;
117                 bgcolor += 10;
118         }
119         if (fgcolor & 128) {
120                 attr = ATTR_BRIGHT;
121                 fgcolor &= ~128;
122         }
123         if (fgcolor && bgcolor) {
124                 snprintf(tmp, sizeof(tmp), "%d;%d", fgcolor, bgcolor);
125         } else if (bgcolor) {
126                 snprintf(tmp, sizeof(tmp), "%d", bgcolor);
127         } else if (fgcolor) {
128                 snprintf(tmp, sizeof(tmp), "%d", fgcolor);
129         }
130         if (attr) {
131                 snprintf(outbuf, maxout, "%c[%d;%sm", ESC, attr, tmp);
132         } else {
133                 snprintf(outbuf, maxout, "%c[%sm", ESC, tmp);
134         }
135         return outbuf;
136 }
137
138 char *term_strip(char *outbuf, char *inbuf, int maxout)
139 {
140         char *outbuf_ptr = outbuf, *inbuf_ptr = inbuf;
141
142         while (outbuf_ptr < outbuf + maxout) {
143                 switch (*inbuf_ptr) {
144                         case ESC:
145                                 while (*inbuf_ptr && (*inbuf_ptr != 'm'))
146                                         inbuf_ptr++;
147                                 break;
148                         default:
149                                 *outbuf_ptr = *inbuf_ptr;
150                                 outbuf_ptr++;
151                 }
152                 if (! *inbuf_ptr)
153                         break;
154                 inbuf_ptr++;
155         }
156         return outbuf;
157 }
158
159 char *term_prompt(char *outbuf, const char *inbuf, int maxout)
160 {
161         if (!vt100compat) {
162                 strncpy(outbuf, inbuf, maxout -1);
163                 return outbuf;
164         }
165         snprintf(outbuf, maxout, "%c[%d;%d;%dm%c%c[%d;%d;%dm%s",
166                 ESC, ATTR_BRIGHT, COLOR_BLUE, COLOR_BLACK + 10,
167                 inbuf[0],
168                 ESC, 0, COLOR_WHITE, COLOR_BLACK + 10,
169                 inbuf + 1);
170         return outbuf;
171 }
172
173 char *term_prep(void)
174 {
175         return prepdata;
176 }
177
178 char *term_end(void)
179 {
180         return enddata;
181 }
182
183 char *term_quit(void)
184 {
185         return quitdata;
186 }