aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--AUTHORS1
-rw-r--r--src/library.js11
-rw-r--r--src/parseTools.js4
-rwxr-xr-xtests/runner.py23
4 files changed, 37 insertions, 2 deletions
diff --git a/AUTHORS b/AUTHORS
index 61b62d70..0fc00f2d 100644
--- a/AUTHORS
+++ b/AUTHORS
@@ -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()