stdio.h revision 199767f8919635c4928607450d9e0abb932109ce
/*-
* Copyright (c) 1990, 1993
* The Regents of the University of California. All rights reserved.
*
* This code is derived from software contributed to Berkeley by
* Chris Torek.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* 3. Neither the name of the University nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
* @(#)stdio.h 8.5 (Berkeley) 4/29/95
* $FreeBSD$
*/
#ifndef _STDIO_H_
#define _STDIO_H_
#ifndef _SIZE_T_DECLARED
#define _SIZE_T_DECLARED
#endif
#if __POSIX_VISIBLE >= 200809
#ifndef _OFF_T_DECLARED
#define _OFF_T_DECLARED
#endif
#ifndef _SSIZE_T_DECLARED
#define _SSIZE_T_DECLARED
#endif
#endif
#ifndef _VA_LIST_DECLARED
#define _VA_LIST_DECLARED
#endif
#endif
#define _FSTDIO /* Define for new stdio with functions. */
/*
* NB: to fit things in six character monocase externals, the stdio
* code uses the prefix `__s' for stdio objects, typically followed
* by a three-character attempt at a mnemonic.
*/
/* stdio buffers */
struct __sbuf {
unsigned char *_base;
int _size;
};
/*
* stdio state variables.
*
* The following always hold:
*
* if (_flags&(__SLBF|__SWR)) == (__SLBF|__SWR),
* _lbfsize is -_bf._size, else _lbfsize is 0
* if _flags&__SRD, _w is 0
* if _flags&__SWR, _r is 0
*
* This ensures that the getc and putc macros (or inline functions) never
* try to write or read from a file that is in `read' or `write' mode.
* (Moreover, they can, and do, automatically switch from read mode to
* write mode, and back, on "r+" and "w+" files.)
*
* _lbfsize is used only to make the inline line-buffered output stream
* code as compact as possible.
*
* _ub, _up, and _ur are used when ungetc() pushes back more characters
* than fit in the current _bf, or when ungetc() pushes back a character
* that does not match the previous one in _bf. When this happens,
* _ub._base becomes non-nil (i.e., a stream has ungetc() data iff
* _ub._base!=NULL) and _up and _ur save the current values of _p and _r.
*
* Certain members of __sFILE are accessed directly via macros or
* inline functions. To preserve ABI compat, these members must not
* be disturbed. These members are marked below with (*).
*/
struct __sFILE {
unsigned char *_p; /* (*) current position in (some) buffer */
int _r; /* (*) read space left for getc() */
int _w; /* (*) write space left for putc() */
short _flags; /* (*) flags, below; this FILE is free if 0 */
short _file; /* (*) fileno, if Unix descriptor, else -1 */
int _lbfsize; /* (*) 0 or -_bf._size, for inline putc */
/* operations */
void *_cookie; /* (*) cookie passed to io functions */
int (*_close)(void *);
int (*_read)(void *, char *, int);
int (*_write)(void *, const char *, int);
/* separate buffer for long sequences of ungetc() */
unsigned char *_up; /* saved _p when _p is doing ungetc data */
int _ur; /* saved _r when _r is counting ungetc data */
/* tricks to meet minimum requirements even when malloc() fails */
/* separate buffer for fgetln() when line crosses buffer boundary */
/* Unix stdio files get aligned to block boundaries on fseek() */
int _fl_count; /* recursive lock count */
int _orientation; /* orientation for fwide() */
int _flags2; /* additional flags */
};
#ifndef _STDFILE_DECLARED
#define _STDFILE_DECLARED
#endif
#ifndef _STDSTREAM_DECLARED
#define _STDSTREAM_DECLARED
#endif
/* RD and WR are never simultaneously asserted */
/*
* The following three definitions are for ANSI C, which took them
* from System V, which brilliantly took internal interface macros and
* made them official arguments to setvbuf(), without renaming them.
* Hence, these ugly _IOxxx names are *supposed* to appear in user code.
*
* Although numbered as their counterparts above, the implementation
* does not rely on this.
*/
#define _IOFBF 0 /* setvbuf should set fully buffered */
#define EOF (-1)
/*
* FOPEN_MAX is a minimum maximum, and is the number of streams that
* stdio can provide without attempting to allocate further resources
* (which could fail). Do not use this for anything.
*/
/* must be == _POSIX_STREAM_MAX <limits.h> */
#ifndef FOPEN_MAX
#endif
#if __XSI_VISIBLE
#define P_tmpdir "/tmp/"
#endif
#define TMP_MAX 308915776
#ifndef SEEK_SET
#define SEEK_SET 0 /* set file offset to offset */
#endif
#ifndef SEEK_CUR
#endif
#ifndef SEEK_END
#endif
#ifdef _XLOCALE_H_
#endif
/*
* Functions defined in ANSI C standard.
*/
int getchar(void);
char *gets(char *);
void perror(const char *);
int printf(const char * __restrict, ...);
int putchar(int);
int puts(const char *);
int remove(const char *);
int rename(const char *, const char *);
int scanf(const char * __restrict, ...);
char *tmpnam(char *);
#if __ISO_C_VISIBLE >= 1999
__scanflike(2, 0);
__scanflike(2, 0);
#endif
/*
* Functions defined in all versions of POSIX 1003.1.
*/
#endif
#if __POSIX_VISIBLE
char *ctermid(char *);
#endif /* __POSIX_VISIBLE */
#if __POSIX_VISIBLE >= 199209
#endif
#if __POSIX_VISIBLE >= 199506
int ftrylockfile(FILE *);
void funlockfile(FILE *);
/*
* These are normally used through macros as defined below, but POSIX
* requires functions as well.
*/
int getc_unlocked(FILE *);
int getchar_unlocked(void);
int putc_unlocked(int, FILE *);
int putchar_unlocked(int);
#endif
#if __BSD_VISIBLE
void clearerr_unlocked(FILE *);
int feof_unlocked(FILE *);
int ferror_unlocked(FILE *);
int fileno_unlocked(FILE *);
#endif
#if __POSIX_VISIBLE >= 200112
#endif
#if __XSI_VISIBLE
char *tempnam(const char *, const char *);
#endif
#if __POSIX_VISIBLE >= 200809
FILE * __restrict);
int renameat(int, const char *, int, const char *);
/*
* Every programmer and his dog wrote functions called getline() and dprintf()
* before POSIX.1-2008 came along and decided to usurp the names, so we
* don't prototype them by default unless one of the following is true:
* a) the app has requested them specifically by defining _WITH_GETLINE or
* _WITH_DPRINTF, respectively
* b) the app has requested a POSIX.1-2008 environment via _POSIX_C_SOURCE
* c) the app defines a GNUism such as _BSD_SOURCE or _GNU_SOURCE
*/
#ifndef _WITH_GETLINE
#if defined(_BSD_SOURCE) || defined(_GNU_SOURCE)
#define _WITH_GETLINE
#elif defined(_POSIX_C_SOURCE)
#if _POSIX_C_SOURCE >= 200809
#define _WITH_GETLINE
#endif
#endif
#endif
#ifdef _WITH_GETLINE
#endif
#ifndef _WITH_DPRINTF
#if defined(_BSD_SOURCE) || defined(_GNU_SOURCE)
#define _WITH_DPRINTF
#elif defined(_POSIX_C_SOURCE)
#if _POSIX_C_SOURCE >= 200809
#define _WITH_DPRINTF
#endif
#endif
#endif
#ifdef _WITH_DPRINTF
int (dprintf)(int, const char * __restrict, ...);
#endif
#endif /* __POSIX_VISIBLE >= 200809 */
/*
* Routines that are purely local.
*/
#if __BSD_VISIBLE
char *ctermid_r(char *);
void fcloseall(void);
int setlinebuf(FILE *);
__printflike(2, 0);
/*
* The system error table contains messages for the first sys_nerr
* positive errno values. Use strerror() or strerror_r() from <string.h>
* instead.
*/
extern const int sys_nerr;
extern const char * const sys_errlist[];
/*
* Stdio function-access interface.
*/
int (*)(void *, char *, int),
int (*)(void *, const char *, int),
int (*)(void *));
/*
*/
#ifndef _FTRUNCATE_DECLARED
#define _FTRUNCATE_DECLARED
#endif
#ifndef _LSEEK_DECLARED
#define _LSEEK_DECLARED
#endif
#ifndef _MMAP_DECLARED
#define _MMAP_DECLARED
#endif
#ifndef _TRUNCATE_DECLARED
#define _TRUNCATE_DECLARED
#endif
#endif /* __BSD_VISIBLE */
/*
* Functions internal to the implementation.
*/
/*
* The __sfoo macros are here so that we can
* define function versions in the C library.
*/
else
}
#else
/*
* This has been tuned to generate reasonable code on the vax using pcc.
*/
#define __sputc(c, p) \
(--(p)->_w < 0 ? \
(int)*(p)->_p++ : \
__swbuf('\n', p) : \
__swbuf((int)(c), p) : \
#endif
extern int __isthreaded;
#ifndef __cplusplus
#if __POSIX_VISIBLE
#endif
#if __BSD_VISIBLE
/*
* B.8.2.7 for the rationale behind the *_unlocked() macros.
*/
#define feof_unlocked(p) __sfeof(p)
#define ferror_unlocked(p) __sferror(p)
#define clearerr_unlocked(p) __sclearerr(p)
#define fileno_unlocked(p) __sfileno(p)
#endif
#if __POSIX_VISIBLE >= 199506
#endif
#endif /* __cplusplus */
#endif /* !_STDIO_H_ */