* Copyright (c) 1990 The Regents of the University of California.
* This code is derived from software contributed to Berkeley by
* %sccs.include.redist.c%
#if defined(LIBC_SCCS) && !defined(lint)
static char sccsid
[] = "@(#)setvbuf.c 5.3 (Berkeley) %G%";
#endif /* LIBC_SCCS and not lint */
* Set one of the three kinds of buffering, optionally including
setvbuf(fp
, buf
, mode
, size
)
* Verify arguments. The `int' limit on `size' is due to this
* particular implementation.
if ((mode
!= _IOFBF
&& mode
!= _IOLBF
&& mode
!= _IONBF
) ||
* Write current buffer, if any; drop read count, if any.
* Make sure putc() will not think fp is line buffered.
* Free old buffer if it was from malloc(). Clear line and
* non buffer flags, and clear malloc flag.
free((void *)fp
->_bf
._base
);
fp
->_flags
&= ~(__SLBF
|__SNBF
|__SMBF
);
* Now put back whichever flag is needed, and fix _lbfsize
* if line buffered. Ensure output flush on exit if the
* stream will be buffered at all.
fp
->_bf
._base
= fp
->_p
= fp
->_nbuf
;
fp
->_bf
._base
= fp
->_p
= (unsigned char *)buf
;
* Patch up write count if necessary.
fp
->_w
= fp
->_flags
& (__SLBF
|__SNBF
) ? 0 : size
;