aboutsummaryrefslogtreecommitdiff
path: root/libio/fileops.c
diff options
context:
space:
mode:
Diffstat (limited to 'libio/fileops.c')
-rw-r--r--libio/fileops.c106
1 files changed, 49 insertions, 57 deletions
diff --git a/libio/fileops.c b/libio/fileops.c
index d184916..c75accd 100644
--- a/libio/fileops.c
+++ b/libio/fileops.c
@@ -775,80 +775,72 @@ _IO_file_xsputn (f, data, n)
return n - to_do;
}
-#if 0
-/* Work in progress */
_IO_size_t
_IO_file_xsgetn (fp, data, n)
_IO_FILE *fp;
void *data;
_IO_size_t n;
{
- register _IO_size_t more = n;
+ register _IO_size_t want, have, count;
register char *s = data;
- for (;;)
+
+ want = n;
+
+ while (want > 0)
{
- /* Data available. */
- _IO_ssize_t count = fp->_IO_read_end - fp->_IO_read_ptr;
- if (count > 0)
+ have = fp->_IO_read_end - fp->_IO_read_ptr;
+ if (want <= have)
{
- if (count > more)
- count = more;
- if (count > 20)
+ memcpy (s, fp->_IO_read_ptr, want);
+ fp->_IO_read_ptr += want;
+ want = 0;
+ }
+ else
+ {
+ if (have > 0)
{
-#ifdef _LIBC
- s = __mempcpy (s, fp->_IO_read_ptr, count);
-#else
- memcpy (s, fp->_IO_read_ptr, count);
- s += count;
-#endif
- fp->_IO_read_ptr += count;
+ memcpy (s, fp->_IO_read_ptr, have);
+ want -= have;
+ s += have;
+ fp->_IO_read_ptr += have;
}
- else if (count <= 0)
- count = 0;
- else
+
+ /* Check for backup and repeat */
+ if (_IO_in_backup (fp))
{
- register char *p = fp->_IO_read_ptr;
- register int i = (int) count;
- while (--i >= 0)
- *s++ = *p++;
- fp->_IO_read_ptr = p;
- }
- more -= count;
- }
-#if 0
- if (! _IO_in put_mode (fp)
- && ! _IO_have_markers (fp) && ! IO_have_backup (fp))
- {
- /* This is an optimization of _IO_file_underflow */
- if (fp->_flags & _IO_NO_READS)
- break;
- /* If we're reading a lot of data, don't bother allocating
- a buffer. But if we're only reading a bit, perhaps we should ??*/
- if (count <= 512 && fp->_IO_buf_base == NULL)
- _IO_doallocbuf (fp);
- if (fp->_flags & (_IO_LINE_BUF|_IO_UNBUFFERED))
- _IO_flush_all_linebuffered ();
-
- _IO_switch_to_get_mode (fp); ???;
- count = _IO_SYSREAD (fp, s, more);
+ _IO_switch_to_main_get_area (fp);
+ continue;
+ }
+
+ /* If we now want less than a buffer, underflow and repeat
+ the copy. Otherwise, _IO_SYSREAD directly to
+ the user buffer. */
+ if (fp->_IO_buf_base && want < fp->_IO_buf_end - fp->_IO_buf_base)
+ {
+ if (__underflow (fp) == EOF)
+ break;
+
+ continue;
+ }
+
+ count = _IO_SYSREAD (fp, s, want);
if (count <= 0)
- {
- if (count == 0)
- fp->_flags |= _IO_EOF_SEEN;
- else
- fp->_flags |= _IO_ERR_SEEN, count = 0;
- }
+ {
+ if (count == 0)
+ fp->_flags |= _IO_EOF_SEEN;
+ else
+ fp->_flags |= _IO_ERR_SEEN;
+
+ break;
+ }
s += count;
- more -= count;
+ want -= count;
}
-#endif
- if (more == 0 || __underflow (fp) == EOF)
- break;
}
- return n - more;
+
+ return n - want;
}
-#endif
struct _IO_jump_t _IO_file_jumps =
{
@@ -859,7 +851,7 @@ struct _IO_jump_t _IO_file_jumps =
JUMP_INIT(uflow, _IO_default_uflow),
JUMP_INIT(pbackfail, _IO_default_pbackfail),
JUMP_INIT(xsputn, _IO_file_xsputn),
- JUMP_INIT(xsgetn, _IO_default_xsgetn),
+ JUMP_INIT(xsgetn, _IO_file_xsgetn),
JUMP_INIT(seekoff, _IO_file_seekoff),
JUMP_INIT(seekpos, _IO_default_seekpos),
JUMP_INIT(setbuf, _IO_file_setbuf),