stdio.h revision 43782
111894Speter/*-
29Sjkh * Copyright (c) 1990, 1993
311894Speter *	The Regents of the University of California.  All rights reserved.
411894Speter *
59Sjkh * This code is derived from software contributed to Berkeley by
611894Speter * Chris Torek.
79Sjkh *
811894Speter * Redistribution and use in source and binary forms, with or without
911894Speter * modification, are permitted provided that the following conditions
1011894Speter * are met:
1111894Speter * 1. Redistributions of source code must retain the above copyright
129Sjkh *    notice, this list of conditions and the following disclaimer.
1311894Speter * 2. Redistributions in binary form must reproduce the above copyright
1411894Speter *    notice, this list of conditions and the following disclaimer in the
1511894Speter *    documentation and/or other materials provided with the distribution.
1611894Speter * 3. All advertising materials mentioning features or use of this software
179Sjkh *    must display the following acknowledgement:
1811894Speter *	This product includes software developed by the University of
1911894Speter *	California, Berkeley and its contributors.
2011894Speter * 4. Neither the name of the University nor the names of its contributors
2111894Speter *    may be used to endorse or promote products derived from this software
229Sjkh *    without specific prior written permission.
2311894Speter *
249Sjkh * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
2511894Speter * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
269Sjkh * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
2711894Speter * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
289Sjkh * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
2911894Speter * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
3011894Speter * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
3111894Speter * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
3211894Speter * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
3311894Speter * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
3411894Speter * SUCH DAMAGE.
3511894Speter *
3611894Speter *	@(#)stdio.h	8.5 (Berkeley) 4/29/95
3711894Speter *	$Id: stdio.h,v 1.21 1998/12/14 19:23:16 dt Exp $
3811894Speter */
3911894Speter
4011894Speter#ifndef	_STDIO_H_
419Sjkh#define	_STDIO_H_
4211894Speter
4311894Speter#include <sys/cdefs.h>
4411894Speter#include <machine/ansi.h>
459Sjkh
4611894Speter#ifdef	_BSD_SIZE_T_
479Sjkhtypedef	_BSD_SIZE_T_	size_t;
4811894Speter#undef	_BSD_SIZE_T_
4950472Speter#endif
509Sjkh
519Sjkh#ifndef NULL
5211894Speter#define	NULL	0
539Sjkh#endif
5411894Speter
559Sjkhtypedef	_BSD_OFF_T_	fpos_t;
5611894Speter
5711894Speter#define	_FSTDIO			/* Define for new stdio with functions. */
5811894Speter
599Sjkh/*
609Sjkh * NB: to fit things in six character monocase externals, the stdio
6111894Speter * code uses the prefix `__s' for stdio objects, typically followed
6211894Speter * by a three-character attempt at a mnemonic.
6311894Speter */
6411894Speter
6511894Speter/* stdio buffers */
6611894Speterstruct __sbuf {
6711894Speter	unsigned char *_base;
6811894Speter	int	_size;
6911894Speter};
7011894Speter
7111894Speter/*
7211894Speter * stdio state variables.
7311894Speter *
7411894Speter * The following always hold:
7511894Speter *
769Sjkh *	if (_flags&(__SLBF|__SWR)) == (__SLBF|__SWR),
779Sjkh *		_lbfsize is -_bf._size, else _lbfsize is 0
7811894Speter *	if _flags&__SRD, _w is 0
7911894Speter *	if _flags&__SWR, _r is 0
8011894Speter *
8111894Speter * This ensures that the getc and putc macros (or inline functions) never
829Sjkh * try to write or read from a file that is in `read' or `write' mode.
8311894Speter * (Moreover, they can, and do, automatically switch from read mode to
8411894Speter * write mode, and back, on "r+" and "w+" files.)
8511894Speter *
8611894Speter * _lbfsize is used only to make the inline line-buffered output stream
8711894Speter * code as compact as possible.
8811894Speter *
8911894Speter * _ub, _up, and _ur are used when ungetc() pushes back more characters
9011894Speter * than fit in the current _bf, or when ungetc() pushes back a character
9111894Speter * that does not match the previous one in _bf.  When this happens,
9211894Speter * _ub._base becomes non-nil (i.e., a stream has ungetc() data iff
9311894Speter * _ub._base!=NULL) and _up and _ur save the current values of _p and _r.
9411894Speter *
9511894Speter * NB: see WARNING above before changing the layout of this structure!
9611894Speter */
9711894Spetertypedef	struct __sFILE {
9811894Speter	unsigned char *_p;	/* current position in (some) buffer */
9911894Speter	int	_r;		/* read space left for getc() */
10011894Speter	int	_w;		/* write space left for putc() */
10111894Speter	short	_flags;		/* flags, below; this FILE is free if 0 */
10211894Speter	short	_file;		/* fileno, if Unix descriptor, else -1 */
10311894Speter	struct	__sbuf _bf;	/* the buffer (at least 1 byte, if !NULL) */
10411894Speter	int	_lbfsize;	/* 0 or -_bf._size, for inline putc */
10511894Speter
10611894Speter	/* operations */
10711894Speter	void	*_cookie;	/* cookie passed to io functions */
10811894Speter	int	(*_close) __P((void *));
10911894Speter	int	(*_read)  __P((void *, char *, int));
11011894Speter	fpos_t	(*_seek)  __P((void *, fpos_t, int));
11111894Speter	int	(*_write) __P((void *, const char *, int));
11211894Speter
11311894Speter	/* separate buffer for long sequences of ungetc() */
11411894Speter	struct	__sbuf _ub;	/* ungetc buffer */
11511894Speter	unsigned char *_up;	/* saved _p when _p is doing ungetc data */
11611894Speter	int	_ur;		/* saved _r when _r is counting ungetc data */
11711894Speter
11811894Speter	/* tricks to meet minimum requirements even when malloc() fails */
11911894Speter	unsigned char _ubuf[3];	/* guarantee an ungetc() buffer */
12011894Speter	unsigned char _nbuf[1];	/* guarantee a getc() buffer */
12111894Speter
12211894Speter	/* separate buffer for fgetln() when line crosses buffer boundary */
12311894Speter	struct	__sbuf _lb;	/* buffer for fgetln() */
12411894Speter
12511894Speter	/* Unix stdio files get aligned to block boundaries on fseek() */
12611894Speter	int	_blksize;	/* stat.st_blksize (may be != _bf._size) */
12711894Speter	fpos_t	_offset;	/* current lseek offset (see WARNING) */
12811894Speter} FILE;
12911894Speter
13011894Speter__BEGIN_DECLS
13111894Speterextern FILE __sF[];
13211894Speter__END_DECLS
13311894Speter
13411894Speter#define	__SLBF	0x0001		/* line buffered */
13511894Speter#define	__SNBF	0x0002		/* unbuffered */
13611894Speter#define	__SRD	0x0004		/* OK to read */
13711894Speter#define	__SWR	0x0008		/* OK to write */
13811894Speter	/* RD and WR are never simultaneously asserted */
13911894Speter#define	__SRW	0x0010		/* open for reading & writing */
14011894Speter#define	__SEOF	0x0020		/* found EOF */
14111894Speter#define	__SERR	0x0040		/* found error */
14211894Speter#define	__SMBF	0x0080		/* _buf is from malloc */
14311894Speter#define	__SAPP	0x0100		/* fdopen()ed in append mode */
14411894Speter#define	__SSTR	0x0200		/* this is an sprintf/snprintf string */
14511894Speter#define	__SOPT	0x0400		/* do fseek() optimization */
14611894Speter#define	__SNPT	0x0800		/* do not do fseek() optimization */
14711894Speter#define	__SOFF	0x1000		/* set iff _offset is in fact correct */
14811894Speter#define	__SMOD	0x2000		/* true => fgetln modified _p text */
14911894Speter#define	__SALC	0x4000		/* allocate string space dynamically */
15011894Speter
15111894Speter/*
15211894Speter * The following three definitions are for ANSI C, which took them
15311894Speter * from System V, which brilliantly took internal interface macros and
15411894Speter * made them official arguments to setvbuf(), without renaming them.
15511894Speter * Hence, these ugly _IOxxx names are *supposed* to appear in user code.
15611894Speter *
15711894Speter * Although numbered as their counterparts above, the implementation
15811894Speter * does not rely on this.
15911894Speter */
16011894Speter#define	_IOFBF	0		/* setvbuf should set fully buffered */
16111894Speter#define	_IOLBF	1		/* setvbuf should set line buffered */
16211894Speter#define	_IONBF	2		/* setvbuf should set unbuffered */
16311894Speter
16411894Speter#define	BUFSIZ	1024		/* size of buffer used by setbuf */
16511894Speter#define	EOF	(-1)
16611894Speter
16711894Speter/*
16811894Speter * FOPEN_MAX is a minimum maximum, and is the number of streams that
16911894Speter * stdio can provide without attempting to allocate further resources
17011894Speter * (which could fail).  Do not use this for anything.
17111894Speter */
17211894Speter				/* must be == _POSIX_STREAM_MAX <limits.h> */
17311894Speter#define	FOPEN_MAX	20	/* must be <= OPEN_MAX <sys/syslimits.h> */
17411894Speter#define	FILENAME_MAX	1024	/* must be <= PATH_MAX <sys/syslimits.h> */
17511894Speter
17611894Speter/* System V/ANSI C; this is the wrong way to do this, do *not* use these. */
17711894Speter#ifndef _ANSI_SOURCE
17811894Speter#define	P_tmpdir	"/var/tmp/"
17911894Speter#endif
18011894Speter#define	L_tmpnam	1024	/* XXX must be == PATH_MAX */
18111894Speter#define	TMP_MAX		308915776
1829Sjkh
18311894Speter#ifndef SEEK_SET
18411894Speter#define	SEEK_SET	0	/* set file offset to offset */
18511894Speter#endif
18611894Speter#ifndef SEEK_CUR
1879Sjkh#define	SEEK_CUR	1	/* set file offset to current plus offset */
18811894Speter#endif
18911894Speter#ifndef SEEK_END
19011894Speter#define	SEEK_END	2	/* set file offset to EOF plus offset */
19111894Speter#endif
19211894Speter
19311894Speter#define	stdin	(&__sF[0])
19411894Speter#define	stdout	(&__sF[1])
19511894Speter#define	stderr	(&__sF[2])
1969Sjkh
19711894Speter/*
19811894Speter * Functions defined in ANSI C standard.
19911894Speter */
20011894Speter__BEGIN_DECLS
20111894Spetervoid	 clearerr __P((FILE *));
20211894Speterint	 fclose __P((FILE *));
20311894Speterint	 feof __P((FILE *));
20411894Speterint	 ferror __P((FILE *));
20511894Speterint	 fflush __P((FILE *));
20611894Speterint	 fgetc __P((FILE *));
20711894Speterint	 fgetpos __P((FILE *, fpos_t *));
20811894Speterchar	*fgets __P((char *, int, FILE *));
20911894SpeterFILE	*fopen __P((const char *, const char *));
21011894Speterint	 fprintf __P((FILE *, const char *, ...));
21111894Speterint	 fputc __P((int, FILE *));
21211894Speterint	 fputs __P((const char *, FILE *));
21311894Spetersize_t	 fread __P((void *, size_t, size_t, FILE *));
21411894SpeterFILE	*freopen __P((const char *, const char *, FILE *));
21511894Speterint	 fscanf __P((FILE *, const char *, ...));
21611894Speterint	 fseek __P((FILE *, long, int));
21711894Speterint	 fsetpos __P((FILE *, const fpos_t *));
21811894Speterlong	 ftell __P((FILE *));
21911894Spetersize_t	 fwrite __P((const void *, size_t, size_t, FILE *));
22011894Speterint	 getc __P((FILE *));
22111894Speterint	 getchar __P((void));
22211894Speterchar	*gets __P((char *));
22311894Speter#if !defined(_ANSI_SOURCE) && !defined(_POSIX_SOURCE)
22411894Speterextern __const int sys_nerr;		/* perror(3) external variables */
22511894Speterextern __const char *__const sys_errlist[];
22611894Speter#endif
22711894Spetervoid	 perror __P((const char *));
22811894Speterint	 printf __P((const char *, ...));
22911894Speterint	 putc __P((int, FILE *));
23011894Speterint	 putchar __P((int));
23111894Speterint	 puts __P((const char *));
23211894Speterint	 remove __P((const char *));
23311894Speterint	 rename  __P((const char *, const char *));
23411894Spetervoid	 rewind __P((FILE *));
23511894Speterint	 scanf __P((const char *, ...));
23611894Spetervoid	 setbuf __P((FILE *, char *));
23711894Speterint	 setvbuf __P((FILE *, char *, int, size_t));
23811894Speterint	 sprintf __P((char *, const char *, ...));
23911894Speterint	 sscanf __P((const char *, const char *, ...));
24011894SpeterFILE	*tmpfile __P((void));
24111894Speterchar	*tmpnam __P((char *));
24211894Speterint	 ungetc __P((int, FILE *));
24311894Speterint	 vfprintf __P((FILE *, const char *, _BSD_VA_LIST_));
24411894Speterint	 vprintf __P((const char *, _BSD_VA_LIST_));
24511894Speterint	 vsprintf __P((char *, const char *, _BSD_VA_LIST_));
24611894Speter__END_DECLS
24711894Speter
24811894Speter/*
24911894Speter * Functions defined in POSIX 1003.1.
25011894Speter */
25111894Speter#ifndef _ANSI_SOURCE
25211894Speter/* size for cuserid(3); UT_NAMESIZE + 1, see <utmp.h> */
25311894Speter#define	L_cuserid	17
25411894Speter
25511894Speter#define	L_ctermid	1024	/* size for ctermid(3); PATH_MAX */
25611894Speter
25711894Speter__BEGIN_DECLS
25811894Speterchar	*ctermid __P((char *));
25911894SpeterFILE	*fdopen __P((int, const char *));
26011894Speterint	 fileno __P((FILE *));
26111894Speterint	 ftrylockfile __P((FILE *));
26211894Spetervoid	 flockfile __P((FILE *));
26311894Spetervoid	 funlockfile __P((FILE *));
26411894Speter__END_DECLS
26511894Speter#endif /* not ANSI */
26611894Speter
26711894Speter/*
26811894Speter * Portability hacks.  See <sys/types.h>.
26911894Speter */
27011894Speter#if !defined (_ANSI_SOURCE) && !defined(_POSIX_SOURCE)
27111894Speter__BEGIN_DECLS
27211894Speter#ifndef _FTRUNCATE_DECLARED
27311894Speter#define	_FTRUNCATE_DECLARED
27411894Speterint	 ftruncate __P((int, _BSD_OFF_T_));
27511894Speter#endif
27611894Speter#ifndef _LSEEK_DECLARED
27711894Speter#define	_LSEEK_DECLARED
27811894Speter_BSD_OFF_T_ lseek __P((int, _BSD_OFF_T_, int));
27911894Speter#endif
28011894Speter#ifndef _MMAP_DECLARED
28111894Speter#define	_MMAP_DECLARED
28211894Spetervoid	*mmap __P((void *, size_t, int, int, int, _BSD_OFF_T_));
28311894Speter#endif
28411894Speter#ifndef _TRUNCATE_DECLARED
28511894Speter#define	_TRUNCATE_DECLARED
2869Sjkhint	 truncate __P((const char *, _BSD_OFF_T_));
2879Sjkh#endif
2889Sjkh__END_DECLS
28911894Speter#endif /* !_ANSI_SOURCE && !_POSIX_SOURCE */
29011894Speter
29111894Speter/*
29211894Speter * Routines that are purely local.
29311894Speter */
29411894Speter#if !defined (_ANSI_SOURCE) && !defined(_POSIX_SOURCE)
29511894Speter__BEGIN_DECLS
2969Sjkhint	 asprintf __P((char **, const char *, ...)) __printflike(2, 3);
29711894Speterchar	*fgetln __P((FILE *, size_t *));
29811894Speterint	 fpurge __P((FILE *));
29911894Speterint	 fseeko __P((FILE *, _BSD_OFF_T_, int));
30011894Speter_BSD_OFF_T_ ftello __P((FILE *));
30111894Speterint	 getw __P((FILE *));
30211894Speterint	 pclose __P((FILE *));
30311894SpeterFILE	*popen __P((const char *, const char *));
30411894Speterint	 putw __P((int, FILE *));
30511894Spetervoid	 setbuffer __P((FILE *, char *, int));
30611894Speterint	 setlinebuf __P((FILE *));
30711894Speterchar	*tempnam __P((const char *, const char *));
3089Sjkhint	 snprintf __P((char *, size_t, const char *, ...)) __printflike(3, 4);
30911894Speterint	 vasprintf __P((char **, const char *, _BSD_VA_LIST_))
31011894Speter	    __printflike(2, 0);
31111894Speterint	 vsnprintf __P((char *, size_t, const char *, _BSD_VA_LIST_))
31211894Speter	    __printflike(3, 0);
31311894Speterint	 vscanf __P((const char *, _BSD_VA_LIST_)) __scanflike(1, 0);
31411894Speterint	 vsscanf __P((const char *, const char *, _BSD_VA_LIST_))
31511894Speter	    __scanflike(2, 0);
31611894Speter__END_DECLS
31711894Speter
31811894Speter/*
31911894Speter * This is a #define because the function is used internally and
32011894Speter * (unlike vfscanf) the name __svfscanf is guaranteed not to collide
3219Sjkh * with a user function when _ANSI_SOURCE or _POSIX_SOURCE is defined.
32211894Speter */
32311894Speter#define	 vfscanf	__svfscanf
32411894Speter
32511894Speter/*
32611894Speter * Stdio function-access interface.
32711894Speter */
32811894Speter__BEGIN_DECLS
32911894SpeterFILE	*funopen __P((const void *,
33011894Speter		int (*)(void *, char *, int),
33111894Speter		int (*)(void *, const char *, int),
33211894Speter		fpos_t (*)(void *, fpos_t, int),
33311894Speter		int (*)(void *)));
33411894Speter__END_DECLS
33511894Speter#define	fropen(cookie, fn) funopen(cookie, fn, 0, 0, 0)
33611894Speter#define	fwopen(cookie, fn) funopen(cookie, 0, fn, 0, 0)
33711894Speter#endif /* !_ANSI_SOURCE && !_POSIX_SOURCE */
33811894Speter
33911894Speter/*
34011894Speter * Functions internal to the implementation.
34111894Speter */
34211894Speter__BEGIN_DECLS
34311894Speterint	__srget __P((FILE *));
34411894Speterint	__svfscanf __P((FILE *, const char *, _BSD_VA_LIST_));
34511894Speterint	__swbuf __P((int, FILE *));
34611894Speter__END_DECLS
34711894Speter
34811894Speter/*
34911894Speter * The __sfoo macros are here so that we can
35011894Speter * define function versions in the C library.
35111894Speter */
35211894Speter#define	__sgetc(p) (--(p)->_r < 0 ? __srget(p) : (int)(*(p)->_p++))
35311894Speter#if defined(__GNUC__) && defined(__STDC__)
35411894Speterstatic __inline int __sputc(int _c, FILE *_p) {
35511894Speter	if (--_p->_w >= 0 || (_p->_w >= _p->_lbfsize && (char)_c != '\n'))
35611894Speter		return (*_p->_p++ = _c);
35711894Speter	else
35811894Speter		return (__swbuf(_c, _p));
35911894Speter}
36011894Speter#else
36111894Speter/*
36211894Speter * This has been tuned to generate reasonable code on the vax using pcc.
36311894Speter */
36411894Speter#define	__sputc(c, p) \
36511894Speter	(--(p)->_w < 0 ? \
36611894Speter		(p)->_w >= (p)->_lbfsize ? \
36711894Speter			(*(p)->_p = (c)), *(p)->_p != '\n' ? \
36811894Speter				(int)*(p)->_p++ : \
36911894Speter				__swbuf('\n', p) : \
37011894Speter			__swbuf((int)(c), p) : \
37111894Speter		(*(p)->_p = (c), (int)*(p)->_p++))
37211894Speter#endif
37311894Speter
37411894Speter#define	__sfeof(p)	(((p)->_flags & __SEOF) != 0)
37511894Speter#define	__sferror(p)	(((p)->_flags & __SERR) != 0)
37611894Speter#define	__sclearerr(p)	((void)((p)->_flags &= ~(__SERR|__SEOF)))
37711894Speter#define	__sfileno(p)	((p)->_file)
3789Sjkh
37911894Speter/*
38011894Speter * See ISO/IEC 9945-1 ANSI/IEEE Std 1003.1 Second Edition 1996-07-12
38111894Speter * B.8.2.7 for the rationale behind the *_unlocked() macros.
38211894Speter */
3839Sjkh#define	feof_unlocked(p)	__sfeof(p)
38411894Speter#define	ferror_unlocked(p)	__sferror(p)
38511894Speter#define	clearerr_unlocked(p)	__sclearerr(p)
38611894Speter
38711894Speter#ifndef _ANSI_SOURCE
38811894Speter#define	fileno_unlocked(p)	__sfileno(p)
38911894Speter#endif
39011894Speter
39111894Speter#ifndef  _THREAD_SAFE
39211894Speter#define	feof(p)		feof_unlocked(p)
39311894Speter#define	ferror(p)	ferror_unlocked(p)
39411894Speter#define	clearerr(p)	clearerr_unlocked(p)
39511894Speter
39611894Speter#ifndef _ANSI_SOURCE
39711894Speter#define	fileno(p)	fileno_unlocked(p)
3989Sjkh#endif
39911894Speter#endif
40011894Speter
40111894Speter#ifndef lint
40211894Speter#define	getc_unlocked(fp)	__sgetc(fp)
40311894Speter#define putc_unlocked(x, fp)	__sputc(x, fp)
40411894Speter#ifdef	_THREAD_SAFE
40511894Spetervoid	_flockfile_debug __P((FILE *, char *, int));
40611894Speter#ifdef	_FLOCK_DEBUG
40711894Speter#define _FLOCKFILE(x)	_flockfile_debug(x, __FILE__, __LINE__)
40811894Speter#else
40911894Speter#define _FLOCKFILE(x)	flockfile(x)
4109Sjkh#endif
41111894Speterstatic __inline int			\
41211894Speter__getc_locked(FILE *_fp)		\
41311894Speter{					\
41411894Speter	extern int __isthreaded;	\
4159Sjkh	int _ret;			\
4169Sjkh	if (__isthreaded)		\
41711894Speter		_FLOCKFILE(_fp);	\
41811894Speter	_ret = getc_unlocked(_fp);	\
41911894Speter	if (__isthreaded)		\
42011894Speter		funlockfile(_fp);	\
42111894Speter	return (_ret);			\
42211894Speter}
42311894Speterstatic __inline int			\
42411894Speter__putc_locked(int _x, FILE *_fp)	\
42511894Speter{					\
42611894Speter	extern int __isthreaded;	\
42711894Speter	int _ret;			\
42811894Speter	if (__isthreaded)		\
42911894Speter		_FLOCKFILE(_fp);	\
43011894Speter	_ret = putc_unlocked(_x, _fp);	\
4319Sjkh	if (__isthreaded)		\
43211894Speter		funlockfile(_fp);	\
43311894Speter	return (_ret);			\
43411894Speter}
43511894Speter#define	getc(fp)	__getc_locked(fp)
4369Sjkh#define	putc(x, fp)	__putc_locked(x, fp)
43711894Speter#else
43811894Speter#define	getc(fp)	getc_unlocked(fp)
43911894Speter#define putc(x, fp)	putc_unlocked(x, fp)
44011894Speter#endif
44111894Speter#endif /* lint */
44211894Speter
44311894Speter#define	getchar()		getc(stdin)
44411894Speter#define	getchar_unlocked()	getc_unlocked(stdin)
44511894Speter#define	putchar(x)		putc(x, stdout)
44611894Speter#define	putchar_unlocked(x)	putc_unlocked(x, stdout)
4479Sjkh
44811894Speter#endif /* !_STDIO_H_ */
44911894Speter