From e02ffe43c534493a40e9b9403cd91a6357514c85 Mon Sep 17 00:00:00 2001 From: "Arnold D. Robbins" Date: Thu, 31 Jul 2014 23:07:09 +0300 Subject: Make sprintf %c work better on Windows (printhuge test) --- builtin.c | 23 ++++++++++++++++++----- 1 file changed, 18 insertions(+), 5 deletions(-) (limited to 'builtin.c') diff --git a/builtin.c b/builtin.c index 7523d6c9..7d314dc5 100644 --- a/builtin.c +++ b/builtin.c @@ -1066,13 +1066,30 @@ check_pos: size_t count; memset(& mbs, 0, sizeof(mbs)); + + /* handle systems with too small wchar_t */ + if (sizeof(wchar_t) < 4 && uval > 0xffff) { + if (do_lint) + lintwarn( + _("[s]printf: value %g is too big for %%c format"), + arg->numbr); + + goto out0; + } + wc = uval; count = wcrtomb(buf, wc, & mbs); if (count == 0 || count == (size_t)-1 - || count == (size_t)-2) + || count == (size_t)-2) { + if (do_lint) + lintwarn( + _("[s]printf: value %g is not a valid wide character"), + arg->numbr); + goto out0; + } memcpy(cpbuf, buf, count); prec = count; @@ -1084,10 +1101,6 @@ out0: /* else, fall through */ #endif - if (do_lint && uval > 255) { - lintwarn("[s]printf: value %g is too big for %%c format", - arg->numbr); - } cpbuf[0] = uval; prec = 1; cp = cpbuf; -- cgit v1.2.3