📄 internal.h
字号:
/***
*internal.h - contains declarations of internal routines and variables
*
* Copyright (c) Microsoft Corporation. All rights reserved.
*
*Purpose:
* Declares routines and variables used internally by the C run-time.
*
* [Internal]
*
****/
#pragma once
#ifndef _INC_INTERNAL
#define _INC_INTERNAL
#include <crtdefs.h>
#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */
#include <cruntime.h>
#include <limits.h>
/*
* Conditionally include windows.h to pick up the definition of
* CRITICAL_SECTION.
*/
#include <windows.h>
#include <mtdll.h>
#pragma pack(push,_CRT_PACKING)
/* Define function types used in several startup sources */
typedef void (__cdecl *_PVFV)(void);
typedef int (__cdecl *_PIFV)(void);
typedef void (__cdecl *_PVFI)(int);
#if defined (_M_CEE)
typedef const void* (__clrcall *_PVFVM)(void);
typedef int (__clrcall *_PIFVM)(void);
typedef void (__clrcall *_CPVFV)(void);
#endif /* defined (_M_CEE) */
#if defined (_M_CEE_PURE) || (defined (_DLL) && defined (_M_IX86))
/* Retained for compatibility with VC++ 5.0 and earlier versions */
_CRTIMP int * __cdecl __p__commode(void);
#endif /* defined (_M_CEE_PURE) || (defined (_DLL) && defined (_M_IX86)) */
#if defined (SPECIAL_CRTEXE) && defined (_DLL)
extern int _commode;
#else /* defined (SPECIAL_CRTEXE) && defined (_DLL) */
#ifndef _M_CEE_PURE
_CRTIMP extern int _commode;
#else /* _M_CEE_PURE */
#define _commode (*__p___commode())
#endif /* _M_CEE_PURE */
#endif /* defined (SPECIAL_CRTEXE) && defined (_DLL) */
#define __IOINFO_TM_ANSI 0 /* Regular Text */
#define __IOINFO_TM_UTF8 1 /* UTF8 Encoded */
#define __IOINFO_TM_UTF16LE 2 /* UTF16 Little Endian Encoded */
#define LF 10 /* line feed */
#define CR 13 /* carriage return */
#define CTRLZ 26 /* ctrl-z means eof for text */
extern char _lookuptrailbytes[256];
/* Most significant Bit */
#define _msbit(c) ((c) & 0x80)
/* Independent byte has most significant bit set to 0 */
#define _utf8_is_independent(c) (_msbit(c) == 0)
/* Any leadbyte will have the patterns 11000xxx 11100xxx or 11110xxx */
#define _utf8_is_leadbyte(c) (_lookuptrailbytes[(unsigned char)c] != 0)
/* Get no of trailing bytes from the lookup table */
#define _utf8_no_of_trailbytes(c) _lookuptrailbytes[(unsigned char)c]
/*
* Control structure for lowio file handles
*/
typedef struct {
intptr_t osfhnd; /* underlying OS file HANDLE */
char osfile; /* attributes of file (e.g., open in text mode?) */
char pipech; /* one char buffer for handles opened on pipes */
int lockinitflag;
CRITICAL_SECTION lock;
#ifndef _SAFECRT_IMPL
/* Not used in the safecrt downlevel. We do not define them, so we cannot use them accidentally */
char textmode : 7; /* __IOINFO_TM_ANSI or __IOINFO_TM_UTF8 or __IOINFO_TM_UTF16LE */
char unicode : 1; /* Was the file opened as unicode? */
char pipech2[2]; /* 2 more peak ahead chars for UNICODE mode */
__int64 startpos; /* File position that matches buffer start */
BOOL utf8translations; /* Buffer contains translations other than CRLF*/
char dbcsBuffer; /* Buffer for the lead byte of dbcs when converting from dbcs to unicode */
BOOL dbcsBufferUsed; /* Bool for the lead byte buffer is used or not */
#endif /* _SAFECRT_IMPL */
} ioinfo;
/*
* Definition of IOINFO_L2E, the log base 2 of the number of elements in each
* array of ioinfo structs.
*/
#define IOINFO_L2E 5
/*
* Definition of IOINFO_ARRAY_ELTS, the number of elements in ioinfo array
*/
#define IOINFO_ARRAY_ELTS (1 << IOINFO_L2E)
/*
* Definition of IOINFO_ARRAYS, maximum number of supported ioinfo arrays.
*/
#define IOINFO_ARRAYS 64
#define _NHANDLE_ (IOINFO_ARRAYS * IOINFO_ARRAY_ELTS)
#define _TZ_STRINGS_SIZE 64
/*
* Access macros for getting at an ioinfo struct and its fields from a
* file handle
*/
#define _pioinfo(i) ( __pioinfo[(i) >> IOINFO_L2E] + ((i) & (IOINFO_ARRAY_ELTS - \
1)) )
#define _osfhnd(i) ( _pioinfo(i)->osfhnd )
#define _osfile(i) ( _pioinfo(i)->osfile )
#define _pipech(i) ( _pioinfo(i)->pipech )
#define _pipech2(i) ( _pioinfo(i)->pipech2 )
#define _textmode(i) ( _pioinfo(i)->textmode )
#define _tm_unicode(i) ( _pioinfo(i)->unicode )
#define _startpos(i) ( _pioinfo(i)->startpos )
#define _utf8translations(i) ( _pioinfo(i)->utf8translations )
#define _dbcsBuffer(i) ( _pioinfo(i)->dbcsBuffer )
#define _dbcsBufferUsed(i) ( _pioinfo(i)->dbcsBufferUsed )
/*
* Safer versions of the above macros. Currently, only _osfile_safe is
* used.
*/
#define _pioinfo_safe(i) ( (((i) != -1) && ((i) != -2)) ? _pioinfo(i) : &__badioinfo )
#define _osfhnd_safe(i) ( _pioinfo_safe(i)->osfhnd )
#define _osfile_safe(i) ( _pioinfo_safe(i)->osfile )
#define _pipech_safe(i) ( _pioinfo_safe(i)->pipech )
#define _pipech2_safe(i) ( _pioinfo_safe(i)->pipech2 )
#ifdef _SAFECRT_IMPL
/* safecrt does not have support for textmode, so we always return __IOINFO_TM_ANSI */
#define _textmode_safe(i) __IOINFO_TM_ANSI
#define _tm_unicode_safe(i) 0
#define _startpos_safe(i) ( 0 )
#define _utf8translations_safe(i) ( FALSE )
#else /* _SAFECRT_IMPL */
#define _textmode_safe(i) ( _pioinfo_safe(i)->textmode )
#define _tm_unicode_safe(i) ( _pioinfo_safe(i)->unicode )
#define _startpos_safe(i) ( _pioinfo_safe(i)->startpos )
#define _utf8translations_safe(i) ( _pioinfo_safe(i)->utf8translations )
#endif /* _SAFECRT_IMPL */
#ifndef _M_CEE_PURE
#ifdef _SAFECRT_IMPL
/* We need to get this from the downlevel DLL, even when we build safecrt.lib */
extern __declspec(dllimport) ioinfo __badioinfo;
extern __declspec(dllimport) ioinfo * __pioinfo[];
#else /* _SAFECRT_IMPL */
/*
* Special, static ioinfo structure used only for more graceful handling
* of a C file handle value of -1 (results from common errors at the stdio
* level).
*/
extern _CRTIMP ioinfo __badioinfo;
/*
* Array of arrays of control structures for lowio files.
*/
extern _CRTIMP ioinfo * __pioinfo[];
#endif /* _SAFECRT_IMPL */
#endif /* _M_CEE_PURE */
/*
* Current number of allocated ioinfo structures (_NHANDLE_ is the upper
* limit).
*/
extern int _nhandle;
int __cdecl _alloc_osfhnd(void);
int __cdecl _free_osfhnd(int);
int __cdecl _set_osfhnd(int, intptr_t);
/*
fileno for stdout, stdin & stderr when there is no console
*/
#define _NO_CONSOLE_FILENO (intptr_t)-2
extern const char __dnames[];
extern const char __mnames[];
extern int _days[];
extern int _lpdays[];
extern __time32_t __cdecl __loctotime32_t(int, int, int, int, int, int, int);
extern __time64_t __cdecl __loctotime64_t(int, int, int, int, int, int, int);
#ifdef _TM_DEFINED
extern int __cdecl _isindst(_In_ struct tm * _Time);
#endif /* _TM_DEFINED */
extern void __cdecl __tzset(void);
extern int __cdecl _validdrive(unsigned);
/*
* If we are only interested in years between 1901 and 2099, we could use this:
*
* #define IS_LEAP_YEAR(y) (y % 4 == 0)
*/
#define IS_LEAP_YEAR(y) (((y) % 4 == 0 && (y) % 100 != 0) || (y) % 400 == 0)
/*
* get the buffer used by gmtime
*/
struct tm * __cdecl __getgmtimebuf ();
/*
* This variable is in the C start-up; the length must be kept synchronized
* It is used by the *cenvarg.c modules
*/
extern char _acfinfo[]; /* "_C_FILE_INFO=" */
#define CFI_LENGTH 12 /* "_C_FILE_INFO" is 12 bytes long */
/*
* stdio internals
*/
#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 /* _FILE_DEFINED */
#if !defined (_FILEX_DEFINED) && defined (_WINDOWS_)
/*
* Variation of FILE type used for the dynamically allocated portion of
* __piob[]. For single thread, _FILEX is the same as FILE. For multithread
* models, _FILEX has two fields: the FILE struct and the CRITICAL_SECTION
* struct used to serialize access to the FILE.
*/
typedef struct {
FILE f;
CRITICAL_SECTION lock;
} _FILEX;
#define _FILEX_DEFINED
#endif /* !defined (_FILEX_DEFINED) && defined (_WINDOWS_) */
/*
* Number of entries supported in the array pointed to by __piob[]. That is,
* the number of stdio-level files which may be open simultaneously. This
* is normally set to _NSTREAM_ by the stdio initialization code.
*/
extern int _nstream;
/*
* Pointer to the array of pointers to FILE/_FILEX structures that are used
* to manage stdio-level files.
*/
extern void **__piob;
FILE * __cdecl _getstream(void);
FILE * __cdecl _openfile(_In_z_ const char * _Filename, _In_z_ const char * _Mode, _In_ int _ShFlag, _Out_ FILE * _File);
FILE * __cdecl _wopenfile(_In_z_ const wchar_t * _Filename, _In_z_ const wchar_t * _Mode, _In_ int _ShFlag, _Out_ FILE * _File);
void __cdecl _getbuf(_Out_ FILE * _File);
int __cdecl _filwbuf (_Inout_ FILE * _File);
int __cdecl _flswbuf(_In_ int _Ch, _Inout_ FILE * _File);
void __cdecl _freebuf(_Inout_ FILE * _File);
int __cdecl _stbuf(_Inout_ FILE * _File);
void __cdecl _ftbuf(int _Flag, _Inout_ FILE * _File);
#ifdef _SAFECRT_IMPL
int __cdecl _output(_Inout_ FILE * _File, _In_z_ __format_string const char *_Format, va_list _ArgList);
int __cdecl _woutput(_Inout_ FILE * _File, _In_z_ __format_string const wchar_t *_Format, va_list _ArgList);
int __cdecl _output_s(_Inout_ FILE * _File, _In_z_ __format_string const char *_Format, va_list _ArgList);
int __cdecl _output_p(_Inout_ FILE * _File, _In_z_ __format_string const char *_Format, va_list _ArgList);
int __cdecl _woutput_s(_Inout_ FILE * _File, _In_z_ __format_string const wchar_t *_Format, va_list _ArgList);
int __cdecl _woutput_p(_Inout_ FILE * _File, _In_z_ __format_string const wchar_t *_Format, va_list _ArgList);
typedef int (*OUTPUTFN)(FILE *, const char *, va_list);
typedef int (*WOUTPUTFN)(FILE *, const wchar_t *, va_list);
#else /* _SAFECRT_IMPL */
int __cdecl _output_l(_Inout_ FILE * _File, _In_z_ __format_string const char *_Format, _In_opt_ _locale_t _Locale, va_list _ArgList);
int __cdecl _woutput_l(_Inout_ FILE * _File, _In_z_ __format_string const wchar_t *_Format, _In_opt_ _locale_t _Locale, va_list _ArgList);
int __cdecl _output_s_l(_Inout_ FILE * _File, _In_z_ __format_string const char *_Format, _In_opt_ _locale_t _Locale, va_list _ArgList);
int __cdecl _output_p_l(_Inout_ FILE * _File, _In_z_ __format_string const char *_Format, _In_opt_ _locale_t _Locale, va_list _ArgList);
int __cdecl _woutput_s_l(_Inout_ FILE * _File, _In_z_ __format_string const wchar_t *_Format, _In_opt_ _locale_t _Locale, va_list _ArgList);
int __cdecl _woutput_p_l(_Inout_ FILE * _File, _In_z_ __format_string const wchar_t *_Format, _In_opt_ _locale_t _Locale, va_list _ArgList);
typedef int (*OUTPUTFN)(_Inout_ FILE * _File, const char *, _locale_t, va_list);
typedef int (*WOUTPUTFN)(_Inout_ FILE * _File, const wchar_t *, _locale_t, va_list);
#endif /* _SAFECRT_IMPL */
#ifdef _SAFECRT_IMPL
int __cdecl _input(_In_ FILE * _File, _In_z_ __format_string const unsigned char * _Format, va_list _ArgList);
int __cdecl _winput(_In_ FILE * _File, _In_z_ __format_string const wchar_t * _Format, va_list _ArgList);
int __cdecl _input_s(_In_ FILE * _File, _In_z_ __format_string const unsigned char * _Format, va_list _ArgList);
int __cdecl _winput_s(_In_ FILE * _File, _In_z_ __format_string const wchar_t * _Format, va_list _ArgList);
typedef int (*INPUTFN)(FILE *, const unsigned char *, va_list);
typedef int (*WINPUTFN)(FILE *, const wchar_t *, va_list);
#else /* _SAFECRT_IMPL */
int __cdecl _input_l(_Inout_ FILE * _File, _In_z_ __format_string const unsigned char *, _In_opt_ _locale_t _Locale, va_list _ArgList);
int __cdecl _winput_l(_Inout_ FILE * _File, _In_z_ __format_string const wchar_t *, _In_opt_ _locale_t _Locale, va_list _ArgList);
int __cdecl _input_s_l(_Inout_ FILE * _File, _In_z_ __format_string const unsigned char *, _In_opt_ _locale_t _Locale, va_list _ArgList);
int __cdecl _winput_s_l(_Inout_ FILE * _File, _In_z_ __format_string const wchar_t *, _In_opt_ _locale_t _Locale, va_list _ArgList);
typedef int (*INPUTFN)(FILE *, const unsigned char *, _locale_t, va_list);
typedef int (*WINPUTFN)(FILE *, const wchar_t *, _locale_t, va_list);
#ifdef _UNICODE
#define TINPUTFN WINPUTFN
#else /* _UNICODE */
#define TINPUTFN INPUTFN
#endif /* _UNICODE */
#endif /* _SAFECRT_IMPL */
int __cdecl _flush(_Inout_ FILE * _File);
void __cdecl _endstdio(void);
errno_t __cdecl _sopen_helper(_In_z_ const char * _Filename,
_In_ int _OFlag, _In_ int _ShFlag, _In_ int _PMode,
_Out_ int * _PFileHandle, int _BSecure);
errno_t __cdecl _wsopen_helper(_In_z_ const wchar_t * _Filename,
_In_ int _OFlag, _In_ int _ShFlag, _In_ int _PMode,
_Out_ int * _PFileHandle, int _BSecure);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -