+ char *buf = _nc_trace_buf(bufnum, BUFSIZ);
+ attr_t attr;
+ const char *found;
+
+ strcpy(buf, l_brace);
+ if (ch != 0) {
+ attr = AttrOfD(ch);
+ if ((found = _nc_altcharset_name(attr, CharOfD(ch))) != 0) {
+ (void) strcat(buf, found);
+ attr &= ~A_ALTCHARSET;
+ } else if (!isnac(CHDEREF(ch))) {
+ PUTC_DATA;
+ int n;
+
+ memset (&PUT_st, '\0', sizeof (PUT_st));
+ PUTC_i = 0;
+ (void) strcat(buf, "{ ");
+ do {
+ PUTC_ch = PUTC_i < CCHARW_MAX ? ch->chars[PUTC_i] : L'\0';
+ PUTC_n = wcrtomb(PUTC_buf, ch->chars[PUTC_i], &PUT_st);
+ if (PUTC_ch == L'\0')
+ --PUTC_n;
+ if (PUTC_n <= 0)
+ break;
+ for (n = 0; n < PUTC_n; n++) {
+ if (n)
+ (void) strcat(buf, ", ");
+ (void) strcat(buf, _tracechar(UChar(PUTC_buf[n])));
+ }
+ ++PUTC_i;
+ } while (PUTC_ch != L'\0');
+ (void) strcat(buf, " }");
+ }
+ if (attr != A_NORMAL)
+ (void) sprintf(buf + strlen(buf), " | %s",
+ _traceattr2(bufnum + 20, attr));
+ }
+
+ return (strcat(buf, r_brace));