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 #include <sys/stdio.h>
80 
81 typedef __darwin_off_t		fpos_t;
82 
83 #define	_FSTDIO			/* Define for new stdio with functions. */
84 
85 /*
86  * NB: to fit things in six character monocase externals, the stdio
87  * code uses the prefix `__s' for stdio objects, typically followed
88  * by a three-character attempt at a mnemonic.
89  */
90 
91 /* stdio buffers */
92 struct __sbuf {
93 	unsigned char	*_base;
94 	int		_size;
95 };
96 
97 /* hold a buncha junk that would grow the ABI */
98 struct __sFILEX;
99 
100 /*
101  * stdio state variables.
102  *
103  * The following always hold:
104  *
105  *	if (_flags&(__SLBF|__SWR)) == (__SLBF|__SWR),
106  *		_lbfsize is -_bf._size, else _lbfsize is 0
107  *	if _flags&__SRD, _w is 0
108  *	if _flags&__SWR, _r is 0
109  *
110  * This ensures that the getc and putc macros (or inline functions) never
111  * try to write or read from a file that is in `read' or `write' mode.
112  * (Moreover, they can, and do, automatically switch from read mode to
113  * write mode, and back, on "r+" and "w+" files.)
114  *
115  * _lbfsize is used only to make the inline line-buffered output stream
116  * code as compact as possible.
117  *
118  * _ub, _up, and _ur are used when ungetc() pushes back more characters
119  * than fit in the current _bf, or when ungetc() pushes back a character
120  * that does not match the previous one in _bf.  When this happens,
121  * _ub._base becomes non-nil (i.e., a stream has ungetc() data iff
122  * _ub._base!=NULL) and _up and _ur save the current values of _p and _r.
123  *
124  * NB: see WARNING above before changing the layout of this structure!
125  */
126 typedef	struct __sFILE {
127 	unsigned char *_p;	/* current position in (some) buffer */
128 	int	_r;		/* read space left for getc() */
129 	int	_w;		/* write space left for putc() */
130 	short	_flags;		/* flags, below; this FILE is free if 0 */
131 	short	_file;		/* fileno, if Unix descriptor, else -1 */
132 	struct	__sbuf _bf;	/* the buffer (at least 1 byte, if !NULL) */
133 	int	_lbfsize;	/* 0 or -_bf._size, for inline putc */
134 
135 	/* operations */
136 	void	*_cookie;	/* cookie passed to io functions */
137 	int	(* _Nullable _close)(void *);
138 	int	(* _Nullable _read) (void *, char *, int);
139 	fpos_t	(* _Nullable _seek) (void *, fpos_t, int);
140 	int	(* _Nullable _write)(void *, const char *, int);
141 
142 	/* separate buffer for long sequences of ungetc() */
143 	struct	__sbuf _ub;	/* ungetc buffer */
144 	struct __sFILEX *_extra; /* additions to FILE to not break ABI */
145 	int	_ur;		/* saved _r when _r is counting ungetc data */
146 
147 	/* tricks to meet minimum requirements even when malloc() fails */
148 	unsigned char _ubuf[3];	/* guarantee an ungetc() buffer */
149 	unsigned char _nbuf[1];	/* guarantee a getc() buffer */
150 
151 	/* separate buffer for fgetln() when line crosses buffer boundary */
152 	struct	__sbuf _lb;	/* buffer for fgetln() */
153 
154 	/* Unix stdio files get aligned to block boundaries on fseek() */
155 	int	_blksize;	/* stat.st_blksize (may be != _bf._size) */
156 	fpos_t	_offset;	/* current lseek offset (see WARNING) */
157 } FILE;
158 
159 #endif /* __STDIO_H_ */