1 /* Copyright (C) 2004 Manuel Novoa III <mjn3@codepoet.org>
3 * GNU Library General Public License (LGPL) version 2 or later.
5 * Dedicated to Toni. See uClibc/DEDICATION.mjn3 for details.
10 libc_hidden_proto(fread_unlocked)
14 libc_hidden_proto(memcpy)
15 libc_hidden_proto(fflush_unlocked)
17 size_t fread_unlocked(void * __restrict ptr, size_t size, size_t nmemb,
18 FILE * __restrict stream)
20 __STDIO_STREAM_VALIDATE(stream);
21 assert(stream->__filedes >= -1);
23 /* Note: If nmbem * size > SIZE_MAX then there is an application
24 * bug since no array can be larger than SIZE_MAX in size. */
26 if ((__STDIO_STREAM_IS_NARROW_READING(stream)
27 || !__STDIO_STREAM_TRANS_TO_READ(stream, __FLAG_NARROW))
31 if (nmemb <= (SIZE_MAX / size)) {
32 unsigned char *buffer = (unsigned char *) ptr;
33 size_t todo, bytes, avail;
35 todo = bytes = size * nmemb;
37 /* Check for ungots... */
38 while (stream->__modeflags & __FLAG_UNGOT) {
39 *buffer++ = stream->__ungot[(stream->__modeflags--) & 1];
40 stream->__ungot[1] = 0;
46 #ifdef __STDIO_BUFFERS
47 /* Next check for available buffered... */
48 if ((avail = stream->__bufread - stream->__bufpos) > 0) {
52 memcpy(buffer, stream->__bufpos, avail);
54 stream->__bufpos += avail;
55 if (!(todo -= avail)) {
60 /* We need to read from the host environment, so we must
61 * flush all line buffered streams if the stream is not
63 if (!__STDIO_STREAM_IS_FBF(stream)) {
64 __STDIO_FLUSH_LBF_STREAMS;
68 #ifdef __UCLIBC_MJN3_ONLY__
69 #warning CONSIDER: should we refill and read from the buffer sometimes?
71 while ((avail = __stdio_READ(stream, buffer, todo)) > 0) {
73 if (!(todo -= avail)) {
79 __STDIO_STREAM_VALIDATE(stream);
80 return (bytes - todo) / size;
83 __STDIO_STREAM_SET_ERROR(stream);
87 __STDIO_STREAM_VALIDATE(stream);
90 libc_hidden_def(fread_unlocked)
92 #ifndef __UCLIBC_HAS_THREADS__
93 strong_alias(fread_unlocked,fread)
94 libc_hidden_proto(fread)
95 libc_hidden_def(fread)
98 #elif defined __UCLIBC_HAS_THREADS__
100 size_t fread(void * __restrict ptr, size_t size, size_t nmemb,
101 register FILE * __restrict stream)
104 __STDIO_AUTO_THREADLOCK_VAR;
106 __STDIO_AUTO_THREADLOCK(stream);
108 retval = fread_unlocked(ptr, size, nmemb, stream);
110 __STDIO_AUTO_THREADUNLOCK(stream);
114 libc_hidden_proto(fread)
115 libc_hidden_def(fread)