111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert/*	$OpenBSD: stdio.h,v 1.35 2006/01/13 18:10:09 miod Exp $	*/
211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert/*	$NetBSD: stdio.h,v 1.18 1996/04/25 18:29:21 jtc Exp $	*/
311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert/*-
511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * Copyright (c) 1990 The Regents of the University of California.
611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * All rights reserved.
711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert *
811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * This code is derived from software contributed to Berkeley by
911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * Chris Torek.
1011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert *
1111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * Redistribution and use in source and binary forms, with or without
1211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * modification, are permitted provided that the following conditions
1311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * are met:
1411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 1. Redistributions of source code must retain the above copyright
1511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert *    notice, this list of conditions and the following disclaimer.
1611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 2. Redistributions in binary form must reproduce the above copyright
1711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert *    notice, this list of conditions and the following disclaimer in the
1811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert *    documentation and/or other materials provided with the distribution.
1911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 3. Neither the name of the University nor the names of its contributors
2011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert *    may be used to endorse or promote products derived from this software
2111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert *    without specific prior written permission.
2211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert *
2311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
2411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
2511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
2611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
2711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
2811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
2911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
3011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
3111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
3211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
3311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * SUCH DAMAGE.
3411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert *
3511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert *	@(#)stdio.h	5.17 (Berkeley) 6/3/91
3611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert */
3711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
3811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#ifndef	_STDIO_H_
3911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define	_STDIO_H_
4011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
4111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert/*
4211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * This file must contain a reference to __gnuc_va_list so that GCC's
4311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * fixincludes knows that that's what's being used for va_list, and so
4411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * to leave our <stdio.h> alone. (fixincludes gets in the way of pointing
4511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * one toolchain at various different sets of platform headers.)
4611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * If you alter this comment, be sure to keep "__gnuc_va_list" in it!
4711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert */
4811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
4911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#include <sys/cdefs.h>
5011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#include <sys/types.h>
5111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
5211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#include <stdarg.h>
5311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#include <stddef.h>
5411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
5511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define __need_NULL
5611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#include <stddef.h>
5711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
5811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define	_FSTDIO			/* Define for new stdio with functions. */
5911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
6011cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttypedef off_t fpos_t;		/* stdio file position type */
6111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
6211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert/*
6311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * NB: to fit things in six character monocase externals, the stdio
6411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * code uses the prefix `__s' for stdio objects, typically followed
6511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * by a three-character attempt at a mnemonic.
6611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert */
6711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
6811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert/* stdio buffers */
6911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if defined(__LP64__)
7011cd02dfb91661c65134cac258cf5924270e9d2Dan Albertstruct __sbuf {
7111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  unsigned char* _base;
7211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  size_t _size;
7311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert};
7411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#else
7511cd02dfb91661c65134cac258cf5924270e9d2Dan Albertstruct __sbuf {
7611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	unsigned char *_base;
7711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	int	_size;
7811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert};
7911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif
8011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
8111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert/*
8211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * stdio state variables.
8311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert *
8411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * The following always hold:
8511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert *
8611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert *	if (_flags&(__SLBF|__SWR)) == (__SLBF|__SWR),
8711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert *		_lbfsize is -_bf._size, else _lbfsize is 0
8811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert *	if _flags&__SRD, _w is 0
8911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert *	if _flags&__SWR, _r is 0
9011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert *
9111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * This ensures that the getc and putc macros (or inline functions) never
9211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * try to write or read from a file that is in `read' or `write' mode.
9311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * (Moreover, they can, and do, automatically switch from read mode to
9411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * write mode, and back, on "r+" and "w+" files.)
9511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert *
9611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * _lbfsize is used only to make the inline line-buffered output stream
9711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * code as compact as possible.
9811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert *
9911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * _ub, _up, and _ur are used when ungetc() pushes back more characters
10011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * than fit in the current _bf, or when ungetc() pushes back a character
10111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * that does not match the previous one in _bf.  When this happens,
10211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * _ub._base becomes non-nil (i.e., a stream has ungetc() data iff
10311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * _ub._base!=NULL) and _up and _ur save the current values of _p and _r.
10411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert *
10511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * NOTE: if you change this structure, you also need to update the
10611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * std() initializer in findfp.c.
10711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert */
10811cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttypedef	struct __sFILE {
10911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	unsigned char *_p;	/* current position in (some) buffer */
11011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	int	_r;		/* read space left for getc() */
11111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	int	_w;		/* write space left for putc() */
11211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if defined(__LP64__)
11311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	int	_flags;		/* flags, below; this FILE is free if 0 */
11411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	int	_file;		/* fileno, if Unix descriptor, else -1 */
11511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#else
11611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	short	_flags;		/* flags, below; this FILE is free if 0 */
11711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	short	_file;		/* fileno, if Unix descriptor, else -1 */
11811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif
11911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	struct	__sbuf _bf;	/* the buffer (at least 1 byte, if !NULL) */
12011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	int	_lbfsize;	/* 0 or -_bf._size, for inline putc */
12111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
12211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	/* operations */
12311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	void	*_cookie;	/* cookie passed to io functions */
12411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	int	(*_close)(void *);
12511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	int	(*_read)(void *, char *, int);
12611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	fpos_t	(*_seek)(void *, fpos_t, int);
12711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	int	(*_write)(void *, const char *, int);
12811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
12911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	/* extension data, to avoid further ABI breakage */
13011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	struct	__sbuf _ext;
13111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	/* data for long sequences of ungetc() */
13211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	unsigned char *_up;	/* saved _p when _p is doing ungetc data */
13311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	int	_ur;		/* saved _r when _r is counting ungetc data */
13411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
13511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	/* tricks to meet minimum requirements even when malloc() fails */
13611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	unsigned char _ubuf[3];	/* guarantee an ungetc() buffer */
13711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	unsigned char _nbuf[1];	/* guarantee a getc() buffer */
13811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
13911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	/* separate buffer for fgetln() when line crosses buffer boundary */
14011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	struct	__sbuf _lb;	/* buffer for fgetln() */
14111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
14211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	/* Unix stdio files get aligned to block boundaries on fseek() */
14311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	int	_blksize;	/* stat.st_blksize (may be != _bf._size) */
14411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	fpos_t	_offset;	/* current lseek offset */
14511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert} FILE;
14611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
14711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert__BEGIN_DECLS
14811cd02dfb91661c65134cac258cf5924270e9d2Dan Albertextern FILE __sF[];
14911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert__END_DECLS
15011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
15111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define	__SLBF	0x0001		/* line buffered */
15211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define	__SNBF	0x0002		/* unbuffered */
15311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define	__SRD	0x0004		/* OK to read */
15411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define	__SWR	0x0008		/* OK to write */
15511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	/* RD and WR are never simultaneously asserted */
15611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define	__SRW	0x0010		/* open for reading & writing */
15711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define	__SEOF	0x0020		/* found EOF */
15811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define	__SERR	0x0040		/* found error */
15911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define	__SMBF	0x0080		/* _buf is from malloc */
16011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define	__SAPP	0x0100		/* fdopen()ed in append mode */
16111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define	__SSTR	0x0200		/* this is an sprintf/snprintf string */
16211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define	__SOPT	0x0400		/* do fseek() optimization */
16311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define	__SNPT	0x0800		/* do not do fseek() optimization */
16411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define	__SOFF	0x1000		/* set iff _offset is in fact correct */
16511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define	__SMOD	0x2000		/* true => fgetln modified _p text */
16611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define	__SALC	0x4000		/* allocate string space dynamically */
16711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define	__SIGN	0x8000		/* ignore this file in _fwalk */
16811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
16911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert/*
17011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * The following three definitions are for ANSI C, which took them
17111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * from System V, which brilliantly took internal interface macros and
17211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * made them official arguments to setvbuf(), without renaming them.
17311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * Hence, these ugly _IOxxx names are *supposed* to appear in user code.
17411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert *
17511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * Although numbered as their counterparts above, the implementation
17611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * does not rely on this.
17711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert */
17811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define	_IOFBF	0		/* setvbuf should set fully buffered */
17911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define	_IOLBF	1		/* setvbuf should set line buffered */
18011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define	_IONBF	2		/* setvbuf should set unbuffered */
18111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
18211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define	BUFSIZ	1024		/* size of buffer used by setbuf */
18311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define	EOF	(-1)
18411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
18511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert/*
18611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * FOPEN_MAX is a minimum maximum, and is the number of streams that
18711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * stdio can provide without attempting to allocate further resources
18811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * (which could fail).  Do not use this for anything.
18911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert */
19011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
19111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define	FOPEN_MAX	20	/* must be <= OPEN_MAX <sys/syslimits.h> */
19211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define	FILENAME_MAX	1024	/* must be <= PATH_MAX <sys/syslimits.h> */
19311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
19411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert/* System V/ANSI C; this is the wrong way to do this, do *not* use these. */
19511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if __BSD_VISIBLE || __XPG_VISIBLE
19611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define	P_tmpdir	"/tmp/"
19711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif
19811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define	L_tmpnam	1024	/* XXX must be == PATH_MAX */
19911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define	TMP_MAX		308915776
20011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
20111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert/* Always ensure that these are consistent with <fcntl.h> and <unistd.h>! */
20211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#ifndef SEEK_SET
20311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define	SEEK_SET	0	/* set file offset to offset */
20411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif
20511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#ifndef SEEK_CUR
20611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define	SEEK_CUR	1	/* set file offset to current plus offset */
20711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif
20811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#ifndef SEEK_END
20911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define	SEEK_END	2	/* set file offset to EOF plus offset */
21011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif
21111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
21211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define	stdin	(&__sF[0])
21311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define	stdout	(&__sF[1])
21411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define	stderr	(&__sF[2])
21511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
21611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert/*
21711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * Functions defined in ANSI C standard.
21811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert */
21911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert__BEGIN_DECLS
22011cd02dfb91661c65134cac258cf5924270e9d2Dan Albertvoid	 clearerr(FILE *);
22111cd02dfb91661c65134cac258cf5924270e9d2Dan Albertint	 fclose(FILE *);
22211cd02dfb91661c65134cac258cf5924270e9d2Dan Albertint	 feof(FILE *);
22311cd02dfb91661c65134cac258cf5924270e9d2Dan Albertint	 ferror(FILE *);
22411cd02dfb91661c65134cac258cf5924270e9d2Dan Albertint	 fflush(FILE *);
22511cd02dfb91661c65134cac258cf5924270e9d2Dan Albertint	 fgetc(FILE *);
22611cd02dfb91661c65134cac258cf5924270e9d2Dan Albertchar	*fgets(char * __restrict, int, FILE * __restrict);
22711cd02dfb91661c65134cac258cf5924270e9d2Dan AlbertFILE	*fopen(const char * __restrict , const char * __restrict);
22811cd02dfb91661c65134cac258cf5924270e9d2Dan Albertint	 fprintf(FILE * __restrict , const char * __restrict, ...)
22911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		__printflike(2, 3);
23011cd02dfb91661c65134cac258cf5924270e9d2Dan Albertint	 fputc(int, FILE *);
23111cd02dfb91661c65134cac258cf5924270e9d2Dan Albertint	 fputs(const char * __restrict, FILE * __restrict);
23211cd02dfb91661c65134cac258cf5924270e9d2Dan Albertsize_t	 fread(void * __restrict, size_t, size_t, FILE * __restrict);
23311cd02dfb91661c65134cac258cf5924270e9d2Dan AlbertFILE	*freopen(const char * __restrict, const char * __restrict,
23411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	    FILE * __restrict);
23511cd02dfb91661c65134cac258cf5924270e9d2Dan Albertint	 fscanf(FILE * __restrict, const char * __restrict, ...)
23611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		__scanflike(2, 3);
23711cd02dfb91661c65134cac258cf5924270e9d2Dan Albertint	 fseek(FILE *, long, int);
23811cd02dfb91661c65134cac258cf5924270e9d2Dan Albertlong	 ftell(FILE *);
23911cd02dfb91661c65134cac258cf5924270e9d2Dan Albertsize_t	 fwrite(const void * __restrict, size_t, size_t, FILE * __restrict);
24011cd02dfb91661c65134cac258cf5924270e9d2Dan Albertint	 getc(FILE *);
24111cd02dfb91661c65134cac258cf5924270e9d2Dan Albertint	 getchar(void);
24211cd02dfb91661c65134cac258cf5924270e9d2Dan Albertssize_t	 getdelim(char ** __restrict, size_t * __restrict, int,
24311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	    FILE * __restrict);
24411cd02dfb91661c65134cac258cf5924270e9d2Dan Albertssize_t	 getline(char ** __restrict, size_t * __restrict, FILE * __restrict);
24511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
24611cd02dfb91661c65134cac258cf5924270e9d2Dan Albertvoid	 perror(const char *);
24711cd02dfb91661c65134cac258cf5924270e9d2Dan Albertint	 printf(const char * __restrict, ...)
24811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		__printflike(1, 2);
24911cd02dfb91661c65134cac258cf5924270e9d2Dan Albertint	 putc(int, FILE *);
25011cd02dfb91661c65134cac258cf5924270e9d2Dan Albertint	 putchar(int);
25111cd02dfb91661c65134cac258cf5924270e9d2Dan Albertint	 puts(const char *);
25211cd02dfb91661c65134cac258cf5924270e9d2Dan Albertint	 remove(const char *);
25311cd02dfb91661c65134cac258cf5924270e9d2Dan Albertvoid	 rewind(FILE *);
25411cd02dfb91661c65134cac258cf5924270e9d2Dan Albertint	 scanf(const char * __restrict, ...)
25511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		__scanflike(1, 2);
25611cd02dfb91661c65134cac258cf5924270e9d2Dan Albertvoid	 setbuf(FILE * __restrict, char * __restrict);
25711cd02dfb91661c65134cac258cf5924270e9d2Dan Albertint	 setvbuf(FILE * __restrict, char * __restrict, int, size_t);
25811cd02dfb91661c65134cac258cf5924270e9d2Dan Albertint	 sscanf(const char * __restrict, const char * __restrict, ...)
25911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		__scanflike(2, 3);
26011cd02dfb91661c65134cac258cf5924270e9d2Dan AlbertFILE	*tmpfile(void);
26111cd02dfb91661c65134cac258cf5924270e9d2Dan Albertint	 ungetc(int, FILE *);
26211cd02dfb91661c65134cac258cf5924270e9d2Dan Albertint	 vfprintf(FILE * __restrict, const char * __restrict, __va_list)
26311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		__printflike(2, 0);
26411cd02dfb91661c65134cac258cf5924270e9d2Dan Albertint	 vprintf(const char * __restrict, __va_list)
26511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		__printflike(1, 0);
26611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
26711cd02dfb91661c65134cac258cf5924270e9d2Dan Albertint dprintf(int, const char * __restrict, ...) __printflike(2, 3);
26811cd02dfb91661c65134cac258cf5924270e9d2Dan Albertint vdprintf(int, const char * __restrict, __va_list) __printflike(2, 0);
26911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
27011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#ifndef __AUDIT__
27111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if !defined(__STDC_VERSION__) || __STDC_VERSION__ < 201112L
27211cd02dfb91661c65134cac258cf5924270e9d2Dan Albertchar* gets(char*) __warnattr("gets is very unsafe; consider using fgets");
27311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif
27411cd02dfb91661c65134cac258cf5924270e9d2Dan Albertint sprintf(char* __restrict, const char* __restrict, ...)
27511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    __printflike(2, 3); //__warnattr("sprintf is often misused; please use snprintf");
27611cd02dfb91661c65134cac258cf5924270e9d2Dan Albertchar* tmpnam(char*) __warnattr("tmpnam possibly used unsafely; consider using mkstemp");
27711cd02dfb91661c65134cac258cf5924270e9d2Dan Albertint vsprintf(char* __restrict, const char* __restrict, __va_list)
27811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    __printflike(2, 0); //__warnattr("vsprintf is often misused; please use vsnprintf");
27911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if __XPG_VISIBLE
28011cd02dfb91661c65134cac258cf5924270e9d2Dan Albertchar* tempnam(const char*, const char*)
28111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    __warnattr("tempnam possibly used unsafely; consider using mkstemp");
28211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif
28311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif
28411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
28511cd02dfb91661c65134cac258cf5924270e9d2Dan Albertextern int rename(const char*, const char*);
28611cd02dfb91661c65134cac258cf5924270e9d2Dan Albertextern int renameat(int, const char*, int, const char*);
28711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
28811cd02dfb91661c65134cac258cf5924270e9d2Dan Albertint	 fgetpos(FILE * __restrict, fpos_t * __restrict);
28911cd02dfb91661c65134cac258cf5924270e9d2Dan Albertint	 fsetpos(FILE *, const fpos_t *);
29011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
29111cd02dfb91661c65134cac258cf5924270e9d2Dan Albertint	 fseeko(FILE *, off_t, int);
29211cd02dfb91661c65134cac258cf5924270e9d2Dan Albertoff_t	 ftello(FILE *);
29311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
29411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if __ISO_C_VISIBLE >= 1999 || __BSD_VISIBLE
29511cd02dfb91661c65134cac258cf5924270e9d2Dan Albertint	 snprintf(char * __restrict, size_t, const char * __restrict, ...)
29611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		__printflike(3, 4);
29711cd02dfb91661c65134cac258cf5924270e9d2Dan Albertint	 vfscanf(FILE * __restrict, const char * __restrict, __va_list)
29811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		__scanflike(2, 0);
29911cd02dfb91661c65134cac258cf5924270e9d2Dan Albertint	 vscanf(const char *, __va_list)
30011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		__scanflike(1, 0);
30111cd02dfb91661c65134cac258cf5924270e9d2Dan Albertint	 vsnprintf(char * __restrict, size_t, const char * __restrict, __va_list)
30211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		__printflike(3, 0);
30311cd02dfb91661c65134cac258cf5924270e9d2Dan Albertint	 vsscanf(const char * __restrict, const char * __restrict, __va_list)
30411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		__scanflike(2, 0);
30511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif /* __ISO_C_VISIBLE >= 1999 || __BSD_VISIBLE */
30611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
30711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert__END_DECLS
30811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
30911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
31011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert/*
31111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * Functions defined in POSIX 1003.1.
31211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert */
31311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if __BSD_VISIBLE || __POSIX_VISIBLE || __XPG_VISIBLE
31411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define	L_ctermid	1024	/* size for ctermid(); PATH_MAX */
31511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
31611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert__BEGIN_DECLS
31711cd02dfb91661c65134cac258cf5924270e9d2Dan AlbertFILE	*fdopen(int, const char *);
31811cd02dfb91661c65134cac258cf5924270e9d2Dan Albertint	 fileno(FILE *);
31911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
32011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if (__POSIX_VISIBLE >= 199209)
32111cd02dfb91661c65134cac258cf5924270e9d2Dan Albertint	 pclose(FILE *);
32211cd02dfb91661c65134cac258cf5924270e9d2Dan AlbertFILE	*popen(const char *, const char *);
32311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif
32411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
32511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if __POSIX_VISIBLE >= 199506
32611cd02dfb91661c65134cac258cf5924270e9d2Dan Albertvoid	 flockfile(FILE *);
32711cd02dfb91661c65134cac258cf5924270e9d2Dan Albertint	 ftrylockfile(FILE *);
32811cd02dfb91661c65134cac258cf5924270e9d2Dan Albertvoid	 funlockfile(FILE *);
32911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
33011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert/*
33111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * These are normally used through macros as defined below, but POSIX
33211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * requires functions as well.
33311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert */
33411cd02dfb91661c65134cac258cf5924270e9d2Dan Albertint	 getc_unlocked(FILE *);
33511cd02dfb91661c65134cac258cf5924270e9d2Dan Albertint	 getchar_unlocked(void);
33611cd02dfb91661c65134cac258cf5924270e9d2Dan Albertint	 putc_unlocked(int, FILE *);
33711cd02dfb91661c65134cac258cf5924270e9d2Dan Albertint	 putchar_unlocked(int);
33811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif /* __POSIX_VISIBLE >= 199506 */
33911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
34011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert__END_DECLS
34111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
34211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif /* __BSD_VISIBLE || __POSIX_VISIBLE || __XPG_VISIBLE */
34311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
34411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert/*
34511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * Routines that are purely local.
34611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert */
34711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if __BSD_VISIBLE
34811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert__BEGIN_DECLS
34911cd02dfb91661c65134cac258cf5924270e9d2Dan Albertint	 asprintf(char ** __restrict, const char * __restrict, ...)
35011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		__printflike(2, 3);
35111cd02dfb91661c65134cac258cf5924270e9d2Dan Albertchar	*fgetln(FILE * __restrict, size_t * __restrict);
35211cd02dfb91661c65134cac258cf5924270e9d2Dan Albertint	 fpurge(FILE *);
35311cd02dfb91661c65134cac258cf5924270e9d2Dan Albertvoid	 setbuffer(FILE *, char *, int);
35411cd02dfb91661c65134cac258cf5924270e9d2Dan Albertint	 setlinebuf(FILE *);
35511cd02dfb91661c65134cac258cf5924270e9d2Dan Albertint	 vasprintf(char ** __restrict, const char * __restrict,
35611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    __va_list)
35711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		__printflike(2, 0);
35811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert__END_DECLS
35911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
36011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert/*
36111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * Stdio function-access interface.
36211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert */
36311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert__BEGIN_DECLS
36411cd02dfb91661c65134cac258cf5924270e9d2Dan AlbertFILE	*funopen(const void *,
36511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		int (*)(void *, char *, int),
36611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		int (*)(void *, const char *, int),
36711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		fpos_t (*)(void *, fpos_t, int),
36811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		int (*)(void *));
36911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert__END_DECLS
37011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define	fropen(cookie, fn) funopen(cookie, fn, 0, 0, 0)
37111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define	fwopen(cookie, fn) funopen(cookie, 0, fn, 0, 0)
37211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif /* __BSD_VISIBLE */
37311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
37411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if defined(__BIONIC_FORTIFY)
37511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
37611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert__BEGIN_DECLS
37711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
37811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert__BIONIC_FORTIFY_INLINE
37911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert__printflike(3, 0)
38011cd02dfb91661c65134cac258cf5924270e9d2Dan Albertint vsnprintf(char *dest, size_t size, const char *format, __va_list ap)
38111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert{
38211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    return __builtin___vsnprintf_chk(dest, size, 0, __bos(dest), format, ap);
38311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert}
38411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
38511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert__BIONIC_FORTIFY_INLINE
38611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert__printflike(2, 0)
38711cd02dfb91661c65134cac258cf5924270e9d2Dan Albertint vsprintf(char *dest, const char *format, __va_list ap)
38811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert{
38911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    return __builtin___vsprintf_chk(dest, 0, __bos(dest), format, ap);
39011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert}
39111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
39211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if defined(__clang__)
39311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  #if !defined(snprintf)
39411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    #define __wrap_snprintf(dest, size, ...) __builtin___snprintf_chk(dest, size, 0, __bos(dest), __VA_ARGS__)
39511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    #define snprintf(...) __wrap_snprintf(__VA_ARGS__)
39611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  #endif
39711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#else
39811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert__BIONIC_FORTIFY_INLINE
39911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert__printflike(3, 4)
40011cd02dfb91661c65134cac258cf5924270e9d2Dan Albertint snprintf(char *dest, size_t size, const char *format, ...)
40111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert{
40211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    return __builtin___snprintf_chk(dest, size, 0,
40311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        __bos(dest), format, __builtin_va_arg_pack());
40411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert}
40511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif
40611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
40711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if defined(__clang__)
40811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  #if !defined(sprintf)
40911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    #define __wrap_sprintf(dest, ...) __builtin___sprintf_chk(dest, 0, __bos(dest), __VA_ARGS__)
41011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    #define sprintf(...) __wrap_sprintf(__VA_ARGS__)
41111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  #endif
41211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#else
41311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert__BIONIC_FORTIFY_INLINE
41411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert__printflike(2, 3)
41511cd02dfb91661c65134cac258cf5924270e9d2Dan Albertint sprintf(char *dest, const char *format, ...)
41611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert{
41711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    return __builtin___sprintf_chk(dest, 0,
41811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        __bos(dest), format, __builtin_va_arg_pack());
41911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert}
42011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif
42111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
42211cd02dfb91661c65134cac258cf5924270e9d2Dan Albertextern char* __fgets_chk(char*, int, FILE*, size_t);
42311cd02dfb91661c65134cac258cf5924270e9d2Dan Albertextern char* __fgets_real(char*, int, FILE*) __asm__(__USER_LABEL_PREFIX__ "fgets");
42411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert__errordecl(__fgets_too_big_error, "fgets called with size bigger than buffer");
42511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert__errordecl(__fgets_too_small_error, "fgets called with size less than zero");
42611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
42711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if !defined(__clang__)
42811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
42911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert__BIONIC_FORTIFY_INLINE
43011cd02dfb91661c65134cac258cf5924270e9d2Dan Albertchar *fgets(char* dest, int size, FILE* stream) {
43111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    size_t bos = __bos(dest);
43211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
43311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    // Compiler can prove, at compile time, that the passed in size
43411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    // is always negative. Force a compiler error.
43511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    if (__builtin_constant_p(size) && (size < 0)) {
43611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        __fgets_too_small_error();
43711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    }
43811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
43911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    // Compiler doesn't know destination size. Don't call __fgets_chk
44011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    if (bos == __BIONIC_FORTIFY_UNKNOWN_SIZE) {
44111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        return __fgets_real(dest, size, stream);
44211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    }
44311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
44411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    // Compiler can prove, at compile time, that the passed in size
44511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    // is always <= the actual object size. Don't call __fgets_chk
44611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    if (__builtin_constant_p(size) && (size <= (int) bos)) {
44711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        return __fgets_real(dest, size, stream);
44811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    }
44911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
45011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    // Compiler can prove, at compile time, that the passed in size
45111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    // is always > the actual object size. Force a compiler error.
45211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    if (__builtin_constant_p(size) && (size > (int) bos)) {
45311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        __fgets_too_big_error();
45411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    }
45511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
45611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    return __fgets_chk(dest, size, stream, bos);
45711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert}
45811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
45911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif /* !defined(__clang__) */
46011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
46111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert__END_DECLS
46211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
46311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif /* defined(__BIONIC_FORTIFY) */
46411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
46511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif /* _STDIO_H_ */
466