aboutsummaryrefslogtreecommitdiffstats
path: root/builtin.c
diff options
context:
space:
mode:
authorArnold D. Robbins <arnold@skeeve.com>2014-07-31 23:07:09 +0300
committerArnold D. Robbins <arnold@skeeve.com>2014-07-31 23:07:09 +0300
commite02ffe43c534493a40e9b9403cd91a6357514c85 (patch)
tree26ab9a0fe1f6794d8c942ddfa53404d2fa358a30 /builtin.c
parent825dd9a1839ca42c4ed6152de41515958e11660d (diff)
downloadegawk-e02ffe43c534493a40e9b9403cd91a6357514c85.tar.gz
egawk-e02ffe43c534493a40e9b9403cd91a6357514c85.tar.bz2
egawk-e02ffe43c534493a40e9b9403cd91a6357514c85.zip
Make sprintf %c work better on Windows (printhuge test)
Diffstat (limited to 'builtin.c')
-rw-r--r--builtin.c23
1 files changed, 18 insertions, 5 deletions
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;