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>
423975cec694a0c9b42e3f7e671fcd678da92836c3Elliott Hughes#include <sys/types.h>
431dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
441dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#include <stdarg.h>
451dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#include <stddef.h>
461dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
477d56ccbfaac2b702e4be0f71038efb7f251ef637Elliott Hughes#define __need_NULL
487d56ccbfaac2b702e4be0f71038efb7f251ef637Elliott Hughes#include <stddef.h>
491dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
501dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define	_FSTDIO			/* Define for new stdio with functions. */
511dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
521dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projecttypedef off_t fpos_t;		/* stdio file position type */
531dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
541dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/*
551dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * NB: to fit things in six character monocase externals, the stdio
561dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * code uses the prefix `__s' for stdio objects, typically followed
571dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * by a three-character attempt at a mnemonic.
581dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project */
591dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
601dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/* stdio buffers */
611dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectstruct __sbuf {
621dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	unsigned char *_base;
631dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	int	_size;
641dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project};
651dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
661dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/*
671dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * stdio state variables.
681dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *
691dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * The following always hold:
701dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *
711dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *	if (_flags&(__SLBF|__SWR)) == (__SLBF|__SWR),
721dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *		_lbfsize is -_bf._size, else _lbfsize is 0
731dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *	if _flags&__SRD, _w is 0
741dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *	if _flags&__SWR, _r is 0
751dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *
761dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * This ensures that the getc and putc macros (or inline functions) never
771dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * try to write or read from a file that is in `read' or `write' mode.
781dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * (Moreover, they can, and do, automatically switch from read mode to
791dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * write mode, and back, on "r+" and "w+" files.)
801dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *
811dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * _lbfsize is used only to make the inline line-buffered output stream
821dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * code as compact as possible.
831dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *
841dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * _ub, _up, and _ur are used when ungetc() pushes back more characters
851dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * than fit in the current _bf, or when ungetc() pushes back a character
861dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * that does not match the previous one in _bf.  When this happens,
871dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * _ub._base becomes non-nil (i.e., a stream has ungetc() data iff
881dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * _ub._base!=NULL) and _up and _ur save the current values of _p and _r.
89c1202510b67f200b668d85ac0190db2b179b0c4dAndy McFadden *
90c1202510b67f200b668d85ac0190db2b179b0c4dAndy McFadden * NOTE: if you change this structure, you also need to update the
91c1202510b67f200b668d85ac0190db2b179b0c4dAndy McFadden * std() initializer in findfp.c.
921dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project */
931dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projecttypedef	struct __sFILE {
941dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	unsigned char *_p;	/* current position in (some) buffer */
951dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	int	_r;		/* read space left for getc() */
961dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	int	_w;		/* write space left for putc() */
971dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	short	_flags;		/* flags, below; this FILE is free if 0 */
981dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	short	_file;		/* fileno, if Unix descriptor, else -1 */
991dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	struct	__sbuf _bf;	/* the buffer (at least 1 byte, if !NULL) */
1001dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	int	_lbfsize;	/* 0 or -_bf._size, for inline putc */
1011dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
1021dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	/* operations */
1031dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	void	*_cookie;	/* cookie passed to io functions */
1041dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	int	(*_close)(void *);
1051dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	int	(*_read)(void *, char *, int);
1061dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	fpos_t	(*_seek)(void *, fpos_t, int);
1071dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	int	(*_write)(void *, const char *, int);
1081dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
1091dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	/* extension data, to avoid further ABI breakage */
1101dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	struct	__sbuf _ext;
1111dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	/* data for long sequences of ungetc() */
1121dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	unsigned char *_up;	/* saved _p when _p is doing ungetc data */
1131dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	int	_ur;		/* saved _r when _r is counting ungetc data */
1141dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
1151dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	/* tricks to meet minimum requirements even when malloc() fails */
1161dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	unsigned char _ubuf[3];	/* guarantee an ungetc() buffer */
1171dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	unsigned char _nbuf[1];	/* guarantee a getc() buffer */
1181dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
1191dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	/* separate buffer for fgetln() when line crosses buffer boundary */
1201dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	struct	__sbuf _lb;	/* buffer for fgetln() */
1211dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
1221dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	/* Unix stdio files get aligned to block boundaries on fseek() */
1231dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	int	_blksize;	/* stat.st_blksize (may be != _bf._size) */
1241dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	fpos_t	_offset;	/* current lseek offset */
1251dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project} FILE;
1261dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
1271dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project__BEGIN_DECLS
1281dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectextern FILE __sF[];
1291dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project__END_DECLS
1301dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
1311dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define	__SLBF	0x0001		/* line buffered */
1321dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define	__SNBF	0x0002		/* unbuffered */
1331dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define	__SRD	0x0004		/* OK to read */
1341dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define	__SWR	0x0008		/* OK to write */
1351dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	/* RD and WR are never simultaneously asserted */
1361dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define	__SRW	0x0010		/* open for reading & writing */
1371dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define	__SEOF	0x0020		/* found EOF */
1381dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define	__SERR	0x0040		/* found error */
1391dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define	__SMBF	0x0080		/* _buf is from malloc */
1401dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define	__SAPP	0x0100		/* fdopen()ed in append mode */
1411dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define	__SSTR	0x0200		/* this is an sprintf/snprintf string */
142d04c18397946f87ac4495351537c31a3d67257daElliott Hughes#define	__SOPT	0x0400		/* do fseek() optimization */
143d04c18397946f87ac4495351537c31a3d67257daElliott Hughes#define	__SNPT	0x0800		/* do not do fseek() optimization */
1441dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define	__SOFF	0x1000		/* set iff _offset is in fact correct */
1451dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define	__SMOD	0x2000		/* true => fgetln modified _p text */
1461dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define	__SALC	0x4000		/* allocate string space dynamically */
147f582340a6a48588aa50da17e1620e8f91b146941Kenny Root#define	__SIGN	0x8000		/* ignore this file in _fwalk */
1481dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
1491dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/*
1501dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * The following three definitions are for ANSI C, which took them
1511dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * from System V, which brilliantly took internal interface macros and
1521dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * made them official arguments to setvbuf(), without renaming them.
1531dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Hence, these ugly _IOxxx names are *supposed* to appear in user code.
1541dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *
1551dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Although numbered as their counterparts above, the implementation
1561dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * does not rely on this.
1571dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project */
1581dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define	_IOFBF	0		/* setvbuf should set fully buffered */
1591dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define	_IOLBF	1		/* setvbuf should set line buffered */
1601dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define	_IONBF	2		/* setvbuf should set unbuffered */
1611dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
1621dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define	BUFSIZ	1024		/* size of buffer used by setbuf */
1631dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define	EOF	(-1)
1641dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
1651dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/*
166d04c18397946f87ac4495351537c31a3d67257daElliott Hughes * FOPEN_MAX is a minimum maximum, and is the number of streams that
167d04c18397946f87ac4495351537c31a3d67257daElliott Hughes * stdio can provide without attempting to allocate further resources
168d04c18397946f87ac4495351537c31a3d67257daElliott Hughes * (which could fail).  Do not use this for anything.
1691dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project */
170d04c18397946f87ac4495351537c31a3d67257daElliott Hughes
1711dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define	FOPEN_MAX	20	/* must be <= OPEN_MAX <sys/syslimits.h> */
1721dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define	FILENAME_MAX	1024	/* must be <= PATH_MAX <sys/syslimits.h> */
1731dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
1741dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/* System V/ANSI C; this is the wrong way to do this, do *not* use these. */
1751dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#if __BSD_VISIBLE || __XPG_VISIBLE
1761dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define	P_tmpdir	"/tmp/"
1771dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#endif
1781dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define	L_tmpnam	1024	/* XXX must be == PATH_MAX */
1791dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define	TMP_MAX		308915776
1801dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
181d04c18397946f87ac4495351537c31a3d67257daElliott Hughes/* Always ensure that these are consistent with <fcntl.h> and <unistd.h>! */
1821dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#ifndef SEEK_SET
1831dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define	SEEK_SET	0	/* set file offset to offset */
1841dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#endif
1851dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#ifndef SEEK_CUR
1861dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define	SEEK_CUR	1	/* set file offset to current plus offset */
1871dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#endif
1881dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#ifndef SEEK_END
1891dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define	SEEK_END	2	/* set file offset to EOF plus offset */
1901dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#endif
1911dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
1921dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define	stdin	(&__sF[0])
1931dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define	stdout	(&__sF[1])
1941dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define	stderr	(&__sF[2])
1951dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
1961dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/*
1971dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Functions defined in ANSI C standard.
1981dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project */
1991dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project__BEGIN_DECLS
2001dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectvoid	 clearerr(FILE *);
2011dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectint	 fclose(FILE *);
2021dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectint	 feof(FILE *);
2031dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectint	 ferror(FILE *);
2041dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectint	 fflush(FILE *);
2051dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectint	 fgetc(FILE *);
206d04c18397946f87ac4495351537c31a3d67257daElliott Hugheschar	*fgets(char * __restrict, int, FILE * __restrict);
207d04c18397946f87ac4495351537c31a3d67257daElliott HughesFILE	*fopen(const char * __restrict , const char * __restrict);
208d04c18397946f87ac4495351537c31a3d67257daElliott Hughesint	 fprintf(FILE * __restrict , const char * __restrict, ...)
209d04c18397946f87ac4495351537c31a3d67257daElliott Hughes		__printflike(2, 3);
2101dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectint	 fputc(int, FILE *);
211d04c18397946f87ac4495351537c31a3d67257daElliott Hughesint	 fputs(const char * __restrict, FILE * __restrict);
212d04c18397946f87ac4495351537c31a3d67257daElliott Hughessize_t	 fread(void * __restrict, size_t, size_t, FILE * __restrict);
213d04c18397946f87ac4495351537c31a3d67257daElliott HughesFILE	*freopen(const char * __restrict, const char * __restrict,
214d04c18397946f87ac4495351537c31a3d67257daElliott Hughes	    FILE * __restrict);
215d04c18397946f87ac4495351537c31a3d67257daElliott Hughesint	 fscanf(FILE * __restrict, const char * __restrict, ...)
216d04c18397946f87ac4495351537c31a3d67257daElliott Hughes		__scanflike(2, 3);
2171dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectint	 fseek(FILE *, long, int);
2181dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectlong	 ftell(FILE *);
219d04c18397946f87ac4495351537c31a3d67257daElliott Hughessize_t	 fwrite(const void * __restrict, size_t, size_t, FILE * __restrict);
2201dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectint	 getc(FILE *);
2211dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectint	 getchar(void);
222eac9eb462ed6f7fcfb791e7a08b4011fcca47829Irina Tirdeassize_t	 getdelim(char ** __restrict, size_t * __restrict, int,
223eac9eb462ed6f7fcfb791e7a08b4011fcca47829Irina Tirdea	    FILE * __restrict);
224eac9eb462ed6f7fcfb791e7a08b4011fcca47829Irina Tirdeassize_t	 getline(char ** __restrict, size_t * __restrict, FILE * __restrict);
2251dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectchar	*gets(char *);
2261dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#if __BSD_VISIBLE && !defined(__SYS_ERRLIST)
2271dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define __SYS_ERRLIST
2281dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
2291dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectextern int sys_nerr;			/* perror(3) external variables */
2301dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectextern char *sys_errlist[];
2311dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#endif
2321dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectvoid	 perror(const char *);
233d04c18397946f87ac4495351537c31a3d67257daElliott Hughesint	 printf(const char * __restrict, ...)
234d04c18397946f87ac4495351537c31a3d67257daElliott Hughes		__printflike(1, 2);
2351dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectint	 putc(int, FILE *);
2361dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectint	 putchar(int);
2371dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectint	 puts(const char *);
2381dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectint	 remove(const char *);
2391dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectvoid	 rewind(FILE *);
240d04c18397946f87ac4495351537c31a3d67257daElliott Hughesint	 scanf(const char * __restrict, ...)
241d04c18397946f87ac4495351537c31a3d67257daElliott Hughes		__scanflike(1, 2);
242d04c18397946f87ac4495351537c31a3d67257daElliott Hughesvoid	 setbuf(FILE * __restrict, char * __restrict);
243d04c18397946f87ac4495351537c31a3d67257daElliott Hughesint	 setvbuf(FILE * __restrict, char * __restrict, int, size_t);
244d04c18397946f87ac4495351537c31a3d67257daElliott Hughesint	 sscanf(const char * __restrict, const char * __restrict, ...)
245d04c18397946f87ac4495351537c31a3d67257daElliott Hughes		__scanflike(2, 3);
2461dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source ProjectFILE	*tmpfile(void);
2471dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectint	 ungetc(int, FILE *);
248d04c18397946f87ac4495351537c31a3d67257daElliott Hughesint	 vfprintf(FILE * __restrict, const char * __restrict, __va_list)
249d04c18397946f87ac4495351537c31a3d67257daElliott Hughes		__printflike(2, 0);
250d04c18397946f87ac4495351537c31a3d67257daElliott Hughesint	 vprintf(const char * __restrict, __va_list)
251d04c18397946f87ac4495351537c31a3d67257daElliott Hughes		__printflike(1, 0);
252d04c18397946f87ac4495351537c31a3d67257daElliott Hughes
253d04c18397946f87ac4495351537c31a3d67257daElliott Hughes#ifndef __AUDIT__
254d04c18397946f87ac4495351537c31a3d67257daElliott Hugheschar	*gets(char *);
255d04c18397946f87ac4495351537c31a3d67257daElliott Hughesint	 sprintf(char * __restrict, const char * __restrict, ...)
256d04c18397946f87ac4495351537c31a3d67257daElliott Hughes		__printflike(2, 3);
257d04c18397946f87ac4495351537c31a3d67257daElliott Hugheschar	*tmpnam(char *);
258d04c18397946f87ac4495351537c31a3d67257daElliott Hughesint	 vsprintf(char * __restrict, const char * __restrict,
259d04c18397946f87ac4495351537c31a3d67257daElliott Hughes    __va_list)
260d04c18397946f87ac4495351537c31a3d67257daElliott Hughes		__printflike(2, 0);
261d04c18397946f87ac4495351537c31a3d67257daElliott Hughes#endif
262d04c18397946f87ac4495351537c31a3d67257daElliott Hughes
263d04c18397946f87ac4495351537c31a3d67257daElliott Hughesint	 rename (const char *, const char *);
264d04c18397946f87ac4495351537c31a3d67257daElliott Hughes
265d04c18397946f87ac4495351537c31a3d67257daElliott Hughesint	 fgetpos(FILE * __restrict, fpos_t * __restrict);
266d04c18397946f87ac4495351537c31a3d67257daElliott Hughesint	 fsetpos(FILE *, const fpos_t *);
267d04c18397946f87ac4495351537c31a3d67257daElliott Hughes
268d04c18397946f87ac4495351537c31a3d67257daElliott Hughesint	 fseeko(FILE *, off_t, int);
269d04c18397946f87ac4495351537c31a3d67257daElliott Hughesoff_t	 ftello(FILE *);
2701dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
2711dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#if __ISO_C_VISIBLE >= 1999 || __BSD_VISIBLE
272d04c18397946f87ac4495351537c31a3d67257daElliott Hughesint	 snprintf(char * __restrict, size_t, const char * __restrict, ...)
273d04c18397946f87ac4495351537c31a3d67257daElliott Hughes		__printflike(3, 4);
274d04c18397946f87ac4495351537c31a3d67257daElliott Hughesint	 vfscanf(FILE * __restrict, const char * __restrict, __va_list)
275d04c18397946f87ac4495351537c31a3d67257daElliott Hughes		__scanflike(2, 0);
2761dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectint	 vscanf(const char *, __va_list)
277d04c18397946f87ac4495351537c31a3d67257daElliott Hughes		__scanflike(1, 0);
278d04c18397946f87ac4495351537c31a3d67257daElliott Hughesint	 vsnprintf(char * __restrict, size_t, const char * __restrict, __va_list)
279d04c18397946f87ac4495351537c31a3d67257daElliott Hughes		__printflike(3, 0);
280d04c18397946f87ac4495351537c31a3d67257daElliott Hughesint	 vsscanf(const char * __restrict, const char * __restrict, __va_list)
281d04c18397946f87ac4495351537c31a3d67257daElliott Hughes		__scanflike(2, 0);
2821dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#endif /* __ISO_C_VISIBLE >= 1999 || __BSD_VISIBLE */
2831dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
2841dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project__END_DECLS
2851dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
2861dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
2871dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/*
2881dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Functions defined in POSIX 1003.1.
2891dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project */
2901dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#if __BSD_VISIBLE || __POSIX_VISIBLE || __XPG_VISIBLE
2911dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define	L_ctermid	1024	/* size for ctermid(); PATH_MAX */
2921dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define L_cuserid	9	/* size for cuserid(); UT_NAMESIZE + 1 */
2931dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
2941dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project__BEGIN_DECLS
295bb5581ad6eec40041dab4e961149f7a8a3a83497David 'Digit' Turner#if 0 /* MISSING FROM BIONIC */
2961dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectchar	*ctermid(char *);
2971dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectchar	*cuserid(char *);
298bb5581ad6eec40041dab4e961149f7a8a3a83497David 'Digit' Turner#endif /* MISSING */
2991dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source ProjectFILE	*fdopen(int, const char *);
3001dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectint	 fileno(FILE *);
3011dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
30250ace4fec5e8cb5afcbc656a4556fa528adfd760David 'Digit' Turner#if (__POSIX_VISIBLE >= 199209)
3031dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectint	 pclose(FILE *);
3041dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source ProjectFILE	*popen(const char *, const char *);
3051dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#endif
3061dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
3071dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#if __POSIX_VISIBLE >= 199506
3081dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectvoid	 flockfile(FILE *);
3091dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectint	 ftrylockfile(FILE *);
3101dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectvoid	 funlockfile(FILE *);
3111dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
3121dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/*
3131dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * These are normally used through macros as defined below, but POSIX
3141dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * requires functions as well.
3151dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project */
3161dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectint	 getc_unlocked(FILE *);
3171dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectint	 getchar_unlocked(void);
3181dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectint	 putc_unlocked(int, FILE *);
3191dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectint	 putchar_unlocked(int);
3201dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#endif /* __POSIX_VISIBLE >= 199506 */
3211dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
3221dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#if __XPG_VISIBLE
3231dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectchar	*tempnam(const char *, const char *);
3241dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#endif
3251dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project__END_DECLS
3261dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
3271dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#endif /* __BSD_VISIBLE || __POSIX_VISIBLE || __XPG_VISIBLE */
3281dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
3291dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/*
3301dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Routines that are purely local.
3311dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project */
3321dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#if __BSD_VISIBLE
3331dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project__BEGIN_DECLS
334d04c18397946f87ac4495351537c31a3d67257daElliott Hughesint	 asprintf(char ** __restrict, const char * __restrict, ...)
335d04c18397946f87ac4495351537c31a3d67257daElliott Hughes		__printflike(2, 3);
336d04c18397946f87ac4495351537c31a3d67257daElliott Hugheschar	*fgetln(FILE * __restrict, size_t * __restrict);
3371dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectint	 fpurge(FILE *);
3381dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectint	 getw(FILE *);
3391dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectint	 putw(int, FILE *);
3401dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectvoid	 setbuffer(FILE *, char *, int);
3411dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectint	 setlinebuf(FILE *);
342d04c18397946f87ac4495351537c31a3d67257daElliott Hughesint	 vasprintf(char ** __restrict, const char * __restrict,
343d04c18397946f87ac4495351537c31a3d67257daElliott Hughes    __va_list)
344d04c18397946f87ac4495351537c31a3d67257daElliott Hughes		__printflike(2, 0);
3451dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project__END_DECLS
3461dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
3471dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/*
3481dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Stdio function-access interface.
3491dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project */
3501dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project__BEGIN_DECLS
3511dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source ProjectFILE	*funopen(const void *,
3521dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		int (*)(void *, char *, int),
3531dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		int (*)(void *, const char *, int),
3541dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		fpos_t (*)(void *, fpos_t, int),
3551dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		int (*)(void *));
3561dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project__END_DECLS
3571dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define	fropen(cookie, fn) funopen(cookie, fn, 0, 0, 0)
3581dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define	fwopen(cookie, fn) funopen(cookie, 0, fn, 0, 0)
3591dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#endif /* __BSD_VISIBLE */
3601dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
3611dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/*
3621dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Functions internal to the implementation.
3631dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project */
3641dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project__BEGIN_DECLS
3651dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectint	__srget(FILE *);
3661dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectint	__swbuf(int, FILE *);
3671dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project__END_DECLS
3681dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
3691dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/*
3701dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * The __sfoo macros are here so that we can
3711dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * define function versions in the C library.
3721dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project */
3731dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define	__sgetc(p) (--(p)->_r < 0 ? __srget(p) : (int)(*(p)->_p++))
3741dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#if defined(__GNUC__)
3751dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectstatic __inline int __sputc(int _c, FILE *_p) {
3761dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	if (--_p->_w >= 0 || (_p->_w >= _p->_lbfsize && (char)_c != '\n'))
3771dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		return (*_p->_p++ = _c);
3781dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	else
3791dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		return (__swbuf(_c, _p));
3801dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project}
3811dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#else
3821dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/*
3831dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * This has been tuned to generate reasonable code on the vax using pcc.
3841dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project */
3851dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define	__sputc(c, p) \
3861dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	(--(p)->_w < 0 ? \
3871dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		(p)->_w >= (p)->_lbfsize ? \
3881dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project			(*(p)->_p = (c)), *(p)->_p != '\n' ? \
3891dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project				(int)*(p)->_p++ : \
3901dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project				__swbuf('\n', p) : \
3911dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project			__swbuf((int)(c), p) : \
3921dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		(*(p)->_p = (c), (int)*(p)->_p++))
3931dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#endif
3941dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
3951dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define	__sfeof(p)	(((p)->_flags & __SEOF) != 0)
3961dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define	__sferror(p)	(((p)->_flags & __SERR) != 0)
3971dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define	__sclearerr(p)	((void)((p)->_flags &= ~(__SERR|__SEOF)))
3981dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define	__sfileno(p)	((p)->_file)
3991dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
400f582340a6a48588aa50da17e1620e8f91b146941Kenny Rootextern	int __isthreaded;
4011dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
402f582340a6a48588aa50da17e1620e8f91b146941Kenny Root#define	feof(p)		(!__isthreaded ? __sfeof(p) : (feof)(p))
403f582340a6a48588aa50da17e1620e8f91b146941Kenny Root#define	ferror(p)	(!__isthreaded ? __sferror(p) : (ferror)(p))
404f582340a6a48588aa50da17e1620e8f91b146941Kenny Root#define	clearerr(p)	(!__isthreaded ? __sclearerr(p) : (clearerr)(p))
4051dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
4061dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#if __POSIX_VISIBLE
407f582340a6a48588aa50da17e1620e8f91b146941Kenny Root#define	fileno(p)	(!__isthreaded ? __sfileno(p) : (fileno)(p))
4081dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#endif
4091dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
410f582340a6a48588aa50da17e1620e8f91b146941Kenny Root#define	getc(fp)	(!__isthreaded ? __sgetc(fp) : (getc)(fp))
411f582340a6a48588aa50da17e1620e8f91b146941Kenny Root
412f582340a6a48588aa50da17e1620e8f91b146941Kenny Root#if __BSD_VISIBLE
413f582340a6a48588aa50da17e1620e8f91b146941Kenny Root/*
414f582340a6a48588aa50da17e1620e8f91b146941Kenny Root * The macro implementations of putc and putc_unlocked are not
415f582340a6a48588aa50da17e1620e8f91b146941Kenny Root * fully POSIX compliant; they do not set errno on failure
416f582340a6a48588aa50da17e1620e8f91b146941Kenny Root */
417f582340a6a48588aa50da17e1620e8f91b146941Kenny Root#define putc(x, fp)	(!__isthreaded ? __sputc(x, fp) : (putc)(x, fp))
418f582340a6a48588aa50da17e1620e8f91b146941Kenny Root#endif /* __BSD_VISIBLE */
419f582340a6a48588aa50da17e1620e8f91b146941Kenny Root
4201dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#ifndef lint
421f582340a6a48588aa50da17e1620e8f91b146941Kenny Root#if __POSIX_VISIBLE >= 199506
4221dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define	getc_unlocked(fp)	__sgetc(fp)
4231dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/*
4241dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * The macro implementations of putc and putc_unlocked are not
4251dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * fully POSIX compliant; they do not set errno on failure
4261dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project */
4271dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#if __BSD_VISIBLE
4281dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define putc_unlocked(x, fp)	__sputc(x, fp)
4291dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#endif /* __BSD_VISIBLE */
430f582340a6a48588aa50da17e1620e8f91b146941Kenny Root#endif /* __POSIX_VISIBLE >= 199506 */
4311dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#endif /* lint */
4321dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
4331dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define	getchar()	getc(stdin)
4341dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define	putchar(x)	putc(x, stdout)
435f582340a6a48588aa50da17e1620e8f91b146941Kenny Root#define	getchar_unlocked()	getc_unlocked(stdin)
436f582340a6a48588aa50da17e1620e8f91b146941Kenny Root#define	putchar_unlocked(c)	putc_unlocked(c, stdout)
4371dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
438fc10b24accd082fb33c8f92ff8b92481c22fe3dcColin Cross#ifdef _GNU_SOURCE
439fc10b24accd082fb33c8f92ff8b92481c22fe3dcColin Cross/*
440fc10b24accd082fb33c8f92ff8b92481c22fe3dcColin Cross * glibc defines dprintf(int, const char*, ...), which is poorly named
441fc10b24accd082fb33c8f92ff8b92481c22fe3dcColin Cross * and likely to conflict with locally defined debugging printfs
442fc10b24accd082fb33c8f92ff8b92481c22fe3dcColin Cross * fdprintf is a better name, and some programs that use fdprintf use a
443fc10b24accd082fb33c8f92ff8b92481c22fe3dcColin Cross * #define fdprintf dprintf for compatibility
444fc10b24accd082fb33c8f92ff8b92481c22fe3dcColin Cross */
445f39a3fe67d7f1faa21a39ea8e1f57a6596c8cadbGlenn Kasten__BEGIN_DECLS
4469b549c39c938f54680f282c21e6885f53254bfb0Nick Kralevichint fdprintf(int, const char*, ...)
447d04c18397946f87ac4495351537c31a3d67257daElliott Hughes		__printflike(2, 3);
4489b549c39c938f54680f282c21e6885f53254bfb0Nick Kralevichint vfdprintf(int, const char*, __va_list)
449d04c18397946f87ac4495351537c31a3d67257daElliott Hughes		__printflike(2, 0);
450f39a3fe67d7f1faa21a39ea8e1f57a6596c8cadbGlenn Kasten__END_DECLS
451fc10b24accd082fb33c8f92ff8b92481c22fe3dcColin Cross#endif /* _GNU_SOURCE */
452fc10b24accd082fb33c8f92ff8b92481c22fe3dcColin Cross
453c6eb9854542c115fd9aa87731adcb1b5da57e8acNick Kralevich#if defined(__BIONIC_FORTIFY)
454cffdf6693ffb50d2a1258d955a162bca83038f25Nick Kralevich
455ce45fea03ddfd8d6d1900d6777a002dec98ea1e1Elliott Hughes__BEGIN_DECLS
456ce45fea03ddfd8d6d1900d6777a002dec98ea1e1Elliott Hughes
457cffdf6693ffb50d2a1258d955a162bca83038f25Nick Kralevich__BIONIC_FORTIFY_INLINE
458d04c18397946f87ac4495351537c31a3d67257daElliott Hughes__printflike(3, 0)
4599b549c39c938f54680f282c21e6885f53254bfb0Nick Kralevichint vsnprintf(char *dest, size_t size, const char *format, __va_list ap)
4609b549c39c938f54680f282c21e6885f53254bfb0Nick Kralevich{
4619020fd503c9eb073f70dbc239a212f8ece19359dNick Kralevich    return __builtin___vsnprintf_chk(dest, size, 0, __bos(dest), format, ap);
4629b549c39c938f54680f282c21e6885f53254bfb0Nick Kralevich}
4639b549c39c938f54680f282c21e6885f53254bfb0Nick Kralevich
4649b549c39c938f54680f282c21e6885f53254bfb0Nick Kralevich__BIONIC_FORTIFY_INLINE
465d04c18397946f87ac4495351537c31a3d67257daElliott Hughes__printflike(2, 0)
4669b549c39c938f54680f282c21e6885f53254bfb0Nick Kralevichint vsprintf(char *dest, const char *format, __va_list ap)
467cffdf6693ffb50d2a1258d955a162bca83038f25Nick Kralevich{
4689020fd503c9eb073f70dbc239a212f8ece19359dNick Kralevich    return __builtin___vsprintf_chk(dest, 0, __bos(dest), format, ap);
469cffdf6693ffb50d2a1258d955a162bca83038f25Nick Kralevich}
470cffdf6693ffb50d2a1258d955a162bca83038f25Nick Kralevich
471621b19dddbfba1cd98c01cb95ce312baa20e0e7cNick Kralevich#if defined(__clang__)
472621b19dddbfba1cd98c01cb95ce312baa20e0e7cNick Kralevich#define snprintf(dest, size, ...) __builtin___snprintf_chk(dest, size, 0, __bos(dest), __VA_ARGS__)
473621b19dddbfba1cd98c01cb95ce312baa20e0e7cNick Kralevich#else
474cffdf6693ffb50d2a1258d955a162bca83038f25Nick Kralevich__BIONIC_FORTIFY_INLINE
475d04c18397946f87ac4495351537c31a3d67257daElliott Hughes__printflike(3, 4)
476621b19dddbfba1cd98c01cb95ce312baa20e0e7cNick Kralevichint snprintf(char *dest, size_t size, const char *format, ...)
477cffdf6693ffb50d2a1258d955a162bca83038f25Nick Kralevich{
478621b19dddbfba1cd98c01cb95ce312baa20e0e7cNick Kralevich    return __builtin___snprintf_chk(dest, size, 0,
479621b19dddbfba1cd98c01cb95ce312baa20e0e7cNick Kralevich        __bos(dest), format, __builtin_va_arg_pack());
4809b549c39c938f54680f282c21e6885f53254bfb0Nick Kralevich}
481621b19dddbfba1cd98c01cb95ce312baa20e0e7cNick Kralevich#endif
4829b549c39c938f54680f282c21e6885f53254bfb0Nick Kralevich
483c6eb9854542c115fd9aa87731adcb1b5da57e8acNick Kralevich#if defined(__clang__)
484c6eb9854542c115fd9aa87731adcb1b5da57e8acNick Kralevich#define sprintf(dest, ...) __builtin___sprintf_chk(dest, 0, __bos(dest), __VA_ARGS__)
485c6eb9854542c115fd9aa87731adcb1b5da57e8acNick Kralevich#else
4869b549c39c938f54680f282c21e6885f53254bfb0Nick Kralevich__BIONIC_FORTIFY_INLINE
487d04c18397946f87ac4495351537c31a3d67257daElliott Hughes__printflike(2, 3)
4889b549c39c938f54680f282c21e6885f53254bfb0Nick Kralevichint sprintf(char *dest, const char *format, ...)
4899b549c39c938f54680f282c21e6885f53254bfb0Nick Kralevich{
4909b549c39c938f54680f282c21e6885f53254bfb0Nick Kralevich    return __builtin___sprintf_chk(dest, 0,
49178d6d9888c24c50f65d694dc8283afdcb58db84cNick Kralevich        __bos(dest), format, __builtin_va_arg_pack());
492cffdf6693ffb50d2a1258d955a162bca83038f25Nick Kralevich}
493c6eb9854542c115fd9aa87731adcb1b5da57e8acNick Kralevich#endif
494cffdf6693ffb50d2a1258d955a162bca83038f25Nick Kralevich
495c6eb9854542c115fd9aa87731adcb1b5da57e8acNick Kralevich#if !defined(__clang__)
496965dbc6405aa2c3170270cfc53a8d4416444fddbNick Kralevichextern char *__fgets_real(char *, int, FILE *)
497965dbc6405aa2c3170270cfc53a8d4416444fddbNick Kralevich    __asm__(__USER_LABEL_PREFIX__ "fgets");
498b24c0637d06fe0980b9e13a8d0c3e6f4dbda9cd5Nick Kralevich__errordecl(__fgets_too_big_error, "fgets called with size bigger than buffer");
499b24c0637d06fe0980b9e13a8d0c3e6f4dbda9cd5Nick Kralevich__errordecl(__fgets_too_small_error, "fgets called with size less than zero");
500965dbc6405aa2c3170270cfc53a8d4416444fddbNick Kralevichextern char *__fgets_chk(char *, int, FILE *, size_t);
501965dbc6405aa2c3170270cfc53a8d4416444fddbNick Kralevich
502965dbc6405aa2c3170270cfc53a8d4416444fddbNick Kralevich__BIONIC_FORTIFY_INLINE
503965dbc6405aa2c3170270cfc53a8d4416444fddbNick Kralevichchar *fgets(char *dest, int size, FILE *stream)
504965dbc6405aa2c3170270cfc53a8d4416444fddbNick Kralevich{
5059020fd503c9eb073f70dbc239a212f8ece19359dNick Kralevich    size_t bos = __bos(dest);
506965dbc6405aa2c3170270cfc53a8d4416444fddbNick Kralevich
507965dbc6405aa2c3170270cfc53a8d4416444fddbNick Kralevich    // Compiler can prove, at compile time, that the passed in size
508965dbc6405aa2c3170270cfc53a8d4416444fddbNick Kralevich    // is always negative. Force a compiler error.
509965dbc6405aa2c3170270cfc53a8d4416444fddbNick Kralevich    if (__builtin_constant_p(size) && (size < 0)) {
510965dbc6405aa2c3170270cfc53a8d4416444fddbNick Kralevich        __fgets_too_small_error();
511965dbc6405aa2c3170270cfc53a8d4416444fddbNick Kralevich    }
512965dbc6405aa2c3170270cfc53a8d4416444fddbNick Kralevich
513965dbc6405aa2c3170270cfc53a8d4416444fddbNick Kralevich    // Compiler doesn't know destination size. Don't call __fgets_chk
5149b6cc223a36835c4367a036d4cfeff14d25bc742Nick Kralevich    if (bos == __BIONIC_FORTIFY_UNKNOWN_SIZE) {
515965dbc6405aa2c3170270cfc53a8d4416444fddbNick Kralevich        return __fgets_real(dest, size, stream);
516965dbc6405aa2c3170270cfc53a8d4416444fddbNick Kralevich    }
517965dbc6405aa2c3170270cfc53a8d4416444fddbNick Kralevich
518965dbc6405aa2c3170270cfc53a8d4416444fddbNick Kralevich    // Compiler can prove, at compile time, that the passed in size
519965dbc6405aa2c3170270cfc53a8d4416444fddbNick Kralevich    // is always <= the actual object size. Don't call __fgets_chk
52041b3179c9ef03ebb447cac7f5e8405dce399cb17Elliott Hughes    if (__builtin_constant_p(size) && (size <= (int) bos)) {
521965dbc6405aa2c3170270cfc53a8d4416444fddbNick Kralevich        return __fgets_real(dest, size, stream);
522965dbc6405aa2c3170270cfc53a8d4416444fddbNick Kralevich    }
523965dbc6405aa2c3170270cfc53a8d4416444fddbNick Kralevich
524965dbc6405aa2c3170270cfc53a8d4416444fddbNick Kralevich    // Compiler can prove, at compile time, that the passed in size
525965dbc6405aa2c3170270cfc53a8d4416444fddbNick Kralevich    // is always > the actual object size. Force a compiler error.
52641b3179c9ef03ebb447cac7f5e8405dce399cb17Elliott Hughes    if (__builtin_constant_p(size) && (size > (int) bos)) {
527965dbc6405aa2c3170270cfc53a8d4416444fddbNick Kralevich        __fgets_too_big_error();
528965dbc6405aa2c3170270cfc53a8d4416444fddbNick Kralevich    }
529965dbc6405aa2c3170270cfc53a8d4416444fddbNick Kralevich
530965dbc6405aa2c3170270cfc53a8d4416444fddbNick Kralevich    return __fgets_chk(dest, size, stream, bos);
531965dbc6405aa2c3170270cfc53a8d4416444fddbNick Kralevich}
532965dbc6405aa2c3170270cfc53a8d4416444fddbNick Kralevich
533c6eb9854542c115fd9aa87731adcb1b5da57e8acNick Kralevich#endif /* !defined(__clang__) */
534c6eb9854542c115fd9aa87731adcb1b5da57e8acNick Kralevich
535ce45fea03ddfd8d6d1900d6777a002dec98ea1e1Elliott Hughes__END_DECLS
536ce45fea03ddfd8d6d1900d6777a002dec98ea1e1Elliott Hughes
537c6eb9854542c115fd9aa87731adcb1b5da57e8acNick Kralevich#endif /* defined(__BIONIC_FORTIFY) */
538cffdf6693ffb50d2a1258d955a162bca83038f25Nick Kralevich
5391dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#endif /* _STDIO_H_ */
540