1 : /*
2 : * Copyright (c) 2000, 2005, 2007, 2009 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 : #ifndef _STDIO_H_
62 : #define _STDIO_H_
63 :
64 : #include <_types.h>
65 :
66 : #ifndef _VA_LIST
67 : #define _VA_LIST
68 : /* DO NOT REMOVE THIS COMMENT: fixincludes needs to see:
69 : * __gnuc_va_list and include <stdarg.h> */
70 : typedef __darwin_va_list va_list;
71 : #endif
72 :
73 : #ifndef _OFF_T
74 : #define _OFF_T
75 : typedef __darwin_off_t off_t;
76 : #endif
77 :
78 : #ifndef _SIZE_T
79 : #define _SIZE_T
80 : typedef __darwin_size_t size_t;
81 : #endif
82 :
83 : #ifndef NULL
84 : #define NULL __DARWIN_NULL
85 : #endif /* ! NULL */
86 :
87 : typedef __darwin_off_t fpos_t;
88 :
89 : #define _FSTDIO /* Define for new stdio with functions. */
90 :
91 : /*
92 : * NB: to fit things in six character monocase externals, the stdio
93 : * code uses the prefix `__s' for stdio objects, typically followed
94 : * by a three-character attempt at a mnemonic.
95 : */
96 :
97 : /* stdio buffers */
98 : struct __sbuf {
99 : unsigned char *_base;
100 : int _size;
101 : };
102 :
103 : /* hold a buncha junk that would grow the ABI */
104 : struct __sFILEX;
105 :
106 : /*
107 : * stdio state variables.
108 : *
109 : * The following always hold:
110 : *
111 : * if (_flags&(__SLBF|__SWR)) == (__SLBF|__SWR),
112 : * _lbfsize is -_bf._size, else _lbfsize is 0
113 : * if _flags&__SRD, _w is 0
114 : * if _flags&__SWR, _r is 0
115 : *
116 : * This ensures that the getc and putc macros (or inline functions) never
117 : * try to write or read from a file that is in `read' or `write' mode.
118 : * (Moreover, they can, and do, automatically switch from read mode to
119 : * write mode, and back, on "r+" and "w+" files.)
120 : *
121 : * _lbfsize is used only to make the inline line-buffered output stream
122 : * code as compact as possible.
123 : *
124 : * _ub, _up, and _ur are used when ungetc() pushes back more characters
125 : * than fit in the current _bf, or when ungetc() pushes back a character
126 : * that does not match the previous one in _bf. When this happens,
127 : * _ub._base becomes non-nil (i.e., a stream has ungetc() data iff
128 : * _ub._base!=NULL) and _up and _ur save the current values of _p and _r.
129 : *
130 : * NB: see WARNING above before changing the layout of this structure!
131 : */
132 : typedef struct __sFILE {
133 : unsigned char *_p; /* current position in (some) buffer */
134 : int _r; /* read space left for getc() */
135 : int _w; /* write space left for putc() */
136 : short _flags; /* flags, below; this FILE is free if 0 */
137 : short _file; /* fileno, if Unix descriptor, else -1 */
138 : struct __sbuf _bf; /* the buffer (at least 1 byte, if !NULL) */
139 : int _lbfsize; /* 0 or -_bf._size, for inline putc */
140 :
141 : /* operations */
142 : void *_cookie; /* cookie passed to io functions */
143 : int (*_close)(void *);
144 : int (*_read) (void *, char *, int);
145 : fpos_t (*_seek) (void *, fpos_t, int);
146 : int (*_write)(void *, const char *, int);
147 :
148 : /* separate buffer for long sequences of ungetc() */
149 : struct __sbuf _ub; /* ungetc buffer */
150 : struct __sFILEX *_extra; /* additions to FILE to not break ABI */
151 : int _ur; /* saved _r when _r is counting ungetc data */
152 :
153 : /* tricks to meet minimum requirements even when malloc() fails */
154 : unsigned char _ubuf[3]; /* guarantee an ungetc() buffer */
155 : unsigned char _nbuf[1]; /* guarantee a getc() buffer */
156 :
157 : /* separate buffer for fgetln() when line crosses buffer boundary */
158 : struct __sbuf _lb; /* buffer for fgetln() */
159 :
160 : /* Unix stdio files get aligned to block boundaries on fseek() */
161 : int _blksize; /* stat.st_blksize (may be != _bf._size) */
162 : fpos_t _offset; /* current lseek offset (see WARNING) */
163 : } FILE;
164 :
165 : __BEGIN_DECLS
166 : #if __DARWIN_UNIX03
167 : extern FILE *__stdinp;
168 : extern FILE *__stdoutp;
169 : extern FILE *__stderrp;
170 : #else /* !__DARWIN_UNIX03 */
171 : extern FILE __sF[];
172 : #endif /* __DARWIN_UNIX03 */
173 : __END_DECLS
174 :
175 : #define __SLBF 0x0001 /* line buffered */
176 : #define __SNBF 0x0002 /* unbuffered */
177 : #define __SRD 0x0004 /* OK to read */
178 : #define __SWR 0x0008 /* OK to write */
179 : /* RD and WR are never simultaneously asserted */
180 : #define __SRW 0x0010 /* open for reading & writing */
181 : #define __SEOF 0x0020 /* found EOF */
182 : #define __SERR 0x0040 /* found error */
183 : #define __SMBF 0x0080 /* _buf is from malloc */
184 : #define __SAPP 0x0100 /* fdopen()ed in append mode */
185 : #define __SSTR 0x0200 /* this is an sprintf/snprintf string */
186 : #define __SOPT 0x0400 /* do fseek() optimisation */
187 : #define __SNPT 0x0800 /* do not do fseek() optimisation */
188 : #define __SOFF 0x1000 /* set iff _offset is in fact correct */
189 : #define __SMOD 0x2000 /* true => fgetln modified _p text */
190 : #define __SALC 0x4000 /* allocate string space dynamically */
191 : #define __SIGN 0x8000 /* ignore this file in _fwalk */
192 :
193 : /*
194 : * The following three definitions are for ANSI C, which took them
195 : * from System V, which brilliantly took internal interface macros and
196 : * made them official arguments to setvbuf(), without renaming them.
197 : * Hence, these ugly _IOxxx names are *supposed* to appear in user code.
198 : *
199 : * Although numbered as their counterparts above, the implementation
200 : * does not rely on this.
201 : */
202 : #define _IOFBF 0 /* setvbuf should set fully buffered */
203 : #define _IOLBF 1 /* setvbuf should set line buffered */
204 : #define _IONBF 2 /* setvbuf should set unbuffered */
205 :
206 : #define BUFSIZ 1024 /* size of buffer used by setbuf */
207 : #define EOF (-1)
208 :
209 : /*
210 : * FOPEN_MAX is a minimum maximum, and is the number of streams that
211 : * stdio can provide without attempting to allocate further resources
212 : * (which could fail). Do not use this for anything.
213 : */
214 : /* must be == _POSIX_STREAM_MAX <limits.h> */
215 : #define FOPEN_MAX 20 /* must be <= OPEN_MAX <sys/syslimits.h> */
216 : #define FILENAME_MAX 1024 /* must be <= PATH_MAX <sys/syslimits.h> */
217 :
218 : /* System V/ANSI C; this is the wrong way to do this, do *not* use these. */
219 : #ifndef _ANSI_SOURCE
220 : #define P_tmpdir "/var/tmp/"
221 : #endif
222 : #define L_tmpnam 1024 /* XXX must be == PATH_MAX */
223 : #define TMP_MAX 308915776
224 :
225 : #ifndef SEEK_SET
226 : #define SEEK_SET 0 /* set file offset to offset */
227 : #endif
228 : #ifndef SEEK_CUR
229 : #define SEEK_CUR 1 /* set file offset to current plus offset */
230 : #endif
231 : #ifndef SEEK_END
232 : #define SEEK_END 2 /* set file offset to EOF plus offset */
233 : #endif
234 :
235 : #if __DARWIN_UNIX03
236 : #define stdin __stdinp
237 : #define stdout __stdoutp
238 : #define stderr __stderrp
239 : #else /* !__DARWIN_UNIX03 */
240 : #define stdin (&__sF[0])
241 : #define stdout (&__sF[1])
242 : #define stderr (&__sF[2])
243 : #endif /* __DARWIN_UNIX03 */
244 :
245 : /*
246 : * Functions defined in ANSI C standard.
247 : */
248 : __BEGIN_DECLS
249 : void clearerr(FILE *);
250 : int fclose(FILE *);
251 : int feof(FILE *);
252 : int ferror(FILE *);
253 : int fflush(FILE *);
254 : int fgetc(FILE *);
255 : int fgetpos(FILE * __restrict, fpos_t *);
256 : char *fgets(char * __restrict, int, FILE *);
257 : #if defined(__DARWIN_10_6_AND_LATER) && (defined(_DARWIN_UNLIMITED_STREAMS) || defined(_DARWIN_C_SOURCE))
258 : FILE *fopen(const char * __restrict, const char * __restrict) __DARWIN_EXTSN(fopen);
259 : #else /* < 10.6 || !_DARWIN_UNLIMITED_STREAMS && !_DARWIN_C_SOURCE */
260 : FILE *fopen(const char * __restrict, const char * __restrict) __DARWIN_10_6_AND_LATER_ALIAS(__DARWIN_ALIAS(fopen));
261 : #endif /* >= 10.6 &&_(DARWIN_UNLIMITED_STREAMS || _DARWIN_C_SOURCE) */
262 : int fprintf(FILE * __restrict, const char * __restrict, ...) __DARWIN_LDBL_COMPAT(fprintf);
263 : int fputc(int, FILE *);
264 : int fputs(const char * __restrict, FILE * __restrict) __DARWIN_ALIAS(fputs);
265 : size_t fread(void * __restrict, size_t, size_t, FILE * __restrict);
266 : FILE *freopen(const char * __restrict, const char * __restrict,
267 : FILE * __restrict) __DARWIN_ALIAS(freopen);
268 : int fscanf(FILE * __restrict, const char * __restrict, ...) __DARWIN_LDBL_COMPAT(fscanf);
269 : int fseek(FILE *, long, int);
270 : int fsetpos(FILE *, const fpos_t *);
271 : long ftell(FILE *);
272 : size_t fwrite(const void * __restrict, size_t, size_t, FILE * __restrict) __DARWIN_ALIAS(fwrite);
273 : int getc(FILE *);
274 : int getchar(void);
275 : char *gets(char *);
276 : #if !defined(_ANSI_SOURCE) && (!defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE))
277 : extern __const int sys_nerr; /* perror(3) external variables */
278 : extern __const char *__const sys_errlist[];
279 : #endif
280 : void perror(const char *);
281 : int printf(const char * __restrict, ...) __DARWIN_LDBL_COMPAT(printf);
282 : int putc(int, FILE *);
283 : int putchar(int);
284 : int puts(const char *);
285 : int remove(const char *);
286 : int rename (const char *, const char *);
287 : void rewind(FILE *);
288 : int scanf(const char * __restrict, ...) __DARWIN_LDBL_COMPAT(scanf);
289 : void setbuf(FILE * __restrict, char * __restrict);
290 : int setvbuf(FILE * __restrict, char * __restrict, int, size_t);
291 : int sprintf(char * __restrict, const char * __restrict, ...) __DARWIN_LDBL_COMPAT(sprintf);
292 : int sscanf(const char * __restrict, const char * __restrict, ...) __DARWIN_LDBL_COMPAT(sscanf);
293 : FILE *tmpfile(void);
294 : char *tmpnam(char *);
295 : int ungetc(int, FILE *);
296 : int vfprintf(FILE * __restrict, const char * __restrict, va_list) __DARWIN_LDBL_COMPAT(vfprintf);
297 : int vprintf(const char * __restrict, va_list) __DARWIN_LDBL_COMPAT(vprintf);
298 : int vsprintf(char * __restrict, const char * __restrict, va_list) __DARWIN_LDBL_COMPAT(vsprintf);
299 : #if !defined(_ANSI_SOURCE) && (!defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE))
300 : int asprintf(char **, const char *, ...) __DARWIN_LDBL_COMPAT(asprintf);
301 : int vasprintf(char **, const char *, va_list) __DARWIN_LDBL_COMPAT(vasprintf);
302 : #endif
303 : __END_DECLS
304 :
305 : /*
306 : * Functions defined in POSIX 1003.1.
307 : */
308 : #ifndef _ANSI_SOURCE
309 : #define L_ctermid 1024 /* size for ctermid(); PATH_MAX */
310 :
311 : __BEGIN_DECLS
312 : char *ctermid(char *);
313 : #if !defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE)
314 : char *ctermid_r(char *);
315 : #endif /* not POSIX */
316 : #if defined(__DARWIN_10_6_AND_LATER) && (defined(_DARWIN_UNLIMITED_STREAMS) || defined(_DARWIN_C_SOURCE))
317 : FILE *fdopen(int, const char *) __DARWIN_EXTSN(fdopen);
318 : #else /* < 10.6 || !_DARWIN_UNLIMITED_STREAMS && !_DARWIN_C_SOURCE */
319 : FILE *fdopen(int, const char *) __DARWIN_10_6_AND_LATER_ALIAS(__DARWIN_ALIAS(fdopen));
320 : #endif /* >= 10.6 &&_(DARWIN_UNLIMITED_STREAMS || _DARWIN_C_SOURCE) */
321 : #if !defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE)
322 : char *fgetln(FILE *, size_t *);
323 : #endif /* not POSIX */
324 : int fileno(FILE *);
325 : void flockfile(FILE *);
326 : #if !defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE)
327 : __const char
328 : *fmtcheck(const char *, const char *);
329 : int fpurge(FILE *);
330 : #endif /* not POSIX */
331 : int fseeko(FILE *, off_t, int);
332 : off_t ftello(FILE *);
333 : int ftrylockfile(FILE *);
334 : void funlockfile(FILE *);
335 : int getc_unlocked(FILE *);
336 : int getchar_unlocked(void);
337 : #if !defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE)
338 : int getw(FILE *);
339 : #endif /* not POSIX */
340 : int pclose(FILE *);
341 : #if defined(__DARWIN_10_6_AND_LATER) && (defined(_DARWIN_UNLIMITED_STREAMS) || defined(_DARWIN_C_SOURCE))
342 : FILE *popen(const char *, const char *) __DARWIN_EXTSN(popen);
343 : #else /* < 10.6 || !_DARWIN_UNLIMITED_STREAMS && !_DARWIN_C_SOURCE */
344 : FILE *popen(const char *, const char *) __DARWIN_10_6_AND_LATER_ALIAS(__DARWIN_ALIAS(popen));
345 : #endif /* >= 10.6 &&_(DARWIN_UNLIMITED_STREAMS || _DARWIN_C_SOURCE) */
346 : int putc_unlocked(int, FILE *);
347 : int putchar_unlocked(int);
348 : #if !defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE)
349 : int putw(int, FILE *);
350 : void setbuffer(FILE *, char *, int);
351 : int setlinebuf(FILE *);
352 : #endif /* not POSIX */
353 : int snprintf(char * __restrict, size_t, const char * __restrict, ...) __DARWIN_LDBL_COMPAT(snprintf);
354 : char *tempnam(const char *, const char *) __DARWIN_ALIAS(tempnam);
355 : int vfscanf(FILE * __restrict, const char * __restrict, va_list) __DARWIN_LDBL_COMPAT(vfscanf);
356 : int vscanf(const char * __restrict, va_list) __DARWIN_LDBL_COMPAT(vscanf);
357 : int vsnprintf(char * __restrict, size_t, const char * __restrict, va_list) __DARWIN_LDBL_COMPAT(vsnprintf);
358 : int vsscanf(const char * __restrict, const char * __restrict, va_list) __DARWIN_LDBL_COMPAT(vsscanf);
359 : #if !defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE)
360 : FILE *zopen(const char *, const char *, int);
361 : #endif /* not POSIX */
362 : __END_DECLS
363 :
364 : /*
365 : * Stdio function-access interface.
366 : */
367 : #if !defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE)
368 : __BEGIN_DECLS
369 : FILE *funopen(const void *,
370 : int (*)(void *, char *, int),
371 : int (*)(void *, const char *, int),
372 : fpos_t (*)(void *, fpos_t, int),
373 : int (*)(void *));
374 : __END_DECLS
375 : #define fropen(cookie, fn) funopen(cookie, fn, 0, 0, 0)
376 : #define fwopen(cookie, fn) funopen(cookie, 0, fn, 0, 0)
377 : #endif /* not POSIX */
378 : #endif /* not ANSI */
379 :
380 : /*
381 : * Functions internal to the implementation.
382 : */
383 : __BEGIN_DECLS
384 : int __srget(FILE *);
385 : int __svfscanf(FILE *, const char *, va_list) __DARWIN_LDBL_COMPAT(__svfscanf);
386 : int __swbuf(int, FILE *);
387 : __END_DECLS
388 :
389 : /*
390 : * The __sfoo macros are here so that we can
391 : * define function versions in the C library.
392 : */
393 : #define __sgetc(p) (--(p)->_r < 0 ? __srget(p) : (int)(*(p)->_p++))
394 : #if defined(__GNUC__) && defined(__STDC__)
395 0 : static __inline int __sputc(int _c, FILE *_p) {
396 0 : if (--_p->_w >= 0 || (_p->_w >= _p->_lbfsize && (char)_c != '\n'))
397 0 : return (*_p->_p++ = _c);
398 : else
399 0 : return (__swbuf(_c, _p));
400 : }
401 : #else
402 : /*
403 : * This has been tuned to generate reasonable code on the vax using pcc.
404 : */
405 : #define __sputc(c, p) \
406 : (--(p)->_w < 0 ? \
407 : (p)->_w >= (p)->_lbfsize ? \
408 : (*(p)->_p = (c)), *(p)->_p != '\n' ? \
409 : (int)*(p)->_p++ : \
410 : __swbuf('\n', p) : \
411 : __swbuf((int)(c), p) : \
412 : (*(p)->_p = (c), (int)*(p)->_p++))
413 : #endif
414 :
415 : #define __sfeof(p) (((p)->_flags & __SEOF) != 0)
416 : #define __sferror(p) (((p)->_flags & __SERR) != 0)
417 : #define __sclearerr(p) ((void)((p)->_flags &= ~(__SERR|__SEOF)))
418 : #define __sfileno(p) ((p)->_file)
419 :
420 : #ifndef _ANSI_SOURCE
421 : #if !defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE)
422 : #define feof_unlocked(p) __sfeof(p)
423 : #define ferror_unlocked(p) __sferror(p)
424 : #define clearerr_unlocked(p) __sclearerr(p)
425 : #define fileno_unlocked(p) __sfileno(p)
426 : #endif /* not POSIX */
427 :
428 : #ifndef lint
429 : #define getc_unlocked(fp) __sgetc(fp)
430 : #define putc_unlocked(x, fp) __sputc(x, fp)
431 : #endif /* lint */
432 :
433 : #define getchar_unlocked() getc_unlocked(stdin)
434 : #define putchar_unlocked(x) putc_unlocked(x, stdout)
435 : #endif /* not ANSI */
436 :
437 : #ifdef _USE_EXTENDED_LOCALES_
438 : #include <xlocale/_stdio.h>
439 : #endif /* _USE_EXTENDED_LOCALES_ */
440 :
441 : #if defined (__GNUC__) && _FORTIFY_SOURCE > 0 && !defined (__cplusplus)
442 : /* Security checking functions. */
443 : #include <secure/_stdio.h>
444 : #endif
445 :
446 : #endif /* _STDIO_H_ */
|