stdio.h revision 13771
1/*-
2 * Copyright (c) 1990, 1993
3 *	The Regents of the University of California.  All rights reserved.
4 *
5 * This code is derived from software contributed to Berkeley by
6 * Chris Torek.
7 *
8 * Redistribution and use in source and binary forms, with or without
9 * modification, are permitted provided that the following conditions
10 * are met:
11 * 1. Redistributions of source code must retain the above copyright
12 *    notice, this list of conditions and the following disclaimer.
13 * 2. Redistributions in binary form must reproduce the above copyright
14 *    notice, this list of conditions and the following disclaimer in the
15 *    documentation and/or other materials provided with the distribution.
16 * 3. All advertising materials mentioning features or use of this software
17 *    must display the following acknowledgement:
18 *	This product includes software developed by the University of
19 *	California, Berkeley and its contributors.
20 * 4. Neither the name of the University nor the names of its contributors
21 *    may be used to endorse or promote products derived from this software
22 *    without specific prior written permission.
23 *
24 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
25 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
26 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
27 * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
28 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
29 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
30 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
31 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
32 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
33 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
34 * SUCH DAMAGE.
35 *
36 *	@(#)stdio.h	8.4 (Berkeley) 1/4/94
37 */
38
39#ifndef	_STDIO_H_
40#define	_STDIO_H_
41
42#if !defined(_ANSI_SOURCE) && !defined(__STRICT_ANSI__)
43#include <sys/types.h>
44#endif
45
46#include <sys/cdefs.h>
47
48#include <machine/ansi.h>
49#ifdef	_BSD_SIZE_T_
50typedef	_BSD_SIZE_T_	size_t;
51#undef	_BSD_SIZE_T_
52#endif
53
54#ifndef NULL
55#define	NULL	0
56#endif
57
58/*
59 * This is fairly grotesque, but pure ANSI code must not inspect the
60 * innards of an fpos_t anyway.  The library internally uses off_t,
61 * which we assume is exactly as big as eight chars.  (When we switch
62 * to gcc 2.4 we will use __attribute__ here.)
63 *
64 * WARNING: the alignment constraints on an off_t and the struct below
65 * differ on (e.g.) the SPARC.  Hence, the placement of an fpos_t object
66 * in a structure will change if fpos_t's are not aligned on 8-byte
67 * boundaries.  THIS IS A CROCK, but for now there is no way around it.
68 */
69#if !defined(_ANSI_SOURCE) && !defined(__STRICT_ANSI__)
70typedef off_t fpos_t;
71#else
72typedef struct __sfpos {
73	char	_pos[8];
74} fpos_t;
75#endif
76
77#define	_FSTDIO			/* Define for new stdio with functions. */
78
79/*
80 * NB: to fit things in six character monocase externals, the stdio
81 * code uses the prefix `__s' for stdio objects, typically followed
82 * by a three-character attempt at a mnemonic.
83 */
84
85/* stdio buffers */
86struct __sbuf {
87	unsigned char *_base;
88	int	_size;
89};
90
91/*
92 * stdio state variables.
93 *
94 * The following always hold:
95 *
96 *	if (_flags&(__SLBF|__SWR)) == (__SLBF|__SWR),
97 *		_lbfsize is -_bf._size, else _lbfsize is 0
98 *	if _flags&__SRD, _w is 0
99 *	if _flags&__SWR, _r is 0
100 *
101 * This ensures that the getc and putc macros (or inline functions) never
102 * try to write or read from a file that is in `read' or `write' mode.
103 * (Moreover, they can, and do, automatically switch from read mode to
104 * write mode, and back, on "r+" and "w+" files.)
105 *
106 * _lbfsize is used only to make the inline line-buffered output stream
107 * code as compact as possible.
108 *
109 * _ub, _up, and _ur are used when ungetc() pushes back more characters
110 * than fit in the current _bf, or when ungetc() pushes back a character
111 * that does not match the previous one in _bf.  When this happens,
112 * _ub._base becomes non-nil (i.e., a stream has ungetc() data iff
113 * _ub._base!=NULL) and _up and _ur save the current values of _p and _r.
114 *
115 * NB: see WARNING above before changing the layout of this structure!
116 */
117typedef	struct __sFILE {
118	unsigned char *_p;	/* current position in (some) buffer */
119	int	_r;		/* read space left for getc() */
120	int	_w;		/* write space left for putc() */
121	short	_flags;		/* flags, below; this FILE is free if 0 */
122	short	_file;		/* fileno, if Unix descriptor, else -1 */
123	struct	__sbuf _bf;	/* the buffer (at least 1 byte, if !NULL) */
124	int	_lbfsize;	/* 0 or -_bf._size, for inline putc */
125
126	/* operations */
127	void	*_cookie;	/* cookie passed to io functions */
128	int	(*_close) __P((void *));
129	int	(*_read)  __P((void *, char *, int));
130	fpos_t	(*_seek)  __P((void *, fpos_t, int));
131	int	(*_write) __P((void *, const char *, int));
132
133	/* separate buffer for long sequences of ungetc() */
134	struct	__sbuf _ub;	/* ungetc buffer */
135	unsigned char *_up;	/* saved _p when _p is doing ungetc data */
136	int	_ur;		/* saved _r when _r is counting ungetc data */
137
138	/* tricks to meet minimum requirements even when malloc() fails */
139	unsigned char _ubuf[3];	/* guarantee an ungetc() buffer */
140	unsigned char _nbuf[1];	/* guarantee a getc() buffer */
141
142	/* separate buffer for fgetln() when line crosses buffer boundary */
143	struct	__sbuf _lb;	/* buffer for fgetln() */
144
145	/* Unix stdio files get aligned to block boundaries on fseek() */
146	int	_blksize;	/* stat.st_blksize (may be != _bf._size) */
147	fpos_t	_offset;	/* current lseek offset (see WARNING) */
148} FILE;
149
150__BEGIN_DECLS
151extern FILE __sF[];
152__END_DECLS
153
154#define	__SLBF	0x0001		/* line buffered */
155#define	__SNBF	0x0002		/* unbuffered */
156#define	__SRD	0x0004		/* OK to read */
157#define	__SWR	0x0008		/* OK to write */
158	/* RD and WR are never simultaneously asserted */
159#define	__SRW	0x0010		/* open for reading & writing */
160#define	__SEOF	0x0020		/* found EOF */
161#define	__SERR	0x0040		/* found error */
162#define	__SMBF	0x0080		/* _buf is from malloc */
163#define	__SAPP	0x0100		/* fdopen()ed in append mode */
164#define	__SSTR	0x0200		/* this is an sprintf/snprintf string */
165#define	__SOPT	0x0400		/* do fseek() optimization */
166#define	__SNPT	0x0800		/* do not do fseek() optimization */
167#define	__SOFF	0x1000		/* set iff _offset is in fact correct */
168#define	__SMOD	0x2000		/* true => fgetln modified _p text */
169
170/*
171 * The following three definitions are for ANSI C, which took them
172 * from System V, which brilliantly took internal interface macros and
173 * made them official arguments to setvbuf(), without renaming them.
174 * Hence, these ugly _IOxxx names are *supposed* to appear in user code.
175 *
176 * Although numbered as their counterparts above, the implementation
177 * does not rely on this.
178 */
179#define	_IOFBF	0		/* setvbuf should set fully buffered */
180#define	_IOLBF	1		/* setvbuf should set line buffered */
181#define	_IONBF	2		/* setvbuf should set unbuffered */
182
183#define	BUFSIZ	1024		/* size of buffer used by setbuf */
184#define	EOF	(-1)
185
186/*
187 * FOPEN_MAX is a minimum maximum, and is the number of streams that
188 * stdio can provide without attempting to allocate further resources
189 * (which could fail).  Do not use this for anything.
190 */
191				/* must be == _POSIX_STREAM_MAX <limits.h> */
192#define	FOPEN_MAX	20	/* must be <= OPEN_MAX <sys/syslimits.h> */
193#define	FILENAME_MAX	1024	/* must be <= PATH_MAX <sys/syslimits.h> */
194
195/* System V/ANSI C; this is the wrong way to do this, do *not* use these. */
196#ifndef _ANSI_SOURCE
197#define	P_tmpdir	"/var/tmp/"
198#endif
199#define	L_tmpnam	1024	/* XXX must be == PATH_MAX */
200#define	TMP_MAX		308915776
201
202#ifndef SEEK_SET
203#define	SEEK_SET	0	/* set file offset to offset */
204#endif
205#ifndef SEEK_CUR
206#define	SEEK_CUR	1	/* set file offset to current plus offset */
207#endif
208#ifndef SEEK_END
209#define	SEEK_END	2	/* set file offset to EOF plus offset */
210#endif
211
212#define	stdin	(&__sF[0])
213#define	stdout	(&__sF[1])
214#define	stderr	(&__sF[2])
215
216/*
217 * Functions defined in ANSI C standard.
218 */
219__BEGIN_DECLS
220void	 clearerr __P((FILE *));
221int	 fclose __P((FILE *));
222int	 feof __P((FILE *));
223int	 ferror __P((FILE *));
224int	 fflush __P((FILE *));
225int	 fgetc __P((FILE *));
226int	 fgetpos __P((FILE *, fpos_t *));
227char	*fgets __P((char *, size_t, FILE *));
228FILE	*fopen __P((const char *, const char *));
229int	 fprintf __P((FILE *, const char *, ...));
230int	 fputc __P((int, FILE *));
231int	 fputs __P((const char *, FILE *));
232size_t	 fread __P((void *, size_t, size_t, FILE *));
233FILE	*freopen __P((const char *, const char *, FILE *));
234int	 fscanf __P((FILE *, const char *, ...));
235int	 fseek __P((FILE *, long, int));
236int	 fsetpos __P((FILE *, const fpos_t *));
237long	 ftell __P((const FILE *));
238size_t	 fwrite __P((const void *, size_t, size_t, FILE *));
239int	 getc __P((FILE *));
240int	 getchar __P((void));
241char	*gets __P((char *));
242#if !defined(_ANSI_SOURCE) && !defined(_POSIX_SOURCE)
243extern __const int sys_nerr;		/* perror(3) external variables */
244extern __const char *__const sys_errlist[];
245#endif
246void	 perror __P((const char *));
247int	 printf __P((const char *, ...));
248int	 putc __P((int, FILE *));
249int	 putchar __P((int));
250int	 puts __P((const char *));
251int	 remove __P((const char *));
252int	 rename  __P((const char *, const char *));
253void	 rewind __P((FILE *));
254int	 scanf __P((const char *, ...));
255void	 setbuf __P((FILE *, char *));
256int	 setvbuf __P((FILE *, char *, int, size_t));
257int	 sprintf __P((char *, const char *, ...));
258int	 sscanf __P((const char *, const char *, ...));
259FILE	*tmpfile __P((void));
260char	*tmpnam __P((char *));
261int	 ungetc __P((int, FILE *));
262int	 vfprintf __P((FILE *, const char *, _BSD_VA_LIST_));
263int	 vprintf __P((const char *, _BSD_VA_LIST_));
264int	 vsprintf __P((char *, const char *, _BSD_VA_LIST_));
265__END_DECLS
266
267/*
268 * Functions defined in POSIX 1003.1.
269 */
270#ifndef _ANSI_SOURCE
271#define	L_cuserid	9	/* size for cuserid(); UT_NAMESIZE + 1 */
272#define	L_ctermid	1024	/* size for ctermid(); PATH_MAX */
273
274__BEGIN_DECLS
275char	*ctermid __P((char *));
276FILE	*fdopen __P((int, const char *));
277int	 fileno __P((FILE *));
278__END_DECLS
279#endif /* not ANSI */
280
281/*
282 * Routines that are purely local.
283 */
284#if !defined (_ANSI_SOURCE) && !defined(_POSIX_SOURCE)
285__BEGIN_DECLS
286char	*fgetln __P((FILE *, size_t *));
287int	 fpurge __P((FILE *));
288int	 getw __P((FILE *));
289int	 pclose __P((FILE *));
290FILE	*popen __P((const char *, const char *));
291int	 putw __P((int, FILE *));
292void	 setbuffer __P((FILE *, char *, int));
293int	 setlinebuf __P((FILE *));
294char	*tempnam __P((const char *, const char *));
295int	 snprintf __P((char *, size_t, const char *, ...));
296int	 vsnprintf __P((char *, size_t, const char *, _BSD_VA_LIST_));
297int	 vscanf __P((const char *, _BSD_VA_LIST_));
298int	 vsscanf __P((const char *, const char *, _BSD_VA_LIST_));
299FILE	*zopen __P((const char *, const char *, int));
300__END_DECLS
301
302/*
303 * This is a #define because the function is used internally and
304 * (unlike vfscanf) the name __svfscanf is guaranteed not to collide
305 * with a user function when _ANSI_SOURCE or _POSIX_SOURCE is defined.
306 */
307#define	 vfscanf	__svfscanf
308
309/*
310 * Stdio function-access interface.
311 */
312__BEGIN_DECLS
313FILE	*funopen __P((const void *,
314		int (*)(void *, char *, int),
315		int (*)(void *, const char *, int),
316		fpos_t (*)(void *, fpos_t, int),
317		int (*)(void *)));
318__END_DECLS
319#define	fropen(cookie, fn) funopen(cookie, fn, 0, 0, 0)
320#define	fwopen(cookie, fn) funopen(cookie, 0, fn, 0, 0)
321#endif /* !_ANSI_SOURCE && !_POSIX_SOURCE */
322
323/*
324 * Functions internal to the implementation.
325 */
326__BEGIN_DECLS
327int	__srget __P((FILE *));
328int	__svfscanf __P((FILE *, const char *, _BSD_VA_LIST_));
329int	__swbuf __P((int, FILE *));
330__END_DECLS
331
332/*
333 * The __sfoo macros are here so that we can
334 * define function versions in the C library.
335 */
336#define	__sgetc(p) (--(p)->_r < 0 ? __srget(p) : (int)(*(p)->_p++))
337#if defined(__GNUC__) && defined(__STDC__)
338static __inline int __sputc(int _c, FILE *_p) {
339	if (--_p->_w >= 0 || (_p->_w >= _p->_lbfsize && (char)_c != '\n'))
340		return (*_p->_p++ = _c);
341	else
342		return (__swbuf(_c, _p));
343}
344#else
345/*
346 * This has been tuned to generate reasonable code on the vax using pcc.
347 */
348#define	__sputc(c, p) \
349	(--(p)->_w < 0 ? \
350		(p)->_w >= (p)->_lbfsize ? \
351			(*(p)->_p = (c)), *(p)->_p != '\n' ? \
352				(int)*(p)->_p++ : \
353				__swbuf('\n', p) : \
354			__swbuf((int)(c), p) : \
355		(*(p)->_p = (c), (int)*(p)->_p++))
356#endif
357
358#define	__sfeof(p)	(((p)->_flags & __SEOF) != 0)
359#define	__sferror(p)	(((p)->_flags & __SERR) != 0)
360#define	__sclearerr(p)	((void)((p)->_flags &= ~(__SERR|__SEOF)))
361#define	__sfileno(p)	((p)->_file)
362
363#define	feof(p)		__sfeof(p)
364#define	ferror(p)	__sferror(p)
365#define	clearerr(p)	__sclearerr(p)
366
367#ifndef _ANSI_SOURCE
368#define	fileno(p)	__sfileno(p)
369#endif
370
371#ifndef lint
372#define	getc(fp)	__sgetc(fp)
373#define putc(x, fp)	__sputc(x, fp)
374#endif /* lint */
375
376#define	getchar()	getc(stdin)
377#define	putchar(x)	putc(x, stdout)
378#endif /* _STDIO_H_ */
379