Ejemplo n.º 1
0
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 ;
}
Ejemplo n.º 2
0
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 ;
}
Ejemplo n.º 3
0
Archivo: read.c Proyecto: 99years/plan9
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;
}