📄 os_spec.h
字号:
#define vsnprintf _vsnprintf
#endif /* Systems without vsnprintf() */
/* Unlike the equivalent crypto code, the MD5, RIPEMD-160, and SHA-1 hashing
code needs special defines set to enable the use of asm alternatives.
Since this works by triggering redefines of function names in the source
code, we can only do this under Windows because for other systems you'd
need to conditionally alter the makefile as well. Since these two defines
were left accidentally unset for about five years and were only noticed
when someone benchmarked the code against BSAFE, it's unlikely that this
is of any real concern */
#ifdef __WIN32__
#define MD5_ASM
#define SHA1_ASM
#define RMD160_ASM
/* Turn on bignum asm as well. By default this is done anyway, but the
x86 asm code contains some additional routines not present in the
asm modules for other CPUs, so we have to define this to disable the
equivalent C code, which must be present for non-x86 asm modules */
#define USE_ASM
#endif /* Win32 */
/* Enable use of the AES ASM code where possible */
#ifdef __WIN32__
#define AES_ASM
#endif /* Win32 */
/* Enable use of zlib ASM longest-match code where possible. zlib comes
with two asm files, of which match.asm (assemble with "ml /Zp /coff
/c match.asm") causes segfaults, so we use gvmat32.asm */
#if defined( __WIN32__ )
#define ASMV
#endif /* Win32 */
/****************************************************************************
* *
* Dynamic Loading Support *
* *
****************************************************************************/
/* On systems that support dynamic loading, we bind various drivers and
libraries at runtime rather than at compile time. Under Windows this is
fairly easy but under Unix it's supported somewhat selectively and may be
buggy or platform-specific */
#if defined( __WINDOWS__ ) || \
( defined( __UNIX__ ) && \
( ( defined( sun ) && OSVERSION > 4 ) || defined( __linux__ ) || \
defined( _AIX ) || ( defined( __APPLE__ ) && !defined( __MAC__ ) ) ) )
#define DYNAMIC_LOAD
/* Macros to map OS-specific dynamic-load values to generic ones */
#if defined( __WINDOWS__ )
#define INSTANCE_HANDLE HINSTANCE
#define NULL_INSTANCE ( HINSTANCE ) NULL
#define DynamicLoad( name ) LoadLibrary( name )
#define DynamicUnload FreeLibrary
#define DynamicBind GetProcAddress
#elif defined( __UNIX__ )
/* Older versions of OS X didn't have dlopen() support but required
the use of the rather painful low-level dyld() interface. If you're
running an older version of OS X and don't have the dlcompat wrapper
installed, get Peter O'Gorman's dlopen() implementation, which wraps
the dyld() interface */
#if !( defined( __APPLE__ ) && OSVERSION < 7 )
#include <dlfcn.h>
#endif /* Mac OS X */
#define INSTANCE_HANDLE void *
#define NULL_INSTANCE NULL
#define DynamicLoad( name ) dlopen( name, RTLD_LAZY )
#define DynamicUnload dlclose
#define DynamicBind dlsym
#elif defined __VMCMS__
#include <dll.h>
#define INSTANCE_HANDLE dllhandle *
#define NULL_INSTANCE NULL
#define DynamicLoad( name ) dllload( name, RTLD_LAZY )
#define DynamicUnload dllfree
#define DynamicBind dlqueryfn
#endif /* OS-specific instance handles */
#endif /* Windows || Some Unix versions */
/****************************************************************************
* *
* Endianness Defines *
* *
****************************************************************************/
/* If the endianness isn't predefined and the compiler can tell us what
endianness we've got, use this in preference to all other methods. This
is only really necessary on non-Unix systems since the makefile runtime
test will tell us the endianness under Unix */
#if defined( CONFIG_DATA_LITTLEENDIAN ) || defined( CONFIG_DATA_BIGENDIAN )
/* If we're cross-compiling for another system, the endianness auto-
detection will have been overridden. In this case we force it to be
what the user has specified rather than what we've auto-detected */
#undef DATA_LITTLEENDIAN
#undef DATA_BIGENDIAN
#ifdef CONFIG_DATA_LITTLEENDIAN
#define DATA_LITTLEENDIAN
#else
#define DATA_BIGENDIAN
#endif /* CONFIG_DATA_LITTLEENDIAN */
#endif /* Forced big vs.little-endian */
#if !defined( DATA_LITTLEENDIAN ) && !defined( DATA_BIGENDIAN )
#if defined( BIG_ENDIAN ) && defined( LITTLE_ENDIAN ) && defined( BYTE_ORDER )
/* Some systems define both BIG_ENDIAN and LITTLE_ENDIAN, then define
BYTE_ORDER to the appropriate one, so we check this and define the
appropriate value */
#if ( BYTE_ORDER == BIG_ENDIAN ) && !defined( DATA_BIGENDIAN )
#define DATA_BIGENDIAN
#elif ( BYTE_ORDER == LITTLE_ENDIAN ) && !defined( DATA_LITTLEENDIAN )
#define DATA_LITTLEENDIAN
#else
#error BYTE_ORDER is neither BIG_ENDIAN nor LITTLE_ENDIAN
#endif /* BYTE_ORDER-specific define */
#elif defined( _M_I86 ) || defined( _M_IX86 ) || defined( __TURBOC__ ) || \
defined( __OS2__ )
#define DATA_LITTLEENDIAN /* Intel architecture always little-endian */
#elif defined( __WINCE__ )
/* For WinCE it can get a bit complicated, however because of x86 cargo
cult programming WinCE systems always tend to be set up in little-
endian mode */
#define DATA_LITTLEENDIAN /* Intel architecture always little-endian */
#elif defined( AMIGA ) || defined( __MWERKS__ ) || defined( SYMANTEC_C ) || \
defined( THINK_C ) || defined( applec ) || defined( __MRC__ )
#define DATA_BIGENDIAN /* Motorola architecture always big-endian */
#elif defined( VMS ) || defined( __VMS )
#define DATA_LITTLEENDIAN /* VAX architecture always little-endian */
#elif defined( __TANDEM_NSK__ ) || defined( __TANDEM_OSS__ )
#define DATA_BIGENDIAN /* Tandem architecture always big-endian */
#elif defined( __AS400__ ) || defined( __VMCMS__ ) || defined( __MVS__ )
#define DATA_BIGENDIAN /* IBM big iron always big-endian */
#elif defined __GNUC__
#ifdef BYTES_BIG_ENDIAN
#define DATA_BIGENDIAN /* Big-endian byte order */
#else
#define DATA_LITTLEENDIAN /* Undefined = little-endian byte order */
#endif /* __GNUC__ */
#endif /* Compiler-specific endianness checks */
#endif /* !( DATA_LITTLEENDIAN || DATA_BIGENDIAN ) */
/* The last-resort method. Thanks to Shawn Clifford
<sysop@robot.nuceng.ufl.edu> for this trick.
NB: A number of compilers aren't tough enough for this test */
#if !defined( DATA_LITTLEENDIAN ) && !defined( DATA_BIGENDIAN )
#if ( ( ( unsigned short ) ( 'AB' ) >> 8 ) == 'B' )
#define DATA_LITTLEENDIAN
#elif ( ( ( unsigned short ) ( 'AB' ) >> 8 ) == 'A' )
#define DATA_BIGENDIAN
#else
#error "Cannot determine processor endianness - edit misc/os_spec.h and recompile"
#endif /* Endianness test */
#endif /* !( DATA_LITTLEENDIAN || DATA_BIGENDIAN ) */
/* Sanity check to catch both values being defined */
#if defined( DATA_LITTLEENDIAN ) && defined( DATA_BIGENDIAN )
#error Both DATA_LITTLEENDIAN and DATA_BIGENDIAN are defined
#endif /* DATA_LITTLEENDIAN && DATA_BIGENDIAN */
/****************************************************************************
* *
* Filesystem Values *
* *
****************************************************************************/
/* When performing file I/O we need to know how large path names can get in
order to perform range checking and allocate buffers. This gets a bit
tricky since not all systems have PATH_MAX, so we first try for PATH_MAX,
if that fails we try _POSIX_PATH_MAX (which is a generic 255 bytes and if
defined always seems to be less than whatever the real PATH_MAX should be),
if that also fails we grab stdio.h and try and get FILENAME_MAX, with an
extra check for PATH_MAX in case it's defined in stdio.h instead of
limits.h where it should be. FILENAME_MAX isn't really correct since it's
the maximum length of a filename rather than a path, but some environments
treat it as if it were PATH_MAX and in any case it's the best that we can
do in the absence of anything better */
#if defined( PATH_MAX )
#define MAX_PATH_LENGTH PATH_MAX
#elif defined( _POSIX_PATH_MAX )
#define MAX_PATH_LENGTH _POSIX_PATH_MAX
#else
#ifndef FILENAME_MAX
#include <stdio.h>
#endif /* FILENAME_MAX */
#if defined( PATH_MAX )
#define MAX_PATH_LENGTH PATH_MAX
#elif defined( MAX_PATH )
#define MAX_PATH_LENGTH MAX_PATH
#else
#define MAX_PATH_LENGTH FILENAME_MAX
#endif /* PATH_MAX, MAX_PATH, or FILENAME_MAX */
#endif /* PATH_MAX */
#ifdef __UNIX__
/* SunOS 4.1.x doesn't define FILENAME_MAX in limits.h, however it does
define a POSIX path length limit so we use that instead. There are a
number of places in various headers in which a max.path length is
defined either as 255 or 1024, but we use the POSIX limit since this is
the only thing defined in limits.h */
#if defined( sun ) && ( OSVERSION == 4 ) && !defined( FILENAME_MAX )
#define FILENAME_MAX _POSIX_PATH_MAX
#endif /* SunOS 4.1.x FILENAME_MAX define */
#endif /* __UNIX__ */
/* SunOS 4 doesn't have memmove(), but Solaris does, so we define memmove()
to bcopy() under 4. In addition SunOS doesn't define the fseek()
position indicators so we define these as well */
#if defined( __UNIX__ ) && defined( sun ) && ( OSVERSION == 4 )
#define memmove bcopy
#define SEEK_SET 0
#define SEEK_CUR 1
#define SEEK_END 2
#endif /* SunOS 4 */
/****************************************************************************
* *
* Charset Support *
* *
****************************************************************************/
/* Widechar handling. Most systems now support this, the only support that
we only require is the wchar_t type define.
Unfortunately in order to check for explicitly enabled widechar support
via config.h we have to include config.h at this point, because this
file, containing OS- and compiler-specific settings, both detects the
OSes and compilers that support widechars in the "OS Detection" section
above, and then sets the appropriate widechar settings here. In between
the two, config.h uses the OS/compiler-detection output to enable or
disable widechars as required, so we need to slip it in between the two
sections */
#if defined( INC_ALL ) || defined( INC_CHILD )
#include "config.h"
#else
#include "misc/config.h"
#endif /* Compiler-specific includes */
#ifdef USE_WIDECHARS
#if !( ( defined( __QNX__ ) && ( OSVERSION <= 4 ) ) || \
( defined( __WINCE__ ) && _WIN32_WCE < 400 ) )
#include <wchar.h>
#endif /* Systems with widechar support in stdlib.h */
#define WCSIZE ( sizeof( wchar_t ) )
#if defined( __MSDOS16__ ) && !defined( __BORLANDC__ )
typedef unsigned short int wchar_t; /* Widechar data type */
#endif /* OSes that don't support widechars */
#if defined( __BORLANDC__ ) && ( __BORLANDC__ == 0x410 )
#define wchar_t unsigned short int; /* BC++ 3.1 has an 8-bit wchar_t */
#endif /* BC++ 3.1 */
#else
/* No native widechar support, define the necesary types ourselves unless
we're running under older OS X (Darwin 6.x), which defines wchar_t in
stdlib.h even though there's no wchar support present, or PalmOS, which
defines it in wchar.h but then defines it differently in stddef.h, and
in any case has no wchar support present */
#if !( defined( __APPLE__ ) || defined( __OpenBSD__ ) || \
defined( __PALMOS__ ) )
typedef unsigned short int wchar_t;
#endif /* __APPLE__ */
#define WCSIZE ( sizeof( wchar_t ) )
#endif /* USE_WIDECHARS */
/* The EOL convention used when outputting text */
#if defined( __MSDOS16__ ) || defined( __MSDOS32__ ) || \
defined( __OS2__ ) || defined( __SYMBIAN32__ ) || \
defined( __WINDOWS__ )
#define EOL "\r\n"
#define EOL_LEN 2
#elif ( defined( __APPLE__ ) && !defined( __MAC__ ) ) || \
defined( __BEOS__ ) || defined( __IBM4758__ ) || \
defined( __PALMOS__ ) || defined( __TANDEM_NSK__ ) || \
defined( __TANDEM_OSS__ ) || defined( __UNIX__ ) || \
defined( __VMCMS__ )
#define EOL "\n"
#define EOL_LEN 1
#elif defined( __MAC__ )
#define EOL "\r"
#define EOL_LEN 1
#else
#error "You need to add the OS-specific define to enable end-of-line handling"
#endif /* OS-specific EOL markers */
/* If we're compiling on IBM mainframes, enable EBCDIC <-> ASCII string
conversion. Since cryptlib uses ASCII internally for all strings, we
need to check to make sure it's been built with ASCII strings enabled
before we go any further */
#ifdef EBCDIC_CHARS
#if 'A' != 0x41
#error cryptlib must be compiled with ASCII literals
#endif /* Check for use of ASCII */
int asciiToEbcdic( char *dest, const char *src, const int length );
int ebcdicToAscii( char *dest, const char *src, const int length );
char *bufferToEbcdic( char *buffer, const char *string );
char *bufferToAscii( char *buffer, const char *string );
#endif /* IBM mainframes */
/* If we're compiling on Windows CE, enable Unicode <-> ASCII string
conversion */
#ifdef UNICODE_CHARS
int asciiToUnicode( wchar_t *dest, const char *src, const int length );
int unicodeToAscii( char *dest, const wchar_t *src, const int length );
#endif /* Windows CE */
/* Since cryptlib uses ASCII internally, we have to force the use of
ASCII-compatible versions of system library functions if the system
uses EBCDIC */
#ifdef EBCDIC_CHARS
#define ASCII_ALPHA 0x01
#define ASCII_LOWER 0x02
#define ASCII_NUMERIC 0x04
#define ASCII_SPACE 0x08
#define ASCII_UPPER 0x10
#define ASCII_HEX 0x20
extern const BYTE asciiCtypeTbl[];
#define isAlnum( ch ) \
( asciiCtypeTbl[ ch ] & ( ASCII_ALPHA | ASCII_NUMERIC ) )
#define isAlpha( ch ) \
( asciiCtypeTbl[ ch ] & ASCII_ALPHA )
#define isDigit( ch ) \
( asciiCtypeTbl[ ch ] & ASCII_NUMERIC )
#define isPrint( ch ) \
( ( ch ) >= 0x20 && ( ch ) <= 0x7E )
#define isXDigit( ch ) \
( asciiCtypeTbl[ ch ] & ASCII_HEX )
#define toLower( ch ) \
( ( asciiCtypeTbl[ ch ] & ASCII_UPPER ) ? ( ch ) + 32 : ( ch ) )
#define toUpper( ch ) \
( ( asciiCtypeTbl[ ch ] & ASCII_LOWER ) ? ( ch ) - 32 : ( ch ) )
int strCompareZ( const char *src, const char *dest );
int strCompare( const char *src, const char *dest, int length );
int sPrintf( char *buffer, const char *format, ... );
int aToI( const char *str );
#else
#define isAlnum( ch ) isalnum( ch )
#define isAlpha( ch ) isalpha( ch )
#define isDigit( ch ) isdigit( ch )
#define isPrint( ch ) isprint( ch )
#define isXDigit( ch ) isxdigit( ch )
#define toLower( ch ) tolower( ch )
#define toUpper( ch ) toupper( ch )
#define strCompareZ( str1, str2 ) \
stricmp( str1, str2 )
#define strCompare( str1, str2, len ) \
strnicmp( str1, str2, len )
#define sPrintf sprintf
#define aToI atoi
#endif /* EBCDIC_CHARS */
#endif /* _OSSPEC_DEFINED */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -