]>
git.saurik.com Git - apple/libc.git/blob - stdio/setvbuf.c
e9934a49d2e67b646ad9390188bfb476312bfab6
   2  * Copyright (c) 1999 Apple Computer, Inc. All rights reserved. 
   4  * @APPLE_LICENSE_HEADER_START@ 
   6  * Copyright (c) 1999-2003 Apple Computer, Inc.  All Rights Reserved. 
   8  * This file contains Original Code and/or Modifications of Original Code 
   9  * as defined in and that are subject to the Apple Public Source License 
  10  * Version 2.0 (the 'License'). You may not use this file except in 
  11  * compliance with the License. Please obtain a copy of the License at 
  12  * http://www.opensource.apple.com/apsl/ and read it before using this 
  15  * The Original Code and all software distributed under the License are 
  16  * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER 
  17  * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, 
  18  * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, 
  19  * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. 
  20  * Please see the License for the specific language governing rights and 
  21  * limitations under the License. 
  23  * @APPLE_LICENSE_HEADER_END@ 
  26  * Copyright (c) 1990, 1993 
  27  *      The Regents of the University of California.  All rights reserved. 
  29  * This code is derived from software contributed to Berkeley by 
  32  * Redistribution and use in source and binary forms, with or without 
  33  * modification, are permitted provided that the following conditions 
  35  * 1. Redistributions of source code must retain the above copyright 
  36  *    notice, this list of conditions and the following disclaimer. 
  37  * 2. Redistributions in binary form must reproduce the above copyright 
  38  *    notice, this list of conditions and the following disclaimer in the 
  39  *    documentation and/or other materials provided with the distribution. 
  40  * 3. All advertising materials mentioning features or use of this software 
  41  *    must display the following acknowledgement: 
  42  *      This product includes software developed by the University of 
  43  *      California, Berkeley and its contributors. 
  44  * 4. Neither the name of the University nor the names of its contributors 
  45  *    may be used to endorse or promote products derived from this software 
  46  *    without specific prior written permission. 
  48  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 
  49  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 
  50  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 
  51  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 
  52  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 
  53  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 
  54  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 
  55  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 
  56  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 
  57  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 
  67  * Set one of the three kinds of buffering, optionally including 
  71 setvbuf(fp
, buf
, mode
, size
) 
  77         register int ret
, flags
; 
  82          * Verify arguments.  The `int' limit on `size' is due to this 
  83          * particular implementation.  Note, buf and size are ignored 
  84          * when setting _IONBF. 
  87                 if ((mode 
!= _IOFBF 
&& mode 
!= _IOLBF
) || (int)size 
< 0) 
  91          * Write current buffer, if any.  Discard unread input (including 
  92          * ungetc data), cancel line buffering, and free old buffer if 
  93          * malloc()ed.  We also clear any eof condition, as if this were 
 100         fp
->_r 
= fp
->_lbfsize 
= 0; 
 103                 free((void *)fp
->_bf
._base
); 
 104         flags 
&= ~(__SLBF 
| __SNBF 
| __SMBF 
| __SOPT 
| __SNPT 
| __SEOF
); 
 106         /* If setting unbuffered mode, skip all the hard work. */ 
 111          * Find optimal I/O size for seek optimization.  This also returns 
 112          * a `tty flag' to suggest that we check isatty(fd), but we do not 
 113          * care since our caller told us how to buffer. 
 115         flags 
|= __swhatbuf(fp
, &iosize
, &ttyflag
); 
 117                 buf 
= NULL
;     /* force local allocation */ 
 121         /* Allocate buffer if needed. */ 
 123                 if ((buf 
= malloc(size
)) == NULL
) { 
 125                          * Unable to honor user's request.  We will return 
 126                          * failure, but try again with file system size. 
 129                         if (size 
!= iosize
) { 
 135                         /* No luck; switch to unbuffered I/O. */ 
 137                         fp
->_flags 
= flags 
| __SNBF
; 
 139                         fp
->_bf
._base 
= fp
->_p 
= fp
->_nbuf
; 
 147          * Kill any seek optimization if the buffer is not the 
 150          * SHOULD WE ALLOW MULTIPLES HERE (i.e., ok iff (size % iosize) == 0)? 
 156          * Fix up the FILE fields, and set __cleanup for output flush on 
 157          * exit (since we are buffered in some way). 
 162         fp
->_bf
._base 
= fp
->_p 
= (unsigned char *)buf
; 
 163         fp
->_bf
._size 
= size
; 
 164         /* fp->_lbfsize is still 0 */ 
 167                  * Begin or continue writing: see __swsetup().  Note 
 168                  * that __SNBF is impossible (it was handled earlier). 
 170                 if (flags 
& __SLBF
) { 
 172                         fp
->_lbfsize 
= -fp
->_bf
._size
; 
 176                 /* begin/continue reading, or stay in intermediate state */ 
 179         __cleanup 
= _cleanup
;