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