/ include / _stdio.h
_stdio.h
  1  /*
  2   * Copyright (c) 2000, 2005, 2007, 2009, 2010 Apple Inc. All rights reserved.
  3   *
  4   * @APPLE_LICENSE_HEADER_START@
  5   *
  6   * This file contains Original Code and/or Modifications of Original Code
  7   * as defined in and that are subject to the Apple Public Source License
  8   * Version 2.0 (the 'License'). You may not use this file except in
  9   * compliance with the License. Please obtain a copy of the License at
 10   * http://www.opensource.apple.com/apsl/ and read it before using this
 11   * file.
 12   *
 13   * The Original Code and all software distributed under the License are
 14   * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
 15   * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
 16   * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
 17   * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
 18   * Please see the License for the specific language governing rights and
 19   * limitations under the License.
 20   *
 21   * @APPLE_LICENSE_HEADER_END@
 22   */
 23  /*-
 24   * Copyright (c) 1990, 1993
 25   *	The Regents of the University of California.  All rights reserved.
 26   *
 27   * This code is derived from software contributed to Berkeley by
 28   * Chris Torek.
 29   *
 30   * Redistribution and use in source and binary forms, with or without
 31   * modification, are permitted provided that the following conditions
 32   * are met:
 33   * 1. Redistributions of source code must retain the above copyright
 34   *    notice, this list of conditions and the following disclaimer.
 35   * 2. Redistributions in binary form must reproduce the above copyright
 36   *    notice, this list of conditions and the following disclaimer in the
 37   *    documentation and/or other materials provided with the distribution.
 38   * 3. All advertising materials mentioning features or use of this software
 39   *    must display the following acknowledgement:
 40   *	This product includes software developed by the University of
 41   *	California, Berkeley and its contributors.
 42   * 4. Neither the name of the University nor the names of its contributors
 43   *    may be used to endorse or promote products derived from this software
 44   *    without specific prior written permission.
 45   *
 46   * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
 47   * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 48   * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 49   * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
 50   * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 51   * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
 52   * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 53   * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 54   * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
 55   * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 56   * SUCH DAMAGE.
 57   *
 58   *	@(#)stdio.h	8.5 (Berkeley) 4/29/95
 59   */
 60  
 61  /*
 62   * Common header for stdio.h and xlocale/_stdio.h
 63   */
 64  
 65  #ifndef	__STDIO_H_
 66  #define	__STDIO_H_
 67  
 68  #include <sys/cdefs.h>
 69  #include <Availability.h>
 70  
 71  #include <_types.h>
 72  
 73  /* DO NOT REMOVE THIS COMMENT: fixincludes needs to see:
 74   * __gnuc_va_list and include <stdarg.h> */
 75  #include <sys/_types/_va_list.h>
 76  #include <sys/_types/_size_t.h>
 77  #include <sys/_types/_null.h>
 78  
 79  #ifndef UNIFDEF_DRIVERKIT
 80  #include <sys/stdio.h>
 81  
 82  typedef __darwin_off_t		fpos_t;
 83  
 84  #define	_FSTDIO			/* Define for new stdio with functions. */
 85  
 86  /*
 87   * NB: to fit things in six character monocase externals, the stdio
 88   * code uses the prefix `__s' for stdio objects, typically followed
 89   * by a three-character attempt at a mnemonic.
 90   */
 91  
 92  /* stdio buffers */
 93  struct __sbuf {
 94  	unsigned char	*_base;
 95  	int		_size;
 96  };
 97  
 98  /* hold a buncha junk that would grow the ABI */
 99  struct __sFILEX;
100  
101  /*
102   * stdio state variables.
103   *
104   * The following always hold:
105   *
106   *	if (_flags&(__SLBF|__SWR)) == (__SLBF|__SWR),
107   *		_lbfsize is -_bf._size, else _lbfsize is 0
108   *	if _flags&__SRD, _w is 0
109   *	if _flags&__SWR, _r is 0
110   *
111   * This ensures that the getc and putc macros (or inline functions) never
112   * try to write or read from a file that is in `read' or `write' mode.
113   * (Moreover, they can, and do, automatically switch from read mode to
114   * write mode, and back, on "r+" and "w+" files.)
115   *
116   * _lbfsize is used only to make the inline line-buffered output stream
117   * code as compact as possible.
118   *
119   * _ub, _up, and _ur are used when ungetc() pushes back more characters
120   * than fit in the current _bf, or when ungetc() pushes back a character
121   * that does not match the previous one in _bf.  When this happens,
122   * _ub._base becomes non-nil (i.e., a stream has ungetc() data iff
123   * _ub._base!=NULL) and _up and _ur save the current values of _p and _r.
124   *
125   * NB: see WARNING above before changing the layout of this structure!
126   */
127  typedef	struct __sFILE {
128  	unsigned char *_p;	/* current position in (some) buffer */
129  	int	_r;		/* read space left for getc() */
130  	int	_w;		/* write space left for putc() */
131  	short	_flags;		/* flags, below; this FILE is free if 0 */
132  	short	_file;		/* fileno, if Unix descriptor, else -1 */
133  	struct	__sbuf _bf;	/* the buffer (at least 1 byte, if !NULL) */
134  	int	_lbfsize;	/* 0 or -_bf._size, for inline putc */
135  
136  	/* operations */
137  	void	*_cookie;	/* cookie passed to io functions */
138  	int	(* _Nullable _close)(void *);
139  	int	(* _Nullable _read) (void *, char *, int);
140  	fpos_t	(* _Nullable _seek) (void *, fpos_t, int);
141  	int	(* _Nullable _write)(void *, const char *, int);
142  
143  	/* separate buffer for long sequences of ungetc() */
144  	struct	__sbuf _ub;	/* ungetc buffer */
145  	struct __sFILEX *_extra; /* additions to FILE to not break ABI */
146  	int	_ur;		/* saved _r when _r is counting ungetc data */
147  
148  	/* tricks to meet minimum requirements even when malloc() fails */
149  	unsigned char _ubuf[3];	/* guarantee an ungetc() buffer */
150  	unsigned char _nbuf[1];	/* guarantee a getc() buffer */
151  
152  	/* separate buffer for fgetln() when line crosses buffer boundary */
153  	struct	__sbuf _lb;	/* buffer for fgetln() */
154  
155  	/* Unix stdio files get aligned to block boundaries on fseek() */
156  	int	_blksize;	/* stat.st_blksize (may be != _bf._size) */
157  	fpos_t	_offset;	/* current lseek offset (see WARNING) */
158  } FILE;
159  #endif /* UNIFDEF_DRIVERKIT */
160  
161  #endif /* __STDIO_H_ */