/****************************************************************************
- * Copyright (c) 2001-2010,2011 Free Software Foundation, Inc. *
+ * Copyright (c) 2001-2012,2014 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.38 2011/10/22 16:34:50 tom Exp $")
+MODULE_ID("$Id: visbuf.c,v 1.44 2014/09/25 08:51:13 tom Exp $")
#define NUM_VISBUFS 4
#define NormalLen(len) (size_t) (((size_t)(len) + 1) * 4)
-#define WideLen(len) (size_t) (((size_t)(len) + 1) * 4 * MB_CUR_MAX)
+#define WideLen(len) (size_t) (((size_t)(len) + 1) * 4 * (size_t) MB_CUR_MAX)
#ifdef TRACE
static const char d_quote[] = StringOf(D_QUOTE);
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++ = (char) c;
- } else if (is7bits(c) && (isgraph(c) || c == ' ')) {
+ } else if (is7bits((int) c) && (isgraph((int) c) || c == ' ')) {
*tp++ = (char) c;
} else if (c == '\n') {
*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;
else
mybuf = typeMalloc(wchar_t, mylen);
}
- for (n = 0; buf[n] != 0; ++n) {
- mybuf[n] = (wchar_t) buf[n];
+ if (mybuf != 0) {
+ for (n = 0; buf[n] != 0; ++n) {
+ mybuf[n] = (wchar_t) buf[n];
+ }
+ mybuf[n] = L'\0';
}
- mybuf[n] = L'\0';
return _nc_viswbuf2(0, mybuf);
}
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]));
- result = _nc_trace_bufcat(bufnum, temp);
+ VisChar(temp, UChar(buf[j]), sizeof(temp));
+ (void) _nc_trace_bufcat(bufnum, temp);
}
#endif /* USE_WIDEC_SUPPORT */
}