aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/jsifier.js2
-rw-r--r--src/library.js88
2 files changed, 75 insertions, 15 deletions
diff --git a/src/jsifier.js b/src/jsifier.js
index 3f3c4161..34d19107 100644
--- a/src/jsifier.js
+++ b/src/jsifier.js
@@ -755,7 +755,7 @@ function JSify(data, functionsOnly, givenTypes, givenFunctions, givenGlobalVaria
function makeSignOp(value, type, op) {
if (type in Runtime.INT_TYPES) {
var bits = parseInt(type.substr(1));
- return op + 'Sign(' + value + ', ' + type.substr(1) + ')';
+ return op + 'Sign(' + value + ', ' + bits + ')';
} else {
return value;
}
diff --git a/src/library.js b/src/library.js
index c58b6e6c..8a77850f 100644
--- a/src/library.js
+++ b/src/library.js
@@ -289,7 +289,28 @@ var Library = {
};
this.filenames[filename] = stream;
return stream;
- }
+ },
+ open: function(filename) {
+ var stream = _STDIO.filenames[filename];
+ if (!stream) return -1; // assert(false, 'No information for file: ' + filename);
+ var info = _STDIO.streams[stream];
+ info.position = info.error = info.eof = 0;
+ return stream;
+ },
+ read: function(stream, ptr, size) {
+ var info = _STDIO.streams[stream];
+ if (!info) return -1;
+ for (var i = 0; i < size; i++) {
+ if (info.position >= info.data.length) {
+ info.eof = 1;
+ return 0; // EOF
+ }
+ {{{ makeSetValue('ptr', '0', 'info.data[info.position]', 'i8') }}}
+ info.position++;
+ ptr++;
+ }
+ return size;
+ },
},
fopen__deps: ['STDIO'],
@@ -297,11 +318,7 @@ var Library = {
filename = Pointer_stringify(filename);
mode = Pointer_stringify(mode);
if (mode.indexOf('r') >= 0) {
- var stream = _STDIO.filenames[filename];
- if (!stream) return 0; // assert(false, 'No information for file: ' + filename);
- var info = _STDIO.streams[stream];
- info.position = info.error = info.eof = 0;
- return stream;
+ return _STDIO.open(filename);
} else if (mode.indexOf('w') >= 0) {
return _STDIO.prepare(filename);
} else {
@@ -345,11 +362,8 @@ var Library = {
info.eof = 1;
return i;
}
- for (var j = 0; j < size; j++) {
- {{{ makeSetValue('ptr', '0', 'info.data[info.position]', 'null') }}}
- info.position++;
- ptr++;
- }
+ _STDIO.read(stream, ptr, size);
+ ptr += size;
}
return count;
},
@@ -384,6 +398,48 @@ var Library = {
return _STDIO.streams[stream].error;
},
+ // unix file IO, see http://rabbit.eng.miami.edu/info/functions/unixio.html
+
+ open: function(filename, flags, mode) {
+ filename = Pointer_stringify(filename);
+ if (flags === 0) { // RDONLY
+ return _STDIO.open(filename);
+ } else if (flags === 1) { // WRONLY
+ return _STDIO.prepare(filename);
+ } else {
+ assert(false, 'open with odd params: ' + [flags, mode]);
+ }
+ },
+
+ close: function(stream) {
+ return 0;
+ },
+
+ read: function(stream, ptr, numbytes) {
+ return _STDIO.read(stream, ptr, numbytes);
+ },
+
+ fcntl: function() { }, // TODO...
+
+ fstat: function(stream, ptr) {
+ var info = _STDIO.streams[stream];
+ if (!info) return -1;
+ {{{ makeSetValue('ptr', '$struct_stat___FLATTENER[9]', 'info.data.length', 'i32') }}} // st_size. XXX: hardcoded index 9 into the structure.
+ // TODO: other fields
+ return 0;
+ },
+
+ mmap: function(start, num, prot, flags, stream, offset) {
+ // Leaky and non-shared... FIXME
+ var info = _STDIO.streams[stream];
+ if (!info) return -1;
+ return Pointer_make(info.data.slice(offset, offset+num), null, ALLOC_NORMAL);
+ },
+
+ munmap: function(start, num) {
+ _free(start); // FIXME: not really correct at all
+ },
+
// stdlib.h
abs: 'Math.abs',
@@ -392,6 +448,12 @@ var Library = {
return Math.floor(Number(Pointer_stringify(s)));
},
+ exit: function(status) {
+ __shutdownRuntime__();
+ ABORT = true;
+ throw 'exit(' + status + ') called.';
+ },
+
atexit: function(func) {
__ATEXIT__.push(func);
},
@@ -994,9 +1056,7 @@ var Library = {
// setjmp.h
_setjmp: function(env) {
- // not really working...
- assert(!arguments.callee.called);
- arguments.callee.called = true;
+ print('WARNING: setjmp() not really implemented, will fail if longjmp() is actually called');
return 0;
},