dom mar 16 23:37:23 CET 2003
[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, "vt", 2))
44                 vt100compat = 1;
45         if (vt100compat) {
46                 /* Make commands show up in nice colors */
47                 snprintf(prepdata, sizeof(prepdata), "%c[%d;%d;%dm", ESC, ATTR_BRIGHT, COLOR_BROWN, COLOR_BLACK + 10);
48                 snprintf(enddata, sizeof(enddata), "%c[%d;%d;%dm", ESC, ATTR_RESET, COLOR_WHITE, COLOR_BLACK + 10);
49                 snprintf(quitdata, sizeof(quitdata), "%c[0m", ESC);
50         }
51         return 0;
52 }
53
54 char *term_color(char *outbuf, const char *inbuf, int fgcolor, int bgcolor, int maxout)
55 {
56         int attr=0;
57         char tmp[40];
58         if (!vt100compat) {
59                 strncpy(outbuf, inbuf, maxout -1);
60                 return outbuf;
61         }
62         if (!fgcolor && !bgcolor) {
63                 strncpy(outbuf, inbuf, maxout - 1);
64                 return outbuf;
65         }
66         if ((fgcolor & 128) && (bgcolor & 128)) {
67                 /* Can't both be highlighted */
68                 strncpy(outbuf, inbuf, maxout - 1);
69                 return outbuf;
70         }
71         if (!bgcolor)
72                 bgcolor = COLOR_BLACK;
73
74         if (bgcolor) {
75                 bgcolor &= ~128;
76                 bgcolor += 10;
77         }
78         if (fgcolor & 128) {
79                 attr = ATTR_BRIGHT;
80                 fgcolor &= ~128;
81         }
82         if (fgcolor && bgcolor) {
83                 snprintf(tmp, sizeof(tmp), "%d;%d", fgcolor, bgcolor);
84         } else if (bgcolor) {
85                 snprintf(tmp, sizeof(tmp), "%d", bgcolor);
86         } else if (fgcolor) {
87                 snprintf(tmp, sizeof(tmp), "%d", fgcolor);
88         }
89         if (attr) {
90                 snprintf(outbuf, maxout, "%c[%d;%sm%s%c[0;%d;%dm", ESC, attr, tmp, inbuf, ESC, COLOR_WHITE, COLOR_BLACK + 10);
91         } else {
92                 snprintf(outbuf, maxout, "%c[%sm%s%c[0;%d;%dm", ESC, tmp, inbuf, ESC, COLOR_WHITE, COLOR_BLACK + 10);
93         }
94         return outbuf;
95 }
96
97 char *term_prompt(char *outbuf, const char *inbuf, int maxout)
98 {
99         if (!vt100compat) {
100                 strncpy(outbuf, inbuf, maxout -1);
101                 return outbuf;
102         }
103         snprintf(outbuf, maxout, "%c[%d;%d;%dm%c%c[%d;%d;%dm%s",
104                 ESC, ATTR_BRIGHT, COLOR_BLUE, COLOR_BLACK + 10,
105                 inbuf[0],
106                 ESC, 0, COLOR_WHITE, COLOR_BLACK + 10,
107                 inbuf + 1);
108         return outbuf;
109 }
110
111 char *term_prep(void)
112 {
113         return prepdata;
114 }
115
116 char *term_end(void)
117 {
118         return enddata;
119 }
120
121 char *term_quit(void)
122 {
123         return quitdata;
124 }