diff options
author | Alon Zakai <alonzakai@gmail.com> | 2013-07-29 10:43:23 -0700 |
---|---|---|
committer | Alon Zakai <alonzakai@gmail.com> | 2013-07-29 10:43:23 -0700 |
commit | 302a73c0a72c9f0b55dcdcd6f2b8b1eb78220a98 (patch) | |
tree | 2367a8d59ed6851c6e20acd2070d5775f2862f87 /src | |
parent | 0914aca645370e8ff46324d304b8a2acb64567ec (diff) | |
parent | 98a58055fb4f75cc46bd7d3e3eb0b2b65b24bd09 (diff) |
Merge pull request #1370 from inolen/ungetc_fixes
misc ungetc fixes
Diffstat (limited to 'src')
-rw-r--r-- | src/library.js | 52 | ||||
-rw-r--r-- | src/settings.js | 3 |
2 files changed, 29 insertions, 26 deletions
diff --git a/src/library.js b/src/library.js index e650a545..9a1f29e5 100644 --- a/src/library.js +++ b/src/library.js @@ -1805,11 +1805,6 @@ LibraryManager.library = { return 0; } else { var bytesRead = 0; - while (stream.ungotten.length && nbyte > 0) { - {{{ makeSetValue('buf++', '0', 'stream.ungotten.pop()', 'i8') }}} - nbyte--; - bytesRead++; - } var contents = stream.object.contents; var size = Math.min(contents.length - offset, nbyte); assert(size >= 0); @@ -1853,11 +1848,6 @@ LibraryManager.library = { if (stream.object.isDevice) { if (stream.object.input) { bytesRead = 0; - while (stream.ungotten.length && nbyte > 0) { - {{{ makeSetValue('buf++', '0', 'stream.ungotten.pop()', 'i8') }}} - nbyte--; - bytesRead++; - } for (var i = 0; i < nbyte; i++) { try { var result = stream.object.input(); @@ -1879,11 +1869,10 @@ LibraryManager.library = { return -1; } } else { - var ungotSize = stream.ungotten.length; bytesRead = _pread(fildes, buf, nbyte, stream.position); assert(bytesRead >= -1); if (bytesRead != -1) { - stream.position += (stream.ungotten.length - ungotSize) + bytesRead; + stream.position += bytesRead; } return bytesRead; } @@ -3243,7 +3232,7 @@ LibraryManager.library = { return -1; } }, - fgetc__deps: ['$FS', 'read'], + fgetc__deps: ['$FS', 'fread'], fgetc__postset: '_fgetc.ret = allocate([0], "i8", ALLOC_STATIC);', fgetc: function(stream) { // int fgetc(FILE *stream); @@ -3251,7 +3240,7 @@ LibraryManager.library = { if (!FS.streams[stream]) return -1; var streamObj = FS.streams[stream]; if (streamObj.eof || streamObj.error) return -1; - var ret = _read(stream, _fgetc.ret, 1); + var ret = _fread(_fgetc.ret, 1, 1, stream); if (ret == 0) { streamObj.eof = true; return -1; @@ -3413,16 +3402,24 @@ LibraryManager.library = { // size_t fread(void *restrict ptr, size_t size, size_t nitems, FILE *restrict stream); // http://pubs.opengroup.org/onlinepubs/000095399/functions/fread.html var bytesToRead = nitems * size; - if (bytesToRead == 0) return 0; - var bytesRead = _read(stream, ptr, bytesToRead); + if (bytesToRead == 0) { + return 0; + } + var bytesRead = 0; var streamObj = FS.streams[stream]; - if (bytesRead == -1) { + while (streamObj.ungotten.length && bytesToRead > 0) { + {{{ makeSetValue('ptr++', '0', 'streamObj.ungotten.pop()', 'i8') }}} + bytesToRead--; + bytesRead++; + } + var err = _read(stream, ptr, bytesToRead); + if (err == -1) { if (streamObj) streamObj.error = true; return 0; - } else { - if (bytesRead < bytesToRead) streamObj.eof = true; - return Math.floor(bytesRead / size); } + bytesRead += err; + if (bytesRead < bytesToRead) streamObj.eof = true; + return Math.floor(bytesRead / size); }, freopen__deps: ['$FS', 'fclose', 'fopen', '__setErrNo', '$ERRNO_CODES'], freopen: function(filename, mode, stream) { @@ -3635,13 +3632,18 @@ LibraryManager.library = { ungetc: function(c, stream) { // int ungetc(int c, FILE *stream); // http://pubs.opengroup.org/onlinepubs/000095399/functions/ungetc.html - if (FS.streams[stream]) { - c = unSign(c & 0xFF); - FS.streams[stream].ungotten.push(c); - return c; - } else { + stream = FS.streams[stream]; + if (!stream) { return -1; } + if (c === {{{ cDefine('EOF') }}}) { + // do nothing for EOF character + return c; + } + c = unSign(c & 0xFF); + stream.ungotten.push(c); + stream.eof = false; + return c; }, system__deps: ['__setErrNo', '$ERRNO_CODES'], system: function(command) { diff --git a/src/settings.js b/src/settings.js index b7460cf2..52e4eeb0 100644 --- a/src/settings.js +++ b/src/settings.js @@ -1289,6 +1289,7 @@ var C_DEFINES = {'SI_MESGQ': '5', 'SOCK_STREAM': '200', 'SOCK_DGRAM': '20', 'IPPROTO_TCP': '1', - 'IPPROTO_UDP': '2' + 'IPPROTO_UDP': '2', + 'EOF': '-1' }; |