size_t _RTL_FUNC fread(void *buf, size_t size, size_t count, FILE *stream) { int i = 0,rv, num = size * count; char *out = (char *)buf ; if (stream->token != FILTOK) { errno = _dos_errno = ENOENT; return 0; } if (!(stream->flags & _F_READ)) { stream->flags |= _F_ERR; errno = EFAULT; return 0; } if (stream == stdin) fflush(stdout); if (!(stream->flags & _F_IN)) { if (stream->flags & _F_OUT) { if (fflush(stream)) return 0; } stream->flags &= ~_F_OUT; stream->flags |= _F_IN; stream->level = 0; } if (stream->flags & _F_EOF) return 0; if (num == 0) return 0 ; if (stream->hold) { out[i++] = stream->hold ; stream->hold = 0; } for (;i < num;) { if (--stream->level <= 0) { if (stream->flags & _F_BUFFEREDSTRING) { stream->flags |= _F_EOF ; break ; } rv = _readbuf(stream); if (rv) break ; } rv = *stream->curp++ ; stream->hold = 0 ; if (rv != '\r' || (stream->flags & _F_BIN)) out[i++] = rv ; } return i / size ; }
int _RTL_FUNC fgetc(FILE *stream) { int rv; if (stream->token != FILTOK) { errno = _dos_errno = ENOENT; return EOF; } if (!(stream->flags & _F_READ)) { stream->flags |= _F_ERR; errno = EFAULT; return EOF; } if (stream == stdin) fflush(stdout); if (!(stream->flags & _F_IN)) { if (stream->flags & _F_OUT) { if (fflush(stream)) return EOF; } stream->flags &= ~_F_OUT; stream->flags |= _F_IN; stream->level = 0; } if (stream->flags & _F_EOF) return EOF; if (stream->hold) { rv = stream->hold; stream->hold = 0; return rv; } do { if (--stream->level <= 0) { if (stream->flags & _F_BUFFEREDSTRING) { stream->flags |= _F_EOF ; return EOF ; } rv = _readbuf(stream); if (rv) return rv; } rv = *stream->curp++ ; stream->hold = 0 ; } while (rv == '\r' && !(stream->flags & _F_BIN)) ; return rv ; }
ssize_t read(int d, void *buf, size_t nbytes) { int n, noblock, isbuf; Fdinfo *f; if(d<0 || d>=OPEN_MAX || !(_fdinfo[d].flags&FD_ISOPEN)){ errno = EBADF; return -1; } if(nbytes <= 0) return 0; if(buf == 0){ errno = EFAULT; return -1; } f = &_fdinfo[d]; noblock = f->oflags&O_NONBLOCK; isbuf = f->flags&(FD_BUFFERED|FD_BUFFEREDX); if(noblock || isbuf){ if(f->flags&FD_BUFFEREDX) { errno = EIO; return -1; } if(!isbuf) { if(_startbuf(d) != 0) { errno = EIO; return -1; } } n = _readbuf(d, buf, nbytes, noblock); }else{ n = _READ(d, buf, nbytes); if(n < 0) _syserrno(); } return n; }