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

56 lines
1.1 KiB
C

/* s e t v b u f */
#include "stdiolib.h"
/*LINTLIBRARY*/
int setvbuf F4(register FILE *, fp,
char *, buf,
register int, type,
__stdiosize_t, size)
{
char mybuf; /* buffer allocated by stdio */
if (GETREADPTR(fp) != NULL || GETWRITEPTR(fp) != NULL)
return EOF;
if (TESTFLAG(fp, _IOINSERT)) {
CLEARFLAG(fp, _IOINSERT);
FINSERT(fp);
}
if (type == _IOFBF || type == _IOLBF) {
if (size == 0)
return EOF;
mybuf = 0;
if (buf == NULL) {
if ((buf = (char *) malloc(size)) == NULL)
return EOF;
mybuf = 1;
}
__freebuf(fp);
fp->__base = (__stdiobuf_t *) buf;
fp->__bufsiz = size;
if (mybuf)
SETFLAG(fp, _IOMYBUF);
if (type == _IOLBF)
__Zrlbf = __rlbf;
}
else if (type == _IONBF) {
__freebuf(fp);
fp->__base = &fp->__buf;
fp->__bufsiz = sizeof(fp->__buf);
}
else
return EOF;
CLEARFLAG(fp, (_IOFBF | _IONBF | _IOLBF));
SETFLAG(fp, type);
return 0;
}