11dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/*	$OpenBSD: stdio.h,v 1.35 2006/01/13 18:10:09 miod Exp $	*/
21dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/*	$NetBSD: stdio.h,v 1.18 1996/04/25 18:29:21 jtc Exp $	*/
31dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
41dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/*-
51dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Copyright (c) 1990 The Regents of the University of California.
61dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * All rights reserved.
71dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *
81dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * This code is derived from software contributed to Berkeley by
91dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Chris Torek.
101dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *
111dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Redistribution and use in source and binary forms, with or without
121dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * modification, are permitted provided that the following conditions
131dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * are met:
141dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * 1. Redistributions of source code must retain the above copyright
151dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *    notice, this list of conditions and the following disclaimer.
161dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * 2. Redistributions in binary form must reproduce the above copyright
171dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *    notice, this list of conditions and the following disclaimer in the
181dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *    documentation and/or other materials provided with the distribution.
191dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * 3. Neither the name of the University nor the names of its contributors
201dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *    may be used to endorse or promote products derived from this software
211dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *    without specific prior written permission.
221dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *
231dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
241dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
251dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
261dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
271dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
281dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
291dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
301dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
311dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
321dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
331dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * SUCH DAMAGE.
341dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *
351dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *	@(#)stdio.h	5.17 (Berkeley) 6/3/91
361dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project */
371dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
381dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#ifndef	_STDIO_H_
391dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define	_STDIO_H_
401dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
411dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#include <sys/cdefs.h>
421dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#include <sys/_types.h>
431dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
441dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/* va_list and size_t must be defined by stdio.h according to Posix */
451dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define __need___va_list
461dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#include <stdarg.h>
471dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
481dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/* note that this forces stddef.h to *only* define size_t */
491dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define __need_size_t
501dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#include <stddef.h>
511dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
521dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#include <stddef.h>
531dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
541dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#if __BSD_VISIBLE || __POSIX_VISIBLE || __XPG_VISIBLE
551dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#include <sys/types.h>	/* XXX should be removed */
561dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#endif
571dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
581dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#ifndef	_SIZE_T_DEFINED_
591dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define	_SIZE_T_DEFINED_
601dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projecttypedef	unsigned long    size_t;
611dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#endif
621dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
631dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#ifndef	_OFF_T_DEFINED_
641dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define	_OFF_T_DEFINED_
651dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projecttypedef	long    off_t;
661dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#endif
671dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
681dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#ifndef NULL
691dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#ifdef 	__GNUG__
701dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define	NULL	__null
711dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#else
721dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define	NULL	0L
731dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#endif
741dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#endif
751dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
761dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define	_FSTDIO			/* Define for new stdio with functions. */
771dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
781dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projecttypedef off_t fpos_t;		/* stdio file position type */
791dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
801dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/*
811dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * NB: to fit things in six character monocase externals, the stdio
821dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * code uses the prefix `__s' for stdio objects, typically followed
831dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * by a three-character attempt at a mnemonic.
841dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project */
851dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
861dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/* stdio buffers */
871dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectstruct __sbuf {
881dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	unsigned char *_base;
891dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	int	_size;
901dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project};
911dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
921dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/*
931dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * stdio state variables.
941dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *
951dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * The following always hold:
961dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *
971dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *	if (_flags&(__SLBF|__SWR)) == (__SLBF|__SWR),
981dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *		_lbfsize is -_bf._size, else _lbfsize is 0
991dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *	if _flags&__SRD, _w is 0
1001dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *	if _flags&__SWR, _r is 0
1011dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *
1021dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * This ensures that the getc and putc macros (or inline functions) never
1031dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * try to write or read from a file that is in `read' or `write' mode.
1041dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * (Moreover, they can, and do, automatically switch from read mode to
1051dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * write mode, and back, on "r+" and "w+" files.)
1061dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *
1071dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * _lbfsize is used only to make the inline line-buffered output stream
1081dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * code as compact as possible.
1091dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *
1101dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * _ub, _up, and _ur are used when ungetc() pushes back more characters
1111dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * than fit in the current _bf, or when ungetc() pushes back a character
1121dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * that does not match the previous one in _bf.  When this happens,
1131dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * _ub._base becomes non-nil (i.e., a stream has ungetc() data iff
1141dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * _ub._base!=NULL) and _up and _ur save the current values of _p and _r.
115c1202510b67f200b668d85ac0190db2b179b0c4dAndy McFadden *
116c1202510b67f200b668d85ac0190db2b179b0c4dAndy McFadden * NOTE: if you change this structure, you also need to update the
117c1202510b67f200b668d85ac0190db2b179b0c4dAndy McFadden * std() initializer in findfp.c.
1181dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project */
1191dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projecttypedef	struct __sFILE {
1201dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	unsigned char *_p;	/* current position in (some) buffer */
1211dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	int	_r;		/* read space left for getc() */
1221dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	int	_w;		/* write space left for putc() */
1231dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	short	_flags;		/* flags, below; this FILE is free if 0 */
1241dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	short	_file;		/* fileno, if Unix descriptor, else -1 */
1251dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	struct	__sbuf _bf;	/* the buffer (at least 1 byte, if !NULL) */
1261dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	int	_lbfsize;	/* 0 or -_bf._size, for inline putc */
1271dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
1281dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	/* operations */
1291dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	void	*_cookie;	/* cookie passed to io functions */
1301dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	int	(*_close)(void *);
1311dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	int	(*_read)(void *, char *, int);
1321dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	fpos_t	(*_seek)(void *, fpos_t, int);
1331dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	int	(*_write)(void *, const char *, int);
1341dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
1351dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	/* extension data, to avoid further ABI breakage */
1361dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	struct	__sbuf _ext;
1371dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	/* data for long sequences of ungetc() */
1381dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	unsigned char *_up;	/* saved _p when _p is doing ungetc data */
1391dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	int	_ur;		/* saved _r when _r is counting ungetc data */
1401dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
1411dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	/* tricks to meet minimum requirements even when malloc() fails */
1421dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	unsigned char _ubuf[3];	/* guarantee an ungetc() buffer */
1431dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	unsigned char _nbuf[1];	/* guarantee a getc() buffer */
1441dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
1451dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	/* separate buffer for fgetln() when line crosses buffer boundary */
1461dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	struct	__sbuf _lb;	/* buffer for fgetln() */
1471dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
1481dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	/* Unix stdio files get aligned to block boundaries on fseek() */
1491dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	int	_blksize;	/* stat.st_blksize (may be != _bf._size) */
1501dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	fpos_t	_offset;	/* current lseek offset */
1511dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project} FILE;
1521dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
1531dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project__BEGIN_DECLS
1541dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectextern FILE __sF[];
1551dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project__END_DECLS
1561dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
1571dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define	__SLBF	0x0001		/* line buffered */
1581dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define	__SNBF	0x0002		/* unbuffered */
1591dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define	__SRD	0x0004		/* OK to read */
1601dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define	__SWR	0x0008		/* OK to write */
1611dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	/* RD and WR are never simultaneously asserted */
1621dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define	__SRW	0x0010		/* open for reading & writing */
1631dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define	__SEOF	0x0020		/* found EOF */
1641dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define	__SERR	0x0040		/* found error */
1651dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define	__SMBF	0x0080		/* _buf is from malloc */
1661dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define	__SAPP	0x0100		/* fdopen()ed in append mode */
1671dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define	__SSTR	0x0200		/* this is an sprintf/snprintf string */
1681dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define	__SOPT	0x0400		/* do fseek() optimisation */
1691dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define	__SNPT	0x0800		/* do not do fseek() optimisation */
1701dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define	__SOFF	0x1000		/* set iff _offset is in fact correct */
1711dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define	__SMOD	0x2000		/* true => fgetln modified _p text */
1721dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define	__SALC	0x4000		/* allocate string space dynamically */
173f582340a6a48588aa50da17e1620e8f91b146941Kenny Root#define	__SIGN	0x8000		/* ignore this file in _fwalk */
1741dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
1751dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/*
1761dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * The following three definitions are for ANSI C, which took them
1771dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * from System V, which brilliantly took internal interface macros and
1781dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * made them official arguments to setvbuf(), without renaming them.
1791dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Hence, these ugly _IOxxx names are *supposed* to appear in user code.
1801dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *
1811dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Although numbered as their counterparts above, the implementation
1821dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * does not rely on this.
1831dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project */
1841dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define	_IOFBF	0		/* setvbuf should set fully buffered */
1851dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define	_IOLBF	1		/* setvbuf should set line buffered */
1861dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define	_IONBF	2		/* setvbuf should set unbuffered */
1871dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
1881dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define	BUFSIZ	1024		/* size of buffer used by setbuf */
1891dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
1901dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define	EOF	(-1)
1911dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
1921dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/*
1931dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * FOPEN_MAX is a minimum maximum, and should be the number of descriptors
1941dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * that the kernel can provide without allocation of a resource that can
1951dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * fail without the process sleeping.  Do not use this for anything.
1961dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project */
1971dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define	FOPEN_MAX	20	/* must be <= OPEN_MAX <sys/syslimits.h> */
1981dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define	FILENAME_MAX	1024	/* must be <= PATH_MAX <sys/syslimits.h> */
1991dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
2001dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/* System V/ANSI C; this is the wrong way to do this, do *not* use these. */
2011dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#if __BSD_VISIBLE || __XPG_VISIBLE
2021dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define	P_tmpdir	"/tmp/"
2031dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#endif
2041dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define	L_tmpnam	1024	/* XXX must be == PATH_MAX */
2051dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define	TMP_MAX		308915776
2061dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
2071dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#ifndef SEEK_SET
2081dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define	SEEK_SET	0	/* set file offset to offset */
2091dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#endif
2101dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#ifndef SEEK_CUR
2111dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define	SEEK_CUR	1	/* set file offset to current plus offset */
2121dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#endif
2131dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#ifndef SEEK_END
2141dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define	SEEK_END	2	/* set file offset to EOF plus offset */
2151dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#endif
2161dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
2171dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define	stdin	(&__sF[0])
2181dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define	stdout	(&__sF[1])
2191dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define	stderr	(&__sF[2])
2201dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
2211dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/*
2221dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Functions defined in ANSI C standard.
2231dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project */
2241dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project__BEGIN_DECLS
2251dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectvoid	 clearerr(FILE *);
2261dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectint	 fclose(FILE *);
2271dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectint	 feof(FILE *);
2281dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectint	 ferror(FILE *);
2291dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectint	 fflush(FILE *);
2301dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectint	 fgetc(FILE *);
2311dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectint	 fgetpos(FILE *, fpos_t *);
2321dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectchar	*fgets(char *, int, FILE *);
2331dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source ProjectFILE	*fopen(const char *, const char *);
2349b549c39c938f54680f282c21e6885f53254bfb0Nick Kralevichint	 fprintf(FILE *, const char *, ...)
2359b549c39c938f54680f282c21e6885f53254bfb0Nick Kralevich		__attribute__((__format__ (printf, 2, 3)))
2369b549c39c938f54680f282c21e6885f53254bfb0Nick Kralevich		__attribute__((__nonnull__ (2)));
2371dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectint	 fputc(int, FILE *);
2381dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectint	 fputs(const char *, FILE *);
2391dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectsize_t	 fread(void *, size_t, size_t, FILE *);
2401dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source ProjectFILE	*freopen(const char *, const char *, FILE *);
2419b549c39c938f54680f282c21e6885f53254bfb0Nick Kralevichint	 fscanf(FILE *, const char *, ...)
2429b549c39c938f54680f282c21e6885f53254bfb0Nick Kralevich		__attribute__ ((__format__ (scanf, 2, 3)))
2439b549c39c938f54680f282c21e6885f53254bfb0Nick Kralevich		__attribute__ ((__nonnull__ (2)));
2441dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectint	 fseek(FILE *, long, int);
2451dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectint	 fseeko(FILE *, off_t, int);
2461dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectint	 fsetpos(FILE *, const fpos_t *);
2471dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectlong	 ftell(FILE *);
2481dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectoff_t	 ftello(FILE *);
2491dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectsize_t	 fwrite(const void *, size_t, size_t, FILE *);
2501dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectint	 getc(FILE *);
2511dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectint	 getchar(void);
2521dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectchar	*gets(char *);
2531dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#if __BSD_VISIBLE && !defined(__SYS_ERRLIST)
2541dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define __SYS_ERRLIST
2551dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
2561dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectextern int sys_nerr;			/* perror(3) external variables */
2571dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectextern char *sys_errlist[];
2581dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#endif
2591dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectvoid	 perror(const char *);
2609b549c39c938f54680f282c21e6885f53254bfb0Nick Kralevichint	 printf(const char *, ...)
2619b549c39c938f54680f282c21e6885f53254bfb0Nick Kralevich		__attribute__((__format__ (printf, 1, 2)))
2629b549c39c938f54680f282c21e6885f53254bfb0Nick Kralevich		__attribute__((__nonnull__ (1)));
2631dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectint	 putc(int, FILE *);
2641dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectint	 putchar(int);
2651dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectint	 puts(const char *);
2661dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectint	 remove(const char *);
2671dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectint	 rename(const char *, const char *);
2681dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectvoid	 rewind(FILE *);
2699b549c39c938f54680f282c21e6885f53254bfb0Nick Kralevichint	 scanf(const char *, ...)
2709b549c39c938f54680f282c21e6885f53254bfb0Nick Kralevich		__attribute__ ((__format__ (scanf, 1, 2)))
2719b549c39c938f54680f282c21e6885f53254bfb0Nick Kralevich		__attribute__ ((__nonnull__ (1)));
2721dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectvoid	 setbuf(FILE *, char *);
2731dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectint	 setvbuf(FILE *, char *, int, size_t);
2749b549c39c938f54680f282c21e6885f53254bfb0Nick Kralevichint	 sprintf(char *, const char *, ...)
2759b549c39c938f54680f282c21e6885f53254bfb0Nick Kralevich		__attribute__((__format__ (printf, 2, 3)))
2769b549c39c938f54680f282c21e6885f53254bfb0Nick Kralevich		__attribute__((__nonnull__ (2)));
2779b549c39c938f54680f282c21e6885f53254bfb0Nick Kralevichint	 sscanf(const char *, const char *, ...)
2789b549c39c938f54680f282c21e6885f53254bfb0Nick Kralevich		__attribute__ ((__format__ (scanf, 2, 3)))
2799b549c39c938f54680f282c21e6885f53254bfb0Nick Kralevich		__attribute__ ((__nonnull__ (2)));
2801dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source ProjectFILE	*tmpfile(void);
2811dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectchar	*tmpnam(char *);
2821dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectint	 ungetc(int, FILE *);
2839b549c39c938f54680f282c21e6885f53254bfb0Nick Kralevichint	 vfprintf(FILE *, const char *, __va_list)
2849b549c39c938f54680f282c21e6885f53254bfb0Nick Kralevich		__attribute__((__format__ (printf, 2, 0)))
2859b549c39c938f54680f282c21e6885f53254bfb0Nick Kralevich		__attribute__((__nonnull__ (2)));
2869b549c39c938f54680f282c21e6885f53254bfb0Nick Kralevichint	 vprintf(const char *, __va_list)
2879b549c39c938f54680f282c21e6885f53254bfb0Nick Kralevich		__attribute__((__format__ (printf, 1, 0)))
2889b549c39c938f54680f282c21e6885f53254bfb0Nick Kralevich		__attribute__((__nonnull__ (1)));
2899b549c39c938f54680f282c21e6885f53254bfb0Nick Kralevichint	 vsprintf(char *, const char *, __va_list)
2909b549c39c938f54680f282c21e6885f53254bfb0Nick Kralevich		__attribute__((__format__ (printf, 2, 0)))
2919b549c39c938f54680f282c21e6885f53254bfb0Nick Kralevich		__attribute__((__nonnull__ (2)));
2921dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
2931dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#if __ISO_C_VISIBLE >= 1999 || __BSD_VISIBLE
2941dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectint	 snprintf(char *, size_t, const char *, ...)
2951dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		__attribute__((__format__ (printf, 3, 4)))
2961dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		__attribute__((__nonnull__ (3)));
2971dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectint	 vfscanf(FILE *, const char *, __va_list)
2981dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		__attribute__((__format__ (scanf, 2, 0)))
2991dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		__attribute__((__nonnull__ (2)));
3001dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectint	 vscanf(const char *, __va_list)
3011dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		__attribute__((__format__ (scanf, 1, 0)))
3021dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		__attribute__((__nonnull__ (1)));
3031dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectint	 vsnprintf(char *, size_t, const char *, __va_list)
3041dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		__attribute__((__format__ (printf, 3, 0)))
3051dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		__attribute__((__nonnull__ (3)));
3061dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectint	 vsscanf(const char *, const char *, __va_list)
3071dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		__attribute__((__format__ (scanf, 2, 0)))
3081dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		__attribute__((__nonnull__ (2)));
3091dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#endif /* __ISO_C_VISIBLE >= 1999 || __BSD_VISIBLE */
3101dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
3111dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project__END_DECLS
3121dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
3131dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
3141dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/*
3151dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Functions defined in POSIX 1003.1.
3161dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project */
3171dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#if __BSD_VISIBLE || __POSIX_VISIBLE || __XPG_VISIBLE
3181dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define	L_ctermid	1024	/* size for ctermid(); PATH_MAX */
3191dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define L_cuserid	9	/* size for cuserid(); UT_NAMESIZE + 1 */
3201dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
3211dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project__BEGIN_DECLS
322bb5581ad6eec40041dab4e961149f7a8a3a83497David 'Digit' Turner#if 0 /* MISSING FROM BIONIC */
3231dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectchar	*ctermid(char *);
3241dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectchar	*cuserid(char *);
325bb5581ad6eec40041dab4e961149f7a8a3a83497David 'Digit' Turner#endif /* MISSING */
3261dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source ProjectFILE	*fdopen(int, const char *);
3271dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectint	 fileno(FILE *);
3281dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
32950ace4fec5e8cb5afcbc656a4556fa528adfd760David 'Digit' Turner#if (__POSIX_VISIBLE >= 199209)
3301dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectint	 pclose(FILE *);
3311dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source ProjectFILE	*popen(const char *, const char *);
3321dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#endif
3331dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
3341dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#if __POSIX_VISIBLE >= 199506
3351dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectvoid	 flockfile(FILE *);
3361dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectint	 ftrylockfile(FILE *);
3371dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectvoid	 funlockfile(FILE *);
3381dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
3391dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/*
3401dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * These are normally used through macros as defined below, but POSIX
3411dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * requires functions as well.
3421dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project */
3431dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectint	 getc_unlocked(FILE *);
3441dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectint	 getchar_unlocked(void);
3451dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectint	 putc_unlocked(int, FILE *);
3461dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectint	 putchar_unlocked(int);
3471dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#endif /* __POSIX_VISIBLE >= 199506 */
3481dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
3491dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#if __XPG_VISIBLE
3501dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectchar	*tempnam(const char *, const char *);
3511dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#endif
3521dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project__END_DECLS
3531dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
3541dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#endif /* __BSD_VISIBLE || __POSIX_VISIBLE || __XPG_VISIBLE */
3551dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
3561dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/*
3571dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Routines that are purely local.
3581dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project */
3591dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#if __BSD_VISIBLE
3601dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project__BEGIN_DECLS
3611dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectint	 asprintf(char **, const char *, ...)
3621dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		__attribute__((__format__ (printf, 2, 3)))
3631dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		__attribute__((__nonnull__ (2)));
3641dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectchar	*fgetln(FILE *, size_t *);
3651dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectint	 fpurge(FILE *);
3661dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectint	 getw(FILE *);
3671dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectint	 putw(int, FILE *);
3681dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectvoid	 setbuffer(FILE *, char *, int);
3691dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectint	 setlinebuf(FILE *);
3701dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectint	 vasprintf(char **, const char *, __va_list)
3711dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		__attribute__((__format__ (printf, 2, 0)))
3721dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		__attribute__((__nonnull__ (2)));
3731dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project__END_DECLS
3741dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
3751dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/*
3761dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Stdio function-access interface.
3771dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project */
3781dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project__BEGIN_DECLS
3791dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source ProjectFILE	*funopen(const void *,
3801dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		int (*)(void *, char *, int),
3811dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		int (*)(void *, const char *, int),
3821dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		fpos_t (*)(void *, fpos_t, int),
3831dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		int (*)(void *));
3841dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project__END_DECLS
3851dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define	fropen(cookie, fn) funopen(cookie, fn, 0, 0, 0)
3861dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define	fwopen(cookie, fn) funopen(cookie, 0, fn, 0, 0)
3871dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#endif /* __BSD_VISIBLE */
3881dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
3891dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/*
3901dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Functions internal to the implementation.
3911dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project */
3921dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project__BEGIN_DECLS
3931dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectint	__srget(FILE *);
3941dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectint	__swbuf(int, FILE *);
3951dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project__END_DECLS
3961dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
3971dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/*
3981dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * The __sfoo macros are here so that we can
3991dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * define function versions in the C library.
4001dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project */
4011dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define	__sgetc(p) (--(p)->_r < 0 ? __srget(p) : (int)(*(p)->_p++))
4021dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#if defined(__GNUC__)
4031dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectstatic __inline int __sputc(int _c, FILE *_p) {
4041dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	if (--_p->_w >= 0 || (_p->_w >= _p->_lbfsize && (char)_c != '\n'))
4051dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		return (*_p->_p++ = _c);
4061dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	else
4071dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		return (__swbuf(_c, _p));
4081dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project}
4091dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#else
4101dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/*
4111dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * This has been tuned to generate reasonable code on the vax using pcc.
4121dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project */
4131dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define	__sputc(c, p) \
4141dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	(--(p)->_w < 0 ? \
4151dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		(p)->_w >= (p)->_lbfsize ? \
4161dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project			(*(p)->_p = (c)), *(p)->_p != '\n' ? \
4171dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project				(int)*(p)->_p++ : \
4181dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project				__swbuf('\n', p) : \
4191dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project			__swbuf((int)(c), p) : \
4201dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		(*(p)->_p = (c), (int)*(p)->_p++))
4211dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#endif
4221dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
4231dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define	__sfeof(p)	(((p)->_flags & __SEOF) != 0)
4241dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define	__sferror(p)	(((p)->_flags & __SERR) != 0)
4251dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define	__sclearerr(p)	((void)((p)->_flags &= ~(__SERR|__SEOF)))
4261dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define	__sfileno(p)	((p)->_file)
4271dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
428f582340a6a48588aa50da17e1620e8f91b146941Kenny Rootextern	int __isthreaded;
4291dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
430f582340a6a48588aa50da17e1620e8f91b146941Kenny Root#define	feof(p)		(!__isthreaded ? __sfeof(p) : (feof)(p))
431f582340a6a48588aa50da17e1620e8f91b146941Kenny Root#define	ferror(p)	(!__isthreaded ? __sferror(p) : (ferror)(p))
432f582340a6a48588aa50da17e1620e8f91b146941Kenny Root#define	clearerr(p)	(!__isthreaded ? __sclearerr(p) : (clearerr)(p))
4331dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
4341dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#if __POSIX_VISIBLE
435f582340a6a48588aa50da17e1620e8f91b146941Kenny Root#define	fileno(p)	(!__isthreaded ? __sfileno(p) : (fileno)(p))
4361dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#endif
4371dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
438f582340a6a48588aa50da17e1620e8f91b146941Kenny Root#define	getc(fp)	(!__isthreaded ? __sgetc(fp) : (getc)(fp))
439f582340a6a48588aa50da17e1620e8f91b146941Kenny Root
440f582340a6a48588aa50da17e1620e8f91b146941Kenny Root#if __BSD_VISIBLE
441f582340a6a48588aa50da17e1620e8f91b146941Kenny Root/*
442f582340a6a48588aa50da17e1620e8f91b146941Kenny Root * The macro implementations of putc and putc_unlocked are not
443f582340a6a48588aa50da17e1620e8f91b146941Kenny Root * fully POSIX compliant; they do not set errno on failure
444f582340a6a48588aa50da17e1620e8f91b146941Kenny Root */
445f582340a6a48588aa50da17e1620e8f91b146941Kenny Root#define putc(x, fp)	(!__isthreaded ? __sputc(x, fp) : (putc)(x, fp))
446f582340a6a48588aa50da17e1620e8f91b146941Kenny Root#endif /* __BSD_VISIBLE */
447f582340a6a48588aa50da17e1620e8f91b146941Kenny Root
4481dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#ifndef lint
449f582340a6a48588aa50da17e1620e8f91b146941Kenny Root#if __POSIX_VISIBLE >= 199506
4501dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define	getc_unlocked(fp)	__sgetc(fp)
4511dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/*
4521dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * The macro implementations of putc and putc_unlocked are not
4531dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * fully POSIX compliant; they do not set errno on failure
4541dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project */
4551dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#if __BSD_VISIBLE
4561dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define putc_unlocked(x, fp)	__sputc(x, fp)
4571dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#endif /* __BSD_VISIBLE */
458f582340a6a48588aa50da17e1620e8f91b146941Kenny Root#endif /* __POSIX_VISIBLE >= 199506 */
4591dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#endif /* lint */
4601dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
4611dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define	getchar()	getc(stdin)
4621dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define	putchar(x)	putc(x, stdout)
463f582340a6a48588aa50da17e1620e8f91b146941Kenny Root#define	getchar_unlocked()	getc_unlocked(stdin)
464f582340a6a48588aa50da17e1620e8f91b146941Kenny Root#define	putchar_unlocked(c)	putc_unlocked(c, stdout)
4651dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
466fc10b24accd082fb33c8f92ff8b92481c22fe3dcColin Cross#ifdef _GNU_SOURCE
467fc10b24accd082fb33c8f92ff8b92481c22fe3dcColin Cross/*
468fc10b24accd082fb33c8f92ff8b92481c22fe3dcColin Cross * glibc defines dprintf(int, const char*, ...), which is poorly named
469fc10b24accd082fb33c8f92ff8b92481c22fe3dcColin Cross * and likely to conflict with locally defined debugging printfs
470fc10b24accd082fb33c8f92ff8b92481c22fe3dcColin Cross * fdprintf is a better name, and some programs that use fdprintf use a
471fc10b24accd082fb33c8f92ff8b92481c22fe3dcColin Cross * #define fdprintf dprintf for compatibility
472fc10b24accd082fb33c8f92ff8b92481c22fe3dcColin Cross */
473f39a3fe67d7f1faa21a39ea8e1f57a6596c8cadbGlenn Kasten__BEGIN_DECLS
4749b549c39c938f54680f282c21e6885f53254bfb0Nick Kralevichint fdprintf(int, const char*, ...)
4759b549c39c938f54680f282c21e6885f53254bfb0Nick Kralevich		__attribute__((__format__ (printf, 2, 3)))
4769b549c39c938f54680f282c21e6885f53254bfb0Nick Kralevich		__attribute__((__nonnull__ (2)));
4779b549c39c938f54680f282c21e6885f53254bfb0Nick Kralevichint vfdprintf(int, const char*, __va_list)
4789b549c39c938f54680f282c21e6885f53254bfb0Nick Kralevich		__attribute__((__format__ (printf, 2, 0)))
4799b549c39c938f54680f282c21e6885f53254bfb0Nick Kralevich		__attribute__((__nonnull__ (2)));
480f39a3fe67d7f1faa21a39ea8e1f57a6596c8cadbGlenn Kasten__END_DECLS
481fc10b24accd082fb33c8f92ff8b92481c22fe3dcColin Cross#endif /* _GNU_SOURCE */
482fc10b24accd082fb33c8f92ff8b92481c22fe3dcColin Cross
483cffdf6693ffb50d2a1258d955a162bca83038f25Nick Kralevich#if defined(__BIONIC_FORTIFY_INLINE)
484cffdf6693ffb50d2a1258d955a162bca83038f25Nick Kralevich
485cffdf6693ffb50d2a1258d955a162bca83038f25Nick Kralevich__BIONIC_FORTIFY_INLINE
486cffdf6693ffb50d2a1258d955a162bca83038f25Nick Kralevich__attribute__((__format__ (printf, 3, 0)))
487cffdf6693ffb50d2a1258d955a162bca83038f25Nick Kralevich__attribute__((__nonnull__ (3)))
4889b549c39c938f54680f282c21e6885f53254bfb0Nick Kralevichint vsnprintf(char *dest, size_t size, const char *format, __va_list ap)
4899b549c39c938f54680f282c21e6885f53254bfb0Nick Kralevich{
4909b549c39c938f54680f282c21e6885f53254bfb0Nick Kralevich    return __builtin___vsnprintf_chk(dest, size, 0,
4919b549c39c938f54680f282c21e6885f53254bfb0Nick Kralevich        __builtin_object_size(dest, 0), format, ap);
4929b549c39c938f54680f282c21e6885f53254bfb0Nick Kralevich}
4939b549c39c938f54680f282c21e6885f53254bfb0Nick Kralevich
4949b549c39c938f54680f282c21e6885f53254bfb0Nick Kralevich__BIONIC_FORTIFY_INLINE
4959b549c39c938f54680f282c21e6885f53254bfb0Nick Kralevich__attribute__((__format__ (printf, 2, 0)))
4969b549c39c938f54680f282c21e6885f53254bfb0Nick Kralevich__attribute__((__nonnull__ (2)))
4979b549c39c938f54680f282c21e6885f53254bfb0Nick Kralevichint vsprintf(char *dest, const char *format, __va_list ap)
498cffdf6693ffb50d2a1258d955a162bca83038f25Nick Kralevich{
4999b549c39c938f54680f282c21e6885f53254bfb0Nick Kralevich    return __builtin___vsprintf_chk(dest, 0,
5009b549c39c938f54680f282c21e6885f53254bfb0Nick Kralevich        __builtin_object_size(dest, 0), format, ap);
501cffdf6693ffb50d2a1258d955a162bca83038f25Nick Kralevich}
502cffdf6693ffb50d2a1258d955a162bca83038f25Nick Kralevich
503cffdf6693ffb50d2a1258d955a162bca83038f25Nick Kralevich__BIONIC_FORTIFY_INLINE
504cffdf6693ffb50d2a1258d955a162bca83038f25Nick Kralevich__attribute__((__format__ (printf, 3, 4)))
505cffdf6693ffb50d2a1258d955a162bca83038f25Nick Kralevich__attribute__((__nonnull__ (3)))
506cffdf6693ffb50d2a1258d955a162bca83038f25Nick Kralevichint snprintf(char *str, size_t size, const char *format, ...)
507cffdf6693ffb50d2a1258d955a162bca83038f25Nick Kralevich{
5089b549c39c938f54680f282c21e6885f53254bfb0Nick Kralevich    return __builtin___snprintf_chk(str, size, 0,
5099b549c39c938f54680f282c21e6885f53254bfb0Nick Kralevich        __builtin_object_size(str, 0), format, __builtin_va_arg_pack());
5109b549c39c938f54680f282c21e6885f53254bfb0Nick Kralevich}
5119b549c39c938f54680f282c21e6885f53254bfb0Nick Kralevich
5129b549c39c938f54680f282c21e6885f53254bfb0Nick Kralevich__BIONIC_FORTIFY_INLINE
5139b549c39c938f54680f282c21e6885f53254bfb0Nick Kralevich__attribute__((__format__ (printf, 2, 3)))
5149b549c39c938f54680f282c21e6885f53254bfb0Nick Kralevich__attribute__((__nonnull__ (2)))
5159b549c39c938f54680f282c21e6885f53254bfb0Nick Kralevichint sprintf(char *dest, const char *format, ...)
5169b549c39c938f54680f282c21e6885f53254bfb0Nick Kralevich{
5179b549c39c938f54680f282c21e6885f53254bfb0Nick Kralevich    return __builtin___sprintf_chk(dest, 0,
5189b549c39c938f54680f282c21e6885f53254bfb0Nick Kralevich        __builtin_object_size(dest, 0), format, __builtin_va_arg_pack());
519cffdf6693ffb50d2a1258d955a162bca83038f25Nick Kralevich}
520cffdf6693ffb50d2a1258d955a162bca83038f25Nick Kralevich
521965dbc6405aa2c3170270cfc53a8d4416444fddbNick Kralevichextern char *__fgets_real(char *, int, FILE *)
522965dbc6405aa2c3170270cfc53a8d4416444fddbNick Kralevich    __asm__(__USER_LABEL_PREFIX__ "fgets");
523965dbc6405aa2c3170270cfc53a8d4416444fddbNick Kralevichextern void __fgets_too_big_error()
524965dbc6405aa2c3170270cfc53a8d4416444fddbNick Kralevich    __attribute__((__error__("fgets called with size bigger than buffer")));
525965dbc6405aa2c3170270cfc53a8d4416444fddbNick Kralevichextern void __fgets_too_small_error()
526965dbc6405aa2c3170270cfc53a8d4416444fddbNick Kralevich    __attribute__((__error__("fgets called with size less than zero")));
527965dbc6405aa2c3170270cfc53a8d4416444fddbNick Kralevichextern char *__fgets_chk(char *, int, FILE *, size_t);
528965dbc6405aa2c3170270cfc53a8d4416444fddbNick Kralevich
529965dbc6405aa2c3170270cfc53a8d4416444fddbNick Kralevich__BIONIC_FORTIFY_INLINE
530965dbc6405aa2c3170270cfc53a8d4416444fddbNick Kralevichchar *fgets(char *dest, int size, FILE *stream)
531965dbc6405aa2c3170270cfc53a8d4416444fddbNick Kralevich{
532965dbc6405aa2c3170270cfc53a8d4416444fddbNick Kralevich    size_t bos = __builtin_object_size(dest, 0);
533965dbc6405aa2c3170270cfc53a8d4416444fddbNick Kralevich
534965dbc6405aa2c3170270cfc53a8d4416444fddbNick Kralevich    // Compiler can prove, at compile time, that the passed in size
535965dbc6405aa2c3170270cfc53a8d4416444fddbNick Kralevich    // is always negative. Force a compiler error.
536965dbc6405aa2c3170270cfc53a8d4416444fddbNick Kralevich    if (__builtin_constant_p(size) && (size < 0)) {
537965dbc6405aa2c3170270cfc53a8d4416444fddbNick Kralevich        __fgets_too_small_error();
538965dbc6405aa2c3170270cfc53a8d4416444fddbNick Kralevich    }
539965dbc6405aa2c3170270cfc53a8d4416444fddbNick Kralevich
540965dbc6405aa2c3170270cfc53a8d4416444fddbNick Kralevich    // Compiler doesn't know destination size. Don't call __fgets_chk
5419b6cc223a36835c4367a036d4cfeff14d25bc742Nick Kralevich    if (bos == __BIONIC_FORTIFY_UNKNOWN_SIZE) {
542965dbc6405aa2c3170270cfc53a8d4416444fddbNick Kralevich        return __fgets_real(dest, size, stream);
543965dbc6405aa2c3170270cfc53a8d4416444fddbNick Kralevich    }
544965dbc6405aa2c3170270cfc53a8d4416444fddbNick Kralevich
545965dbc6405aa2c3170270cfc53a8d4416444fddbNick Kralevich    // Compiler can prove, at compile time, that the passed in size
546965dbc6405aa2c3170270cfc53a8d4416444fddbNick Kralevich    // is always <= the actual object size. Don't call __fgets_chk
547965dbc6405aa2c3170270cfc53a8d4416444fddbNick Kralevich    if (__builtin_constant_p(size) && (size <= bos)) {
548965dbc6405aa2c3170270cfc53a8d4416444fddbNick Kralevich        return __fgets_real(dest, size, stream);
549965dbc6405aa2c3170270cfc53a8d4416444fddbNick Kralevich    }
550965dbc6405aa2c3170270cfc53a8d4416444fddbNick Kralevich
551965dbc6405aa2c3170270cfc53a8d4416444fddbNick Kralevich    // Compiler can prove, at compile time, that the passed in size
552965dbc6405aa2c3170270cfc53a8d4416444fddbNick Kralevich    // is always > the actual object size. Force a compiler error.
553965dbc6405aa2c3170270cfc53a8d4416444fddbNick Kralevich    if (__builtin_constant_p(size) && (size > bos)) {
554965dbc6405aa2c3170270cfc53a8d4416444fddbNick Kralevich        __fgets_too_big_error();
555965dbc6405aa2c3170270cfc53a8d4416444fddbNick Kralevich    }
556965dbc6405aa2c3170270cfc53a8d4416444fddbNick Kralevich
557965dbc6405aa2c3170270cfc53a8d4416444fddbNick Kralevich    return __fgets_chk(dest, size, stream, bos);
558965dbc6405aa2c3170270cfc53a8d4416444fddbNick Kralevich}
559965dbc6405aa2c3170270cfc53a8d4416444fddbNick Kralevich
560cffdf6693ffb50d2a1258d955a162bca83038f25Nick Kralevich#endif /* defined(__BIONIC_FORTIFY_INLINE) */
561cffdf6693ffb50d2a1258d955a162bca83038f25Nick Kralevich
5621dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#endif /* _STDIO_H_ */
563