]> git.saurik.com Git - apple/libc.git/blame - include/_stdio.h
Libc-1272.200.26.tar.gz
[apple/libc.git] / include / _stdio.h
CommitLineData
e07eda1a
A
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
81typedef __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 */
92struct __sbuf {
93 unsigned char *_base;
94 int _size;
95};
96
97/* hold a buncha junk that would grow the ABI */
98struct __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 */
126typedef 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_ */