xref: /freebsd/contrib/ncurses/ncurses/trace/visbuf.c (revision 21817992)
139f2269fSPeter Wemm /****************************************************************************
2*21817992SBaptiste Daroussin  * Copyright 2019-2021,2023 Thomas E. Dickey                                *
3e1865124SBaptiste Daroussin  * Copyright 2001-2016,2017 Free Software Foundation, Inc.                  *
439f2269fSPeter Wemm  *                                                                          *
539f2269fSPeter Wemm  * Permission is hereby granted, free of charge, to any person obtaining a  *
639f2269fSPeter Wemm  * copy of this software and associated documentation files (the            *
739f2269fSPeter Wemm  * "Software"), to deal in the Software without restriction, including      *
839f2269fSPeter Wemm  * without limitation the rights to use, copy, modify, merge, publish,      *
939f2269fSPeter Wemm  * distribute, distribute with modifications, sublicense, and/or sell       *
1039f2269fSPeter Wemm  * copies of the Software, and to permit persons to whom the Software is    *
1139f2269fSPeter Wemm  * furnished to do so, subject to the following conditions:                 *
1239f2269fSPeter Wemm  *                                                                          *
1339f2269fSPeter Wemm  * The above copyright notice and this permission notice shall be included  *
1439f2269fSPeter Wemm  * in all copies or substantial portions of the Software.                   *
1539f2269fSPeter Wemm  *                                                                          *
1639f2269fSPeter Wemm  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS  *
1739f2269fSPeter Wemm  * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF               *
1839f2269fSPeter Wemm  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.   *
1939f2269fSPeter Wemm  * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,   *
2039f2269fSPeter Wemm  * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR    *
2139f2269fSPeter Wemm  * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR    *
2239f2269fSPeter Wemm  * THE USE OR OTHER DEALINGS IN THE SOFTWARE.                               *
2339f2269fSPeter Wemm  *                                                                          *
2439f2269fSPeter Wemm  * Except as contained in this notice, the name(s) of the above copyright   *
2539f2269fSPeter Wemm  * holders shall not be used in advertising or otherwise to promote the     *
2639f2269fSPeter Wemm  * sale, use or other dealings in this Software without prior written       *
2739f2269fSPeter Wemm  * authorization.                                                           *
2839f2269fSPeter Wemm  ****************************************************************************/
2939f2269fSPeter Wemm 
3039f2269fSPeter Wemm /****************************************************************************
314a1a9510SRong-En Fan  *  Author: Thomas E. Dickey                        1996-on                 *
3239f2269fSPeter Wemm  *     and: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1992,1995               *
3339f2269fSPeter Wemm  *     and: Eric S. Raymond <esr@snark.thyrsus.com>                         *
3439f2269fSPeter Wemm  ****************************************************************************/
3539f2269fSPeter Wemm 
3639f2269fSPeter Wemm /*
3739f2269fSPeter Wemm  *	visbuf.c - Tracing/Debugging support routines
3839f2269fSPeter Wemm  */
3939f2269fSPeter Wemm 
404a1a9510SRong-En Fan #define NEED_NCURSES_CH_T
4139f2269fSPeter Wemm #include <curses.priv.h>
4239f2269fSPeter Wemm 
4339f2269fSPeter Wemm #include <tic.h>
4439f2269fSPeter Wemm #include <ctype.h>
4539f2269fSPeter Wemm 
46*21817992SBaptiste Daroussin MODULE_ID("$Id: visbuf.c,v 1.54 2023/05/27 20:13:10 tom Exp $")
4706bfebdeSXin LI 
4806bfebdeSXin LI #define NUM_VISBUFS 4
494a1a9510SRong-En Fan 
505d08fb1fSRong-En Fan #define NormalLen(len) (size_t) (((size_t)(len) + 1) * 4)
51aae38d10SBaptiste Daroussin #define WideLen(len)   (size_t) (((size_t)(len) + 1) * 4 * (size_t) MB_CUR_MAX)
525ca44d1cSRong-En Fan 
535ca44d1cSRong-En Fan #ifdef TRACE
545ca44d1cSRong-En Fan static const char d_quote[] = StringOf(D_QUOTE);
555ca44d1cSRong-En Fan static const char l_brace[] = StringOf(L_BRACE);
565ca44d1cSRong-En Fan static const char r_brace[] = StringOf(R_BRACE);
575ca44d1cSRong-En Fan #endif
5839f2269fSPeter Wemm 
5973f0a83dSXin LI #if USE_STRING_HACKS && HAVE_SNPRINTF
6073f0a83dSXin LI #define VisChar(tp, chr, limit) _nc_vischar(tp, chr, limit)
6173f0a83dSXin LI #define LIMIT_ARG ,size_t limit
6273f0a83dSXin LI #else
6373f0a83dSXin LI #define VisChar(tp, chr, limit) _nc_vischar(tp, chr)
6473f0a83dSXin LI #define LIMIT_ARG		/* nothing */
6573f0a83dSXin LI #endif
6673f0a83dSXin LI 
6739f2269fSPeter Wemm static char *
_nc_vischar(char * tp,unsigned c LIMIT_ARG)6873f0a83dSXin LI _nc_vischar(char *tp, unsigned c LIMIT_ARG)
6939f2269fSPeter Wemm {
70*21817992SBaptiste Daroussin     if (tp == NULL) {
71*21817992SBaptiste Daroussin 	return NULL;
72*21817992SBaptiste Daroussin     } else if (c == '"' || c == '\\') {
7339f2269fSPeter Wemm 	*tp++ = '\\';
745d08fb1fSRong-En Fan 	*tp++ = (char) c;
7573f0a83dSXin LI     } else if (is7bits((int) c) && (isgraph((int) c) || c == ' ')) {
765d08fb1fSRong-En Fan 	*tp++ = (char) c;
7739f2269fSPeter Wemm     } else if (c == '\n') {
7839f2269fSPeter Wemm 	*tp++ = '\\';
7939f2269fSPeter Wemm 	*tp++ = 'n';
8039f2269fSPeter Wemm     } else if (c == '\r') {
8139f2269fSPeter Wemm 	*tp++ = '\\';
8239f2269fSPeter Wemm 	*tp++ = 'r';
8339f2269fSPeter Wemm     } else if (c == '\b') {
8439f2269fSPeter Wemm 	*tp++ = '\\';
8539f2269fSPeter Wemm 	*tp++ = 'b';
86aae38d10SBaptiste Daroussin     } else if (c == '\t') {
87aae38d10SBaptiste Daroussin 	*tp++ = '\\';
88aae38d10SBaptiste Daroussin 	*tp++ = 't';
8939f2269fSPeter Wemm     } else if (c == '\033') {
9039f2269fSPeter Wemm 	*tp++ = '\\';
9139f2269fSPeter Wemm 	*tp++ = 'e';
925ca44d1cSRong-En Fan     } else if (UChar(c) == 0x7f) {
935ca44d1cSRong-En Fan 	*tp++ = '\\';
945ca44d1cSRong-En Fan 	*tp++ = '^';
955ca44d1cSRong-En Fan 	*tp++ = '?';
9639f2269fSPeter Wemm     } else if (is7bits(c) && iscntrl(UChar(c))) {
9739f2269fSPeter Wemm 	*tp++ = '\\';
9839f2269fSPeter Wemm 	*tp++ = '^';
995d08fb1fSRong-En Fan 	*tp++ = (char) ('@' + c);
10039f2269fSPeter Wemm     } else {
10173f0a83dSXin LI 	_nc_SPRINTF(tp, _nc_SLIMIT(limit)
10273f0a83dSXin LI 		    "\\%03lo", (unsigned long) ChCharOf(c));
10339f2269fSPeter Wemm 	tp += strlen(tp);
10439f2269fSPeter Wemm     }
1054a1a9510SRong-En Fan     *tp = 0;
10639f2269fSPeter Wemm     return tp;
10739f2269fSPeter Wemm }
10839f2269fSPeter Wemm 
1094a1a9510SRong-En Fan static const char *
_nc_visbuf2n(int bufnum,const char * buf,int len)1104a1a9510SRong-En Fan _nc_visbuf2n(int bufnum, const char *buf, int len)
11139f2269fSPeter Wemm {
11206bfebdeSXin LI     const char *vbuf = 0;
11339f2269fSPeter Wemm     char *tp;
11473f0a83dSXin LI     int count;
11539f2269fSPeter Wemm 
11639f2269fSPeter Wemm     if (buf == 0)
11739f2269fSPeter Wemm 	return ("(null)");
11839f2269fSPeter Wemm     if (buf == CANCELLED_STRING)
11939f2269fSPeter Wemm 	return ("(cancelled)");
12039f2269fSPeter Wemm 
1214a1a9510SRong-En Fan     if (len < 0)
1225d08fb1fSRong-En Fan 	len = (int) strlen(buf);
1234a1a9510SRong-En Fan 
12473f0a83dSXin LI     count = len;
12539f2269fSPeter Wemm #ifdef TRACE
1265d08fb1fSRong-En Fan     vbuf = tp = _nc_trace_buf(bufnum, NormalLen(len));
12739f2269fSPeter Wemm #else
12839f2269fSPeter Wemm     {
12906bfebdeSXin LI 	static char *mybuf[NUM_VISBUFS];
130aae38d10SBaptiste Daroussin 	int c;
131aae38d10SBaptiste Daroussin 
13206bfebdeSXin LI 	if (bufnum < 0) {
13306bfebdeSXin LI 	    for (c = 0; c < NUM_VISBUFS; ++c) {
13406bfebdeSXin LI 		FreeAndNull(mybuf[c]);
13506bfebdeSXin LI 	    }
13606bfebdeSXin LI 	    tp = 0;
13706bfebdeSXin LI 	} else {
1385ca44d1cSRong-En Fan 	    mybuf[bufnum] = typeRealloc(char, NormalLen(len), mybuf[bufnum]);
1395d08fb1fSRong-En Fan 	    vbuf = tp = mybuf[bufnum];
14039f2269fSPeter Wemm 	}
14106bfebdeSXin LI     }
14239f2269fSPeter Wemm #endif
1435d08fb1fSRong-En Fan     if (tp != 0) {
144aae38d10SBaptiste Daroussin 	int c;
145aae38d10SBaptiste Daroussin 
14639f2269fSPeter Wemm 	*tp++ = D_QUOTE;
14773f0a83dSXin LI 	while ((--count >= 0) && (c = *buf++) != '\0') {
14873f0a83dSXin LI 	    tp = VisChar(tp, UChar(c), NormalLen(len));
14939f2269fSPeter Wemm 	}
15039f2269fSPeter Wemm 	*tp++ = D_QUOTE;
15106bfebdeSXin LI 	*tp = '\0';
1525d08fb1fSRong-En Fan     } else {
1535d08fb1fSRong-En Fan 	vbuf = ("(_nc_visbuf2n failed)");
1545d08fb1fSRong-En Fan     }
15539f2269fSPeter Wemm     return (vbuf);
15639f2269fSPeter Wemm }
15739f2269fSPeter Wemm 
15839f2269fSPeter Wemm NCURSES_EXPORT(const char *)
_nc_visbuf2(int bufnum,const char * buf)1594a1a9510SRong-En Fan _nc_visbuf2(int bufnum, const char *buf)
1604a1a9510SRong-En Fan {
1614a1a9510SRong-En Fan     return _nc_visbuf2n(bufnum, buf, -1);
1624a1a9510SRong-En Fan }
1634a1a9510SRong-En Fan 
1644a1a9510SRong-En Fan NCURSES_EXPORT(const char *)
_nc_visbuf(const char * buf)16539f2269fSPeter Wemm _nc_visbuf(const char *buf)
16639f2269fSPeter Wemm {
16739f2269fSPeter Wemm     return _nc_visbuf2(0, buf);
16839f2269fSPeter Wemm }
16939f2269fSPeter Wemm 
17039f2269fSPeter Wemm NCURSES_EXPORT(const char *)
_nc_visbufn(const char * buf,int len)1714a1a9510SRong-En Fan _nc_visbufn(const char *buf, int len)
1724a1a9510SRong-En Fan {
1734a1a9510SRong-En Fan     return _nc_visbuf2n(0, buf, len);
1744a1a9510SRong-En Fan }
1754a1a9510SRong-En Fan 
1764a1a9510SRong-En Fan #ifdef TRACE
1774a1a9510SRong-En Fan #if USE_WIDEC_SUPPORT
1784a1a9510SRong-En Fan 
1794a1a9510SRong-En Fan #if defined(USE_TERMLIB)
1804a1a9510SRong-En Fan #define _nc_wchstrlen _my_wchstrlen
1814a1a9510SRong-En Fan static int
_nc_wchstrlen(const cchar_t * s)1824a1a9510SRong-En Fan _nc_wchstrlen(const cchar_t *s)
1834a1a9510SRong-En Fan {
1844a1a9510SRong-En Fan     int result = 0;
1854a1a9510SRong-En Fan     while (CharOf(s[result]) != L'\0') {
1864a1a9510SRong-En Fan 	result++;
1874a1a9510SRong-En Fan     }
1884a1a9510SRong-En Fan     return result;
1894a1a9510SRong-En Fan }
1904a1a9510SRong-En Fan #endif
1914a1a9510SRong-En Fan 
1924a1a9510SRong-En Fan static const char *
_nc_viswbuf2n(int bufnum,const wchar_t * buf,int len)1934a1a9510SRong-En Fan _nc_viswbuf2n(int bufnum, const wchar_t *buf, int len)
19439f2269fSPeter Wemm {
1955d08fb1fSRong-En Fan     const char *vbuf;
19639f2269fSPeter Wemm     char *tp;
19773f0a83dSXin LI     int count;
19839f2269fSPeter Wemm 
19939f2269fSPeter Wemm     if (buf == 0)
20039f2269fSPeter Wemm 	return ("(null)");
20139f2269fSPeter Wemm 
2024a1a9510SRong-En Fan     if (len < 0)
2035d08fb1fSRong-En Fan 	len = (int) wcslen(buf);
2044a1a9510SRong-En Fan 
20573f0a83dSXin LI     count = len;
20639f2269fSPeter Wemm #ifdef TRACE
2075d08fb1fSRong-En Fan     vbuf = tp = _nc_trace_buf(bufnum, WideLen(len));
20839f2269fSPeter Wemm #else
20939f2269fSPeter Wemm     {
21006bfebdeSXin LI 	static char *mybuf[NUM_VISBUFS];
2115ca44d1cSRong-En Fan 	mybuf[bufnum] = typeRealloc(char, WideLen(len), mybuf[bufnum]);
2125d08fb1fSRong-En Fan 	vbuf = tp = mybuf[bufnum];
21339f2269fSPeter Wemm     }
21439f2269fSPeter Wemm #endif
2155d08fb1fSRong-En Fan     if (tp != 0) {
216aae38d10SBaptiste Daroussin 	wchar_t c;
217aae38d10SBaptiste Daroussin 
21839f2269fSPeter Wemm 	*tp++ = D_QUOTE;
21973f0a83dSXin LI 	while ((--count >= 0) && (c = *buf++) != '\0') {
2204a1a9510SRong-En Fan 	    char temp[CCHARW_MAX + 80];
2214a1a9510SRong-En Fan 	    int j = wctomb(temp, c), k;
2224a1a9510SRong-En Fan 	    if (j <= 0) {
22373f0a83dSXin LI 		_nc_SPRINTF(temp, _nc_SLIMIT(sizeof(temp))
22473f0a83dSXin LI 			    "\\u%08X", (unsigned) c);
2255d08fb1fSRong-En Fan 		j = (int) strlen(temp);
2264a1a9510SRong-En Fan 	    }
2274a1a9510SRong-En Fan 	    for (k = 0; k < j; ++k) {
22873f0a83dSXin LI 		tp = VisChar(tp, UChar(temp[k]), WideLen(len));
2294a1a9510SRong-En Fan 	    }
23039f2269fSPeter Wemm 	}
23139f2269fSPeter Wemm 	*tp++ = D_QUOTE;
23206bfebdeSXin LI 	*tp = '\0';
2335d08fb1fSRong-En Fan     } else {
2345d08fb1fSRong-En Fan 	vbuf = ("(_nc_viswbuf2n failed)");
2355d08fb1fSRong-En Fan     }
23639f2269fSPeter Wemm     return (vbuf);
23739f2269fSPeter Wemm }
23839f2269fSPeter Wemm 
23939f2269fSPeter Wemm NCURSES_EXPORT(const char *)
_nc_viswbuf2(int bufnum,const wchar_t * buf)2404a1a9510SRong-En Fan _nc_viswbuf2(int bufnum, const wchar_t *buf)
2414a1a9510SRong-En Fan {
2424a1a9510SRong-En Fan     return _nc_viswbuf2n(bufnum, buf, -1);
2434a1a9510SRong-En Fan }
2444a1a9510SRong-En Fan 
2454a1a9510SRong-En Fan NCURSES_EXPORT(const char *)
_nc_viswbuf(const wchar_t * buf)24639f2269fSPeter Wemm _nc_viswbuf(const wchar_t *buf)
24739f2269fSPeter Wemm {
24839f2269fSPeter Wemm     return _nc_viswbuf2(0, buf);
24939f2269fSPeter Wemm }
25039f2269fSPeter Wemm 
25139f2269fSPeter Wemm NCURSES_EXPORT(const char *)
_nc_viswbufn(const wchar_t * buf,int len)2524a1a9510SRong-En Fan _nc_viswbufn(const wchar_t *buf, int len)
25339f2269fSPeter Wemm {
2544a1a9510SRong-En Fan     return _nc_viswbuf2n(0, buf, len);
2554a1a9510SRong-En Fan }
2564a1a9510SRong-En Fan 
2574a1a9510SRong-En Fan /* this special case is used for wget_wstr() */
2584a1a9510SRong-En Fan NCURSES_EXPORT(const char *)
_nc_viswibuf(const wint_t * buf)2594a1a9510SRong-En Fan _nc_viswibuf(const wint_t *buf)
2604a1a9510SRong-En Fan {
2614a1a9510SRong-En Fan     static wchar_t *mybuf;
2624a1a9510SRong-En Fan     static unsigned mylen;
2634a1a9510SRong-En Fan     unsigned n;
2644a1a9510SRong-En Fan 
26506bfebdeSXin LI     for (n = 0; buf[n] != 0; ++n) {
26606bfebdeSXin LI 	;			/* empty */
26706bfebdeSXin LI     }
2684a1a9510SRong-En Fan     if (mylen < ++n) {
2694a1a9510SRong-En Fan 	mylen = n + 80;
2704a1a9510SRong-En Fan 	if (mybuf != 0)
2714a1a9510SRong-En Fan 	    mybuf = typeRealloc(wchar_t, mylen, mybuf);
2724a1a9510SRong-En Fan 	else
2734a1a9510SRong-En Fan 	    mybuf = typeMalloc(wchar_t, mylen);
2744a1a9510SRong-En Fan     }
27573f0a83dSXin LI     if (mybuf != 0) {
27606bfebdeSXin LI 	for (n = 0; buf[n] != 0; ++n) {
2774a1a9510SRong-En Fan 	    mybuf[n] = (wchar_t) buf[n];
27806bfebdeSXin LI 	}
27906bfebdeSXin LI 	mybuf[n] = L'\0';
28073f0a83dSXin LI     }
2814a1a9510SRong-En Fan 
2824a1a9510SRong-En Fan     return _nc_viswbuf2(0, mybuf);
2834a1a9510SRong-En Fan }
2844a1a9510SRong-En Fan #endif /* USE_WIDEC_SUPPORT */
2854a1a9510SRong-En Fan 
2864a1a9510SRong-En Fan /* use these functions for displaying parts of a line within a window */
2874a1a9510SRong-En Fan NCURSES_EXPORT(const char *)
_nc_viscbuf2(int bufnum,const NCURSES_CH_T * buf,int len)2884a1a9510SRong-En Fan _nc_viscbuf2(int bufnum, const NCURSES_CH_T *buf, int len)
2894a1a9510SRong-En Fan {
29073f0a83dSXin LI     char *result = _nc_trace_buf(bufnum, (size_t) BUFSIZ);
29139f2269fSPeter Wemm 
2925d08fb1fSRong-En Fan     if (result != 0) {
293aae38d10SBaptiste Daroussin 	int first = 0;
294aae38d10SBaptiste Daroussin 
2954a1a9510SRong-En Fan #if USE_WIDEC_SUPPORT
29639f2269fSPeter Wemm 	if (len < 0)
29739f2269fSPeter Wemm 	    len = _nc_wchstrlen(buf);
2984a1a9510SRong-En Fan #endif /* USE_WIDEC_SUPPORT */
29939f2269fSPeter Wemm 
30039f2269fSPeter Wemm 	/*
3014a1a9510SRong-En Fan 	 * Display one or more strings followed by attributes.
30239f2269fSPeter Wemm 	 */
3034a1a9510SRong-En Fan 	while (first < len) {
3044a1a9510SRong-En Fan 	    attr_t attr = AttrOf(buf[first]);
3054a1a9510SRong-En Fan 	    int last = len - 1;
3064a1a9510SRong-En Fan 	    int j;
3074a1a9510SRong-En Fan 
3084a1a9510SRong-En Fan 	    for (j = first + 1; j < len; ++j) {
3094a1a9510SRong-En Fan 		if (!SameAttrOf(buf[j], buf[first])) {
3104a1a9510SRong-En Fan 		    last = j - 1;
3114a1a9510SRong-En Fan 		    break;
3124a1a9510SRong-En Fan 		}
3134a1a9510SRong-En Fan 	    }
3144a1a9510SRong-En Fan 
31506bfebdeSXin LI 	    (void) _nc_trace_bufcat(bufnum, l_brace);
31606bfebdeSXin LI 	    (void) _nc_trace_bufcat(bufnum, d_quote);
3174a1a9510SRong-En Fan 	    for (j = first; j <= last; ++j) {
318aae38d10SBaptiste Daroussin 		const char *found = _nc_altcharset_name(attr, (chtype)
319aae38d10SBaptiste Daroussin 							CharOf(buf[j]));
3205ca44d1cSRong-En Fan 		if (found != 0) {
32106bfebdeSXin LI 		    (void) _nc_trace_bufcat(bufnum, found);
32239f2269fSPeter Wemm 		    attr &= ~A_ALTCHARSET;
3234a1a9510SRong-En Fan 		} else
3244a1a9510SRong-En Fan #if USE_WIDEC_SUPPORT
3254a1a9510SRong-En Fan 		if (!isWidecExt(buf[j])) {
32639f2269fSPeter Wemm 		    PUTC_DATA;
32739f2269fSPeter Wemm 
3284a1a9510SRong-En Fan 		    for (PUTC_i = 0; PUTC_i < CCHARW_MAX; ++PUTC_i) {
3294a1a9510SRong-En Fan 			int k;
330aae38d10SBaptiste Daroussin 			char temp[80];
3314a1a9510SRong-En Fan 
3324a1a9510SRong-En Fan 			PUTC_ch = buf[j].chars[PUTC_i];
33306bfebdeSXin LI 			if (PUTC_ch == L'\0') {
33406bfebdeSXin LI 			    if (PUTC_i == 0)
33506bfebdeSXin LI 				(void) _nc_trace_bufcat(bufnum, "\\000");
3364a1a9510SRong-En Fan 			    break;
33706bfebdeSXin LI 			}
338aae38d10SBaptiste Daroussin 			PUTC_INIT;
33906bfebdeSXin LI 			PUTC_n = (int) wcrtomb(PUTC_buf,
34006bfebdeSXin LI 					       buf[j].chars[PUTC_i], &PUT_st);
341aae38d10SBaptiste Daroussin 			if (PUTC_n <= 0 || buf[j].chars[PUTC_i] > 255) {
342aae38d10SBaptiste Daroussin 			    _nc_SPRINTF(temp, _nc_SLIMIT(sizeof(temp))
343aae38d10SBaptiste Daroussin 					"{%d:\\u%lx}",
344aae38d10SBaptiste Daroussin 					_nc_wacs_width(buf[j].chars[PUTC_i]),
345aae38d10SBaptiste Daroussin 					(unsigned long) buf[j].chars[PUTC_i]);
346aae38d10SBaptiste Daroussin 			    (void) _nc_trace_bufcat(bufnum, temp);
34739f2269fSPeter Wemm 			    break;
348aae38d10SBaptiste Daroussin 			}
3494a1a9510SRong-En Fan 			for (k = 0; k < PUTC_n; k++) {
35073f0a83dSXin LI 			    VisChar(temp, UChar(PUTC_buf[k]), sizeof(temp));
35106bfebdeSXin LI 			    (void) _nc_trace_bufcat(bufnum, temp);
35239f2269fSPeter Wemm 			}
35339f2269fSPeter Wemm 		    }
35439f2269fSPeter Wemm 		}
3554a1a9510SRong-En Fan #else
3564a1a9510SRong-En Fan 		{
3574a1a9510SRong-En Fan 		    char temp[80];
35873f0a83dSXin LI 		    VisChar(temp, UChar(buf[j]), sizeof(temp));
35973f0a83dSXin LI 		    (void) _nc_trace_bufcat(bufnum, temp);
36039f2269fSPeter Wemm 		}
3614a1a9510SRong-En Fan #endif /* USE_WIDEC_SUPPORT */
36239f2269fSPeter Wemm 	    }
36306bfebdeSXin LI 	    (void) _nc_trace_bufcat(bufnum, d_quote);
3644a1a9510SRong-En Fan 	    if (attr != A_NORMAL) {
36506bfebdeSXin LI 		(void) _nc_trace_bufcat(bufnum, " | ");
36606bfebdeSXin LI 		(void) _nc_trace_bufcat(bufnum, _traceattr2(bufnum + 20, attr));
3674a1a9510SRong-En Fan 	    }
3684a1a9510SRong-En Fan 	    result = _nc_trace_bufcat(bufnum, r_brace);
3694a1a9510SRong-En Fan 	    first = last + 1;
37039f2269fSPeter Wemm 	}
3715d08fb1fSRong-En Fan     }
37239f2269fSPeter Wemm     return result;
37339f2269fSPeter Wemm }
37439f2269fSPeter Wemm 
37539f2269fSPeter Wemm NCURSES_EXPORT(const char *)
_nc_viscbuf(const NCURSES_CH_T * buf,int len)3764a1a9510SRong-En Fan _nc_viscbuf(const NCURSES_CH_T *buf, int len)
37739f2269fSPeter Wemm {
37839f2269fSPeter Wemm     return _nc_viscbuf2(0, buf, len);
37939f2269fSPeter Wemm }
38039f2269fSPeter Wemm #endif /* TRACE */
381