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