54 lines
1.1 KiB
C
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;
|
|
}
|