8a4701d2161be8cfe8c30c1c33cd95c81163ac25
[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 <pthread.h>
17 #include <string.h>
18 #include <sys/time.h>
19 #include <signal.h>
20 #include <errno.h>
21 #include <unistd.h>
22 #include <asterisk/term.h>
23 #include <asterisk/options.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_prompt(char *outbuf, const char *inbuf, int maxout)
100 {
101         if (!vt100compat) {
102                 strncpy(outbuf, inbuf, maxout -1);
103                 return outbuf;
104         }
105         snprintf(outbuf, maxout, "%c[%d;%d;%dm%c%c[%d;%d;%dm%s",
106                 ESC, ATTR_BRIGHT, COLOR_BLUE, COLOR_BLACK + 10,
107                 inbuf[0],
108                 ESC, 0, COLOR_WHITE, COLOR_BLACK + 10,
109                 inbuf + 1);
110         return outbuf;
111 }
112
113 char *term_prep(void)
114 {
115         return prepdata;
116 }
117
118 char *term_end(void)
119 {
120         return enddata;
121 }
122
123 char *term_quit(void)
124 {
125         return quitdata;
126 }