Files
oldlinux-files/study/linux-travel/minix-386/estdio21.tar/estdio21/_fgetlx.c
2024-02-19 00:25:23 -05:00

69 lines
1.8 KiB
C

/* _ f g e t l x
*
* Read a line from stream
*
* The line is read from the specified stream into the named
* buffer. At most n-1 characters are read. Reading will stop
* when the buffer is filled, or when a newline character is
* read. The buffer is null terminated. The newline is included
* in the string.
*
* The function returns a pointer to the null terminator at the
* end of the buffer. If no characters were read because of EOF,
* a null pointer is returned.
*/
#include "stdiolib.h"
/*LINTLIBRARY*/
char *__fgetlx F3(char *, buf, __stdiosize_t, n, register FILE *, fp)
{
register __stdiobuf_t *s; /* output buffer */
__stdiobuf_t *r; /* output buffer */
__stdiobuf_t *q; /* input buffer pointer */
int ch; /* character read */
__stdiosize_t bytesleft; /* bytes left in current load */
__stdiosize_t bytesread; /* bytes read */
if (n <= 1)
return n > 0 ? (buf[0] = 0, buf) : (char *) (NULL);
if (GETFLAG(fp, _IOSTDX) == _IOSTDIN && __Zout != NULL &&
(ALLFLAGS(fp) & ALLFLAGS(__Zout) & _IOLBF) != 0)
(void) FFLUSH(__Zout);
for (s = (__stdiobuf_t *) buf, --n; ; ) {
if ((bytesleft = BYTESINREADBUFFER(fp)) != 0) {
if (bytesleft > n)
bytesleft = n;
n -= bytesleft;
q = GETREADPTR(fp);
if ((r = (__stdiobuf_t *) MEMCHR(q, '\n', (size_t) bytesleft)) != NULL)
bytesread = r - q + 1;
else {
bytesread = bytesleft;
bytesleft = 0;
}
MEMCPY(s, q, (size_t) bytesread);
s += bytesread;
SETREADPTR(fp, q + bytesread);
}
*s = 0;
if (bytesleft != 0 || n == 0)
return (char *) (s);
if ((ch = getc(fp)) == EOF)
return s == (__stdiobuf_t *) buf ? (char *) (NULL) : (char *) (s);
if ((*s++ = ch) == '\n' || --n == 0) {
*s = 0;
return (char *) (s);
}
}
}