-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathterminfo.c
119 lines (103 loc) · 3.15 KB
/
terminfo.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
/* Copyright © 2005-2018 Jakub Wilk <[email protected]>
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the “Software”), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
#include "common.h"
#include "memory.h"
#include "terminfo.h"
#include <unistd.h>
#include <term.h>
bool is_term = false;
char *term_setaf[8];
char *term_setab[8];
char *term_sgr0;
char *term_bold;
char *term_rev;
static char* term_getstr(const char *str)
{
char *result = tigetstr((char*) str);
if (result == NULL || result == (char*)-1)
return "";
else
return result;
}
static void term_quit(void)
{
unsigned int j;
free(term_sgr0);
free(term_rev);
free(term_bold);
for (j = 0; j < 8; j++)
free(term_setaf[j]);
for (j = 0; j < 8; j++)
free(term_setab[j]);
}
void term_init(void)
{
char *s0;
int err;
unsigned int j;
if (!isatty(STDOUT_FILENO) || setupterm(NULL, STDOUT_FILENO, &err) != 0)
{
term_sgr0 = str_clone("");
term_bold = str_clone("");
term_rev = str_clone("");
for (j = 0; j < 8; j++)
term_setaf[j] = str_clone("");
for (j = 0; j < 8; j++)
term_setab[j] = str_clone("");
atexit(term_quit);
return;
}
is_term = true;
term_sgr0 = str_clone(term_getstr("sgr0"));
assert(term_sgr0 != NULL);
term_bold = str_clone(term_getstr("bold"));
assert(term_bold != NULL);
term_rev = str_clone(term_getstr("rev"));
assert(term_rev != NULL);
memset(term_setaf, 0, sizeof(term_setaf));
memset(term_setab, 0, sizeof(term_setab));
s0 = term_getstr("setaf");
if (*s0 != '\0')
for (j = 0; j < 8; j++)
{
term_setaf[j] = tiparm(s0, j);
term_setaf[j] = str_clone(term_setaf[j] == NULL ? "" : term_setaf[j]);
if (term_setaf[j] == NULL)
term_setaf[j] = str_clone("");
}
else
for (j = 0; j < 8; j++)
term_setaf[j] = str_clone("");
s0 = term_getstr("setab");
if (*s0 != '\0')
for (j = 0; j < 8; j++)
{
term_setab[j] = tiparm(s0, j);
term_setab[j] = str_clone(term_setab[j] == NULL ? "" : term_setab[j]);
if (term_setab[j] == NULL)
term_setab[j] = str_clone("");
}
else
for (j=0; j<8; j++)
term_setab[j] = str_clone("");
atexit(term_quit);
}
// vim: ts=2 sts=2 sw=2 et