stdio.h revision 72529
117721Speter/*- 217721Speter * Copyright (c) 1990, 1993 317721Speter * The Regents of the University of California. All rights reserved. 417721Speter * 517721Speter * This code is derived from software contributed to Berkeley by 617721Speter * Chris Torek. 717721Speter * 817721Speter * Redistribution and use in source and binary forms, with or without 917721Speter * modification, are permitted provided that the following conditions 1017721Speter * are met: 1117721Speter * 1. Redistributions of source code must retain the above copyright 1217721Speter * notice, this list of conditions and the following disclaimer. 1317721Speter * 2. Redistributions in binary form must reproduce the above copyright 1417721Speter * notice, this list of conditions and the following disclaimer in the 1517721Speter * documentation and/or other materials provided with the distribution. 1617721Speter * 3. All advertising materials mentioning features or use of this software 1717721Speter * must display the following acknowledgement: 1817721Speter * This product includes software developed by the University of 1917721Speter * California, Berkeley and its contributors. 2017721Speter * 4. Neither the name of the University nor the names of its contributors 2117721Speter * may be used to endorse or promote products derived from this software 2217721Speter * without specific prior written permission. 2317721Speter * 2417721Speter * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 2517721Speter * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 2617721Speter * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 2717721Speter * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 2817721Speter * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 2917721Speter * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 3017721Speter * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 3117721Speter * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 3217721Speter * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 3317721Speter * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 3417721Speter * SUCH DAMAGE. 3517721Speter * 3617721Speter * @(#)stdio.h 8.5 (Berkeley) 4/29/95 3717721Speter * $FreeBSD: head/include/stdio.h 72529 2001-02-16 06:11:22Z imp $ 3817721Speter */ 3917721Speter 4017721Speter#ifndef _STDIO_H_ 4117721Speter#define _STDIO_H_ 4217721Speter 4317721Speter#include <sys/cdefs.h> 4417721Speter#include <machine/ansi.h> 4517721Speter 4617721Speter#ifdef _BSD_SIZE_T_ 4717721Spetertypedef _BSD_SIZE_T_ size_t; 4817721Speter#undef _BSD_SIZE_T_ 4917721Speter#endif 5017721Speter 5117721Speter#ifndef NULL 5217721Speter#define NULL 0 5317721Speter#endif 5417721Speter 5517721Spetertypedef _BSD_OFF_T_ fpos_t; 5617721Speter 5717721Speter#define _FSTDIO /* Define for new stdio with functions. */ 5817721Speter 5917721Speter/* 6017721Speter * NB: to fit things in six character monocase externals, the stdio 6117721Speter * code uses the prefix `__s' for stdio objects, typically followed 6217721Speter * by a three-character attempt at a mnemonic. 6317721Speter */ 6417721Speter 6517721Speter/* stdio buffers */ 6617721Speterstruct __sbuf { 6717721Speter unsigned char *_base; 6817721Speter int _size; 6917721Speter}; 7017721Speter 7117721Speterstruct __file_lock; 7217721Speter 7317721Speter/* hold a buncha junk that would grow the ABI */ 7417721Speterstruct __sFILEX { 7517721Speter struct __file_lock *_mtlock; /* used for MT-safety */ 7617721Speter unsigned char *_up; /* saved _p when _p is doing ungetc data */ 7717721Speter}; 7817721Speter 7917721Speter/* 8017721Speter * stdio state variables. 8117721Speter * 8217721Speter * The following always hold: 8317721Speter * 8417721Speter * if (_flags&(__SLBF|__SWR)) == (__SLBF|__SWR), 8517721Speter * _lbfsize is -_bf._size, else _lbfsize is 0 8617721Speter * if _flags&__SRD, _w is 0 8717721Speter * if _flags&__SWR, _r is 0 8817721Speter * 8917721Speter * This ensures that the getc and putc macros (or inline functions) never 9017721Speter * try to write or read from a file that is in `read' or `write' mode. 9117721Speter * (Moreover, they can, and do, automatically switch from read mode to 9217721Speter * write mode, and back, on "r+" and "w+" files.) 9317721Speter * 9417721Speter * _lbfsize is used only to make the inline line-buffered output stream 9517721Speter * code as compact as possible. 9617721Speter * 9717721Speter * _ub, _up, and _ur are used when ungetc() pushes back more characters 9817721Speter * than fit in the current _bf, or when ungetc() pushes back a character 9917721Speter * that does not match the previous one in _bf. When this happens, 10017721Speter * _ub._base becomes non-nil (i.e., a stream has ungetc() data iff 10117721Speter * _ub._base!=NULL) and _up and _ur save the current values of _p and _r. 10217721Speter * 10317721Speter * NB: see WARNING above before changing the layout of this structure! 10417721Speter */ 10517721Spetertypedef struct __sFILE { 10617721Speter unsigned char *_p; /* current position in (some) buffer */ 10717721Speter int _r; /* read space left for getc() */ 10817721Speter int _w; /* write space left for putc() */ 10917721Speter short _flags; /* flags, below; this FILE is free if 0 */ 11017721Speter short _file; /* fileno, if Unix descriptor, else -1 */ 11117721Speter struct __sbuf _bf; /* the buffer (at least 1 byte, if !NULL) */ 11217721Speter int _lbfsize; /* 0 or -_bf._size, for inline putc */ 11317721Speter 11417721Speter /* operations */ 11517721Speter void *_cookie; /* cookie passed to io functions */ 11617721Speter int (*_close) __P((void *)); 11717721Speter int (*_read) __P((void *, char *, int)); 11817721Speter fpos_t (*_seek) __P((void *, fpos_t, int)); 11917721Speter int (*_write) __P((void *, const char *, int)); 12017721Speter 12117721Speter /* separate buffer for long sequences of ungetc() */ 12217721Speter struct __sbuf _ub; /* ungetc buffer */ 12317721Speter struct __sFILEX *_extra; /* additions to FILE to not break ABI */ 12417721Speter int _ur; /* saved _r when _r is counting ungetc data */ 12517721Speter 12617721Speter /* tricks to meet minimum requirements even when malloc() fails */ 12717721Speter unsigned char _ubuf[3]; /* guarantee an ungetc() buffer */ 12817721Speter unsigned char _nbuf[1]; /* guarantee a getc() buffer */ 12917721Speter 13017721Speter /* separate buffer for fgetln() when line crosses buffer boundary */ 13117721Speter struct __sbuf _lb; /* buffer for fgetln() */ 13217721Speter 13317721Speter /* Unix stdio files get aligned to block boundaries on fseek() */ 13417721Speter int _blksize; /* stat.st_blksize (may be != _bf._size) */ 13517721Speter fpos_t _offset; /* current lseek offset (see WARNING) */ 13617721Speter} FILE; 13717721Speter 13817721Speter__BEGIN_DECLS 13917721Speterextern FILE __sF[]; 14017721Speter__END_DECLS 14117721Speter 14217721Speter#define __SLBF 0x0001 /* line buffered */ 14317721Speter#define __SNBF 0x0002 /* unbuffered */ 14417721Speter#define __SRD 0x0004 /* OK to read */ 14517721Speter#define __SWR 0x0008 /* OK to write */ 14617721Speter /* RD and WR are never simultaneously asserted */ 14717721Speter#define __SRW 0x0010 /* open for reading & writing */ 14817721Speter#define __SEOF 0x0020 /* found EOF */ 14917721Speter#define __SERR 0x0040 /* found error */ 15017721Speter#define __SMBF 0x0080 /* _buf is from malloc */ 15117721Speter#define __SAPP 0x0100 /* fdopen()ed in append mode */ 15217721Speter#define __SSTR 0x0200 /* this is an sprintf/snprintf string */ 15317721Speter#define __SOPT 0x0400 /* do fseek() optimization */ 15417721Speter#define __SNPT 0x0800 /* do not do fseek() optimization */ 15517721Speter#define __SOFF 0x1000 /* set iff _offset is in fact correct */ 15617721Speter#define __SMOD 0x2000 /* true => fgetln modified _p text */ 15717721Speter#define __SALC 0x4000 /* allocate string space dynamically */ 15817721Speter#define __SIGN 0x8000 /* ignore this file in _fwalk */ 15917721Speter 16017721Speter/* 16117721Speter * The following three definitions are for ANSI C, which took them 16217721Speter * from System V, which brilliantly took internal interface macros and 16317721Speter * made them official arguments to setvbuf(), without renaming them. 16417721Speter * Hence, these ugly _IOxxx names are *supposed* to appear in user code. 16517721Speter * 16617721Speter * Although numbered as their counterparts above, the implementation 16717721Speter * does not rely on this. 16817721Speter */ 16917721Speter#define _IOFBF 0 /* setvbuf should set fully buffered */ 17017721Speter#define _IOLBF 1 /* setvbuf should set line buffered */ 17117721Speter#define _IONBF 2 /* setvbuf should set unbuffered */ 17217721Speter 17317721Speter#define BUFSIZ 1024 /* size of buffer used by setbuf */ 17417721Speter#define EOF (-1) 17517721Speter 17617721Speter/* 17717721Speter * FOPEN_MAX is a minimum maximum, and is the number of streams that 17817721Speter * stdio can provide without attempting to allocate further resources 17917721Speter * (which could fail). Do not use this for anything. 18017721Speter */ 18117721Speter /* must be == _POSIX_STREAM_MAX <limits.h> */ 18217721Speter#define FOPEN_MAX 20 /* must be <= OPEN_MAX <sys/syslimits.h> */ 18317721Speter#define FILENAME_MAX 1024 /* must be <= PATH_MAX <sys/syslimits.h> */ 18417721Speter 18517721Speter/* System V/ANSI C; this is the wrong way to do this, do *not* use these. */ 18617721Speter#ifndef _ANSI_SOURCE 18717721Speter#define P_tmpdir "/var/tmp/" 18817721Speter#endif 18917721Speter#define L_tmpnam 1024 /* XXX must be == PATH_MAX */ 19017721Speter#define TMP_MAX 308915776 19117721Speter 19217721Speter#ifndef SEEK_SET 19317721Speter#define SEEK_SET 0 /* set file offset to offset */ 19417721Speter#endif 19517721Speter#ifndef SEEK_CUR 19617721Speter#define SEEK_CUR 1 /* set file offset to current plus offset */ 19717721Speter#endif 19817721Speter#ifndef SEEK_END 19917721Speter#define SEEK_END 2 /* set file offset to EOF plus offset */ 20017721Speter#endif 20117721Speter 20217721Speter#define stdin (&__sF[0]) 20317721Speter#define stdout (&__sF[1]) 20417721Speter#define stderr (&__sF[2]) 20517721Speter 20617721Speter/* 20717721Speter * Functions defined in ANSI C standard. 20817721Speter */ 20917721Speter__BEGIN_DECLS 21017721Spetervoid clearerr __P((FILE *)); 21117721Speterint fclose __P((FILE *)); 21217721Speterint feof __P((FILE *)); 21317721Speterint ferror __P((FILE *)); 21417721Speterint fflush __P((FILE *)); 21517721Speterint fgetc __P((FILE *)); 21617721Speterint fgetpos __P((FILE *, fpos_t *)); 21717721Speterchar *fgets __P((char *, int, FILE *)); 21817721SpeterFILE *fopen __P((const char *, const char *)); 21917721Speterint fprintf __P((FILE *, const char *, ...)); 22017721Speterint fputc __P((int, FILE *)); 22117721Speterint fputs __P((const char *, FILE *)); 22217721Spetersize_t fread __P((void *, size_t, size_t, FILE *)); 22317721SpeterFILE *freopen __P((const char *, const char *, FILE *)); 22417721Speterint fscanf __P((FILE *, const char *, ...)); 22517721Speterint fseek __P((FILE *, long, int)); 22617721Speterint fsetpos __P((FILE *, const fpos_t *)); 22717721Speterlong ftell __P((FILE *)); 22817721Spetersize_t fwrite __P((const void *, size_t, size_t, FILE *)); 22917721Speterint getc __P((FILE *)); 23017721Speterint getchar __P((void)); 23117721Speterchar *gets __P((char *)); 23217721Speter#if !defined(_ANSI_SOURCE) && !defined(_POSIX_SOURCE) 23317721Speterextern __const int sys_nerr; /* perror(3) external variables */ 23417721Speterextern __const char *__const sys_errlist[]; 23517721Speter#endif 23617721Spetervoid perror __P((const char *)); 23717721Speterint printf __P((const char *, ...)); 23817721Speterint putc __P((int, FILE *)); 23917721Speterint putchar __P((int)); 24017721Speterint puts __P((const char *)); 24117721Speterint remove __P((const char *)); 24217721Speterint rename __P((const char *, const char *)); 24317721Spetervoid rewind __P((FILE *)); 24417721Speterint scanf __P((const char *, ...)); 24517721Spetervoid setbuf __P((FILE *, char *)); 24617721Speterint setvbuf __P((FILE *, char *, int, size_t)); 24717721Speterint sprintf __P((char *, const char *, ...)); 24817721Speterint sscanf __P((const char *, const char *, ...)); 24917721SpeterFILE *tmpfile __P((void)); 25017721Speterchar *tmpnam __P((char *)); 25117721Speterint ungetc __P((int, FILE *)); 25217721Speterint vfprintf __P((FILE *, const char *, _BSD_VA_LIST_)); 25317721Speterint vprintf __P((const char *, _BSD_VA_LIST_)); 25417721Speterint vsprintf __P((char *, const char *, _BSD_VA_LIST_)); 25517721Speter__END_DECLS 25617721Speter 25717721Speter/* 25817721Speter * Functions defined in POSIX 1003.1. 25917721Speter */ 26017721Speter#ifndef _ANSI_SOURCE 26117721Speter/* size for cuserid(3); UT_NAMESIZE + 1, see <utmp.h> */ 26217721Speter#define L_cuserid 17 26317721Speter 26417721Speter#define L_ctermid 1024 /* size for ctermid(3); PATH_MAX */ 26517721Speter 26617721Speter__BEGIN_DECLS 26717721Speterchar *ctermid __P((char *)); 26817721SpeterFILE *fdopen __P((int, const char *)); 26917721Speterint fileno __P((FILE *)); 27017721Speterint ftrylockfile __P((FILE *)); 27117721Spetervoid flockfile __P((FILE *)); 27217721Spetervoid funlockfile __P((FILE *)); 27317721Speter__END_DECLS 27417721Speter#endif /* not ANSI */ 27517721Speter 27617721Speter/* 27717721Speter * Portability hacks. See <sys/types.h>. 27817721Speter */ 27917721Speter#if !defined (_ANSI_SOURCE) && !defined(_POSIX_SOURCE) 28017721Speter__BEGIN_DECLS 28117721Speter#ifndef _FTRUNCATE_DECLARED 28217721Speter#define _FTRUNCATE_DECLARED 28317721Speterint ftruncate __P((int, _BSD_OFF_T_)); 28417721Speter#endif 28517721Speter#ifndef _LSEEK_DECLARED 28617721Speter#define _LSEEK_DECLARED 28717721Speter_BSD_OFF_T_ lseek __P((int, _BSD_OFF_T_, int)); 28817721Speter#endif 28917721Speter#ifndef _MMAP_DECLARED 29017721Speter#define _MMAP_DECLARED 29117721Spetervoid *mmap __P((void *, size_t, int, int, int, _BSD_OFF_T_)); 29217721Speter#endif 29317721Speter#ifndef _TRUNCATE_DECLARED 29417721Speter#define _TRUNCATE_DECLARED 29517721Speterint truncate __P((const char *, _BSD_OFF_T_)); 29617721Speter#endif 29717721Speter__END_DECLS 29817721Speter#endif /* !_ANSI_SOURCE && !_POSIX_SOURCE */ 29917721Speter 30017721Speter/* 30117721Speter * Routines that are purely local. 30217721Speter */ 30317721Speter#if !defined (_ANSI_SOURCE) && !defined(_POSIX_SOURCE) 30417721Speter__BEGIN_DECLS 30517721Speterint asprintf __P((char **, const char *, ...)) __printflike(2, 3); 30617721Speterchar *ctermid_r __P((char *)); 30717721Speterchar *fgetln __P((FILE *, size_t *)); 30817721Speterint fpurge __P((FILE *)); 30917721Speterint fseeko __P((FILE *, _BSD_OFF_T_, int)); 31017721Speter_BSD_OFF_T_ ftello __P((FILE *)); 31117721Speterint getw __P((FILE *)); 31217721Speterint pclose __P((FILE *)); 31317721SpeterFILE *popen __P((const char *, const char *)); 31417721Speterint putw __P((int, FILE *)); 31517721Spetervoid setbuffer __P((FILE *, char *, int)); 31617721Speterint setlinebuf __P((FILE *)); 31717721Speterchar *tempnam __P((const char *, const char *)); 31817721Speterint snprintf __P((char *, size_t, const char *, ...)) __printflike(3, 4); 31917721Speterint vasprintf __P((char **, const char *, _BSD_VA_LIST_)) 32017721Speter __printflike(2, 0); 32117721Speterint vsnprintf __P((char *, size_t, const char *, _BSD_VA_LIST_)) 32217721Speter __printflike(3, 0); 32317721Speterint vscanf __P((const char *, _BSD_VA_LIST_)) __scanflike(1, 0); 32417721Speterint vsscanf __P((const char *, const char *, _BSD_VA_LIST_)) 32517721Speter __scanflike(2, 0); 32617721Speter__END_DECLS 32717721Speter 32817721Speter/* 32917721Speter * This is a #define because the function is used internally and 33017721Speter * (unlike vfscanf) the name __vfscanf is guaranteed not to collide 33117721Speter * with a user function when _ANSI_SOURCE or _POSIX_SOURCE is defined. 33217721Speter */ 33317721Speter#define vfscanf __vfscanf 33417721Speter 33517721Speter/* 33617721Speter * Stdio function-access interface. 33717721Speter */ 33817721Speter__BEGIN_DECLS 33917721SpeterFILE *funopen __P((const void *, 34017721Speter int (*)(void *, char *, int), 34117721Speter int (*)(void *, const char *, int), 34217721Speter fpos_t (*)(void *, fpos_t, int), 34317721Speter int (*)(void *))); 34417721Speter__END_DECLS 34517721Speter#define fropen(cookie, fn) funopen(cookie, fn, 0, 0, 0) 34617721Speter#define fwopen(cookie, fn) funopen(cookie, 0, fn, 0, 0) 34717721Speter#endif /* !_ANSI_SOURCE && !_POSIX_SOURCE */ 34817721Speter 34917721Speter/* 35017721Speter * Functions internal to the implementation. 35117721Speter */ 35217721Speter__BEGIN_DECLS 35317721Speterint __srget __P((FILE *)); 35417721Speterint __vfscanf __P((FILE *, const char *, _BSD_VA_LIST_)); 35517721Speterint __svfscanf __P((FILE *, const char *, _BSD_VA_LIST_)); 35617721Speterint __swbuf __P((int, FILE *)); 35717721Speter__END_DECLS 35817721Speter 35917721Speter/* 36017721Speter * The __sfoo macros are here so that we can 36117721Speter * define function versions in the C library. 36217721Speter */ 36317721Speter#define __sgetc(p) (--(p)->_r < 0 ? __srget(p) : (int)(*(p)->_p++)) 36417721Speter#if defined(__GNUC__) && defined(__STDC__) 36517721Speterstatic __inline int __sputc(int _c, FILE *_p) { 36617721Speter if (--_p->_w >= 0 || (_p->_w >= _p->_lbfsize && (char)_c != '\n')) 36717721Speter return (*_p->_p++ = _c); 36817721Speter else 36917721Speter return (__swbuf(_c, _p)); 37017721Speter} 37117721Speter#else 37217721Speter/* 37317721Speter * This has been tuned to generate reasonable code on the vax using pcc. 37417721Speter */ 37517721Speter#define __sputc(c, p) \ 37617721Speter (--(p)->_w < 0 ? \ 37717721Speter (p)->_w >= (p)->_lbfsize ? \ 37817721Speter (*(p)->_p = (c)), *(p)->_p != '\n' ? \ 37917721Speter (int)*(p)->_p++ : \ 38017721Speter __swbuf('\n', p) : \ 38117721Speter __swbuf((int)(c), p) : \ 38217721Speter (*(p)->_p = (c), (int)*(p)->_p++)) 38317721Speter#endif 38417721Speter 38517721Speter#define __sfeof(p) (((p)->_flags & __SEOF) != 0) 38617721Speter#define __sferror(p) (((p)->_flags & __SERR) != 0) 38717721Speter#define __sclearerr(p) ((void)((p)->_flags &= ~(__SERR|__SEOF))) 38817721Speter#define __sfileno(p) ((p)->_file) 38917721Speter 39017721Speter/* 39117721Speter * See ISO/IEC 9945-1 ANSI/IEEE Std 1003.1 Second Edition 1996-07-12 39217721Speter * B.8.2.7 for the rationale behind the *_unlocked() macros. 39317721Speter */ 39417721Speter#define feof_unlocked(p) __sfeof(p) 39517721Speter#define ferror_unlocked(p) __sferror(p) 39617721Speter#define clearerr_unlocked(p) __sclearerr(p) 39717721Speter 39817721Speter#ifndef _ANSI_SOURCE 39917721Speter#define fileno_unlocked(p) __sfileno(p) 40017721Speter#endif 40117721Speter 40217721Speter#define getc_unlocked(fp) __sgetc(fp) 40317721Speter#define putc_unlocked(x, fp) __sputc(x, fp) 40417721Speter 40517721Speter#define getchar_unlocked() getc_unlocked(stdin) 40617721Speter#define putchar_unlocked(x) putc_unlocked(x, stdout) 40717721Speter 40817721Speter#endif /* !_STDIO_H_ */ 40917721Speter