]> ncurses.scripts.mit.edu Git - ncurses.git/blobdiff - ncurses/trace/lib_traceatr.c
ncurses 6.4 - patch 20240414
[ncurses.git] / ncurses / trace / lib_traceatr.c
index 8b009953f2467e4cb60f478a62afa51f102c9048..b36286253d6d7fd6c8ac04e51fe6b2406dc448ce 100644 (file)
@@ -1,5 +1,6 @@
 /****************************************************************************
- * Copyright (c) 1998-2014,2016 Free Software Foundation, Inc.              *
+ * Copyright 2018-2022,2024 Thomas E. Dickey                                *
+ * Copyright 1998-2017,2018 Free Software Foundation, Inc.                  *
  *                                                                          *
  * Permission is hereby granted, free of charge, to any person obtaining a  *
  * copy of this software and associated documentation files (the            *
@@ -43,7 +44,7 @@
 #define CUR SP_TERMTYPE
 #endif
 
-MODULE_ID("$Id: lib_traceatr.c,v 1.85 2016/01/16 21:23:43 tom Exp $")
+MODULE_ID("$Id: lib_traceatr.c,v 1.96 2024/02/04 00:11:35 tom Exp $")
 
 #define COLOR_OF(c) ((c < 0) ? "default" : (c > 7 ? color_of(c) : colors[c].name))
 
@@ -67,7 +68,7 @@ color_of(int c)
     if (c != my_cached) {
        my_cached = c;
        my_select = !my_select;
-       if (c == COLOR_DEFAULT)
+       if (isDefaultColor(c))
            _nc_STRCPY(my_buffer[my_select], "default",
                       COLOR_BUF_SIZE(my_select));
        else
@@ -123,11 +124,10 @@ _traceattr2(int bufnum, chtype newmode)
 #endif /* !USE_TERMLIB */
     ;
 #undef DATA
-    size_t n;
-    char temp[80];
     char *result = _nc_trace_buf(bufnum, (size_t) BUFSIZ);
 
     if (result != 0) {
+       size_t n;
        unsigned save_nc_tracing = _nc_tracing;
 
        _nc_tracing = 0;
@@ -135,12 +135,14 @@ _traceattr2(int bufnum, chtype newmode)
        _nc_STRCPY(result, l_brace, TRACE_BUF_SIZE(bufnum));
 
        for (n = 0; n < SIZEOF(names); n++) {
+
            if ((newmode & names[n].val) != 0) {
                if (result[1] != '\0')
                    (void) _nc_trace_bufcat(bufnum, "|");
                result = _nc_trace_bufcat(bufnum, names[n].name);
 
                if (names[n].val == A_COLOR) {
+                   char temp[80];
                    short pairnum = (short) PairNumber(newmode);
 #ifdef USE_TERMLIB
                    /* pair_content lives in libncurses */
@@ -254,7 +256,6 @@ _nc_altcharset_name(attr_t attr, chtype ch)
     if (SP_PARM != 0 && (attr & A_ALTCHARSET) && (acs_chars != 0)) {
        char *cp;
        char *found = 0;
-       size_t n;
 
        for (cp = acs_chars; cp[0] && cp[1]; cp += 2) {
            if (ChCharOf(UChar(cp[1])) == ChCharOf(ch)) {
@@ -264,6 +265,8 @@ _nc_altcharset_name(attr_t attr, chtype ch)
        }
 
        if (found != 0) {
+           size_t n;
+
            ch = ChCharOf(UChar(*found));
            for (n = 0; n < SIZEOF(names); ++n) {
                if (names[n].val == ch) {
@@ -279,22 +282,25 @@ _nc_altcharset_name(attr_t attr, chtype ch)
 NCURSES_EXPORT(char *)
 _tracechtype2(int bufnum, chtype ch)
 {
-    const char *found;
     char *result = _nc_trace_buf(bufnum, (size_t) BUFSIZ);
 
     if (result != 0) {
+       const char *found;
+       attr_t attr = ChAttrOf(ch);
+
        _nc_STRCPY(result, l_brace, TRACE_BUF_SIZE(bufnum));
-       if ((found = _nc_altcharset_name(ChAttrOf(ch), ch)) != 0) {
+       if ((found = _nc_altcharset_name(attr, ch)) != 0) {
            (void) _nc_trace_bufcat(bufnum, found);
+           attr &= ~A_ALTCHARSET;
        } else
            (void) _nc_trace_bufcat(bufnum,
                                    _nc_tracechar(CURRENT_SCREEN,
                                                  (int) ChCharOf(ch)));
 
-       if (ChAttrOf(ch) != A_NORMAL) {
+       if (attr != A_NORMAL) {
            (void) _nc_trace_bufcat(bufnum, " | ");
            (void) _nc_trace_bufcat(bufnum,
-                                   _traceattr2(bufnum + 20, ChAttrOf(ch)));
+                                   _traceattr2(bufnum + 20, attr));
        }
 
        result = _nc_trace_bufcat(bufnum, r_brace);
@@ -321,13 +327,13 @@ NCURSES_EXPORT(char *)
 _tracecchar_t2(int bufnum, const cchar_t *ch)
 {
     char *result = _nc_trace_buf(bufnum, (size_t) BUFSIZ);
-    attr_t attr;
-    const char *found;
 
     if (result != 0) {
        _nc_STRCPY(result, l_brace, TRACE_BUF_SIZE(bufnum));
        if (ch != 0) {
-           attr = AttrOfD(ch);
+           const char *found;
+           attr_t attr = AttrOfD(ch);
+
            if ((found = _nc_altcharset_name(attr, (chtype) CharOfD(ch))) != 0) {
                (void) _nc_trace_bufcat(bufnum, found);
                attr &= ~A_ALTCHARSET;
@@ -337,6 +343,7 @@ _tracecchar_t2(int bufnum, const cchar_t *ch)
            } else {
                PUTC_DATA;
                int n;
+               int assume_unicode = _nc_unicode_locale()? 128 : 255;
 
                (void) _nc_trace_bufcat(bufnum, "{ ");
                for (PUTC_i = 0; PUTC_i < CCHARW_MAX; ++PUTC_i) {
@@ -356,20 +363,22 @@ _tracecchar_t2(int bufnum, const cchar_t *ch)
                                                                  UChar(ch->chars[PUTC_i])));
                        }
                        break;
-                   } else if (ch->chars[PUTC_i] > 255) {
+                   } else if (ch->chars[PUTC_i] > assume_unicode) {
                        char temp[80];
-                       sprintf(temp, "{%d:\\u%x}",
-                               wcwidth(ch->chars[PUTC_i]),
-                               ch->chars[PUTC_i]);
+                       _nc_SPRINTF(temp, _nc_SLIMIT(sizeof(temp))
+                                   "{%d:\\u%04lx}",
+                                   _nc_wacs_width(ch->chars[PUTC_i]),
+                                   (unsigned long) ch->chars[PUTC_i]);
                        (void) _nc_trace_bufcat(bufnum, temp);
-                       break;
-                   }
-                   for (n = 0; n < PUTC_n; n++) {
-                       if (n)
-                           (void) _nc_trace_bufcat(bufnum, ", ");
-                       (void) _nc_trace_bufcat(bufnum,
-                                               _nc_tracechar(CURRENT_SCREEN,
-                                                             UChar(PUTC_buf[n])));
+                       attr &= ~A_CHARTEXT;    /* ignore WidecExt(ch) */
+                   } else {
+                       for (n = 0; n < PUTC_n; n++) {
+                           if (n)
+                               (void) _nc_trace_bufcat(bufnum, ", ");
+                           (void) _nc_trace_bufcat(bufnum,
+                                                   _nc_tracechar(CURRENT_SCREEN,
+                                                                 UChar(PUTC_buf[n])));
+                       }
                    }
                }
                (void) _nc_trace_bufcat(bufnum, " }");
@@ -378,6 +387,18 @@ _tracecchar_t2(int bufnum, const cchar_t *ch)
                (void) _nc_trace_bufcat(bufnum, " | ");
                (void) _nc_trace_bufcat(bufnum, _traceattr2(bufnum + 20, attr));
            }
+#if NCURSES_EXT_COLORS
+           /*
+            * Just in case the extended color is different from the chtype
+            * value, trace both.
+            */
+           if (ch->ext_color != PairNumber(attr)) {
+               char temp[80];
+               _nc_SPRINTF(temp, _nc_SLIMIT(sizeof(temp))
+                           " X_COLOR{%d:%d}", ch->ext_color, PairNumber(attr));
+               (void) _nc_trace_bufcat(bufnum, temp);
+           }
+#endif
        }
 
        result = _nc_trace_bufcat(bufnum, r_brace);