diff options
author | Manuel Wellmann <manuel.wellmann@autodesk.com> | 2012-10-18 11:06:15 +0200 |
---|---|---|
committer | Manuel Wellmann <manuel.wellmann@autodesk.com> | 2012-11-05 18:00:29 +0100 |
commit | 1365ac6abc04af43100cfa5b763ee81412af76a0 (patch) | |
tree | e87a41e3cc7e5abdf259c72955e087217b30af0f | |
parent | 1687c90b286d2e7c1fe1aa2acfa68397a4dfacfb (diff) |
Added %lld support to __scanString
Also extended makeSetValue for the i64/typed_array=2 case.
-rw-r--r-- | AUTHORS | 1 | ||||
-rw-r--r-- | src/library.js | 11 | ||||
-rw-r--r-- | src/parseTools.js | 4 | ||||
-rwxr-xr-x | tests/runner.py | 23 |
4 files changed, 37 insertions, 2 deletions
@@ -39,3 +39,4 @@ a license to everyone to use it as detailed in LICENSE.) * Janus Troelsen <janus.troelsen@stud.tu-darmstadt.de> * Lars Schneider <lars.schneider@autodesk.com> (copyright owned by Autodesk, Inc.) * Joel Martin <github@martintribe.org> +* Manuel Wellmann <manuel.wellmann@autodesk.com> (copyright owned by Autodesk, Inc.)
\ No newline at end of file diff --git a/src/library.js b/src/library.js index 207d6e39..c3f7c600 100644 --- a/src/library.js +++ b/src/library.js @@ -2434,7 +2434,7 @@ LibraryManager.library = { __scanString.whiteSpace['\t'] = 1; __scanString.whiteSpace['\n'] = 1; } - // Supports %x, %4x, %d.%d, %s, %f, %lf. + // Supports %x, %4x, %d.%d, %lld, %s, %f, %lf. // TODO: Support all format specifiers. format = Pointer_stringify(format); var soFar = 0; @@ -2485,9 +2485,14 @@ LibraryManager.library = { } var long_ = false; var half = false; + var longLong = false; if (format[formatIndex] == 'l') { long_ = true; formatIndex++; + if(format[formatIndex] == 'l') { + longLong = true; + formatIndex++; + } } else if (format[formatIndex] == 'h') { half = true; formatIndex++; @@ -2498,7 +2503,7 @@ LibraryManager.library = { var buffer = []; // Read characters according to the format. floats are trickier, they may be in an unfloat state in the middle, then be a valid float later if (type == 'f') { - var last = -1; + var last = 0; while (next > 0) { buffer.push(String.fromCharCode(next)); if (__isFloat(buffer.join(''))) { @@ -2539,6 +2544,8 @@ LibraryManager.library = { case 'd': case 'u': case 'i': if (half) { {{{ makeSetValue('argPtr', 0, 'parseInt(text, 10)', 'i16') }}}; + } else if(longLong) { + {{{ makeSetValue('argPtr', 0, 'parseInt(text, 10)', 'i64') }}}; } else { {{{ makeSetValue('argPtr', 0, 'parseInt(text, 10)', 'i32') }}}; } diff --git a/src/parseTools.js b/src/parseTools.js index 5d7420ef..2cdea7c0 100644 --- a/src/parseTools.js +++ b/src/parseTools.js @@ -1005,6 +1005,10 @@ function makeSetValue(ptr, pos, value, type, noNeedFirst, ignore, align, noSafe, return '(tempDoubleF64[0]=' + value + ',' + makeSetValue(ptr, pos, 'tempDoubleI32[0]', 'i32', noNeedFirst, ignore, align, noSafe, ',') + ',' + makeSetValue(ptr, getFastValue(pos, '+', Runtime.getNativeTypeSize('i32')), 'tempDoubleI32[1]', 'i32', noNeedFirst, ignore, align, noSafe, ',') + ')'; + } else if (USE_TYPED_ARRAYS == 2 && type == 'i64') { + return '(tempI64 = [' + splitI64(value) + '],' + + makeSetValue(ptr, pos, 'tempI64[0]', 'i32', noNeedFirst, ignore, align, noSafe, ',') + ',' + + makeSetValue(ptr, getFastValue(pos, '+', Runtime.getNativeTypeSize('i32')), 'tempI64[1]', 'i32', noNeedFirst, ignore, align, noSafe, ',') + ')'; } var bits = getBits(type); diff --git a/tests/runner.py b/tests/runner.py index bc2a4f7d..1e5841a4 100755 --- a/tests/runner.py +++ b/tests/runner.py @@ -4407,6 +4407,29 @@ Pass: 0.000012 0.000012''') ''' self.do_run(src, '''0:173,16 1:16,173 2:183,173 3:17,287 4:98,123''') + def test_sscanf_3(self): + # i64 + if not Settings.USE_TYPED_ARRAYS == 2: return self.skip('64-bit sscanf only supported in ta2') + src = r''' + #include <stdio.h> + + int main(){ + + int64_t s, m, l; + printf("%d\n", sscanf("123 1073741823 1125899906842620", "%lld %lld %lld", &s, &m, &l)); + printf("%lld,%lld,%lld\n", s, m, l); + + int64_t negS, negM, negL; + printf("%d\n", sscanf("-123 -1073741823 -1125899906842620", "%lld %lld %lld", &negS, &negM, &negL)); + printf("%lld,%lld,%lld\n", negS, negM, negL); + + return 0; + } + ''' + + self.do_run(src, '3\n123,1073741823,1125899906842620\n' + + '3\n-123,-1073741823,-1125899906842620\n') + def test_langinfo(self): src = open(path_from_root('tests', 'langinfo', 'test.c'), 'r').read() expected = open(path_from_root('tests', 'langinfo', 'output.txt'), 'r').read() |