diff options
-rw-r--r-- | src/library.js | 48 | ||||
-rw-r--r-- | src/preamble.js | 8 | ||||
-rw-r--r-- | tests/files.cpp | 13 | ||||
-rw-r--r-- | tests/runner.py | 2 |
4 files changed, 61 insertions, 10 deletions
diff --git a/src/library.js b/src/library.js index 3fb268dc..07d177c2 100644 --- a/src/library.js +++ b/src/library.js @@ -19,14 +19,14 @@ var Library = { // ========================================================================== _scanString: function() { - // Supports %x, %4x, %d.%d + // Supports %x, %4x, %d.%d, %s var str = Pointer_stringify(arguments[0]); var stri = 0; var fmt = Pointer_stringify(arguments[1]); var fmti = 0; var args = Array.prototype.slice.call(arguments, 2); var argsi = 0; - var read = 0; + var fields = 0; while (fmti < fmt.length) { if (fmt[fmti] === '%') { fmti++; @@ -37,19 +37,35 @@ var Library = { var curr = 0; while ((curr < max_ || isNaN(max_)) && stri+curr < str.length) { if ((type === 'd' && parseInt(str[stri+curr]) >= 0) || - (type === 'x' && parseInt(str[stri+curr].replace(/[a-fA-F]/, 5)) >= 0)) { + (type === 'x' && parseInt(str[stri+curr].replace(/[a-fA-F]/, 5)) >= 0) || + (type === 's')) { curr++; } else { break; } } - if (curr === 0) { print("FAIL"); break; } + if (curr === 0) return 0; // failure var text = str.substr(stri, curr); stri += curr; - var value = type === 'd' ? parseInt(text) : eval('0x' + text); - {{{ makeSetValue('args[argsi]', '0', 'value', 'i32') }}} + switch (type) { + case 'd': { + {{{ makeSetValue('args[argsi]', '0', 'parseInt(text)', 'i32') }}} + break; + } + case 'x': { + {{{ makeSetValue('args[argsi]', '0', 'eval("0x" + text)', 'i32') }}} + break; + } + case 's': { + var array = intArrayFromString(text); + for (var j = 0; j < array.length; j++) { + {{{ makeSetValue('args[argsi]', 'j', 'array[j]', 'i8') }}} + } + break; + } + } argsi++; - read++; + fields++; } else { // not '%' if (fmt[fmti] === str[stri]) { fmti++; @@ -59,9 +75,12 @@ var Library = { } } } - return read; // XXX Possibly we should return EOF (-1) sometimes + return { fields: fields, bytes: stri }; + }, + sscanf__deps: ['_scanString'], + sscanf: function() { + return __scanString.apply(null, arguments).fields; }, - sscanf: '_scanString', _formatString__deps: ['$STDIO', 'isdigit'], _formatString: function() { @@ -751,6 +770,17 @@ var Library = { return ptr; }, + fscanf__deps: ['_scanString'], + fscanf: function(stream, format) { + var f = STDIO.streams[stream]; + if (!f) + return -1; // EOF + arguments[0] = Pointer_make(f.data.slice(f.position).concat(0), 0, ALLOC_STACK, 'i8'); + var ret = __scanString.apply(null, arguments); + f.position += ret.bytes; + return ret.fields; + }, + // unix file IO, see http://rabbit.eng.miami.edu/info/functions/unixio.html open: function(filename, flags, mode) { diff --git a/src/preamble.js b/src/preamble.js index 5903a5be..151c399d 100644 --- a/src/preamble.js +++ b/src/preamble.js @@ -388,6 +388,14 @@ function Pointer_stringify(ptr) { return ret; } +function Array_stringify(array) { + var ret = ""; + for (var i = 0; i < array.length; i++) { + ret += String.fromCharCode(array[i]); + } + return ret; +} + // Memory management var PAGE_SIZE = 4096; diff --git a/tests/files.cpp b/tests/files.cpp index 1167bbdf..6283c4f1 100644 --- a/tests/files.cpp +++ b/tests/files.cpp @@ -76,6 +76,19 @@ int main() fclose(other); + // fscanf + + outf = fopen("fscan.f", "w"); + fprintf(outf, "10 hello"); + fclose(outf); + + int number; + char text[100]; + inf = fopen("fscan.f", "r"); + num = fscanf(inf, "%d %s", &number, text); + fclose(inf); + printf("fscanfed: %d - %s\n", number, text); + return 0; } diff --git a/tests/runner.py b/tests/runner.py index b49edf38..3d122cd8 100644 --- a/tests/runner.py +++ b/tests/runner.py @@ -2032,7 +2032,7 @@ if 'benchmark' not in sys.argv: other.close() src = open(path_from_root('tests', 'files.cpp'), 'r').read() - self.do_test(src, 'size: 7\ndata: 100,-56,50,25,10,77,123\ninput:hi there!\ntexto\ntexte\n5 : 10,30,20,11,88\nother=some data.\nseeked=me da.\nseeked=ata.\nseeked=ta.', post_build=post) + self.do_test(src, 'size: 7\ndata: 100,-56,50,25,10,77,123\ninput:hi there!\ntexto\ntexte\n5 : 10,30,20,11,88\nother=some data.\nseeked=me da.\nseeked=ata.\nseeked=ta.\nfscanfed: 10 - hello\n', post_build=post) ### 'Big' tests |