aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authormax99x <max99x@gmail.com>2011-07-13 21:44:19 +0300
committermax99x <max99x@gmail.com>2011-07-13 21:44:19 +0300
commitfcacb4c13c73f2febfa7dabe2ffc70c727ea7762 (patch)
tree77a6cd18e3152f9ffff3e616ea7105a789d7d24d /src
parent8ffd5c52cab224dd582d5a1c2973696f41742280 (diff)
parentdc24fffc94606ccb566a3e6bb8dae5543f1ab790 (diff)
Merge branch 'master' of github.com:max99x/emscripten
Diffstat (limited to 'src')
-rw-r--r--src/library.js48
-rw-r--r--src/preamble.js8
2 files changed, 47 insertions, 9 deletions
diff --git a/src/library.js b/src/library.js
index fb14580d..c831c9bc 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() {
@@ -752,6 +771,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;