150276Speter/**************************************************************************** 2184989Srafan * Copyright (c) 1998-2007,2008 Free Software Foundation, Inc. * 350276Speter * * 450276Speter * Permission is hereby granted, free of charge, to any person obtaining a * 550276Speter * copy of this software and associated documentation files (the * 650276Speter * "Software"), to deal in the Software without restriction, including * 750276Speter * without limitation the rights to use, copy, modify, merge, publish, * 850276Speter * distribute, distribute with modifications, sublicense, and/or sell * 950276Speter * copies of the Software, and to permit persons to whom the Software is * 1050276Speter * furnished to do so, subject to the following conditions: * 1150276Speter * * 1250276Speter * The above copyright notice and this permission notice shall be included * 1350276Speter * in all copies or substantial portions of the Software. * 1450276Speter * * 1550276Speter * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * 1650276Speter * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * 1750276Speter * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * 1850276Speter * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * 1950276Speter * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * 2050276Speter * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * 2150276Speter * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * 2250276Speter * * 2350276Speter * Except as contained in this notice, the name(s) of the above copyright * 2450276Speter * holders shall not be used in advertising or otherwise to promote the * 2550276Speter * sale, use or other dealings in this Software without prior written * 2650276Speter * authorization. * 2750276Speter ****************************************************************************/ 2850276Speter 2950276Speter/**************************************************************************** 30166124Srafan * Author: Thomas Dickey 1996-on * 3197049Speter * and: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1992,1995 * 3250276Speter * and: Eric S. Raymond <esr@snark.thyrsus.com> * 3350276Speter ****************************************************************************/ 3450276Speter 3550276Speter/* 3650276Speter * lib_traceatr.c - Tracing/Debugging routines (attributes) 3750276Speter */ 3850276Speter 3950276Speter#include <curses.priv.h> 4066963Speter#include <term.h> /* acs_chars */ 4150276Speter 42184989SrafanMODULE_ID("$Id: lib_traceatr.c,v 1.63 2008/08/03 16:24:53 tom Exp $") 4350276Speter 44166124Srafan#define COLOR_OF(c) ((c < 0) ? "default" : (c > 7 ? color_of(c) : colors[c].name)) 4550276Speter 4650276Speter#ifdef TRACE 4797049Speter 48174993Srafanstatic const char l_brace[] = StringOf(L_BRACE); 49174993Srafanstatic const char r_brace[] = StringOf(R_BRACE); 5097049Speter 51166124Srafan#ifndef USE_TERMLIB 52174993Srafan 53174993Srafan#define my_buffer _nc_globals.traceatr_color_buf 54174993Srafan#define my_select _nc_globals.traceatr_color_sel 55174993Srafan#define my_cached _nc_globals.traceatr_color_last 56174993Srafan 57166124Srafanstatic char * 58166124Srafancolor_of(int c) 59166124Srafan{ 60174993Srafan if (c != my_cached) { 61174993Srafan my_cached = c; 62174993Srafan my_select = !my_select; 63166124Srafan if (c == COLOR_DEFAULT) 64174993Srafan strcpy(my_buffer[my_select], "default"); 65166124Srafan else 66174993Srafan sprintf(my_buffer[my_select], "color%d", c); 67166124Srafan } 68174993Srafan return my_buffer[my_select]; 69166124Srafan} 70174993Srafan 71174993Srafan#undef my_buffer 72174993Srafan#undef my_select 73166124Srafan#endif /* !USE_TERMLIB */ 74166124Srafan 7576726SpeterNCURSES_EXPORT(char *) 76166124Srafan_traceattr2(int bufnum, chtype newmode) 7750276Speter{ 7866963Speter static const struct { 7966963Speter unsigned int val; 8066963Speter const char *name; 8166963Speter } names[] = 8250276Speter { 8366963Speter /* *INDENT-OFF* */ 8450276Speter { A_STANDOUT, "A_STANDOUT" }, 8550276Speter { A_UNDERLINE, "A_UNDERLINE" }, 8650276Speter { A_REVERSE, "A_REVERSE" }, 8750276Speter { A_BLINK, "A_BLINK" }, 8850276Speter { A_DIM, "A_DIM" }, 8950276Speter { A_BOLD, "A_BOLD" }, 9050276Speter { A_ALTCHARSET, "A_ALTCHARSET" }, 9150276Speter { A_INVIS, "A_INVIS" }, 9250276Speter { A_PROTECT, "A_PROTECT" }, 9350276Speter { A_CHARTEXT, "A_CHARTEXT" }, 9450276Speter { A_NORMAL, "A_NORMAL" }, 9550276Speter { A_COLOR, "A_COLOR" }, 9666963Speter /* *INDENT-ON* */ 9766963Speter 98166124Srafan } 99166124Srafan#ifndef USE_TERMLIB 100166124Srafan , 10166963Speter colors[] = 10250276Speter { 10366963Speter /* *INDENT-OFF* */ 10450276Speter { COLOR_BLACK, "COLOR_BLACK" }, 10550276Speter { COLOR_RED, "COLOR_RED" }, 10650276Speter { COLOR_GREEN, "COLOR_GREEN" }, 10750276Speter { COLOR_YELLOW, "COLOR_YELLOW" }, 10850276Speter { COLOR_BLUE, "COLOR_BLUE" }, 10950276Speter { COLOR_MAGENTA, "COLOR_MAGENTA" }, 11050276Speter { COLOR_CYAN, "COLOR_CYAN" }, 11150276Speter { COLOR_WHITE, "COLOR_WHITE" }, 11266963Speter /* *INDENT-ON* */ 11366963Speter 114166124Srafan } 115166124Srafan#endif /* !USE_TERMLIB */ 116166124Srafan ; 11766963Speter size_t n; 118184989Srafan char temp[80]; 119184989Srafan char *result = _nc_trace_buf(bufnum, BUFSIZ); 12050276Speter 121184989Srafan if (result != 0) { 122184989Srafan unsigned save_nc_tracing = _nc_tracing; 12350276Speter 124184989Srafan _nc_tracing = 0; 12550276Speter 126184989Srafan strcpy(result, l_brace); 127184989Srafan 128184989Srafan for (n = 0; n < SIZEOF(names); n++) { 129184989Srafan if ((newmode & names[n].val) != 0) { 130184989Srafan if (result[1] != '\0') 131184989Srafan result = _nc_trace_bufcat(bufnum, "|"); 132184989Srafan result = _nc_trace_bufcat(bufnum, names[n].name); 133184989Srafan 134184989Srafan if (names[n].val == A_COLOR) { 135184989Srafan short pairnum = PAIR_NUMBER(newmode); 136166124Srafan#ifdef USE_TERMLIB 137184989Srafan /* pair_content lives in libncurses */ 138184989Srafan (void) sprintf(temp, "{%d}", pairnum); 139166124Srafan#else 140184989Srafan short fg, bg; 14166963Speter 142184989Srafan if (pair_content(pairnum, &fg, &bg) == OK) { 143184989Srafan (void) sprintf(temp, 144184989Srafan "{%d = {%s, %s}}", 145184989Srafan pairnum, 146184989Srafan COLOR_OF(fg), 147184989Srafan COLOR_OF(bg)); 148184989Srafan } else { 149184989Srafan (void) sprintf(temp, "{%d}", pairnum); 150184989Srafan } 151184989Srafan#endif 152184989Srafan result = _nc_trace_bufcat(bufnum, temp); 153166124Srafan } 15466963Speter } 15550276Speter } 156184989Srafan if (ChAttrOf(newmode) == A_NORMAL) { 157184989Srafan if (result != 0 && result[1] != '\0') 158184989Srafan (void) _nc_trace_bufcat(bufnum, "|"); 159184989Srafan (void) _nc_trace_bufcat(bufnum, "A_NORMAL"); 160184989Srafan } 161184989Srafan 162184989Srafan _nc_tracing = save_nc_tracing; 163184989Srafan result = _nc_trace_bufcat(bufnum, r_brace); 16466963Speter } 165184989Srafan return result; 16650276Speter} 16750276Speter 16876726SpeterNCURSES_EXPORT(char *) 16966963Speter_traceattr(attr_t newmode) 17050276Speter{ 17166963Speter return _traceattr2(0, newmode); 17250276Speter} 17350276Speter 17450276Speter/* Trace 'int' return-values */ 17576726SpeterNCURSES_EXPORT(attr_t) 17666963Speter_nc_retrace_attr_t(attr_t code) 17750276Speter{ 17866963Speter T((T_RETURN("%s"), _traceattr(code))); 17966963Speter return code; 18050276Speter} 18150276Speter 18297049Speterconst char * 18397049Speter_nc_altcharset_name(attr_t attr, chtype ch) 18450276Speter{ 185174993Srafan typedef struct { 186174993Srafan unsigned int val; 187174993Srafan const char *name; 188174993Srafan } ALT_NAMES; 189184989Srafan static const ALT_NAMES names[] = 190184989Srafan { 191184989Srafan {'l', "ACS_ULCORNER"}, /* upper left corner */ 192184989Srafan {'m', "ACS_LLCORNER"}, /* lower left corner */ 193184989Srafan {'k', "ACS_URCORNER"}, /* upper right corner */ 194184989Srafan {'j', "ACS_LRCORNER"}, /* lower right corner */ 195184989Srafan {'t', "ACS_LTEE"}, /* tee pointing right */ 196184989Srafan {'u', "ACS_RTEE"}, /* tee pointing left */ 197184989Srafan {'v', "ACS_BTEE"}, /* tee pointing up */ 198184989Srafan {'w', "ACS_TTEE"}, /* tee pointing down */ 199184989Srafan {'q', "ACS_HLINE"}, /* horizontal line */ 200184989Srafan {'x', "ACS_VLINE"}, /* vertical line */ 201184989Srafan {'n', "ACS_PLUS"}, /* large plus or crossover */ 202184989Srafan {'o', "ACS_S1"}, /* scan line 1 */ 203184989Srafan {'s', "ACS_S9"}, /* scan line 9 */ 204184989Srafan {'`', "ACS_DIAMOND"}, /* diamond */ 205184989Srafan {'a', "ACS_CKBOARD"}, /* checker board (stipple) */ 206184989Srafan {'f', "ACS_DEGREE"}, /* degree symbol */ 207184989Srafan {'g', "ACS_PLMINUS"}, /* plus/minus */ 208184989Srafan {'~', "ACS_BULLET"}, /* bullet */ 209184989Srafan {',', "ACS_LARROW"}, /* arrow pointing left */ 210184989Srafan {'+', "ACS_RARROW"}, /* arrow pointing right */ 211184989Srafan {'.', "ACS_DARROW"}, /* arrow pointing down */ 212184989Srafan {'-', "ACS_UARROW"}, /* arrow pointing up */ 213184989Srafan {'h', "ACS_BOARD"}, /* board of squares */ 214184989Srafan {'i', "ACS_LANTERN"}, /* lantern symbol */ 215184989Srafan {'0', "ACS_BLOCK"}, /* solid square block */ 216184989Srafan {'p', "ACS_S3"}, /* scan line 3 */ 217184989Srafan {'r', "ACS_S7"}, /* scan line 7 */ 218184989Srafan {'y', "ACS_LEQUAL"}, /* less/equal */ 219184989Srafan {'z', "ACS_GEQUAL"}, /* greater/equal */ 220184989Srafan {'{', "ACS_PI"}, /* Pi */ 221184989Srafan {'|', "ACS_NEQUAL"}, /* not equal */ 222184989Srafan {'}', "ACS_STERLING"}, /* UK pound sign */ 223184989Srafan {'\0', (char *) 0} 224184989Srafan }; 225174993Srafan 22697049Speter const char *result = 0; 22750276Speter 228166124Srafan if ((attr & A_ALTCHARSET) && (acs_chars != 0)) { 22966963Speter char *cp; 23097049Speter char *found = 0; 231174993Srafan const ALT_NAMES *sp; 23250276Speter 23366963Speter for (cp = acs_chars; cp[0] && cp[1]; cp += 2) { 23497049Speter if (ChCharOf(cp[1]) == ChCharOf(ch)) { 23550276Speter found = cp; 23650276Speter /* don't exit from loop - there may be redefinitions */ 23750276Speter } 23850276Speter } 23950276Speter 24066963Speter if (found != 0) { 24197049Speter ch = ChCharOf(*found); 24250276Speter for (sp = names; sp->val; sp++) 24366963Speter if (sp->val == ch) { 24497049Speter result = sp->name; 24550276Speter break; 24650276Speter } 24750276Speter } 24850276Speter } 24997049Speter return result; 25097049Speter} 25150276Speter 25297049SpeterNCURSES_EXPORT(char *) 25397049Speter_tracechtype2(int bufnum, chtype ch) 25497049Speter{ 25597049Speter const char *found; 256184989Srafan char *result = _nc_trace_buf(bufnum, BUFSIZ); 25750276Speter 258184989Srafan if (result != 0) { 259184989Srafan strcpy(result, l_brace); 260184989Srafan if ((found = _nc_altcharset_name(ChAttrOf(ch), ch)) != 0) { 261184989Srafan (void) _nc_trace_bufcat(bufnum, found); 262184989Srafan } else 263184989Srafan (void) _nc_trace_bufcat(bufnum, _nc_tracechar(SP, (int) ChCharOf(ch))); 26497049Speter 265184989Srafan if (ChAttrOf(ch) != A_NORMAL) { 266184989Srafan (void) _nc_trace_bufcat(bufnum, " | "); 267184989Srafan (void) _nc_trace_bufcat(bufnum, 268184989Srafan _traceattr2(bufnum + 20, ChAttrOf(ch))); 269184989Srafan } 270184989Srafan 271184989Srafan result = _nc_trace_bufcat(bufnum, r_brace); 272166124Srafan } 273184989Srafan return result; 27450276Speter} 27550276Speter 27676726SpeterNCURSES_EXPORT(char *) 277184989Srafan_tracechtype(chtype ch) 27850276Speter{ 27966963Speter return _tracechtype2(0, ch); 28050276Speter} 28166963Speter 28266963Speter/* Trace 'chtype' return-values */ 283166124SrafanNCURSES_EXPORT(chtype) 284184989Srafan_nc_retrace_chtype(chtype code) 28566963Speter{ 28666963Speter T((T_RETURN("%s"), _tracechtype(code))); 28766963Speter return code; 28866963Speter} 28966963Speter 29097049Speter#if USE_WIDEC_SUPPORT 29197049SpeterNCURSES_EXPORT(char *) 292184989Srafan_tracecchar_t2(int bufnum, const cchar_t *ch) 29366963Speter{ 294184989Srafan char *result = _nc_trace_buf(bufnum, BUFSIZ); 29598503Speter attr_t attr; 29697049Speter const char *found; 29797049Speter 298184989Srafan if (result != 0) { 299184989Srafan strcpy(result, l_brace); 300184989Srafan if (ch != 0) { 301184989Srafan attr = AttrOfD(ch); 302184989Srafan if ((found = _nc_altcharset_name(attr, (chtype) CharOfD(ch))) != 0) { 303184989Srafan (void) _nc_trace_bufcat(bufnum, found); 304184989Srafan attr &= ~A_ALTCHARSET; 305184989Srafan } else if (isWidecExt(CHDEREF(ch))) { 306184989Srafan (void) _nc_trace_bufcat(bufnum, "{NAC}"); 307184989Srafan attr &= ~A_CHARTEXT; 308184989Srafan } else { 309184989Srafan PUTC_DATA; 310184989Srafan int n; 31197049Speter 312184989Srafan PUTC_INIT; 313184989Srafan (void) _nc_trace_bufcat(bufnum, "{ "); 314184989Srafan for (PUTC_i = 0; PUTC_i < CCHARW_MAX; ++PUTC_i) { 315184989Srafan PUTC_ch = ch->chars[PUTC_i]; 316184989Srafan if (PUTC_ch == L'\0') 317184989Srafan break; 318184989Srafan PUTC_n = wcrtomb(PUTC_buf, ch->chars[PUTC_i], &PUT_st); 319184989Srafan if (PUTC_n <= 0) { 320184989Srafan if (PUTC_ch != L'\0') { 321184989Srafan /* it could not be a multibyte sequence */ 322184989Srafan (void) _nc_trace_bufcat(bufnum, 323184989Srafan _nc_tracechar(SP, 324184989Srafan UChar(ch->chars[PUTC_i]))); 325184989Srafan } 326184989Srafan break; 327166124Srafan } 328184989Srafan for (n = 0; n < PUTC_n; n++) { 329184989Srafan if (n) 330184989Srafan (void) _nc_trace_bufcat(bufnum, ", "); 331184989Srafan (void) _nc_trace_bufcat(bufnum, 332184989Srafan _nc_tracechar(SP, 333184989Srafan UChar(PUTC_buf[n]))); 334184989Srafan } 335166124Srafan } 336184989Srafan (void) _nc_trace_bufcat(bufnum, " }"); 337166124Srafan } 338184989Srafan if (attr != A_NORMAL) { 339184989Srafan (void) _nc_trace_bufcat(bufnum, " | "); 340184989Srafan (void) _nc_trace_bufcat(bufnum, _traceattr2(bufnum + 20, attr)); 341184989Srafan } 34298503Speter } 343184989Srafan 344184989Srafan result = _nc_trace_bufcat(bufnum, r_brace); 34597049Speter } 346184989Srafan return result; 34766963Speter} 34897049Speter 34997049SpeterNCURSES_EXPORT(char *) 350184989Srafan_tracecchar_t(const cchar_t *ch) 35197049Speter{ 35297049Speter return _tracecchar_t2(0, ch); 35397049Speter} 35497049Speter#endif 35597049Speter 35697049Speter#else 357184989SrafanEMPTY_MODULE(_nc_lib_traceatr) 35850276Speter#endif /* TRACE */ 359