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