aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAlon Zakai <alonzakai@gmail.com>2013-07-29 10:43:23 -0700
committerAlon Zakai <alonzakai@gmail.com>2013-07-29 10:43:23 -0700
commit302a73c0a72c9f0b55dcdcd6f2b8b1eb78220a98 (patch)
tree2367a8d59ed6851c6e20acd2070d5775f2862f87 /src
parent0914aca645370e8ff46324d304b8a2acb64567ec (diff)
parent98a58055fb4f75cc46bd7d3e3eb0b2b65b24bd09 (diff)
Merge pull request #1370 from inolen/ungetc_fixes
misc ungetc fixes
Diffstat (limited to 'src')
-rw-r--r--src/library.js52
-rw-r--r--src/settings.js3
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'
};