aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/library.js4
-rwxr-xr-xtests/runner.py13
2 files changed, 15 insertions, 2 deletions
diff --git a/src/library.js b/src/library.js
index 06661d59..d0a556be 100644
--- a/src/library.js
+++ b/src/library.js
@@ -3485,11 +3485,11 @@ LibraryManager.library = {
// http://pubs.opengroup.org/onlinepubs/000095399/functions/printf.html
var result = __formatString(format, varargs);
var limit = (n === undefined) ? result.length
- : Math.min(result.length, n - 1);
+ : Math.min(result.length, Math.max(n - 1, 0));
for (var i = 0; i < limit; i++) {
{{{ makeSetValue('s', 'i', 'result[i]', 'i8') }}};
}
- {{{ makeSetValue('s', 'i', '0', 'i8') }}};
+ if (limit < n) {{{ makeSetValue('s', 'i', '0', 'i8') }}};
return result.length;
},
fprintf__deps: ['fwrite', '_formatString'],
diff --git a/tests/runner.py b/tests/runner.py
index f3289e46..deeb5689 100755
--- a/tests/runner.py
+++ b/tests/runner.py
@@ -4318,6 +4318,19 @@ at function.:blag
'''
self.do_run(src, re.sub('(^|\n)\s+', '\\1', expected))
+ def test_snprintf0(self):
+ src = r'''
+ #include <stdio.h>
+ int main() {
+ int size = snprintf(NULL, 0, "%s %d %.2f\n", "me and myself", 25, 1.345);
+ char buf[size];
+ snprintf(buf, size, "%s %d %.2f\n", "me and myself", 25, 1.345);
+ printf("%d : %s\n", size, buf);
+ return 0;
+ }
+ '''
+ self.do_run(src, '22 : me and myself 25 1.34\n')
+
def test_atoX(self):
if self.emcc_args is None: return self.skip('requires ta2')