xref: /illumos-gate/usr/src/head/stdio.h (revision 6a634c9d)
1 /*
2  * CDDL HEADER START
3  *
4  * The contents of this file are subject to the terms of the
5  * Common Development and Distribution License (the "License").
6  * You may not use this file except in compliance with the License.
7  *
8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9  * or http://www.opensolaris.org/os/licensing.
10  * See the License for the specific language governing permissions
11  * and limitations under the License.
12  *
13  * When distributing Covered Code, include this CDDL HEADER in each
14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15  * If applicable, add the following below this CDDL HEADER, with the
16  * fields enclosed by brackets "[]" replaced with your own identifying
17  * information: Portions Copyright [yyyy] [name of copyright owner]
18  *
19  * CDDL HEADER END
20  */
21 
22 /*
23  * Copyright (c) 1989, 2010, Oracle and/or its affiliates. All rights reserved.
24  */
25 
26 /*	Copyright (c) 1988 AT&T	*/
27 /*	  All Rights Reserved  	*/
28 
29 /*
30  * User-visible pieces of the ANSI C standard I/O package.
31  */
32 
33 #ifndef _STDIO_H
34 #define	_STDIO_H
35 
36 #include <sys/feature_tests.h>
37 
38 #ifdef	__cplusplus
39 extern "C" {
40 #endif
41 
42 /*
43  * Do all of our 'redefine_extname' processing before
44  * declarations of the associated functions are seen.
45  * This is necessary to keep gcc happy.
46  */
47 #if defined(__PRAGMA_REDEFINE_EXTNAME)
48 
49 /* large file compilation environment setup */
50 #if !defined(_LP64) && _FILE_OFFSET_BITS == 64
51 #pragma redefine_extname	fopen		fopen64
52 #pragma redefine_extname	freopen		freopen64
53 #pragma redefine_extname	tmpfile		tmpfile64
54 #pragma redefine_extname	fgetpos		fgetpos64
55 #pragma redefine_extname	fsetpos		fsetpos64
56 #if defined(_LARGEFILE_SOURCE)
57 #pragma redefine_extname	fseeko		fseeko64
58 #pragma redefine_extname	ftello		ftello64
59 #endif	/* _LARGEFILE_SOURCE */
60 #endif	/* !defined(_LP64) && _FILE_OFFSET_BITS == 64 */
61 
62 /* In the LP64 compilation environment, all APIs are already large file */
63 #if defined(_LP64) && defined(_LARGEFILE64_SOURCE)
64 #pragma redefine_extname	fopen64		fopen
65 #pragma redefine_extname	freopen64	freopen
66 #pragma redefine_extname	tmpfile64	tmpfile
67 #pragma redefine_extname	fgetpos64	fgetpos
68 #pragma redefine_extname	fsetpos64	fsetpos
69 #if defined(_LARGEFILE_SOURCE)
70 #pragma redefine_extname	fseeko64	fseeko
71 #pragma redefine_extname	ftello64	ftello
72 #endif	/* _LARGEFILE_SOURCE */
73 #endif	/* defined(_LP64) && defined(_LARGEFILE64_SOURCE) */
74 
75 #endif	/* __PRAGMA_REDEFINE_EXTNAME */
76 
77 #ifdef	__cplusplus
78 }
79 #endif
80 
81 #include <iso/stdio_iso.h>
82 
83 /*
84  * If feature test macros are set that enable interfaces that use types
85  * defined in <sys/types.h>, get those types by doing the include.
86  *
87  * Note that in asking for the interfaces associated with this feature test
88  * macro one also asks for definitions of the POSIX types.
89  */
90 
91 /*
92  * Allow global visibility for symbols defined in
93  * C++ "std" namespace in <iso/stdio_iso.h>.
94  */
95 #if __cplusplus >= 199711L
96 using std::FILE;
97 using std::size_t;
98 using std::fpos_t;
99 using std::remove;
100 using std::rename;
101 using std::tmpfile;
102 using std::tmpnam;
103 using std::fclose;
104 using std::fflush;
105 using std::fopen;
106 using std::freopen;
107 using std::setbuf;
108 using std::setvbuf;
109 using std::fprintf;
110 using std::fscanf;
111 using std::printf;
112 using std::scanf;
113 using std::sprintf;
114 using std::sscanf;
115 using std::vfprintf;
116 using std::vprintf;
117 using std::vsprintf;
118 using std::fgetc;
119 using std::fgets;
120 using std::fputc;
121 using std::fputs;
122 using std::getc;
123 using std::getchar;
124 using std::gets;
125 using std::putc;
126 using std::putchar;
127 using std::puts;
128 using std::ungetc;
129 using std::fread;
130 using std::fwrite;
131 using std::fgetpos;
132 using std::fseek;
133 using std::fsetpos;
134 using std::ftell;
135 using std::rewind;
136 using std::clearerr;
137 using std::feof;
138 using std::ferror;
139 using std::perror;
140 #ifndef	_LP64
141 using std::__filbuf;
142 using std::__flsbuf;
143 #endif	/* _LP64 */
144 #endif	/*  __cplusplus >= 199711L */
145 
146 /*
147  * This header needs to be included here because it relies on the global
148  * visibility of FILE and size_t in the C++ environment.
149  */
150 #include <iso/stdio_c99.h>
151 
152 #ifdef	__cplusplus
153 extern "C" {
154 #endif
155 
156 #if defined(_LARGEFILE_SOURCE) || defined(_XPG5)
157 #ifndef	_OFF_T
158 #define	_OFF_T
159 #if defined(_LP64) || _FILE_OFFSET_BITS == 32
160 typedef long		off_t;
161 #else
162 typedef __longlong_t	off_t;
163 #endif
164 #ifdef	_LARGEFILE64_SOURCE
165 #ifdef _LP64
166 typedef	off_t		off64_t;
167 #else
168 typedef __longlong_t	off64_t;
169 #endif
170 #endif /* _LARGEFILE64_SOURCE */
171 #endif /* _OFF_T */
172 #endif /* _LARGEFILE_SOURCE */
173 
174 #ifdef _LARGEFILE64_SOURCE
175 #ifdef _LP64
176 typedef fpos_t		fpos64_t;
177 #else
178 typedef __longlong_t	fpos64_t;
179 #endif
180 #endif /* _LARGEFILE64_SOURCE */
181 
182 /*
183  * XPG4 requires that va_list be defined in <stdio.h> "as described in
184  * <stdarg.h>".  ANSI-C and POSIX require that the namespace of <stdio.h>
185  * not be polluted with this name.
186  */
187 #if defined(_XPG4) && !defined(_VA_LIST)
188 #define	_VA_LIST
189 typedef	__va_list va_list;
190 #endif	/* defined(_XPG4 && !defined(_VA_LIST) */
191 
192 #if defined(__EXTENSIONS__) || !defined(_STRICT_STDC) || \
193 		defined(__XOPEN_OR_POSIX)
194 
195 #define	L_ctermid	9
196 
197 /* Marked LEGACY in SUSv2 and removed in SUSv3 */
198 #if !defined(_XPG6) || defined(__EXTENSIONS__)
199 #define	L_cuserid	9
200 #endif
201 
202 #endif /* defined(__EXTENSIONS__) || !defined(_STRICT_STDC) ... */
203 
204 #if defined(__EXTENSIONS__) || \
205 	(!defined(_STRICT_STDC) && !defined(_POSIX_C_SOURCE)) || \
206 	defined(_XOPEN_SOURCE)
207 
208 #define	P_tmpdir	"/var/tmp/"
209 #endif /* defined(__EXTENSIONS__) || (!defined(_STRICT_STDC) ... */
210 
211 #ifndef _STDIO_ALLOCATE
212 extern unsigned char	 _sibuf[], _sobuf[];
213 #endif
214 
215 /* large file compilation environment setup */
216 #if !defined(_LP64) && _FILE_OFFSET_BITS == 64
217 #if !defined(__PRAGMA_REDEFINE_EXTNAME)
218 #if defined(__STDC__)
219 extern FILE	*fopen64(const char *, const char *);
220 extern FILE	*freopen64(const char *, const char *, FILE *);
221 extern FILE	*tmpfile64(void);
222 extern int	fgetpos64(FILE *, fpos_t *);
223 extern int	fsetpos64(FILE *, const fpos_t *);
224 #else	/* defined(__STDC__) */
225 extern FILE	*fopen64();
226 extern FILE	*freopen64();
227 extern FILE	*tmpfile64();
228 extern int	fgetpos64();
229 extern int	fsetpos64();
230 #endif	/* defined(__STDC__) */
231 #define	fopen			fopen64
232 #define	freopen			freopen64
233 #define	tmpfile			tmpfile64
234 #define	fgetpos			fgetpos64
235 #define	fsetpos			fsetpos64
236 #ifdef	_LARGEFILE_SOURCE
237 #define	fseeko			fseeko64
238 #define	ftello			ftello64
239 #endif
240 #endif	/* !__PRAGMA_REDEFINE_EXTNAME */
241 #endif	/* !_LP64 && _FILE_OFFSET_BITS == 64 */
242 
243 #ifndef _LP64
244 extern unsigned char	*_bufendtab[];
245 extern FILE		*_lastbuf;
246 #endif
247 
248 /* In the LP64 compilation environment, all APIs are already large file */
249 #if defined(_LP64) && defined(_LARGEFILE64_SOURCE)
250 #if !defined(__PRAGMA_REDEFINE_EXTNAME)
251 #define	fopen64		fopen
252 #define	freopen64	freopen
253 #define	tmpfile64	tmpfile
254 #define	fgetpos64	fgetpos
255 #define	fsetpos64	fsetpos
256 #ifdef	_LARGEFILE_SOURCE
257 #define	fseeko64	fseeko
258 #define	ftello64	ftello
259 #endif
260 #endif	/* !__PRAGMA_REDEFINE_EXTNAME */
261 #endif	/* _LP64 && _LARGEFILE64_SOURCE */
262 
263 #ifndef	_SSIZE_T
264 #define	_SSIZE_T
265 #if defined(_LP64) || defined(_I32LPx)
266 typedef long	ssize_t;	/* size of something in bytes or -1 */
267 #else
268 typedef int	ssize_t;	/* (historical version) */
269 #endif
270 #endif	/* !_SSIZE_T */
271 
272 #if defined(__STDC__)
273 
274 #if defined(__EXTENSIONS__) || \
275 	(!defined(_STRICT_STDC) && !defined(__XOPEN_OR_POSIX)) || \
276 	defined(_REENTRANT)
277 extern char	*tmpnam_r(char *);
278 #endif
279 
280 #if defined(__EXTENSIONS__) || \
281 	(!defined(_STRICT_STDC) && !defined(__XOPEN_OR_POSIX))
282 extern int fcloseall(void);
283 extern void setbuffer(FILE *, char *, size_t);
284 extern int setlinebuf(FILE *);
285 /* PRINTFLIKE2 */
286 extern int asprintf(char **, const char *, ...);
287 /* PRINTFLIKE2 */
288 extern int vasprintf(char **, const char *, __va_list);
289 #endif
290 
291 #if defined(__EXTENSIONS__) || \
292 	(!defined(_STRICT_STDC) && !defined(__XOPEN_OR_POSIX))
293 	/* || defined(_XPG7) */
294 extern ssize_t getdelim(char **_RESTRICT_KYWD, size_t *_RESTRICT_KYWD,
295 	int, FILE *_RESTRICT_KYWD);
296 extern ssize_t getline(char **_RESTRICT_KYWD, size_t *_RESTRICT_KYWD,
297 	FILE *_RESTRICT_KYWD);
298 #endif	/* __EXTENSIONS__ ... */
299 
300 /*
301  * The following are known to POSIX and XOPEN, but not to ANSI-C.
302  */
303 #if defined(__EXTENSIONS__) || \
304 	!defined(_STRICT_STDC) || defined(__XOPEN_OR_POSIX)
305 
306 extern FILE	*fdopen(int, const char *);
307 extern char	*ctermid(char *);
308 extern int	fileno(FILE *);
309 
310 #endif	/* defined(__EXTENSIONS__) || !defined(_STRICT_STDC) ... */
311 
312 /*
313  * The following are known to POSIX.1c, but not to ANSI-C or XOPEN.
314  */
315 #if defined(__EXTENSIONS__) || defined(_REENTRANT) || \
316 	(_POSIX_C_SOURCE - 0 >= 199506L)
317 extern void	flockfile(FILE *);
318 extern int	ftrylockfile(FILE *);
319 extern void	funlockfile(FILE *);
320 extern int	getc_unlocked(FILE *);
321 extern int	getchar_unlocked(void);
322 extern int	putc_unlocked(int, FILE *);
323 extern int	putchar_unlocked(int);
324 
325 #endif	/* defined(__EXTENSIONS__) || defined(_REENTRANT).. */
326 
327 /*
328  * The following are known to XOPEN, but not to ANSI-C or POSIX.
329  */
330 #if defined(__EXTENSIONS__) || !defined(_STRICT_STDC) || \
331 	defined(_XOPEN_SOURCE)
332 extern FILE	*popen(const char *, const char *);
333 extern char	*tempnam(const char *, const char *);
334 extern int	pclose(FILE *);
335 #if !defined(_XOPEN_SOURCE)
336 extern int	getsubopt(char **, char *const *, char **);
337 #endif /* !defined(_XOPEN_SOURCE) */
338 
339 /* Marked LEGACY in SUSv2 and removed in SUSv3 */
340 #if !defined(_XPG6) || defined(__EXTENSIONS__)
341 extern char	*cuserid(char *);
342 extern int	getopt(int, char *const *, const char *);
343 extern char	*optarg;
344 extern int	optind, opterr, optopt;
345 extern int	getw(FILE *);
346 extern int	putw(int, FILE *);
347 #endif /* !defined(_XPG6) || defined(__EXTENSIONS__) */
348 
349 #endif	/* defined(__EXTENSIONS__) || !defined(_STRICT_STDC) ... */
350 
351 /*
352  * The following are defined as part of the Large File Summit interfaces.
353  */
354 #if defined(_LARGEFILE_SOURCE) || defined(_XPG5)
355 extern int	fseeko(FILE *, off_t, int);
356 extern off_t	ftello(FILE *);
357 #endif
358 
359 /*
360  * The following are defined as part of the transitional Large File Summit
361  * interfaces.
362  */
363 #if defined(_LARGEFILE64_SOURCE) && !((_FILE_OFFSET_BITS == 64) && \
364 	    !defined(__PRAGMA_REDEFINE_EXTNAME))
365 extern FILE	*fopen64(const char *, const char *);
366 extern FILE	*freopen64(const char *, const char *, FILE *);
367 extern FILE	*tmpfile64(void);
368 extern int	fgetpos64(FILE *, fpos64_t *);
369 extern int	fsetpos64(FILE *, const fpos64_t *);
370 extern int	fseeko64(FILE *, off64_t, int);
371 extern off64_t	ftello64(FILE *);
372 #endif
373 
374 #else	/* !defined __STDC__ */
375 
376 #ifndef	_LP64
377 #define	_bufend(p)	((fileno(p) < _NFILE) ? _bufendtab[fileno(p)] : \
378 			(unsigned char *)_realbufend(p))
379 #define	_bufsiz(p)	(_bufend(p) - (p)->_base)
380 #endif	/*	_LP64	*/
381 
382 #if defined(__EXTENSIONS__) || !defined(__XOPEN_OR_POSIX) || \
383 	defined(_REENTRANT)
384 extern char	*tmpnam_r();
385 #endif
386 
387 #if defined(__EXTENSIONS__) || !defined(__XOPEN_OR_POSIX)
388 extern int fcloseall();
389 extern void setbuffer();
390 extern int setlinebuf();
391 extern int asprintf();
392 extern int vasprintf();
393 #endif
394 
395 #if defined(__EXTENSIONS__) || !defined(__XOPEN_OR_POSIX)
396 	/* || defined(_XPG7) */
397 extern ssize_t getdelim();
398 extern ssize_t getline();
399 #endif	/* __EXTENSIONS__ ... */
400 
401 #if defined(__EXTENSIONS__) || defined(__XOPEN_OR_POSIX)
402 extern FILE	*fdopen();
403 extern char	*ctermid();
404 extern int	fileno();
405 #endif	/* defined(__EXTENSIONS__) || defined(__XOPEN_OR_POSIX) */
406 
407 #if defined(__EXTENSIONS__) || defined(_REENTRANT) || \
408 	    (_POSIX_C_SOURCE - 0 >= 199506L)
409 extern void	flockfile();
410 extern int	ftrylockfile();
411 extern void	funlockfile();
412 extern int	getc_unlocked();
413 extern int	getchar_unlocked();
414 extern int	putc_unlocked();
415 extern int	putchar_unlocked();
416 #endif	/* defined(__EXTENSIONS__) || defined(_REENTRANT).. */
417 
418 #if defined(__EXTENSIONS__) || defined(_XOPEN_SOURCE)
419 extern FILE	*popen();
420 extern char	*tempnam();
421 extern int	pclose();
422 
423 #if !defined(_XOPEN_SOURCE)
424 extern int	getsubopt();
425 #endif /* !defined(_XOPEN_SOURCE) */
426 
427 #if !defined(_XPG6) || defined(__EXTENSIONS__)
428 extern char	*cuserid();
429 extern int	getopt();
430 extern char	*optarg;
431 extern int	optind, opterr, optopt;
432 extern int	getw();
433 extern int	putw();
434 #endif /* !defined(_XPG6) || defined(__EXTENSIONS__) */
435 
436 #endif	/* defined(__EXTENSIONS__) || defined(_XOPEN_SOURCE) */
437 
438 #if defined(_LARGEFILE_SOURCE) || defined(_XPG5)
439 extern int	fseeko();
440 extern off_t	ftello();
441 #endif
442 
443 #if defined(_LARGEFILE64_SOURCE) && !((_FILE_OFFSET_BITS == 64) && \
444 	    !defined(__PRAGMA_REDEFINE_EXTNAME))
445 extern FILE	*fopen64();
446 extern FILE	*freopen64();
447 extern FILE	*tmpfile64();
448 extern int	fgetpos64();
449 extern int	fsetpos64();
450 extern int	fseeko64();
451 extern off64_t	ftello64();
452 #endif
453 
454 #endif	/* __STDC__ */
455 
456 #if !defined(__lint)
457 
458 #if defined(__EXTENSIONS__) || defined(_REENTRANT) || \
459 	    (_POSIX_C_SOURCE - 0 >= 199506L)
460 #ifndef	_LP64
461 #ifdef	__STDC__
462 #define	getc_unlocked(p)	(--(p)->_cnt < 0 \
463 					? __filbuf(p) \
464 					: (int)*(p)->_ptr++)
465 #define	putc_unlocked(x, p)	(--(p)->_cnt < 0 \
466 					? __flsbuf((x), (p)) \
467 					: (int)(*(p)->_ptr++ = \
468 					(unsigned char) (x)))
469 #else
470 #define	getc_unlocked(p)	(--(p)->_cnt < 0 \
471 					? _filbuf(p) \
472 					: (int)*(p)->_ptr++)
473 #define	putc_unlocked(x, p)	(--(p)->_cnt < 0 \
474 					? _flsbuf((x), (p)) \
475 					: (int)(*(p)->_ptr++ = \
476 					(unsigned char) (x)))
477 #endif	/* __STDC__ */
478 #endif	/* _LP64 */
479 #define	getchar_unlocked()	getc_unlocked(stdin)
480 #define	putchar_unlocked(x)	putc_unlocked((x), stdout)
481 #endif	/* defined(__EXTENSIONS__) || defined(_REENTRANT).. */
482 
483 #endif	/* !defined(__lint) */
484 
485 #ifdef	__cplusplus
486 }
487 #endif
488 
489 #endif	/* _STDIO_H */
490