lib_traceatr.c revision 66963
1/****************************************************************************
2 * Copyright (c) 1998,2000 Free Software Foundation, Inc.                   *
3 *                                                                          *
4 * Permission is hereby granted, free of charge, to any person obtaining a  *
5 * copy of this software and associated documentation files (the            *
6 * "Software"), to deal in the Software without restriction, including      *
7 * without limitation the rights to use, copy, modify, merge, publish,      *
8 * distribute, distribute with modifications, sublicense, and/or sell       *
9 * copies of the Software, and to permit persons to whom the Software is    *
10 * furnished to do so, subject to the following conditions:                 *
11 *                                                                          *
12 * The above copyright notice and this permission notice shall be included  *
13 * in all copies or substantial portions of the Software.                   *
14 *                                                                          *
15 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS  *
16 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF               *
17 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.   *
18 * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,   *
19 * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR    *
20 * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR    *
21 * THE USE OR OTHER DEALINGS IN THE SOFTWARE.                               *
22 *                                                                          *
23 * Except as contained in this notice, the name(s) of the above copyright   *
24 * holders shall not be used in advertising or otherwise to promote the     *
25 * sale, use or other dealings in this Software without prior written       *
26 * authorization.                                                           *
27 ****************************************************************************/
28
29/****************************************************************************
30 *  Author: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1992,1995               *
31 *     and: Eric S. Raymond <esr@snark.thyrsus.com>                         *
32 ****************************************************************************/
33
34/*
35 *	lib_traceatr.c - Tracing/Debugging routines (attributes)
36 */
37
38#include <curses.priv.h>
39#include <term.h>		/* acs_chars */
40
41MODULE_ID("$Id: lib_traceatr.c,v 1.30 2000/07/29 18:06:09 tom Exp $")
42
43#define COLOR_OF(c) (c < 0 || c > 7 ? "default" : colors[c].name)
44
45#ifdef TRACE
46char *
47_traceattr2(int bufnum, attr_t newmode)
48{
49    char *buf = _nc_trace_buf(bufnum, BUFSIZ);
50    char *tmp = buf;
51    static const struct {
52	unsigned int val;
53	const char *name;
54    } names[] =
55    {
56	/* *INDENT-OFF* */
57	{ A_STANDOUT,		"A_STANDOUT" },
58	{ A_UNDERLINE,		"A_UNDERLINE" },
59	{ A_REVERSE,		"A_REVERSE" },
60	{ A_BLINK,		"A_BLINK" },
61	{ A_DIM,		"A_DIM" },
62	{ A_BOLD,		"A_BOLD" },
63	{ A_ALTCHARSET,		"A_ALTCHARSET" },
64	{ A_INVIS,		"A_INVIS" },
65	{ A_PROTECT,		"A_PROTECT" },
66	{ A_CHARTEXT,		"A_CHARTEXT" },
67	{ A_NORMAL,		"A_NORMAL" },
68	{ A_COLOR,		"A_COLOR" },
69	/* *INDENT-ON* */
70
71    },
72	colors[] =
73    {
74	/* *INDENT-OFF* */
75	{ COLOR_BLACK,		"COLOR_BLACK" },
76	{ COLOR_RED,		"COLOR_RED" },
77	{ COLOR_GREEN,		"COLOR_GREEN" },
78	{ COLOR_YELLOW,		"COLOR_YELLOW" },
79	{ COLOR_BLUE,		"COLOR_BLUE" },
80	{ COLOR_MAGENTA,	"COLOR_MAGENTA" },
81	{ COLOR_CYAN,		"COLOR_CYAN" },
82	{ COLOR_WHITE,		"COLOR_WHITE" },
83	/* *INDENT-ON* */
84
85    };
86    size_t n;
87    unsigned save_nc_tracing = _nc_tracing;
88    _nc_tracing = 0;
89
90    strcpy(tmp++, "{");
91
92    for (n = 0; n < SIZEOF(names); n++) {
93	if ((newmode & names[n].val) != 0) {
94	    if (buf[1] != '\0')
95		strcat(tmp, "|");
96	    strcat(tmp, names[n].name);
97	    tmp += strlen(tmp);
98
99	    if (names[n].val == A_COLOR) {
100		short pairnum = PAIR_NUMBER(newmode);
101		short fg, bg;
102
103		if (pair_content(pairnum, &fg, &bg) == OK)
104		    (void) sprintf(tmp,
105				   "{%d = {%s, %s}}",
106				   pairnum,
107				   COLOR_OF(fg),
108				   COLOR_OF(bg)
109			);
110		else
111		    (void) sprintf(tmp, "{%d}", pairnum);
112	    }
113	}
114    }
115    if (AttrOf(newmode) == A_NORMAL) {
116	if (buf[1] != '\0')
117	    strcat(tmp, "|");
118	strcat(tmp, "A_NORMAL");
119    }
120
121    _nc_tracing = save_nc_tracing;
122    return (strcat(buf, "}"));
123}
124
125char *
126_traceattr(attr_t newmode)
127{
128    return _traceattr2(0, newmode);
129}
130
131/* Trace 'int' return-values */
132attr_t
133_nc_retrace_attr_t(attr_t code)
134{
135    T((T_RETURN("%s"), _traceattr(code)));
136    return code;
137}
138
139char *
140_tracechtype2(int bufnum, chtype ch)
141{
142    char *buf = _nc_trace_buf(bufnum, BUFSIZ);
143    char *found = 0;
144
145    strcpy(buf, "{");
146    if (ch & A_ALTCHARSET) {
147	char *cp;
148	static const struct {
149	    unsigned int val;
150	    const char *name;
151	} names[] =
152	{
153	    /* *INDENT-OFF* */
154	    { 'l', "ACS_ULCORNER" },	/* upper left corner */
155	    { 'm', "ACS_LLCORNER" },	/* lower left corner */
156	    { 'k', "ACS_URCORNER" },	/* upper right corner */
157	    { 'j', "ACS_LRCORNER" },	/* lower right corner */
158	    { 't', "ACS_LTEE" },	/* tee pointing right */
159	    { 'u', "ACS_RTEE" },	/* tee pointing left */
160	    { 'v', "ACS_BTEE" },	/* tee pointing up */
161	    { 'w', "ACS_TTEE" },	/* tee pointing down */
162	    { 'q', "ACS_HLINE" },	/* horizontal line */
163	    { 'x', "ACS_VLINE" },	/* vertical line */
164	    { 'n', "ACS_PLUS" },	/* large plus or crossover */
165	    { 'o', "ACS_S1" },		/* scan line 1 */
166	    { 's', "ACS_S9" },		/* scan line 9 */
167	    { '`', "ACS_DIAMOND" },	/* diamond */
168	    { 'a', "ACS_CKBOARD" },	/* checker board (stipple) */
169	    { 'f', "ACS_DEGREE" },	/* degree symbol */
170	    { 'g', "ACS_PLMINUS" },	/* plus/minus */
171	    { '~', "ACS_BULLET" },	/* bullet */
172	    { ',', "ACS_LARROW" },	/* arrow pointing left */
173	    { '+', "ACS_RARROW" },	/* arrow pointing right */
174	    { '.', "ACS_DARROW" },	/* arrow pointing down */
175	    { '-', "ACS_UARROW" },	/* arrow pointing up */
176	    { 'h', "ACS_BOARD" },	/* board of squares */
177	    { 'i', "ACS_LANTERN" },	/* lantern symbol */
178	    { '0', "ACS_BLOCK" },	/* solid square block */
179	    { 'p', "ACS_S3" },		/* scan line 3 */
180	    { 'r', "ACS_S7" },		/* scan line 7 */
181	    { 'y', "ACS_LEQUAL" },	/* less/equal */
182	    { 'z', "ACS_GEQUAL" },	/* greater/equal */
183	    { '{', "ACS_PI" },		/* Pi */
184	    { '|', "ACS_NEQUAL" },	/* not equal */
185	    { '}', "ACS_STERLING" },	/* UK pound sign */
186	    { '\0', (char *) 0 }
187		/* *INDENT-OFF* */
188	},
189	    *sp;
190
191	for (cp = acs_chars; cp[0] && cp[1]; cp += 2) {
192	    if (TextOf(cp[1]) == TextOf(ch)) {
193		found = cp;
194		/* don't exit from loop - there may be redefinitions */
195	    }
196	}
197
198	if (found != 0) {
199	    ch = TextOf(*found);
200	    for (sp = names; sp->val; sp++)
201		if (sp->val == ch) {
202		    (void) strcat(buf, sp->name);
203		    ch &= ~A_ALTCHARSET;
204		    break;
205		}
206	}
207    }
208
209    if (found == 0)
210	(void) strcat(buf, _tracechar(TextOf(ch)));
211
212    if (AttrOf(ch) != A_NORMAL)
213	(void) sprintf(buf + strlen(buf), " | %s",
214		_traceattr2(bufnum + 20, AttrOf(ch)));
215
216    strcat(buf, "}");
217    return (buf);
218}
219
220char *
221_tracechtype(chtype ch)
222{
223    return _tracechtype2(0, ch);
224}
225
226/* Trace 'chtype' return-values */
227attr_t
228_nc_retrace_chtype(attr_t code)
229{
230    T((T_RETURN("%s"), _tracechtype(code)));
231    return code;
232}
233
234#else
235extern void _nc_lib_traceatr(void);
236void
237_nc_lib_traceatr(void)
238{
239}
240#endif /* TRACE */
241