|
|
1.1 ! root 1: /* ! 2: * libc/stdio/fread.c ! 3: * ANSI-compliant C standard i/o library. ! 4: * fread() ! 5: * ANSI 4.9.8.1. ! 6: * Read nmemb items of given size from stream to ptr. ! 7: */ ! 8: ! 9: #include <stdio.h> ! 10: #include <stdlib.h> ! 11: ! 12: size_t ! 13: fread(ptr, size, nmemb, stream) const __VOID__ *ptr; size_t size, nmemb; register FILE *stream; ! 14: { ! 15: register size_t nb; ! 16: register int c; ! 17: register unsigned char *p; ! 18: ! 19: if ((nb = size*nmemb) == 0) ! 20: return nb; ! 21: p = ptr; ! 22: ! 23: /* Read ungotten character if present. */ ! 24: if (stream->_ff2 & _FUNGOT) { ! 25: *p++ = (*stream->_f2p->_gt)(stream); ! 26: if (--nb == 0) ! 27: return 1; ! 28: } ! 29: ! 30: /* If unbuffered, read() will work, otherwise use getc(). */ ! 31: /* getc() sets _FEOF and _FERR as required, read() does not. */ ! 32: if (stream->_mode == _MODE_FBUF || stream->_mode == _MODE_LBUF) ! 33: for (; nb && (c = getc(stream)) != EOF; nb--) ! 34: *p++ = c; ! 35: else if ((c = read(fileno(stream), p, nb)) > 0) ! 36: nb -= c; ! 37: else if (c == 0) ! 38: stream->_ff1 |= _FEOF; ! 39: else ! 40: stream->_ff1 |= _FERR; ! 41: ! 42: /* Adjust seek after partial read. */ ! 43: if (nb != 0 && nb % size != 0) ! 44: fseek(stream, (long)(nb % size - size), SEEK_CUR); ! 45: ! 46: return (size*nmemb-nb)/size; ! 47: } ! 48: ! 49: /* end of libc/stdio/fread.c */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.