aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/library.js48
-rw-r--r--src/preamble.js8
-rw-r--r--tests/files.cpp13
-rw-r--r--tests/runner.py2
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