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

54 lines
1.1 KiB
C

/* _ a l l o c b u f */
/* Malloc a buffer for a stream. Unbuffered streams use the built
* in buffers. Streams connected to terminals use small buffers.
*/
#include "stdiolib.h"
/*LINTLIBRARY*/
__stdiosize_t __allocbuf F1(register FILE *,fp)
{
register int i; /* pool scanner */
if (! TESTFLAG(fp, _IONBF)) {
fp->__bufsiz = BUFSIZ;
if (isatty(fileno(fp))) {
fp->__bufsiz = TTYBUFSIZ;
if (TESTFLAG(fp, _IOWRITE))
SETFLAG(fp, _IOLBF);
}
#if TTYBUFSIZ > BUFSIZ
<< TTYBUFSIZE overruns BUFSIZ for buffer pool >>
#endif
for (i = 0; i < POOLSIZE; i++) {
if (__iob[i] != NULL) {
fp->__base = __iob[i];
__iob[i] = NULL;
SETFLAG(fp, _IOPOOLBUF);
goto Gotbuffer;
}
}
if ((fp->__base = (__stdiobuf_t *) malloc(BUFSIZ)) != NULL)
SETFLAG(fp, _IOMYBUF);
else {
CLEARFLAG(fp, (_IOFBF | _IOLBF));
SETFLAG(fp, _IONBF);
}
}
if (TESTFLAG(fp, _IONBF)) {
fp->__base = &fp->__buf;
fp->__bufsiz = sizeof(fp->__buf);
}
Gotbuffer:
return fp->__bufsiz;
}