]>
Commit | Line | Data |
---|---|---|
5b2abdfb | 1 | /* |
224c7076 | 2 | * Copyright (c) 2000, 2005, 2007 Apple Inc. All rights reserved. |
5b2abdfb A |
3 | * |
4 | * @APPLE_LICENSE_HEADER_START@ | |
224c7076 | 5 | * |
734aad71 A |
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. | |
224c7076 | 12 | * |
734aad71 A |
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 | |
5b2abdfb A |
15 | * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, |
16 | * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, | |
734aad71 A |
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. | |
224c7076 | 20 | * |
5b2abdfb A |
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 | ||
59e0d9fe | 64 | #include <_types.h> |
5b2abdfb | 65 | |
3d9156a7 A |
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 | ||
224c7076 A |
73 | #ifndef _OFF_T |
74 | #define _OFF_T | |
75 | typedef __darwin_off_t off_t; | |
76 | #endif | |
77 | ||
3d9156a7 A |
78 | #ifndef _SIZE_T |
79 | #define _SIZE_T | |
80 | typedef __darwin_size_t size_t; | |
5b2abdfb A |
81 | #endif |
82 | ||
83 | #ifndef NULL | |
3d9156a7 | 84 | #define NULL __DARWIN_NULL |
59e0d9fe | 85 | #endif /* ! NULL */ |
5b2abdfb | 86 | |
3d9156a7 | 87 | typedef __darwin_off_t fpos_t; |
5b2abdfb A |
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 { | |
3d9156a7 A |
99 | unsigned char *_base; |
100 | int _size; | |
5b2abdfb A |
101 | }; |
102 | ||
9385eb3d A |
103 | /* hold a buncha junk that would grow the ABI */ |
104 | struct __sFILEX; | |
105 | ||
5b2abdfb A |
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 */ | |
9385eb3d A |
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); | |
5b2abdfb A |
147 | |
148 | /* separate buffer for long sequences of ungetc() */ | |
149 | struct __sbuf _ub; /* ungetc buffer */ | |
9385eb3d | 150 | struct __sFILEX *_extra; /* additions to FILE to not break ABI */ |
5b2abdfb A |
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 | |
3d9156a7 A |
166 | #if __DARWIN_UNIX03 |
167 | extern FILE *__stdinp; | |
168 | extern FILE *__stdoutp; | |
169 | extern FILE *__stderrp; | |
170 | #else /* !__DARWIN_UNIX03 */ | |
5b2abdfb | 171 | extern FILE __sF[]; |
3d9156a7 | 172 | #endif /* __DARWIN_UNIX03 */ |
5b2abdfb A |
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 */ | |
9385eb3d | 191 | #define __SIGN 0x8000 /* ignore this file in _fwalk */ |
5b2abdfb A |
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 | ||
3d9156a7 A |
235 | #if __DARWIN_UNIX03 |
236 | #define stdin __stdinp | |
237 | #define stdout __stdoutp | |
238 | #define stderr __stderrp | |
239 | #else /* !__DARWIN_UNIX03 */ | |
59e0d9fe A |
240 | #define stdin (&__sF[0]) |
241 | #define stdout (&__sF[1]) | |
242 | #define stderr (&__sF[2]) | |
3d9156a7 | 243 | #endif /* __DARWIN_UNIX03 */ |
5b2abdfb A |
244 | |
245 | /* | |
246 | * Functions defined in ANSI C standard. | |
247 | */ | |
248 | __BEGIN_DECLS | |
9385eb3d A |
249 | void clearerr(FILE *); |
250 | int fclose(FILE *); | |
251 | int feof(FILE *); | |
252 | int ferror(FILE *); | |
253 | int fflush(FILE *); | |
254 | int fgetc(FILE *); | |
59e0d9fe A |
255 | int fgetpos(FILE * __restrict, fpos_t *); |
256 | char *fgets(char * __restrict, int, FILE *); | |
257 | FILE *fopen(const char * __restrict, const char * __restrict); | |
3d9156a7 | 258 | int fprintf(FILE * __restrict, const char * __restrict, ...) __DARWIN_LDBL_COMPAT(fprintf); |
9385eb3d | 259 | int fputc(int, FILE *); |
224c7076 A |
260 | //Begin-Libc |
261 | #ifndef LIBC_ALIAS_FPUTS | |
262 | //End-Libc | |
263 | int fputs(const char * __restrict, FILE * __restrict) __DARWIN_ALIAS(fputs); | |
264 | //Begin-Libc | |
265 | #else /* LIBC_ALIAS_FPUTS */ | |
266 | int fputs(const char * __restrict, FILE * __restrict) LIBC_ALIAS(fputs); | |
267 | #endif /* !LIBC_ALIAS_FPUTS */ | |
268 | //End-Libc | |
59e0d9fe | 269 | size_t fread(void * __restrict, size_t, size_t, FILE * __restrict); |
224c7076 A |
270 | //Begin-Libc |
271 | #ifndef LIBC_ALIAS_FREOPEN | |
272 | //End-Libc | |
59e0d9fe | 273 | FILE *freopen(const char * __restrict, const char * __restrict, |
3d9156a7 | 274 | FILE * __restrict) __DARWIN_ALIAS(freopen); |
224c7076 A |
275 | //Begin-Libc |
276 | #else /* LIBC_ALIAS_FREOPEN */ | |
277 | FILE *freopen(const char * __restrict, const char * __restrict, | |
278 | FILE * __restrict) LIBC_ALIAS(freopen); | |
279 | #endif /* !LIBC_ALIAS_FREOPEN */ | |
280 | //End-Libc | |
3d9156a7 | 281 | int fscanf(FILE * __restrict, const char * __restrict, ...) __DARWIN_LDBL_COMPAT(fscanf); |
9385eb3d A |
282 | int fseek(FILE *, long, int); |
283 | int fsetpos(FILE *, const fpos_t *); | |
284 | long ftell(FILE *); | |
224c7076 A |
285 | //Begin-Libc |
286 | #ifndef LIBC_ALIAS_FWRITE | |
287 | //End-Libc | |
3d9156a7 | 288 | size_t fwrite(const void * __restrict, size_t, size_t, FILE * __restrict) __DARWIN_ALIAS(fwrite); |
224c7076 A |
289 | //Begin-Libc |
290 | #else /* LIBC_ALIAS_FWRITE */ | |
291 | size_t fwrite(const void * __restrict, size_t, size_t, FILE * __restrict) LIBC_ALIAS(fwrite); | |
292 | #endif /* !LIBC_ALIAS_FWRITE */ | |
293 | //End-Libc | |
9385eb3d A |
294 | int getc(FILE *); |
295 | int getchar(void); | |
296 | char *gets(char *); | |
224c7076 | 297 | #if !defined(_ANSI_SOURCE) && (!defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE)) |
5b2abdfb A |
298 | extern __const int sys_nerr; /* perror(3) external variables */ |
299 | extern __const char *__const sys_errlist[]; | |
300 | #endif | |
9385eb3d | 301 | void perror(const char *); |
3d9156a7 | 302 | int printf(const char * __restrict, ...) __DARWIN_LDBL_COMPAT(printf); |
9385eb3d A |
303 | int putc(int, FILE *); |
304 | int putchar(int); | |
305 | int puts(const char *); | |
306 | int remove(const char *); | |
307 | int rename (const char *, const char *); | |
308 | void rewind(FILE *); | |
3d9156a7 | 309 | int scanf(const char * __restrict, ...) __DARWIN_LDBL_COMPAT(scanf); |
59e0d9fe A |
310 | void setbuf(FILE * __restrict, char * __restrict); |
311 | int setvbuf(FILE * __restrict, char * __restrict, int, size_t); | |
3d9156a7 A |
312 | int sprintf(char * __restrict, const char * __restrict, ...) __DARWIN_LDBL_COMPAT(sprintf); |
313 | int sscanf(const char * __restrict, const char * __restrict, ...) __DARWIN_LDBL_COMPAT(sscanf); | |
9385eb3d A |
314 | FILE *tmpfile(void); |
315 | char *tmpnam(char *); | |
316 | int ungetc(int, FILE *); | |
3d9156a7 A |
317 | int vfprintf(FILE * __restrict, const char * __restrict, va_list) __DARWIN_LDBL_COMPAT(vfprintf); |
318 | int vprintf(const char * __restrict, va_list) __DARWIN_LDBL_COMPAT(vprintf); | |
319 | int vsprintf(char * __restrict, const char * __restrict, va_list) __DARWIN_LDBL_COMPAT(vsprintf); | |
224c7076 | 320 | #if !defined(_ANSI_SOURCE) && (!defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE)) |
3d9156a7 A |
321 | int asprintf(char **, const char *, ...) __DARWIN_LDBL_COMPAT(asprintf); |
322 | int vasprintf(char **, const char *, va_list) __DARWIN_LDBL_COMPAT(vasprintf); | |
59e0d9fe | 323 | #endif |
5b2abdfb A |
324 | __END_DECLS |
325 | ||
326 | /* | |
327 | * Functions defined in POSIX 1003.1. | |
328 | */ | |
329 | #ifndef _ANSI_SOURCE | |
5b2abdfb A |
330 | #define L_ctermid 1024 /* size for ctermid(); PATH_MAX */ |
331 | ||
332 | __BEGIN_DECLS | |
9385eb3d | 333 | char *ctermid(char *); |
224c7076 | 334 | #if !defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE) |
9385eb3d | 335 | char *ctermid_r(char *); |
59e0d9fe | 336 | #endif /* not POSIX */ |
9385eb3d | 337 | FILE *fdopen(int, const char *); |
224c7076 | 338 | #if !defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE) |
9385eb3d | 339 | char *fgetln(FILE *, size_t *); |
59e0d9fe A |
340 | #endif /* not POSIX */ |
341 | int fileno(FILE *); | |
9385eb3d | 342 | void flockfile(FILE *); |
224c7076 A |
343 | #if !defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE) |
344 | __const char | |
9385eb3d A |
345 | *fmtcheck(const char *, const char *); |
346 | int fpurge(FILE *); | |
59e0d9fe | 347 | #endif /* not POSIX */ |
224c7076 A |
348 | int fseeko(FILE *, off_t, int); |
349 | off_t ftello(FILE *); | |
9385eb3d A |
350 | int ftrylockfile(FILE *); |
351 | void funlockfile(FILE *); | |
352 | int getc_unlocked(FILE *); | |
353 | int getchar_unlocked(void); | |
224c7076 | 354 | #if !defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE) |
9385eb3d | 355 | int getw(FILE *); |
59e0d9fe | 356 | #endif /* not POSIX */ |
9385eb3d A |
357 | int pclose(FILE *); |
358 | FILE *popen(const char *, const char *); | |
359 | int putc_unlocked(int, FILE *); | |
360 | int putchar_unlocked(int); | |
224c7076 | 361 | #if !defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE) |
9385eb3d A |
362 | int putw(int, FILE *); |
363 | void setbuffer(FILE *, char *, int); | |
364 | int setlinebuf(FILE *); | |
59e0d9fe | 365 | #endif /* not POSIX */ |
3d9156a7 | 366 | int snprintf(char * __restrict, size_t, const char * __restrict, ...) __DARWIN_LDBL_COMPAT(snprintf); |
224c7076 A |
367 | //Begin-Libc |
368 | #ifndef LIBC_ALIAS_TEMPNAM | |
369 | //End-Libc | |
370 | char *tempnam(const char *, const char *) __DARWIN_ALIAS(tempnam); | |
371 | //Begin-Libc | |
372 | #else /* LIBC_ALIAS_TEMPNAM */ | |
373 | char *tempnam(const char *, const char *) LIBC_ALIAS(tempnam); | |
374 | #endif /* !LIBC_ALIAS_TEMPNAM */ | |
375 | //End-Libc | |
3d9156a7 A |
376 | int vfscanf(FILE * __restrict, const char * __restrict, va_list) __DARWIN_LDBL_COMPAT(vfscanf); |
377 | int vscanf(const char * __restrict, va_list) __DARWIN_LDBL_COMPAT(vscanf); | |
378 | int vsnprintf(char * __restrict, size_t, const char * __restrict, va_list) __DARWIN_LDBL_COMPAT(vsnprintf); | |
379 | int vsscanf(const char * __restrict, const char * __restrict, va_list) __DARWIN_LDBL_COMPAT(vsscanf); | |
224c7076 | 380 | #if !defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE) |
9385eb3d | 381 | FILE *zopen(const char *, const char *, int); |
59e0d9fe | 382 | #endif /* not POSIX */ |
5b2abdfb A |
383 | __END_DECLS |
384 | ||
5b2abdfb A |
385 | /* |
386 | * Stdio function-access interface. | |
387 | */ | |
224c7076 | 388 | #if !defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE) |
5b2abdfb | 389 | __BEGIN_DECLS |
9385eb3d | 390 | FILE *funopen(const void *, |
5b2abdfb A |
391 | int (*)(void *, char *, int), |
392 | int (*)(void *, const char *, int), | |
393 | fpos_t (*)(void *, fpos_t, int), | |
9385eb3d | 394 | int (*)(void *)); |
5b2abdfb A |
395 | __END_DECLS |
396 | #define fropen(cookie, fn) funopen(cookie, fn, 0, 0, 0) | |
397 | #define fwopen(cookie, fn) funopen(cookie, 0, fn, 0, 0) | |
59e0d9fe A |
398 | #endif /* not POSIX */ |
399 | #endif /* not ANSI */ | |
5b2abdfb A |
400 | |
401 | /* | |
402 | * Functions internal to the implementation. | |
403 | */ | |
404 | __BEGIN_DECLS | |
9385eb3d | 405 | int __srget(FILE *); |
3d9156a7 | 406 | int __svfscanf(FILE *, const char *, va_list) __DARWIN_LDBL_COMPAT(__svfscanf); |
9385eb3d | 407 | int __swbuf(int, FILE *); |
5b2abdfb A |
408 | __END_DECLS |
409 | ||
410 | /* | |
224c7076 | 411 | * The __sfoo macros are here so that we can |
5b2abdfb A |
412 | * define function versions in the C library. |
413 | */ | |
414 | #define __sgetc(p) (--(p)->_r < 0 ? __srget(p) : (int)(*(p)->_p++)) | |
415 | #if defined(__GNUC__) && defined(__STDC__) | |
416 | static __inline int __sputc(int _c, FILE *_p) { | |
417 | if (--_p->_w >= 0 || (_p->_w >= _p->_lbfsize && (char)_c != '\n')) | |
418 | return (*_p->_p++ = _c); | |
419 | else | |
420 | return (__swbuf(_c, _p)); | |
421 | } | |
422 | #else | |
423 | /* | |
424 | * This has been tuned to generate reasonable code on the vax using pcc. | |
425 | */ | |
426 | #define __sputc(c, p) \ | |
427 | (--(p)->_w < 0 ? \ | |
428 | (p)->_w >= (p)->_lbfsize ? \ | |
429 | (*(p)->_p = (c)), *(p)->_p != '\n' ? \ | |
430 | (int)*(p)->_p++ : \ | |
431 | __swbuf('\n', p) : \ | |
432 | __swbuf((int)(c), p) : \ | |
433 | (*(p)->_p = (c), (int)*(p)->_p++)) | |
434 | #endif | |
435 | ||
436 | #define __sfeof(p) (((p)->_flags & __SEOF) != 0) | |
437 | #define __sferror(p) (((p)->_flags & __SERR) != 0) | |
438 | #define __sclearerr(p) ((void)((p)->_flags &= ~(__SERR|__SEOF))) | |
439 | #define __sfileno(p) ((p)->_file) | |
440 | ||
59e0d9fe | 441 | #ifndef _ANSI_SOURCE |
224c7076 | 442 | #if !defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE) |
9385eb3d A |
443 | #define feof_unlocked(p) __sfeof(p) |
444 | #define ferror_unlocked(p) __sferror(p) | |
445 | #define clearerr_unlocked(p) __sclearerr(p) | |
9385eb3d | 446 | #define fileno_unlocked(p) __sfileno(p) |
59e0d9fe | 447 | #endif /* not POSIX */ |
5b2abdfb A |
448 | |
449 | #ifndef lint | |
9385eb3d A |
450 | #define getc_unlocked(fp) __sgetc(fp) |
451 | #define putc_unlocked(x, fp) __sputc(x, fp) | |
5b2abdfb A |
452 | #endif /* lint */ |
453 | ||
9385eb3d A |
454 | #define getchar_unlocked() getc_unlocked(stdin) |
455 | #define putchar_unlocked(x) putc_unlocked(x, stdout) | |
59e0d9fe A |
456 | #endif /* not ANSI */ |
457 | ||
3d9156a7 A |
458 | #ifdef _USE_EXTENDED_LOCALES_ |
459 | #include <xlocale/_stdio.h> | |
460 | #endif /* _USE_EXTENDED_LOCALES_ */ | |
461 | ||
224c7076 A |
462 | #if defined (__GNUC__) && _FORTIFY_SOURCE > 0 && !defined (__cplusplus) |
463 | /* Security checking functions. */ | |
464 | #include <secure/_stdio.h> | |
465 | #endif | |
466 | ||
5b2abdfb | 467 | #endif /* _STDIO_H_ */ |