Files
seta75D 7c4988eac0 Init
2021-10-11 19:38:01 -03:00

78 lines
1.5 KiB
C
Executable File

/* Copyright (c) 1988 AT&T */
/* All Rights Reserved */
/* THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF AT&T */
/* The copyright notice above does not evidence any */
/* actual or intended publication of such source code. */
#ident "@(#)_filbuf.c 1.7 92/07/14 SMI" /* SVr4.0 1.8 */
/*LINTLIBRARY*/
#ifdef __STDC__
#pragma weak _filbuf = __filbuf
#endif
#include "synonyms.h"
#include "shlib.h"
#include <stdio.h>
#include <errno.h>
#include "stdiom.h"
extern int read();
int
_filbuf(iop) /* fill buffer, return first character or EOF */
register FILE *iop;
{
register int res;
register unsigned nbyte;
register Uchar *endbuf;
if (!(iop->_flag & _IOREAD)) /* check, correct permissions */
{
if (iop->_flag & _IORW)
iop->_flag |= _IOREAD; /* change direction to read - fseek */
else {
errno = EBADF;
return EOF;
}
}
if (iop->_base == 0)
{
if ((endbuf = _findbuf(iop)) == 0) /* get buffer and end_of_buffer*/
return EOF;
}
else
endbuf = _bufend(iop);
/*
* Flush all line-buffered streams before we
* read no-buffered or line-buffered input.
*/
if (iop->_flag & (_IONBF | _IOLBF))
_flushlbf();
/*
* Fill buffer or read 1 byte for unbuffered, handling any errors.
*/
iop->_ptr = iop->_base;
if (iop->_flag & _IONBF)
nbyte = 1;
else
nbyte = endbuf - iop->_base;
if ((res = read(iop->_file, (char *)iop->_base, nbyte)) > 0)
{
iop->_cnt = res - 1;
return *iop->_ptr++;
}
else
{
iop->_cnt = 0;
if (res == 0)
iop->_flag |= _IOEOF;
else
iop->_flag |= _IOERR;
return EOF;
}
}