xref: /titanic_52/usr/src/head/stdio.h (revision 68b2bbf26c7040fea4281dcb58b81e7627e46f34)
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 2014 Garrett D'Amore <garrett@damore.org>
24   * Copyright (c) 1989, 2010, Oracle and/or its affiliates. All rights reserved.
25   */
26  
27  /*	Copyright (c) 1988 AT&T	*/
28  /*	  All Rights Reserved  	*/
29  
30  /*
31   * User-visible pieces of the ANSI C standard I/O package.
32   */
33  
34  #ifndef _STDIO_H
35  #define	_STDIO_H
36  
37  #include <sys/feature_tests.h>
38  
39  #ifdef	__cplusplus
40  extern "C" {
41  #endif
42  
43  /*
44   * Do all of our 'redefine_extname' processing before
45   * declarations of the associated functions are seen.
46   * This is necessary to keep gcc happy.
47   */
48  #if defined(__PRAGMA_REDEFINE_EXTNAME)
49  
50  /* large file compilation environment setup */
51  #if !defined(_LP64) && _FILE_OFFSET_BITS == 64
52  #pragma redefine_extname	fopen		fopen64
53  #pragma redefine_extname	freopen		freopen64
54  #pragma redefine_extname	tmpfile		tmpfile64
55  #pragma redefine_extname	fgetpos		fgetpos64
56  #pragma redefine_extname	fsetpos		fsetpos64
57  #if defined(_LARGEFILE_SOURCE)
58  #pragma redefine_extname	fseeko		fseeko64
59  #pragma redefine_extname	ftello		ftello64
60  #endif	/* _LARGEFILE_SOURCE */
61  #endif	/* !defined(_LP64) && _FILE_OFFSET_BITS == 64 */
62  
63  /* In the LP64 compilation environment, all APIs are already large file */
64  #if defined(_LP64) && defined(_LARGEFILE64_SOURCE)
65  #pragma redefine_extname	fopen64		fopen
66  #pragma redefine_extname	freopen64	freopen
67  #pragma redefine_extname	tmpfile64	tmpfile
68  #pragma redefine_extname	fgetpos64	fgetpos
69  #pragma redefine_extname	fsetpos64	fsetpos
70  #if defined(_LARGEFILE_SOURCE)
71  #pragma redefine_extname	fseeko64	fseeko
72  #pragma redefine_extname	ftello64	ftello
73  #endif	/* _LARGEFILE_SOURCE */
74  #endif	/* defined(_LP64) && defined(_LARGEFILE64_SOURCE) */
75  
76  #endif	/* __PRAGMA_REDEFINE_EXTNAME */
77  
78  #ifdef	__cplusplus
79  }
80  #endif
81  
82  #include <iso/stdio_iso.h>
83  
84  /*
85   * If feature test macros are set that enable interfaces that use types
86   * defined in <sys/types.h>, get those types by doing the include.
87   *
88   * Note that in asking for the interfaces associated with this feature test
89   * macro one also asks for definitions of the POSIX types.
90   */
91  
92  /*
93   * Allow global visibility for symbols defined in
94   * C++ "std" namespace in <iso/stdio_iso.h>.
95   */
96  #if __cplusplus >= 199711L
97  using std::FILE;
98  using std::size_t;
99  using std::fpos_t;
100  using std::remove;
101  using std::rename;
102  using std::tmpfile;
103  using std::tmpnam;
104  using std::fclose;
105  using std::fflush;
106  using std::fopen;
107  using std::freopen;
108  using std::setbuf;
109  using std::setvbuf;
110  using std::fprintf;
111  using std::fscanf;
112  using std::printf;
113  using std::scanf;
114  using std::sprintf;
115  using std::sscanf;
116  using std::vfprintf;
117  using std::vprintf;
118  using std::vsprintf;
119  using std::fgetc;
120  using std::fgets;
121  using std::fputc;
122  using std::fputs;
123  using std::getc;
124  using std::getchar;
125  using std::gets;
126  using std::putc;
127  using std::putchar;
128  using std::puts;
129  using std::ungetc;
130  using std::fread;
131  using std::fwrite;
132  using std::fgetpos;
133  using std::fseek;
134  using std::fsetpos;
135  using std::ftell;
136  using std::rewind;
137  using std::clearerr;
138  using std::feof;
139  using std::ferror;
140  using std::perror;
141  #ifndef	_LP64
142  using std::__filbuf;
143  using std::__flsbuf;
144  #endif	/* _LP64 */
145  #endif	/*  __cplusplus >= 199711L */
146  
147  /*
148   * This header needs to be included here because it relies on the global
149   * visibility of FILE and size_t in the C++ environment.
150   */
151  #include <iso/stdio_c99.h>
152  
153  #ifdef	__cplusplus
154  extern "C" {
155  #endif
156  
157  #if defined(_LARGEFILE_SOURCE) || defined(_XPG5)
158  #ifndef	_OFF_T
159  #define	_OFF_T
160  #if defined(_LP64) || _FILE_OFFSET_BITS == 32
161  typedef long		off_t;
162  #else
163  typedef __longlong_t	off_t;
164  #endif
165  #ifdef	_LARGEFILE64_SOURCE
166  #ifdef _LP64
167  typedef	off_t		off64_t;
168  #else
169  typedef __longlong_t	off64_t;
170  #endif
171  #endif /* _LARGEFILE64_SOURCE */
172  #endif /* _OFF_T */
173  #endif /* _LARGEFILE_SOURCE */
174  
175  #ifdef _LARGEFILE64_SOURCE
176  #ifdef _LP64
177  typedef fpos_t		fpos64_t;
178  #else
179  typedef __longlong_t	fpos64_t;
180  #endif
181  #endif /* _LARGEFILE64_SOURCE */
182  
183  /*
184   * XPG4 requires that va_list be defined in <stdio.h> "as described in
185   * <stdarg.h>".  ANSI-C and POSIX require that the namespace of <stdio.h>
186   * not be polluted with this name.
187   */
188  #if defined(_XPG4) && !defined(_VA_LIST)
189  #define	_VA_LIST
190  typedef	__va_list va_list;
191  #endif	/* defined(_XPG4 && !defined(_VA_LIST) */
192  
193  #if defined(__EXTENSIONS__) || !defined(_STRICT_STDC) || \
194  		defined(__XOPEN_OR_POSIX)
195  
196  #define	L_ctermid	9
197  
198  /* Marked LEGACY in SUSv2 and removed in SUSv3 */
199  #if !defined(_XPG6) || defined(__EXTENSIONS__)
200  #define	L_cuserid	9
201  #endif
202  
203  #endif /* defined(__EXTENSIONS__) || !defined(_STRICT_STDC) ... */
204  
205  #if defined(__EXTENSIONS__) || \
206  	(!defined(_STRICT_STDC) && !defined(_POSIX_C_SOURCE)) || \
207  	defined(_XOPEN_SOURCE)
208  
209  #define	P_tmpdir	"/var/tmp/"
210  #endif /* defined(__EXTENSIONS__) || (!defined(_STRICT_STDC) ... */
211  
212  #ifndef _STDIO_ALLOCATE
213  extern unsigned char	 _sibuf[], _sobuf[];
214  #endif
215  
216  /* large file compilation environment setup */
217  #if !defined(_LP64) && _FILE_OFFSET_BITS == 64
218  #if !defined(__PRAGMA_REDEFINE_EXTNAME)
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  #define	fopen			fopen64
225  #define	freopen			freopen64
226  #define	tmpfile			tmpfile64
227  #define	fgetpos			fgetpos64
228  #define	fsetpos			fsetpos64
229  #ifdef	_LARGEFILE_SOURCE
230  #define	fseeko			fseeko64
231  #define	ftello			ftello64
232  #endif
233  #endif	/* !__PRAGMA_REDEFINE_EXTNAME */
234  #endif	/* !_LP64 && _FILE_OFFSET_BITS == 64 */
235  
236  #ifndef _LP64
237  extern unsigned char	*_bufendtab[];
238  extern FILE		*_lastbuf;
239  #endif
240  
241  /* In the LP64 compilation environment, all APIs are already large file */
242  #if defined(_LP64) && defined(_LARGEFILE64_SOURCE)
243  #if !defined(__PRAGMA_REDEFINE_EXTNAME)
244  #define	fopen64		fopen
245  #define	freopen64	freopen
246  #define	tmpfile64	tmpfile
247  #define	fgetpos64	fgetpos
248  #define	fsetpos64	fsetpos
249  #ifdef	_LARGEFILE_SOURCE
250  #define	fseeko64	fseeko
251  #define	ftello64	ftello
252  #endif
253  #endif	/* !__PRAGMA_REDEFINE_EXTNAME */
254  #endif	/* _LP64 && _LARGEFILE64_SOURCE */
255  
256  #ifndef	_SSIZE_T
257  #define	_SSIZE_T
258  #if defined(_LP64) || defined(_I32LPx)
259  typedef long	ssize_t;	/* size of something in bytes or -1 */
260  #else
261  typedef int	ssize_t;	/* (historical version) */
262  #endif
263  #endif	/* !_SSIZE_T */
264  
265  #if defined(__EXTENSIONS__) || \
266  	(!defined(_STRICT_STDC) && !defined(__XOPEN_OR_POSIX)) || \
267  	defined(_REENTRANT)
268  extern char	*tmpnam_r(char *);
269  #endif
270  
271  #if defined(__EXTENSIONS__) || \
272  	(!defined(_STRICT_STDC) && !defined(__XOPEN_OR_POSIX))
273  extern int fcloseall(void);
274  extern void setbuffer(FILE *, char *, size_t);
275  extern int setlinebuf(FILE *);
276  /* PRINTFLIKE2 */
277  extern int asprintf(char **, const char *, ...);
278  /* PRINTFLIKE2 */
279  extern int vasprintf(char **, const char *, __va_list);
280  #endif
281  
282  #if defined(__EXTENSIONS__) || \
283  	(!defined(_STRICT_STDC) && !defined(__XOPEN_OR_POSIX))
284  	/* || defined(_XPG7) */
285  extern ssize_t getdelim(char **_RESTRICT_KYWD, size_t *_RESTRICT_KYWD,
286  	int, FILE *_RESTRICT_KYWD);
287  extern ssize_t getline(char **_RESTRICT_KYWD, size_t *_RESTRICT_KYWD,
288  	FILE *_RESTRICT_KYWD);
289  #endif	/* __EXTENSIONS__ ... */
290  
291  /*
292   * The following are known to POSIX and XOPEN, but not to ANSI-C.
293   */
294  #if defined(__EXTENSIONS__) || \
295  	!defined(_STRICT_STDC) || defined(__XOPEN_OR_POSIX)
296  
297  extern FILE	*fdopen(int, const char *);
298  extern char	*ctermid(char *);
299  extern int	fileno(FILE *);
300  
301  #endif	/* defined(__EXTENSIONS__) || !defined(_STRICT_STDC) ... */
302  
303  /*
304   * The following are known to POSIX.1c, but not to ANSI-C or XOPEN.
305   */
306  #if defined(__EXTENSIONS__) || defined(_REENTRANT) || \
307  	(_POSIX_C_SOURCE - 0 >= 199506L)
308  extern void	flockfile(FILE *);
309  extern int	ftrylockfile(FILE *);
310  extern void	funlockfile(FILE *);
311  extern int	getc_unlocked(FILE *);
312  extern int	getchar_unlocked(void);
313  extern int	putc_unlocked(int, FILE *);
314  extern int	putchar_unlocked(int);
315  
316  #endif	/* defined(__EXTENSIONS__) || defined(_REENTRANT).. */
317  
318  /*
319   * The following are known to XOPEN, but not to ANSI-C or POSIX.
320   */
321  #if defined(__EXTENSIONS__) || !defined(_STRICT_STDC) || \
322  	defined(_XOPEN_SOURCE)
323  extern FILE	*popen(const char *, const char *);
324  extern char	*tempnam(const char *, const char *);
325  extern int	pclose(FILE *);
326  #if !defined(_XOPEN_SOURCE)
327  extern int	getsubopt(char **, char *const *, char **);
328  #endif /* !defined(_XOPEN_SOURCE) */
329  
330  /* Marked LEGACY in SUSv2 and removed in SUSv3 */
331  #if !defined(_XPG6) || defined(__EXTENSIONS__)
332  extern char	*cuserid(char *);
333  extern int	getopt(int, char *const *, const char *);
334  extern char	*optarg;
335  extern int	optind, opterr, optopt;
336  extern int	getw(FILE *);
337  extern int	putw(int, FILE *);
338  #endif /* !defined(_XPG6) || defined(__EXTENSIONS__) */
339  
340  #endif	/* defined(__EXTENSIONS__) || !defined(_STRICT_STDC) ... */
341  
342  /*
343   * The following are defined as part of the Large File Summit interfaces.
344   */
345  #if defined(_LARGEFILE_SOURCE) || defined(_XPG5)
346  extern int	fseeko(FILE *, off_t, int);
347  extern off_t	ftello(FILE *);
348  #endif
349  
350  /*
351   * The following are defined as part of the transitional Large File Summit
352   * interfaces.
353   */
354  #if defined(_LARGEFILE64_SOURCE) && !((_FILE_OFFSET_BITS == 64) && \
355  	    !defined(__PRAGMA_REDEFINE_EXTNAME))
356  extern FILE	*fopen64(const char *, const char *);
357  extern FILE	*freopen64(const char *, const char *, FILE *);
358  extern FILE	*tmpfile64(void);
359  extern int	fgetpos64(FILE *, fpos64_t *);
360  extern int	fsetpos64(FILE *, const fpos64_t *);
361  extern int	fseeko64(FILE *, off64_t, int);
362  extern off64_t	ftello64(FILE *);
363  #endif
364  
365  #if !defined(__lint)
366  
367  #if defined(__EXTENSIONS__) || defined(_REENTRANT) || \
368  	    (_POSIX_C_SOURCE - 0 >= 199506L)
369  #ifndef	_LP64
370  #define	getc_unlocked(p)	(--(p)->_cnt < 0 \
371  					? __filbuf(p) \
372  					: (int)*(p)->_ptr++)
373  #define	putc_unlocked(x, p)	(--(p)->_cnt < 0 \
374  					? __flsbuf((x), (p)) \
375  					: (int)(*(p)->_ptr++ = \
376  					(unsigned char) (x)))
377  #endif	/* _LP64 */
378  #define	getchar_unlocked()	getc_unlocked(stdin)
379  #define	putchar_unlocked(x)	putc_unlocked((x), stdout)
380  #endif	/* defined(__EXTENSIONS__) || defined(_REENTRANT).. */
381  
382  #endif	/* !defined(__lint) */
383  
384  #ifdef	__cplusplus
385  }
386  #endif
387  
388  #endif	/* _STDIO_H */
389