/****************************************************************************
- * Copyright (c) 2001-2009,2010 Free Software Foundation, Inc. *
+ * Copyright (c) 2001-2011,2012 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 *
#include <tic.h>
#include <ctype.h>
-MODULE_ID("$Id: visbuf.c,v 1.37 2010/05/29 18:51:41 tom Exp $")
+MODULE_ID("$Id: visbuf.c,v 1.40 2012/02/22 22:40:24 tom Exp $")
#define NUM_VISBUFS 4
static const char r_brace[] = StringOf(R_BRACE);
#endif
+#if USE_STRING_HACKS && HAVE_SNPRINTF
+#define VisChar(tp, chr, limit) _nc_vischar(tp, chr, limit)
+#define LIMIT_ARG ,size_t limit
+#else
+#define VisChar(tp, chr, limit) _nc_vischar(tp, chr)
+#define LIMIT_ARG /* nothing */
+#endif
+
static char *
-_nc_vischar(char *tp, unsigned c)
+_nc_vischar(char *tp, unsigned c LIMIT_ARG)
{
if (c == '"' || c == '\\') {
*tp++ = '\\';
*tp++ = '^';
*tp++ = (char) ('@' + c);
} else {
- sprintf(tp, "\\%03lo", (unsigned long) ChCharOf(c));
+ _nc_SPRINTF(tp, _nc_SLIMIT(limit)
+ "\\%03lo", (unsigned long) ChCharOf(c));
tp += strlen(tp);
}
*tp = 0;
const char *vbuf = 0;
char *tp;
int c;
+ int count;
if (buf == 0)
return ("(null)");
if (len < 0)
len = (int) strlen(buf);
+ count = len;
#ifdef TRACE
vbuf = tp = _nc_trace_buf(bufnum, NormalLen(len));
#else
#endif
if (tp != 0) {
*tp++ = D_QUOTE;
- while ((--len >= 0) && (c = *buf++) != '\0') {
- tp = _nc_vischar(tp, UChar(c));
+ while ((--count >= 0) && (c = *buf++) != '\0') {
+ tp = VisChar(tp, UChar(c), NormalLen(len));
}
*tp++ = D_QUOTE;
*tp = '\0';
const char *vbuf;
char *tp;
wchar_t c;
+ int count;
if (buf == 0)
return ("(null)");
if (len < 0)
len = (int) wcslen(buf);
+ count = len;
#ifdef TRACE
vbuf = tp = _nc_trace_buf(bufnum, WideLen(len));
#else
#endif
if (tp != 0) {
*tp++ = D_QUOTE;
- while ((--len >= 0) && (c = *buf++) != '\0') {
+ while ((--count >= 0) && (c = *buf++) != '\0') {
char temp[CCHARW_MAX + 80];
int j = wctomb(temp, c), k;
if (j <= 0) {
- sprintf(temp, "\\u%08X", (unsigned) c);
+ _nc_SPRINTF(temp, _nc_SLIMIT(sizeof(temp))
+ "\\u%08X", (unsigned) c);
j = (int) strlen(temp);
}
for (k = 0; k < j; ++k) {
- tp = _nc_vischar(tp, UChar(temp[k]));
+ tp = VisChar(tp, UChar(temp[k]), WideLen(len));
}
}
*tp++ = D_QUOTE;
NCURSES_EXPORT(const char *)
_nc_viscbuf2(int bufnum, const NCURSES_CH_T * buf, int len)
{
- char *result = _nc_trace_buf(bufnum, BUFSIZ);
+ char *result = _nc_trace_buf(bufnum, (size_t) BUFSIZ);
int first;
const char *found;
break;
for (k = 0; k < PUTC_n; k++) {
char temp[80];
- _nc_vischar(temp, UChar(PUTC_buf[k]));
+ VisChar(temp, UChar(PUTC_buf[k]), sizeof(temp));
(void) _nc_trace_bufcat(bufnum, temp);
}
}
#else
{
char temp[80];
- _nc_vischar(temp, UChar(buf[j]));
+ VisChar(temp, UChar(buf[j]), sizeof(temp));
result = _nc_trace_bufcat(bufnum, temp);
}
#endif /* USE_WIDEC_SUPPORT */