diff options
author | Jason Merrill <jason@gcc.gnu.org> | 1997-08-21 18:57:35 -0400 |
---|---|---|
committer | Jason Merrill <jason@gcc.gnu.org> | 1997-08-21 18:57:35 -0400 |
commit | 6599da043e22e96ac830fb50a61c1b6d95d1b142 (patch) | |
tree | a3b19970338bdae580faff126a716e1d5520400c /libio/iosetvbuf.c | |
parent | 8975416cfb6269ad94b6330d42960cca8b0925b7 (diff) | |
download | gcc-6599da043e22e96ac830fb50a61c1b6d95d1b142.zip gcc-6599da043e22e96ac830fb50a61c1b6d95d1b142.tar.gz gcc-6599da043e22e96ac830fb50a61c1b6d95d1b142.tar.bz2 |
Initial revision
From-SVN: r14877
Diffstat (limited to 'libio/iosetvbuf.c')
-rw-r--r-- | libio/iosetvbuf.c | 78 |
1 files changed, 78 insertions, 0 deletions
diff --git a/libio/iosetvbuf.c b/libio/iosetvbuf.c new file mode 100644 index 0000000..1b2da4f --- /dev/null +++ b/libio/iosetvbuf.c @@ -0,0 +1,78 @@ +/* +Copyright (C) 1993 Free Software Foundation + +This file is part of the GNU IO Library. This library is free +software; you can redistribute it and/or modify it under the +terms of the GNU General Public License as published by the +Free Software Foundation; either version 2, or (at your option) +any later version. + +This library is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this library; see the file COPYING. If not, write to the Free +Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +As a special exception, if you link this library with files +compiled with a GNU compiler to produce an executable, this does not cause +the resulting executable to be covered by the GNU General Public License. +This exception does not however invalidate any other reasons why +the executable file might be covered by the GNU General Public License. */ + +#include "libioP.h" + +#define _IOFBF 0 /* Fully buffered. */ +#define _IOLBF 1 /* Line buffered. */ +#define _IONBF 2 /* No buffering. */ + +int +DEFUN(_IO_setvbuf, (fp, buf, mode, size), + _IO_FILE* fp AND char* buf AND int mode AND _IO_size_t size) +{ + CHECK_FILE(fp, EOF); + switch (mode) + { + case _IOFBF: + fp->_IO_file_flags &= ~_IO_LINE_BUF|_IO_UNBUFFERED; + if (buf == NULL) + { + if (fp->_IO_buf_base == NULL) + { + /* There is no flag to distinguish between "fully buffered + mode has been explicitly set" as opposed to "line + buffering has not been explicitly set". In both + cases, _IO_LINE_BUF is off. If this is a tty, and + _IO_filedoalloc later gets called, it cannot know if + it should set the _IO_LINE_BUF flag (because that is + the default), or not (because we have explicitly asked + for fully buffered mode). So we make sure a buffer + gets allocated now, and explicitly turn off line + buffering. + + A possibly cleaner alternative would be to add an + extra flag, but then flags are a finite resource. */ + if (_IO_DOALLOCATE (fp) < 0) + return EOF; + fp->_IO_file_flags &= ~_IO_LINE_BUF; + } + return 0; + } + break; + case _IOLBF: + fp->_IO_file_flags &= ~_IO_UNBUFFERED; + fp->_IO_file_flags |= _IO_LINE_BUF; + if (buf == NULL) + return 0; + break; + case _IONBF: + buf = NULL; + size = 0; + break; + default: + return EOF; + } + return _IO_SETBUF (fp, buf, size) == NULL ? EOF : 0; +} |