diff options
author | max99x <max99x@gmail.com> | 2011-07-13 21:44:19 +0300 |
---|---|---|
committer | max99x <max99x@gmail.com> | 2011-07-13 21:44:19 +0300 |
commit | fcacb4c13c73f2febfa7dabe2ffc70c727ea7762 (patch) | |
tree | 77a6cd18e3152f9ffff3e616ea7105a789d7d24d /src | |
parent | 8ffd5c52cab224dd582d5a1c2973696f41742280 (diff) | |
parent | dc24fffc94606ccb566a3e6bb8dae5543f1ab790 (diff) |
Merge branch 'master' of github.com:max99x/emscripten
Diffstat (limited to 'src')
-rw-r--r-- | src/library.js | 48 | ||||
-rw-r--r-- | src/preamble.js | 8 |
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; |