524 lines
12 KiB
C
524 lines
12 KiB
C
|
/***
|
||
|
*stdio.h - definitions/declarations for standard I/O routines
|
||
|
*
|
||
|
* Copyright (c) 1985-1995, Microsoft Corporation. All rights reserved.
|
||
|
*
|
||
|
*Purpose:
|
||
|
* This file defines the structures, values, macros, and functions
|
||
|
* used by the level 2 I/O ("standard I/O") routines.
|
||
|
* [ANSI/System V]
|
||
|
*
|
||
|
* [Public]
|
||
|
*
|
||
|
****/
|
||
|
|
||
|
#ifndef _INC_STDIO
|
||
|
#define _INC_STDIO
|
||
|
|
||
|
#if !defined(_WIN32) && !defined(_MAC)
|
||
|
#error ERROR: Only Mac or Win32 targets supported!
|
||
|
#endif
|
||
|
|
||
|
|
||
|
#ifdef _MSC_VER
|
||
|
/*
|
||
|
* Currently, all MS C compilers for Win32 platforms default to 8 byte
|
||
|
* alignment.
|
||
|
*/
|
||
|
#pragma pack(push,8)
|
||
|
#endif /* _MSC_VER */
|
||
|
|
||
|
#ifdef __cplusplus
|
||
|
extern "C" {
|
||
|
#endif
|
||
|
|
||
|
|
||
|
/* Define _CRTAPI1 (for compatibility with the NT SDK) */
|
||
|
|
||
|
#ifndef _CRTAPI1
|
||
|
#if _MSC_VER >= 800 && _M_IX86 >= 300
|
||
|
#define _CRTAPI1 __cdecl
|
||
|
#else
|
||
|
#define _CRTAPI1
|
||
|
#endif
|
||
|
#endif
|
||
|
|
||
|
|
||
|
/* Define _CRTAPI2 (for compatibility with the NT SDK) */
|
||
|
|
||
|
#ifndef _CRTAPI2
|
||
|
#if _MSC_VER >= 800 && _M_IX86 >= 300
|
||
|
#define _CRTAPI2 __cdecl
|
||
|
#else
|
||
|
#define _CRTAPI2
|
||
|
#endif
|
||
|
#endif
|
||
|
|
||
|
|
||
|
/* Define _CRTIMP */
|
||
|
|
||
|
#ifndef _CRTIMP
|
||
|
#ifdef _NTSDK
|
||
|
/* definition compatible with NT SDK */
|
||
|
#define _CRTIMP
|
||
|
#else /* ndef _NTSDK */
|
||
|
/* current definition */
|
||
|
#ifdef _DLL
|
||
|
#define _CRTIMP __declspec(dllimport)
|
||
|
#else /* ndef _DLL */
|
||
|
#define _CRTIMP
|
||
|
#endif /* _DLL */
|
||
|
#endif /* _NTSDK */
|
||
|
#endif /* _CRTIMP */
|
||
|
|
||
|
|
||
|
/* Define __cdecl for non-Microsoft compilers */
|
||
|
|
||
|
#if ( !defined(_MSC_VER) && !defined(__cdecl) )
|
||
|
#define __cdecl
|
||
|
#endif
|
||
|
|
||
|
|
||
|
#ifndef _SIZE_T_DEFINED
|
||
|
typedef unsigned int size_t;
|
||
|
#define _SIZE_T_DEFINED
|
||
|
#endif
|
||
|
|
||
|
|
||
|
#ifndef _MAC
|
||
|
#ifndef _WCHAR_T_DEFINED
|
||
|
typedef unsigned short wchar_t;
|
||
|
#define _WCHAR_T_DEFINED
|
||
|
#endif
|
||
|
|
||
|
|
||
|
#ifndef _WCTYPE_T_DEFINED
|
||
|
typedef wchar_t wint_t;
|
||
|
typedef wchar_t wctype_t;
|
||
|
#define _WCTYPE_T_DEFINED
|
||
|
#endif
|
||
|
#endif /* ndef _MAC */
|
||
|
|
||
|
|
||
|
#ifndef _VA_LIST_DEFINED
|
||
|
#ifdef _M_ALPHA
|
||
|
typedef struct {
|
||
|
char *a0; /* pointer to first homed integer argument */
|
||
|
int offset; /* byte offset of next parameter */
|
||
|
} va_list;
|
||
|
#else
|
||
|
typedef char * va_list;
|
||
|
#endif
|
||
|
#define _VA_LIST_DEFINED
|
||
|
#endif
|
||
|
|
||
|
|
||
|
/* Buffered I/O macros */
|
||
|
|
||
|
#if defined(_M_MPPC)
|
||
|
#define BUFSIZ 4096
|
||
|
#else /* defined (_M_MPPC) */
|
||
|
#define BUFSIZ 512
|
||
|
#endif /* defined (_M_MPPC) */
|
||
|
|
||
|
|
||
|
/*
|
||
|
* Default number of supported streams. _NFILE is confusing and obsolete, but
|
||
|
* supported anyway for backwards compatibility.
|
||
|
*/
|
||
|
#define _NFILE _NSTREAM_
|
||
|
|
||
|
#ifdef _WIN32
|
||
|
|
||
|
#define _NSTREAM_ 512
|
||
|
|
||
|
/*
|
||
|
* Number of entries in _iob[] (declared below). Note that _NSTREAM_ must be
|
||
|
* greater than or equal to _IOB_ENTRIES.
|
||
|
*/
|
||
|
#define _IOB_ENTRIES 20
|
||
|
|
||
|
#else /* ndef _WIN32 */
|
||
|
|
||
|
#ifdef _DLL
|
||
|
#define _NSTREAM_ 128
|
||
|
#else
|
||
|
#ifdef _MT
|
||
|
#define _NSTREAM_ 40
|
||
|
#else
|
||
|
#define _NSTREAM_ 20
|
||
|
#endif
|
||
|
#endif /* _DLL */
|
||
|
|
||
|
#endif /* ndef _MAC */
|
||
|
|
||
|
#define EOF (-1)
|
||
|
|
||
|
|
||
|
#ifndef _FILE_DEFINED
|
||
|
struct _iobuf {
|
||
|
char *_ptr;
|
||
|
int _cnt;
|
||
|
char *_base;
|
||
|
int _flag;
|
||
|
int _file;
|
||
|
int _charbuf;
|
||
|
int _bufsiz;
|
||
|
char *_tmpfname;
|
||
|
};
|
||
|
typedef struct _iobuf FILE;
|
||
|
#define _FILE_DEFINED
|
||
|
#endif
|
||
|
|
||
|
#if !defined(_M_MPPC) && !defined(_M_M68K)
|
||
|
|
||
|
/* Directory where temporary files may be created. */
|
||
|
|
||
|
#ifdef _POSIX_
|
||
|
#define _P_tmpdir "/"
|
||
|
#define _wP_tmpdir L"/"
|
||
|
#else
|
||
|
#define _P_tmpdir "\\"
|
||
|
#define _wP_tmpdir L"\\"
|
||
|
#endif
|
||
|
|
||
|
|
||
|
/* L_tmpnam = size of P_tmpdir
|
||
|
* + 1 (in case P_tmpdir does not end in "/")
|
||
|
* + 12 (for the filename string)
|
||
|
* + 1 (for the null terminator)
|
||
|
*/
|
||
|
#define L_tmpnam sizeof(_P_tmpdir)+12
|
||
|
#else /* defined(_M_M68K) || defined(_M_MPPC) */
|
||
|
#define L_tmpnam 255
|
||
|
#endif /* !defined(_M_M68K) && defined(_M_MPPC) */
|
||
|
|
||
|
|
||
|
#ifdef _POSIX_
|
||
|
#define L_ctermid 9
|
||
|
#define L_cuserid 32
|
||
|
#endif
|
||
|
|
||
|
|
||
|
/* Seek method constants */
|
||
|
|
||
|
#define SEEK_CUR 1
|
||
|
#define SEEK_END 2
|
||
|
#define SEEK_SET 0
|
||
|
|
||
|
|
||
|
#define FILENAME_MAX 260
|
||
|
#define FOPEN_MAX 20
|
||
|
#define _SYS_OPEN 20
|
||
|
#define TMP_MAX 32767
|
||
|
|
||
|
|
||
|
/* Define NULL pointer value */
|
||
|
|
||
|
#ifndef NULL
|
||
|
#ifdef __cplusplus
|
||
|
#define NULL 0
|
||
|
#else
|
||
|
#define NULL ((void *)0)
|
||
|
#endif
|
||
|
#endif
|
||
|
|
||
|
|
||
|
/* Declare _iob[] array */
|
||
|
|
||
|
#ifndef _STDIO_DEFINED
|
||
|
|
||
|
#ifdef _NTSDK
|
||
|
|
||
|
#ifdef _DLL
|
||
|
extern FILE * _iob;
|
||
|
#else
|
||
|
extern FILE _iob[];
|
||
|
#endif
|
||
|
|
||
|
#else /* ndef _NTSDK */
|
||
|
|
||
|
#if defined(_DLL) && defined(_M_IX86)
|
||
|
|
||
|
#define _iob (__p__iob())
|
||
|
_CRTIMP extern FILE * __cdecl __p__iob(void);
|
||
|
|
||
|
#else /* !(defined(_DLL) && defined(_M_IX86)) */
|
||
|
|
||
|
_CRTIMP extern FILE _iob[];
|
||
|
|
||
|
#endif /* defined(_DLL) && defined(_M_IX86) */
|
||
|
|
||
|
#endif /* _NTSDK */
|
||
|
|
||
|
#endif /* _STDIO_DEFINED */
|
||
|
|
||
|
|
||
|
/* Define file position type */
|
||
|
|
||
|
#ifndef _FPOS_T_DEFINED
|
||
|
|
||
|
#if defined(_M_MPPC) || defined(_M_M68K) || defined(_POSIX_)
|
||
|
|
||
|
typedef long fpos_t;
|
||
|
|
||
|
#else /* !defined(_M_MPPC) && !defined(_M_M68K) */
|
||
|
|
||
|
#if !__STDC__ && _INTEGRAL_MAX_BITS >= 64
|
||
|
typedef __int64 fpos_t;
|
||
|
#else
|
||
|
typedef struct fpos_t {
|
||
|
unsigned int lopart;
|
||
|
int hipart;
|
||
|
} fpos_t;
|
||
|
#endif
|
||
|
|
||
|
#endif /* defined(_M_MPPC) || defined(_M_68K) */
|
||
|
|
||
|
#define _FPOS_T_DEFINED
|
||
|
#endif
|
||
|
|
||
|
|
||
|
#define stdin (&_iob[0])
|
||
|
#define stdout (&_iob[1])
|
||
|
#define stderr (&_iob[2])
|
||
|
|
||
|
|
||
|
#define _IOREAD 0x0001
|
||
|
#define _IOWRT 0x0002
|
||
|
|
||
|
#define _IOFBF 0x0000
|
||
|
#define _IOLBF 0x0040
|
||
|
#define _IONBF 0x0004
|
||
|
|
||
|
#define _IOMYBUF 0x0008
|
||
|
#define _IOEOF 0x0010
|
||
|
#define _IOERR 0x0020
|
||
|
#define _IOSTRG 0x0040
|
||
|
#define _IORW 0x0080
|
||
|
#ifdef _POSIX_
|
||
|
#define _IOAPPEND 0x0200
|
||
|
#endif
|
||
|
|
||
|
|
||
|
/* Function prototypes */
|
||
|
|
||
|
#ifndef _STDIO_DEFINED
|
||
|
|
||
|
_CRTIMP int __cdecl _filbuf(FILE *);
|
||
|
_CRTIMP int __cdecl _flsbuf(int, FILE *);
|
||
|
|
||
|
#ifdef _POSIX_
|
||
|
_CRTIMP FILE * __cdecl _fsopen(const char *, const char *);
|
||
|
#else
|
||
|
_CRTIMP FILE * __cdecl _fsopen(const char *, const char *, int);
|
||
|
#endif
|
||
|
|
||
|
_CRTIMP void __cdecl clearerr(FILE *);
|
||
|
_CRTIMP int __cdecl fclose(FILE *);
|
||
|
_CRTIMP int __cdecl _fcloseall(void);
|
||
|
|
||
|
#ifdef _POSIX_
|
||
|
_CRTIMP FILE * __cdecl fdopen(int, const char *);
|
||
|
#else
|
||
|
_CRTIMP FILE * __cdecl _fdopen(int, const char *);
|
||
|
#endif
|
||
|
|
||
|
_CRTIMP int __cdecl feof(FILE *);
|
||
|
_CRTIMP int __cdecl ferror(FILE *);
|
||
|
_CRTIMP int __cdecl fflush(FILE *);
|
||
|
_CRTIMP int __cdecl fgetc(FILE *);
|
||
|
_CRTIMP int __cdecl _fgetchar(void);
|
||
|
_CRTIMP int __cdecl fgetpos(FILE *, fpos_t *);
|
||
|
_CRTIMP char * __cdecl fgets(char *, int, FILE *);
|
||
|
|
||
|
#ifdef _POSIX_
|
||
|
_CRTIMP int __cdecl fileno(FILE *);
|
||
|
#else
|
||
|
_CRTIMP int __cdecl _fileno(FILE *);
|
||
|
#endif
|
||
|
|
||
|
_CRTIMP int __cdecl _flushall(void);
|
||
|
_CRTIMP FILE * __cdecl fopen(const char *, const char *);
|
||
|
_CRTIMP int __cdecl fprintf(FILE *, const char *, ...);
|
||
|
_CRTIMP int __cdecl fputc(int, FILE *);
|
||
|
_CRTIMP int __cdecl _fputchar(int);
|
||
|
_CRTIMP int __cdecl fputs(const char *, FILE *);
|
||
|
_CRTIMP size_t __cdecl fread(void *, size_t, size_t, FILE *);
|
||
|
_CRTIMP FILE * __cdecl freopen(const char *, const char *, FILE *);
|
||
|
_CRTIMP int __cdecl fscanf(FILE *, const char *, ...);
|
||
|
_CRTIMP int __cdecl fsetpos(FILE *, const fpos_t *);
|
||
|
_CRTIMP int __cdecl fseek(FILE *, long, int);
|
||
|
_CRTIMP long __cdecl ftell(FILE *);
|
||
|
_CRTIMP size_t __cdecl fwrite(const void *, size_t, size_t, FILE *);
|
||
|
_CRTIMP int __cdecl getc(FILE *);
|
||
|
_CRTIMP int __cdecl getchar(void);
|
||
|
_CRTIMP char * __cdecl gets(char *);
|
||
|
_CRTIMP int __cdecl _getw(FILE *);
|
||
|
_CRTIMP void __cdecl perror(const char *);
|
||
|
_CRTIMP int __cdecl _pclose(FILE *);
|
||
|
_CRTIMP FILE * __cdecl _popen(const char *, const char *);
|
||
|
_CRTIMP int __cdecl printf(const char *, ...);
|
||
|
_CRTIMP int __cdecl putc(int, FILE *);
|
||
|
_CRTIMP int __cdecl putchar(int);
|
||
|
_CRTIMP int __cdecl puts(const char *);
|
||
|
_CRTIMP int __cdecl _putw(int, FILE *);
|
||
|
_CRTIMP int __cdecl remove(const char *);
|
||
|
_CRTIMP int __cdecl rename(const char *, const char *);
|
||
|
_CRTIMP void __cdecl rewind(FILE *);
|
||
|
_CRTIMP int __cdecl _rmtmp(void);
|
||
|
_CRTIMP int __cdecl scanf(const char *, ...);
|
||
|
_CRTIMP void __cdecl setbuf(FILE *, char *);
|
||
|
_CRTIMP int __cdecl _setmaxstdio(int);
|
||
|
_CRTIMP int __cdecl setvbuf(FILE *, char *, int, size_t);
|
||
|
_CRTIMP int __cdecl _snprintf(char *, size_t, const char *, ...);
|
||
|
_CRTIMP int __cdecl sprintf(char *, const char *, ...);
|
||
|
_CRTIMP int __cdecl sscanf(const char *, const char *, ...);
|
||
|
_CRTIMP char * __cdecl _tempnam(const char *, const char *);
|
||
|
_CRTIMP FILE * __cdecl tmpfile(void);
|
||
|
_CRTIMP char * __cdecl tmpnam(char *);
|
||
|
_CRTIMP int __cdecl ungetc(int, FILE *);
|
||
|
_CRTIMP int __cdecl _unlink(const char *);
|
||
|
_CRTIMP int __cdecl vfprintf(FILE *, const char *, va_list);
|
||
|
_CRTIMP int __cdecl vprintf(const char *, va_list);
|
||
|
_CRTIMP int __cdecl _vsnprintf(char *, size_t, const char *, va_list);
|
||
|
_CRTIMP int __cdecl vsprintf(char *, const char *, va_list);
|
||
|
|
||
|
#ifndef _MAC
|
||
|
#ifndef _WSTDIO_DEFINED
|
||
|
|
||
|
/* wide function prototypes, also declared in wchar.h */
|
||
|
|
||
|
#ifndef WEOF
|
||
|
#define WEOF (wint_t)(0xFFFF)
|
||
|
#endif
|
||
|
|
||
|
#ifdef _POSIX_
|
||
|
_CRTIMP FILE * __cdecl _wfsopen(const wchar_t *, const wchar_t *);
|
||
|
#else
|
||
|
_CRTIMP FILE * __cdecl _wfsopen(const wchar_t *, const wchar_t *, int);
|
||
|
#endif
|
||
|
|
||
|
_CRTIMP wint_t __cdecl fgetwc(FILE *);
|
||
|
_CRTIMP wint_t __cdecl _fgetwchar(void);
|
||
|
_CRTIMP wint_t __cdecl fputwc(wint_t, FILE *);
|
||
|
_CRTIMP wint_t __cdecl _fputwchar(wint_t);
|
||
|
_CRTIMP wint_t __cdecl getwc(FILE *);
|
||
|
_CRTIMP wint_t __cdecl getwchar(void);
|
||
|
_CRTIMP wint_t __cdecl putwc(wint_t, FILE *);
|
||
|
_CRTIMP wint_t __cdecl putwchar(wint_t);
|
||
|
_CRTIMP wint_t __cdecl ungetwc(wint_t, FILE *);
|
||
|
|
||
|
_CRTIMP wchar_t * __cdecl fgetws(wchar_t *, int, FILE *);
|
||
|
_CRTIMP int __cdecl fputws(const wchar_t *, FILE *);
|
||
|
_CRTIMP wchar_t * __cdecl _getws(wchar_t *);
|
||
|
_CRTIMP int __cdecl _putws(const wchar_t *);
|
||
|
|
||
|
_CRTIMP int __cdecl fwprintf(FILE *, const wchar_t *, ...);
|
||
|
_CRTIMP int __cdecl wprintf(const wchar_t *, ...);
|
||
|
_CRTIMP int __cdecl _snwprintf(wchar_t *, size_t, const wchar_t *, ...);
|
||
|
_CRTIMP int __cdecl swprintf(wchar_t *, const wchar_t *, ...);
|
||
|
_CRTIMP int __cdecl vfwprintf(FILE *, const wchar_t *, va_list);
|
||
|
_CRTIMP int __cdecl vwprintf(const wchar_t *, va_list);
|
||
|
_CRTIMP int __cdecl _vsnwprintf(wchar_t *, size_t, const wchar_t *, va_list);
|
||
|
_CRTIMP int __cdecl vswprintf(wchar_t *, const wchar_t *, va_list);
|
||
|
_CRTIMP int __cdecl fwscanf(FILE *, const wchar_t *, ...);
|
||
|
_CRTIMP int __cdecl swscanf(const wchar_t *, const wchar_t *, ...);
|
||
|
_CRTIMP int __cdecl wscanf(const wchar_t *, ...);
|
||
|
|
||
|
#define getwchar() fgetwc(stdin)
|
||
|
#define putwchar(_c) fputwc((_c),stdout)
|
||
|
#define getwc(_stm) fgetwc(_stm)
|
||
|
#define putwc(_c,_stm) fputwc(_c,_stm)
|
||
|
|
||
|
_CRTIMP FILE * __cdecl _wfdopen(int, const wchar_t *);
|
||
|
_CRTIMP FILE * __cdecl _wfopen(const wchar_t *, const wchar_t *);
|
||
|
_CRTIMP FILE * __cdecl _wfreopen(const wchar_t *, const wchar_t *, FILE *);
|
||
|
_CRTIMP void __cdecl _wperror(const wchar_t *);
|
||
|
_CRTIMP FILE * __cdecl _wpopen(const wchar_t *, const wchar_t *);
|
||
|
_CRTIMP int __cdecl _wremove(const wchar_t *);
|
||
|
_CRTIMP wchar_t * __cdecl _wtempnam(const wchar_t *, const wchar_t *);
|
||
|
_CRTIMP wchar_t * __cdecl _wtmpnam(wchar_t *);
|
||
|
|
||
|
|
||
|
#define _WSTDIO_DEFINED
|
||
|
#endif /* _WSTDIO_DEFINED */
|
||
|
#endif /* ndef _MAC */
|
||
|
|
||
|
#define _STDIO_DEFINED
|
||
|
#endif /* _STDIO_DEFINED */
|
||
|
|
||
|
|
||
|
/* Macro definitions */
|
||
|
|
||
|
#define feof(_stream) ((_stream)->_flag & _IOEOF)
|
||
|
#define ferror(_stream) ((_stream)->_flag & _IOERR)
|
||
|
#define _fileno(_stream) ((_stream)->_file)
|
||
|
#define getc(_stream) (--(_stream)->_cnt >= 0 \
|
||
|
? 0xff & *(_stream)->_ptr++ : _filbuf(_stream))
|
||
|
#define putc(_c,_stream) (--(_stream)->_cnt >= 0 \
|
||
|
? 0xff & (*(_stream)->_ptr++ = (char)(_c)) : _flsbuf((_c),(_stream)))
|
||
|
#define getchar() getc(stdin)
|
||
|
#define putchar(_c) putc((_c),stdout)
|
||
|
|
||
|
|
||
|
|
||
|
#ifdef _MT
|
||
|
#undef getc
|
||
|
#undef putc
|
||
|
#undef getchar
|
||
|
#undef putchar
|
||
|
#endif
|
||
|
|
||
|
|
||
|
|
||
|
#if !__STDC__ && !defined(_POSIX_)
|
||
|
|
||
|
/* Non-ANSI names for compatibility */
|
||
|
|
||
|
#define P_tmpdir _P_tmpdir
|
||
|
#define SYS_OPEN _SYS_OPEN
|
||
|
|
||
|
#ifdef _NTSDK
|
||
|
|
||
|
#define fcloseall _fcloseall
|
||
|
#define fdopen _fdopen
|
||
|
#define fgetchar _fgetchar
|
||
|
#define fileno _fileno
|
||
|
#define flushall _flushall
|
||
|
#define fputchar _fputchar
|
||
|
#define getw _getw
|
||
|
#define putw _putw
|
||
|
#define rmtmp _rmtmp
|
||
|
#define tempnam _tempnam
|
||
|
#define unlink _unlink
|
||
|
|
||
|
#else /* ndef _NTSDK */
|
||
|
|
||
|
_CRTIMP int __cdecl fcloseall(void);
|
||
|
_CRTIMP FILE * __cdecl fdopen(int, const char *);
|
||
|
_CRTIMP int __cdecl fgetchar(void);
|
||
|
_CRTIMP int __cdecl fileno(FILE *);
|
||
|
_CRTIMP int __cdecl flushall(void);
|
||
|
_CRTIMP int __cdecl fputchar(int);
|
||
|
_CRTIMP int __cdecl getw(FILE *);
|
||
|
_CRTIMP int __cdecl putw(int, FILE *);
|
||
|
_CRTIMP int __cdecl rmtmp(void);
|
||
|
_CRTIMP char * __cdecl tempnam(const char *, const char *);
|
||
|
_CRTIMP int __cdecl unlink(const char *);
|
||
|
|
||
|
#endif /* _NTSDK */
|
||
|
|
||
|
#endif /* __STDC__ */
|
||
|
|
||
|
#ifdef __cplusplus
|
||
|
}
|
||
|
#endif
|
||
|
|
||
|
|
||
|
#ifdef _MSC_VER
|
||
|
#pragma pack(pop)
|
||
|
#endif /* _MSC_VER */
|
||
|
|
||
|
#endif /* _INC_STDIO */
|