diff options
Diffstat (limited to 'lib/libc')
-rw-r--r-- | lib/libc/stdio/ftell.c | 33 | ||||
-rw-r--r-- | lib/libc/stdio/ungetc.c | 4 |
2 files changed, 15 insertions, 22 deletions
diff --git a/lib/libc/stdio/ftell.c b/lib/libc/stdio/ftell.c index 93f1f9e..a0b5fa8 100644 --- a/lib/libc/stdio/ftell.c +++ b/lib/libc/stdio/ftell.c @@ -116,35 +116,24 @@ get_real_pos: */ pos -= fp->_r; if (pos < 0) { - if (HASUB(fp)) { - fp->_p -= pos; - fp->_r += pos; - pos = 0; - } else { + fp->_p = fp->_bf._base; + fp->_r = 0; + if (HASUB(fp)) + FREEUB(fp); + if (spos == -1) + goto get_real_pos; + pos = spos; + } else if (HASUB(fp)) { + pos -= fp->_ur; + if (pos < 0) { fp->_p = fp->_bf._base; fp->_r = 0; + FREEUB(fp); if (spos == -1) goto get_real_pos; pos = spos; } } - if (HASUB(fp)) { - pos -= fp->_ur; - if (pos < 0) { - if (-pos <= fp->_r) { - fp->_p -= pos; - fp->_r += pos; - pos = 0; - } else { - fp->_p = fp->_bf._base; - fp->_r = 0; - FREEUB(fp); - if (spos == -1) - goto get_real_pos; - pos = spos; - } - } - } } else if ((fp->_flags & __SWR) && fp->_p != NULL) { /* * Writing. Any buffered characters cause the diff --git a/lib/libc/stdio/ungetc.c b/lib/libc/stdio/ungetc.c index f70fb42..092debd 100644 --- a/lib/libc/stdio/ungetc.c +++ b/lib/libc/stdio/ungetc.c @@ -132,6 +132,10 @@ __ungetc(int c, FILE *fp) } fp->_flags |= __SRD; } + + if (!(fp->_flags & __SSTR) && _ftello(fp) == 0) + return (EOF); + c = (unsigned char)c; /* |