blob: be49257df3328cdaec97b66b6601aaad6eee0d66 [file] [log] [blame]
/* -*- Mode: C; tab-width: 4 -*-
*
* Copyright (c) 1997-2004 Apple Computer, Inc. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
//---------------------------------------------------------------------------------------------------------------------------
/*! @header CommonServices
Common Services for Mac OS X, Linux, Palm, VxWorks, Windows, and Windows CE.
*/
#ifndef __COMMON_SERVICES__
#define __COMMON_SERVICES__
#ifdef __cplusplus
extern "C" {
#endif
#if 0
#pragma mark == Target ==
#endif
//===========================================================================================================================
// Target
//===========================================================================================================================
// Macintosh
#if( !defined( TARGET_OS_MAC ) )
#if( ( macintosh || __MACH__ ) && !KERNEL )
// ConditionalMacros.h in CoreServices will define this TARGET_* flag.
#else
#define TARGET_OS_MAC 0
#endif
#endif
#if( !defined( TARGET_API_MAC_OSX_KERNEL ) )
#if( __MACH__ && KERNEL )
#define TARGET_API_MAC_OSX_KERNEL 1
#else
#define TARGET_API_MAC_OSX_KERNEL 0
#endif
#endif
// FreeBSD
#if( !defined( TARGET_OS_FREEBSD ) )
#if( defined( __FreeBSD__ ) )
#define TARGET_OS_FREEBSD 1
#else
#define TARGET_OS_FREEBSD 0
#endif
#endif
// Linux
#if( !defined( TARGET_OS_LINUX ) )
#if( defined( __linux__ ) )
#define TARGET_OS_LINUX 1
#else
#define TARGET_OS_LINUX 0
#endif
#endif
// Solaris
#if( !defined( TARGET_OS_SOLARIS ) )
#if( defined(solaris) || (defined(__SVR4) && defined(sun)) )
#define TARGET_OS_SOLARIS 1
#else
#define TARGET_OS_SOLARIS 0
#endif
#endif
// Palm
#if( !defined( TARGET_OS_PALM ) )
#if( defined( __PALMOS_TRAPS__ ) || defined( __PALMOS_ARMLET__ ) )
#define TARGET_OS_PALM 1
#else
#define TARGET_OS_PALM 0
#endif
#endif
// VxWorks
#if( !defined( TARGET_OS_VXWORKS ) )
// No predefined macro for VxWorks so just assume VxWorks if nothing else is set.
#if( !macintosh && !__MACH__ && !defined( __FreeBSD__ ) && !defined( __linux__ ) && !defined ( __SVR4 ) && !defined ( __sun ) && !defined( __PALMOS_TRAPS__ ) && !defined( __PALMOS_ARMLET__ ) && !defined( _WIN32 ) )
#define TARGET_OS_VXWORKS 1
#else
#define TARGET_OS_VXWORKS 0
#endif
#endif
// Windows
#if( !defined( TARGET_OS_WIN32 ) )
#if( macintosh || __MACH__ )
// ConditionalMacros.h in CoreServices will define this TARGET_* flag.
#else
#if( defined( _WIN32 ) )
#define TARGET_OS_WIN32 1
#else
#define TARGET_OS_WIN32 0
#endif
#endif
#endif
// Windows CE
#if( !defined( TARGET_OS_WINDOWS_CE ) )
#if( defined( _WIN32_WCE ) )
#define TARGET_OS_WINDOWS_CE 1
#else
#define TARGET_OS_WINDOWS_CE 0
#endif
#endif
#if 0
#pragma mark == Includes ==
#endif
//===========================================================================================================================
// Includes
//===========================================================================================================================
#if( !KERNEL )
#if defined(WIN32) && !defined(_WSPIAPI_COUNTOF)
#define _WSPIAPI_COUNTOF(_Array) (sizeof(_Array) / sizeof(_Array[0]))
#endif
#include <stddef.h>
#endif
#if( ( macintosh || __MACH__ ) && !KERNEL )
#if( defined( __MWERKS__ ) )
#if( __option( c9x ) )
#include <stdbool.h>
#endif
#else
#include <stdbool.h>
#endif
#include <stdint.h>
#if( __MACH__ )
// Mac OS X
#include <sys/types.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <fcntl.h>
#include <pthread.h>
#include <sys/ioctl.h>
#include <sys/socket.h>
#include <unistd.h>
#else
// Classic Mac OS
#include <ConditionalMacros.h>
#include <MacTypes.h>
#endif
#elif( KERNEL )
// Mac OS X Kernel
#include <stdint.h>
#include <libkern/OSTypes.h>
#include <sys/types.h>
#elif( TARGET_OS_FREEBSD )
// FreeBSD
#include <stdint.h>
#include <pthread.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#elif( TARGET_OS_LINUX )
// Linux
#include <stdint.h>
#include <arpa/inet.h>
#elif( TARGET_OS_SOLARIS )
// Solaris
#include <stdint.h>
#include <arpa/inet.h>
#include <arpa/nameser.h>
#if ( defined( BYTE_ORDER ) && defined( LITTLE_ENDIAN ) && ( BYTE_ORDER == LITTLE_ENDIAN ) )
#define TARGET_RT_LITTLE_ENDIAN 1
#endif
#if ( defined( BYTE_ORDER ) && defined( BIG_ENDIAN ) && ( BYTE_ORDER == BIG_ENDIAN ) )
#define TARGET_RT_BIG_ENDIAN 1
#endif
#elif( TARGET_OS_PALM )
// Palm (no special includes yet).
#elif( TARGET_OS_VXWORKS )
// VxWorks
#include "vxWorks.h"
#elif( TARGET_OS_WIN32 )
// Windows
#if( !defined( WIN32_WINDOWS ) )
#define WIN32_WINDOWS 0x0401
#endif
#if( !defined( _WIN32_WINDOWS ) )
#define _WIN32_WINDOWS 0x0401
#endif
#if( !defined( WIN32_LEAN_AND_MEAN ) )
#define WIN32_LEAN_AND_MEAN // Needed to avoid redefinitions by Windows interfaces.
#endif
#if( defined( __MWERKS__ ) )
#if( __option( c9x ) )
#include <stdbool.h>
#endif
#include <stdint.h>
#elif( defined( _MSC_VER ) )
#pragma warning( disable:4127 ) // Disable "conditional expression is constant" warning for debug macros.
#pragma warning( disable:4706 ) // Disable "assignment within conditional expression" for Microsoft headers.
#endif
#include <windows.h>
#include <winsock2.h>
#include <Ws2tcpip.h>
#if( defined( _MSC_VER ) )
#pragma warning( default:4706 )
#endif
#else
#error unknown OS - update this file to support your OS
#endif
#if( !defined( TARGET_BUILD_MAIN ) )
#if( !TARGET_OS_VXWORKS )
#define TARGET_BUILD_MAIN 1
#endif
#endif
#if( __GNUC__ || !TARGET_OS_VXWORKS )
#define TARGET_LANGUAGE_C_LIKE 1
#else
#define TARGET_LANGUAGE_C_LIKE 0
#endif
#if 0
#pragma mark == CPU ==
#endif
//===========================================================================================================================
// CPU
//===========================================================================================================================
// PowerPC
#if( !defined( TARGET_CPU_PPC ) )
#if( defined( __ppc__ ) || defined( __PPC__ ) || defined( powerpc ) || defined( ppc ) || defined( _M_MPPC ) )
#define TARGET_CPU_PPC 1
#else
#define TARGET_CPU_PPC 0
#endif
#endif
// x86
#if( !defined( TARGET_CPU_X86 ) )
#if( __INTEL__ || defined( __i386__ ) || defined( i386 ) || defined( intel ) || defined( _M_IX86 ) )
#define TARGET_CPU_X86 1
#else
#define TARGET_CPU_X86 0
#endif
#endif
// MIPS
#if( !defined( TARGET_CPU_MIPS ) )
#if( __MIPS__ || defined( MIPS32 ) || defined( R3000 ) || defined( R4000 ) || defined( R4650 ) || defined( _M_MRX000 ) )
#define TARGET_CPU_MIPS 1
#else
#define TARGET_CPU_MIPS 0
#endif
#endif
#if( !defined( TARGET_CPU_PPC ) && !defined( TARGET_CPU_X86 ) && !defined( TARGET_CPU_MIPS ) )
#error unknown CPU - update this file to support your CPU
#endif
#if 0
#pragma mark == Byte Order ==
#endif
//===========================================================================================================================
// Byte Order
//===========================================================================================================================
// TARGET_RT_LITTLE_ENDIAN
#if( !defined( TARGET_RT_LITTLE_ENDIAN ) )
#if( MIPSEL || IL_LITTLE_ENDIAN || defined( __LITTLE_ENDIAN__ ) || \
( defined( BYTE_ORDER ) && defined( LITTLE_ENDIAN ) && ( BYTE_ORDER == LITTLE_ENDIAN ) ) || \
( defined( _BYTE_ORDER ) && defined( _LITTLE_ENDIAN ) && ( _BYTE_ORDER == _LITTLE_ENDIAN ) ) || \
( defined( __BYTE_ORDER ) && defined( __LITTLE_ENDIAN ) && ( __BYTE_ORDER == __LITTLE_ENDIAN ) ) || \
TARGET_CPU_X86 || ( defined( TARGET_RT_BIG_ENDIAN ) && !TARGET_RT_BIG_ENDIAN ) )
#define TARGET_RT_LITTLE_ENDIAN 1
#else
#define TARGET_RT_LITTLE_ENDIAN 0
#endif
#endif
// TARGET_RT_BIG_ENDIAN
#if( !defined( TARGET_RT_BIG_ENDIAN ) )
#if( MIPSEB || IL_BIG_ENDIAN || defined( __BIG_ENDIAN__ ) || \
( defined( BYTE_ORDER ) && defined( BIG_ENDIAN ) && ( BYTE_ORDER == BIG_ENDIAN ) ) || \
( defined( _BYTE_ORDER ) && defined( _BIG_ENDIAN ) && ( _BYTE_ORDER == _BIG_ENDIAN ) ) || \
( defined( __BYTE_ORDER ) && defined( __BIG_ENDIAN ) && ( __BYTE_ORDER == __BIG_ENDIAN ) ) || \
( defined( TARGET_RT_LITTLE_ENDIAN ) && !TARGET_RT_LITTLE_ENDIAN ) )
#define TARGET_RT_BIG_ENDIAN 1
#else
#define TARGET_RT_BIG_ENDIAN 0
#endif
#endif
#if( defined( TARGET_RT_LITTLE_ENDIAN ) && !defined( TARGET_RT_BIG_ENDIAN ) )
#if( TARGET_RT_LITTLE_ENDIAN )
#define TARGET_RT_BIG_ENDIAN 0
#else
#define TARGET_RT_BIG_ENDIAN 1
#endif
#endif
#if( defined( TARGET_RT_BIG_ENDIAN ) && !defined( TARGET_RT_LITTLE_ENDIAN ) )
#if( TARGET_RT_BIG_ENDIAN )
#define TARGET_RT_LITTLE_ENDIAN 0
#else
#define TARGET_RT_LITTLE_ENDIAN 1
#endif
#endif
#if( !defined( TARGET_RT_LITTLE_ENDIAN ) || !defined( TARGET_RT_BIG_ENDIAN ) )
#error unknown byte order - update this file to support your byte order
#endif
// TARGET_RT_BYTE_ORDER
#if( !defined( TARGET_RT_BYTE_ORDER_BIG_ENDIAN ) )
#define TARGET_RT_BYTE_ORDER_BIG_ENDIAN 1234
#endif
#if( !defined( TARGET_RT_BYTE_ORDER_LITTLE_ENDIAN ) )
#define TARGET_RT_BYTE_ORDER_LITTLE_ENDIAN 4321
#endif
#if( !defined( TARGET_RT_BYTE_ORDER ) )
#if( TARGET_RT_LITTLE_ENDIAN )
#define TARGET_RT_BYTE_ORDER TARGET_RT_BYTE_ORDER_LITTLE_ENDIAN
#else
#define TARGET_RT_BYTE_ORDER TARGET_RT_BYTE_ORDER_BIG_ENDIAN
#endif
#endif
#if 0
#pragma mark == Constants ==
#endif
//===========================================================================================================================
// Constants
//===========================================================================================================================
#if( !TARGET_OS_MAC )
#define CR '\r'
#endif
#define LF '\n'
#define CRSTR "\r"
#define LFSTR "\n"
#define CRLF "\r\n"
#define CRCR "\r\r"
#if 0
#pragma mark == Compatibility ==
#endif
//===========================================================================================================================
// Compatibility
//===========================================================================================================================
// Macros to allow the same code to work on Windows and other sockets API-compatible platforms.
#if( TARGET_OS_WIN32 )
#define close_compat( X ) closesocket( X )
#define errno_compat() (int) GetLastError()
#define set_errno_compat( X ) SetLastError( X )
#define EWOULDBLOCK_compat WSAEWOULDBLOCK
#define ETIMEDOUT_compat WSAETIMEDOUT
#define ENOTCONN_compat WSAENOTCONN
#define IsValidSocket( X ) ( ( X ) != INVALID_SOCKET )
#define kInvalidSocketRef INVALID_SOCKET
#if( TARGET_LANGUAGE_C_LIKE )
typedef SOCKET SocketRef;
#endif
#else
#define close_compat( X ) close( X )
#define errno_compat() errno
#define set_errno_compat( X ) do { errno = ( X ); } while( 0 )
#define EWOULDBLOCK_compat EWOULDBLOCK
#define ETIMEDOUT_compat ETIMEDOUT
#define ENOTCONN_compat ENOTCONN
#define IsValidSocket( X ) ( ( X ) >= 0 )
#define kInvalidSocketRef -1
#if( TARGET_LANGUAGE_C_LIKE )
typedef int SocketRef;
#endif
#endif
// socklen_t is not defined on the following platforms so emulate it if not defined:
//
// - Pre-Panther Mac OS X. Panther defines SO_NOADDRERR so trigger off that.
// - Windows SDK prior to 2003. 2003+ SDK's define EAI_AGAIN so trigger off that.
// - VxWorks
#if( TARGET_LANGUAGE_C_LIKE )
#if( ( TARGET_OS_MAC && !defined( SO_NOADDRERR ) ) || ( TARGET_OS_WIN32 && !defined( EAI_AGAIN ) ) || TARGET_OS_VXWORKS )
typedef int socklen_t;
#endif
#endif
// ssize_t is not defined on the following platforms so emulate it if not defined:
//
// - Mac OS X when not building with BSD headers
// - Windows
#if( TARGET_LANGUAGE_C_LIKE )
#if( !defined(_SSIZE_T) && ( TARGET_OS_WIN32 || !defined( _BSD_SSIZE_T_DEFINED_ ) ) && !TARGET_OS_FREEBSD && !TARGET_OS_LINUX && !TARGET_OS_VXWORKS && !TARGET_OS_MAC)
typedef int ssize_t;
#endif
#endif
// sockaddr_storage is not supported on non-IPv6 machines so alias it to an IPv4-compatible structure.
#if( TARGET_LANGUAGE_C_LIKE )
#if( !defined( AF_INET6 ) )
#define sockaddr_storage sockaddr_in
#define ss_family sin_family
#endif
#endif
//---------------------------------------------------------------------------------------------------------------------------
/*! @defined SOCKADDR_IS_IP_LOOPBACK
@abstract Determines if a sockaddr is an IPv4 or IPv6 loopback address (if IPv6 is supported).
*/
#if( defined( AF_INET6 ) )
#define SOCKADDR_IS_IP_LOOPBACK( SA ) \
( ( (const struct sockaddr *)( SA ) )->sa_family == AF_INET ) \
? ( ( (const struct sockaddr_in *)( SA ) )->sin_addr.s_addr == htonl( INADDR_LOOPBACK ) ) \
: ( ( (const struct sockaddr *)( SA ) )->sa_family == AF_INET6 ) \
? IN6_IS_ADDR_LOOPBACK( &( (const struct sockaddr_in6 *)( SA ) )->sin6_addr ) \
: 0
#else
#define SOCKADDR_IS_IP_LOOPBACK( SA ) \
( ( (const struct sockaddr *)( SA ) )->sa_family == AF_INET ) \
? ( ( (const struct sockaddr_in *)( SA ) )->sin_addr.s_addr == htonl( INADDR_LOOPBACK ) ) \
: 0
#endif
//---------------------------------------------------------------------------------------------------------------------------
/*! @defined SOCKADDR_IS_IP_LINK_LOCAL
@abstract Determines if a sockaddr is an IPv4 or IPv6 link-local address (if IPv6 is supported).
*/
#if( defined( AF_INET6 ) )
#define SOCKADDR_IS_IP_LINK_LOCAL( SA ) \
( ( ( (const struct sockaddr *)( SA ) )->sa_family == AF_INET ) \
? ( ( ( (uint8_t *)( &( (const struct sockaddr_in *)( SA ) )->sin_addr ) )[ 0 ] == 169 ) && \
( ( (uint8_t *)( &( (const struct sockaddr_in *)( SA ) )->sin_addr ) )[ 1 ] == 254 ) ) \
: IN6_IS_ADDR_LOOPBACK( &( (const struct sockaddr_in6 *)( SA ) )->sin6_addr ) )
#else
#define SOCKADDR_IS_IP_LINK_LOCAL( SA ) \
( ( ( (const struct sockaddr *)( SA ) )->sa_family == AF_INET ) \
? ( ( ( (uint8_t *)( &( (const struct sockaddr_in *)( SA ) )->sin_addr ) )[ 0 ] == 169 ) && \
( ( (uint8_t *)( &( (const struct sockaddr_in *)( SA ) )->sin_addr ) )[ 1 ] == 254 ) ) \
: 0 )
#endif
// _beginthreadex and _endthreadex are not supported on Windows CE 2.1 or later (the C runtime issues with leaking
// resources have apparently been resolved and they seem to have just ripped out support for the API) so map it to
// CreateThread on Windows CE.
#if( TARGET_OS_WINDOWS_CE )
#define _beginthreadex_compat( SECURITY_PTR, STACK_SIZE, START_ADDRESS, ARG_LIST, FLAGS, THREAD_ID_PTR ) \
(uintptr_t) CreateThread( SECURITY_PTR, STACK_SIZE, (LPTHREAD_START_ROUTINE) START_ADDRESS, ARG_LIST, FLAGS, \
(LPDWORD) THREAD_ID_PTR )
#define _endthreadex_compat( RESULT ) ExitThread( (DWORD) RESULT )
#elif( TARGET_OS_WIN32 )
#define _beginthreadex_compat _beginthreadex
#define _endthreadex_compat _endthreadex
#endif
// The C99 "inline" keyword is not supported by Microsoft compilers, but they do support __inline so map it when needed.
#if( defined( _MSC_VER ) )
#define inline_compat __inline
#else
#define inline_compat inline
#endif
// Calling conventions
#if( !defined( CALLBACK_COMPAT ) )
#if( TARGET_OS_WIN32 || TARGET_OS_WINDOWS_CE )
#define CALLBACK_COMPAT CALLBACK
#else
#define CALLBACK_COMPAT
#endif
#endif
#if 0
#pragma mark == Macros ==
#endif
//---------------------------------------------------------------------------------------------------------------------------
/*! @defined kSizeCString
@abstract A meta-value to pass to supported routines to indicate the size should be calculated with strlen.
*/
#define kSizeCString ( (size_t) -1 )
//---------------------------------------------------------------------------------------------------------------------------
/*! @defined sizeof_array
@abstract Determines the number of elements in an array.
*/
#define sizeof_array( X ) ( sizeof( X ) / sizeof( X[ 0 ] ) )
//---------------------------------------------------------------------------------------------------------------------------
/*! @defined sizeof_element
@abstract Determines the size of an array element.
*/
#define sizeof_element( X ) sizeof( X[ 0 ] )
//---------------------------------------------------------------------------------------------------------------------------
/*! @defined sizeof_string
@abstract Determines the size of a constant C string, excluding the null terminator.
*/
#define sizeof_string( X ) ( sizeof( ( X ) ) - 1 )
//---------------------------------------------------------------------------------------------------------------------------
/*! @defined sizeof_field
@abstract Determines the size of a field of a type.
*/
#define sizeof_field( TYPE, FIELD ) sizeof( ( ( (TYPE *) 0 )->FIELD ) )
//---------------------------------------------------------------------------------------------------------------------------
/*! @function RoundUp
@abstract Rounds X up to a multiple of Y.
*/
#define RoundUp( X, Y ) ( ( X ) + ( ( Y ) - ( ( X ) % ( Y ) ) ) )
//---------------------------------------------------------------------------------------------------------------------------
/*! @function IsAligned
@abstract Returns non-zero if X is aligned to a Y byte boundary and 0 if not. Y must be a power of 2.
*/
#define IsAligned( X, Y ) ( ( ( X ) & ( ( Y ) - 1 ) ) == 0 )
//---------------------------------------------------------------------------------------------------------------------------
/*! @function IsFieldAligned
@abstract Returns non-zero if FIELD of type TYPE is aligned to a Y byte boundary and 0 if not. Y must be a power of 2.
*/
#define IsFieldAligned( X, TYPE, FIELD, Y ) IsAligned( ( (uintptr_t)( X ) ) + offsetof( TYPE, FIELD ), ( Y ) )
//---------------------------------------------------------------------------------------------------------------------------
/*! @function AlignDown
@abstract Aligns X down to a Y byte boundary. Y must be a power of 2.
*/
#define AlignDown( X, Y ) ( ( X ) & ~( ( Y ) - 1 ) )
//---------------------------------------------------------------------------------------------------------------------------
/*! @function AlignUp
@abstract Aligns X up to a Y byte boundary. Y must be a power of 2.
*/
#define AlignUp( X, Y ) ( ( ( X ) + ( ( Y ) - 1 ) ) & ~( ( Y ) - 1 ) )
//---------------------------------------------------------------------------------------------------------------------------
/*! @function Min
@abstract Returns the lesser of X and Y.
*/
#if( !defined( Min ) )
#define Min( X, Y ) ( ( ( X ) < ( Y ) ) ? ( X ) : ( Y ) )
#endif
//---------------------------------------------------------------------------------------------------------------------------
/*! @function Max
@abstract Returns the greater of X and Y.
*/
#if( !defined( Max ) )
#define Max( X, Y ) ( ( ( X ) > ( Y ) ) ? ( X ) : ( Y ) )
#endif
//---------------------------------------------------------------------------------------------------------------------------
/*! @function InsertBits
@abstract Inserts BITS (both 0 and 1 bits) into X, controlled by MASK and SHIFT, and returns the result.
@discussion
MASK is the bitmask of the bits in the final position.
SHIFT is the number of bits to shift left for 1 to reach the first bit position of MASK.
For example, if you wanted to insert 0x3 into the leftmost 4 bits of a 32-bit value:
InsertBits( 0, 0x3, 0xF0000000U, 28 ) == 0x30000000
*/
#define InsertBits( X, BITS, MASK, SHIFT ) ( ( ( X ) & ~( MASK ) ) | ( ( ( BITS ) << ( SHIFT ) ) & ( MASK ) ) )
//---------------------------------------------------------------------------------------------------------------------------
/*! @function ExtractBits
@abstract Extracts bits from X, controlled by MASK and SHIFT, and returns the result.
@discussion
MASK is the bitmask of the bits in the final position.
SHIFT is the number of bits to shift right to right justify MASK.
For example, if you had a 32-bit value (e.g. 0x30000000) wanted the left-most 4 bits (e.g. 3 in this example):
ExtractBits( 0x30000000U, 0xF0000000U, 28 ) == 0x3
*/
#define ExtractBits( X, MASK, SHIFT ) ( ( ( X ) >> ( SHIFT ) ) & ( ( MASK ) >> ( SHIFT ) ) )
//---------------------------------------------------------------------------------------------------------------------------
/*! @function Stringify
@abstract Stringify's an expression.
@discussion
Stringify macros to process raw text passed via -D options to C string constants. The double-wrapping is necessary
because the C preprocessor doesn't perform its normal argument expansion pre-scan with stringified macros so the
-D macro needs to be expanded once via the wrapper macro then stringified so the raw text is stringified. Otherwise,
the replacement value would be used instead of the symbolic name (only for preprocessor symbols like #defines).
For example:
#define kMyConstant 1
printf( "%s", Stringify( kMyConstant ) ); // Prints "kMyConstant"
printf( "%s", StringifyExpansion( kMyConstant ) ); // Prints "1"
Non-preprocessor symbols do not have this issue. For example:
enum
{
kMyConstant = 1
};
printf( "%s", Stringify( kMyConstant ) ); // Prints "kMyConstant"
printf( "%s", StringifyExpansion( kMyConstant ) ); // Prints "kMyConstant"
See <http://gcc.gnu.org/onlinedocs/cpp/Argument-Prescan.html> for more info on C preprocessor pre-scanning.
*/
#define Stringify( X ) # X
#define StringifyExpansion( X ) Stringify( X )
#if 0
#pragma mark == Types ==
#endif
#if( TARGET_LANGUAGE_C_LIKE )
//===========================================================================================================================
// Standard Types
//===========================================================================================================================
#if( !defined( INT8_MIN ) )
#define INT8_MIN SCHAR_MIN
#if( defined( _MSC_VER ) )
// C99 stdint.h not supported in VC++/VS.NET yet.
typedef INT8 int8_t;
typedef UINT8 uint8_t;
typedef INT16 int16_t;
typedef UINT16 uint16_t;
typedef INT32 int32_t;
typedef UINT32 uint32_t;
typedef __int64 int64_t;
typedef unsigned __int64 uint64_t;
#elif( TARGET_OS_VXWORKS && ( TORNADO_VERSION < 220 ) )
typedef long long int64_t;
typedef unsigned long long uint64_t;
#endif
typedef int8_t int_least8_t;
typedef int16_t int_least16_t;
typedef int32_t int_least32_t;
typedef int64_t int_least64_t;
typedef uint8_t uint_least8_t;
typedef uint16_t uint_least16_t;
typedef uint32_t uint_least32_t;
typedef uint64_t uint_least64_t;
typedef int8_t int_fast8_t;
typedef int16_t int_fast16_t;
typedef int32_t int_fast32_t;
typedef int64_t int_fast64_t;
typedef uint8_t uint_fast8_t;
typedef uint16_t uint_fast16_t;
typedef uint32_t uint_fast32_t;
typedef uint64_t uint_fast64_t;
#if( !defined( _MSC_VER ) || TARGET_OS_WINDOWS_CE )
typedef long int intptr_t;
typedef unsigned long int uintptr_t;
#endif
#endif
// Macros for minimum-width integer constants
#if( !defined( INT8_C ) )
#define INT8_C( value ) value
#endif
#if( !defined( INT16_C ) )
#define INT16_C( value ) value
#endif
#if( !defined( INT32_C ) )
#define INT32_C( value ) value ## L
#endif
#if( !defined( INT64_C ) )
#if( defined( _MSC_VER ) )
#define INT64_C( value ) value ## i64
#else
#define INT64_C( value ) value ## LL
#endif
#endif
#if( !defined( UINT8_C ) )
#define UINT8_C( value ) value ## U
#endif
#if( !defined( UINT16_C ) )
#define UINT16_C( value ) value ## U
#endif
#if( !defined( UINT32_C ) )
#define UINT32_C( value ) value ## UL
#endif
#if( !defined( UINT64_C ) )
#if( defined( _MSC_VER ) )
#define UINT64_C( value ) value ## UI64
#else
#define UINT64_C( value ) value ## ULL
#endif
#endif
#if 0
#pragma mark == bool ==
#endif
//===========================================================================================================================
// Boolean Constants and Types
//===========================================================================================================================
// C++ defines bool, true, and false. Metrowerks allows this to be controlled by the "bool" option though.
// C99 defines __bool_true_false_are_defined when bool, true, and false are defined.
// MacTypes.h defines true and false (Mac builds only).
//
// Note: The Metrowerks has to be in its own block because Microsoft Visual Studio .NET does not completely
// short-circuit and gets confused by the option( bool ) portion of the conditional.
#if( defined( __MWERKS__ ) )
// Note: The following test is done on separate lines because CodeWarrior doesn't like it all on one line.
#if( !__bool_true_false_are_defined && ( !defined( __cplusplus ) || !__option( bool ) ) )
#define COMMON_SERVICES_NEEDS_BOOL 1
#else
#define COMMON_SERVICES_NEEDS_BOOL 0
#endif
// Workaround when building with CodeWarrior, but using the Apple stdbool.h header, which uses _Bool.
#if( __bool_true_false_are_defined && !defined( __cplusplus ) && !__option( c9x ) )
#define _Bool int
#endif
// Workaround when building with CodeWarrior for C++ with bool disabled and using the Apple stdbool.h header,
// which defines true and false to map to C++ true and false (which are not enabled). Serenity Now!
#if( __bool_true_false_are_defined && defined( __cplusplus ) && !__option( bool ) )
#define true 1
#define false 0
#endif
#else
#define COMMON_SERVICES_NEEDS_BOOL ( !defined( __cplusplus ) && !__bool_true_false_are_defined )
#endif
#if( COMMON_SERVICES_NEEDS_BOOL )
typedef int bool;
#define bool bool
#if( !defined( __MACTYPES__ ) && !defined( true ) && !defined( false ) )
#define true 1
#define false 0
#endif
#define __bool_true_false_are_defined 1
#endif
// IOKit IOTypes.h typedef's bool if TYPE_BOOL is not defined so define it here to prevent redefinition by IOTypes.h.
#if( TARGET_API_MAC_OSX_KERNEL )
#define TYPE_BOOL 1
#endif
//---------------------------------------------------------------------------------------------------------------------------
/*! @typedef CStr255
@abstract 255 character null-terminated (C-style) string.
*/
#if( TARGET_LANGUAGE_C_LIKE )
typedef char CStr255[ 256 ];
#endif
#endif // TARGET_LANGUAGE_C_LIKE
//---------------------------------------------------------------------------------------------------------------------------
/*! @defined TYPE_LONGLONG_NATIVE
@abstract Defines whether long long (or its equivalent) is natively supported or requires special libraries.
*/
#if( !defined( TYPE_LONGLONG_NATIVE ) )
#if( !TARGET_OS_VXWORKS )
#define TYPE_LONGLONG_NATIVE 1
#else
#define TYPE_LONGLONG_NATIVE 0
#endif
#endif
//---------------------------------------------------------------------------------------------------------------------------
/*! @defined long_long_compat
@abstract Compatibility type to map to the closest thing to long long and unsigned long long.
@discussion
Neither long long nor unsigned long long are supported by Microsoft compilers, but they do support proprietary
"__int64" and "unsigned __int64" equivalents so map to those types if the real long long is not supported.
*/
#if( TARGET_LANGUAGE_C_LIKE )
#if( TARGET_OS_WIN32 )
typedef __int64 long_long_compat;
typedef unsigned __int64 unsigned_long_long_compat;
#else
typedef signed long long long_long_compat;
typedef unsigned long long unsigned_long_long_compat;
#endif
#endif
#if 0
#pragma mark == Errors ==
#endif
//---------------------------------------------------------------------------------------------------------------------------
/*! @enum OSStatus
@abstract Status Code
@constant kNoErr 0 No error occurred.
@constant kInProgressErr 1 Operation in progress.
@constant kUnknownErr -6700 Unknown error occurred.
@constant kOptionErr -6701 Option was not acceptable.
@constant kSelectorErr -6702 Selector passed in is invalid or unknown.
@constant kExecutionStateErr -6703 Call made in the wrong execution state (e.g. called at interrupt time).
@constant kPathErr -6704 Path is invalid, too long, or otherwise not usable.
@constant kParamErr -6705 Parameter is incorrect, missing, or not appropriate.
@constant kParamCountErr -6706 Incorrect or unsupported number of parameters.
@constant kCommandErr -6707 Command invalid or not supported.
@constant kIDErr -6708 Unknown, invalid, or inappropriate identifier.
@constant kStateErr -6709 Not in appropriate state to perform operation.
@constant kRangeErr -6710 Index is out of range or not valid.
@constant kRequestErr -6711 Request was improperly formed or not appropriate.
@constant kResponseErr -6712 Response was incorrect or out of sequence.
@constant kChecksumErr -6713 Checksum does not match the actual data.
@constant kNotHandledErr -6714 Operation was not handled (or not handled completely).
@constant kVersionErr -6715 Version is not incorrect or not compatibile.
@constant kSignatureErr -6716 Signature did not match what was expected.
@constant kFormatErr -6717 Unknown, invalid, or inappropriate file/data format.
@constant kNotInitializedErr -6718 Action request before needed services were initialized.
@constant kAlreadyInitializedErr -6719 Attempt made to initialize when already initialized.
@constant kNotInUseErr -6720 Object not in use (e.g. cannot abort if not already in use).
@constant kInUseErr -6721 Object is in use (e.g. cannot reuse active param blocks).
@constant kTimeoutErr -6722 Timeout occurred.
@constant kCanceledErr -6723 Operation canceled (successful cancel).
@constant kAlreadyCanceledErr -6724 Operation has already been canceled.
@constant kCannotCancelErr -6725 Operation could not be canceled (maybe already done or invalid).
@constant kDeletedErr -6726 Object has already been deleted.
@constant kNotFoundErr -6727 Something was not found.
@constant kNoMemoryErr -6728 Not enough memory was available to perform the operation.
@constant kNoResourcesErr -6729 Resources unavailable to perform the operation.
@constant kDuplicateErr -6730 Duplicate found or something is a duplicate.
@constant kImmutableErr -6731 Entity is not changeable.
@constant kUnsupportedDataErr -6732 Data is unknown or not supported.
@constant kIntegrityErr -6733 Data is corrupt.
@constant kIncompatibleErr -6734 Data is not compatible or it is in an incompatible format.
@constant kUnsupportedErr -6735 Feature or option is not supported.
@constant kUnexpectedErr -6736 Error occurred that was not expected.
@constant kValueErr -6737 Value is not appropriate.
@constant kNotReadableErr -6738 Could not read or reading is not allowed.
@constant kNotWritableErr -6739 Could not write or writing is not allowed.
@constant kBadReferenceErr -6740 An invalid or inappropriate reference was specified.
@constant kFlagErr -6741 An invalid, inappropriate, or unsupported flag was specified.
@constant kMalformedErr -6742 Something was not formed correctly.
@constant kSizeErr -6743 Size was too big, too small, or not appropriate.
@constant kNameErr -6744 Name was not correct, allowed, or appropriate.
@constant kNotReadyErr -6745 Device or service is not ready.
@constant kReadErr -6746 Could not read.
@constant kWriteErr -6747 Could not write.
@constant kMismatchErr -6748 Something does not match.
@constant kDateErr -6749 Date is invalid or out-of-range.
@constant kUnderrunErr -6750 Less data than expected.
@constant kOverrunErr -6751 More data than expected.
@constant kEndingErr -6752 Connection, session, or something is ending.
@constant kConnectionErr -6753 Connection failed or could not be established.
@constant kAuthenticationErr -6754 Authentication failed or is not supported.
@constant kOpenErr -6755 Could not open file, pipe, device, etc.
@constant kTypeErr -6756 Incorrect or incompatible type (e.g. file, data, etc.).
@constant kSkipErr -6757 Items should be or was skipped.
@constant kNoAckErr -6758 No acknowledge.
@constant kCollisionErr -6759 Collision occurred (e.g. two on bus at same time).
@constant kBackoffErr -6760 Backoff in progress and operation intentionally failed.
@constant kNoAddressAckErr -6761 No acknowledge of address.
@constant kBusyErr -6762 Cannot perform because something is busy.
@constant kNoSpaceErr -6763 Not enough space to perform operation.
*/
#if( TARGET_LANGUAGE_C_LIKE )
#if( !TARGET_OS_MAC && !TARGET_API_MAC_OSX_KERNEL )
typedef int32_t OSStatus;
#endif
#endif
#define kNoErr 0
#define kInProgressErr 1
// Generic error codes are in the range -6700 to -6779.
#define kGenericErrorBase -6700 // Starting error code for all generic errors.
#define kUnknownErr -6700
#define kOptionErr -6701
#define kSelectorErr -6702
#define kExecutionStateErr -6703
#define kPathErr -6704
#define kParamErr -6705
#define kParamCountErr -6706
#define kCommandErr -6707
#define kIDErr -6708
#define kStateErr -6709
#define kRangeErr -6710
#define kRequestErr -6711
#define kResponseErr -6712
#define kChecksumErr -6713
#define kNotHandledErr -6714
#define kVersionErr -6715
#define kSignatureErr -6716
#define kFormatErr -6717
#define kNotInitializedErr -6718
#define kAlreadyInitializedErr -6719
#define kNotInUseErr -6720
#define kInUseErr -6721
#define kTimeoutErr -6722
#define kCanceledErr -6723
#define kAlreadyCanceledErr -6724
#define kCannotCancelErr -6725
#define kDeletedErr -6726
#define kNotFoundErr -6727
#define kNoMemoryErr -6728
#define kNoResourcesErr -6729
#define kDuplicateErr -6730
#define kImmutableErr -6731
#define kUnsupportedDataErr -6732
#define kIntegrityErr -6733
#define kIncompatibleErr -6734
#define kUnsupportedErr -6735
#define kUnexpectedErr -6736
#define kValueErr -6737
#define kNotReadableErr -6738
#define kNotWritableErr -6739
#define kBadReferenceErr -6740
#define kFlagErr -6741
#define kMalformedErr -6742
#define kSizeErr -6743
#define kNameErr -6744
#define kNotReadyErr -6745
#define kReadErr -6746
#define kWriteErr -6747
#define kMismatchErr -6748
#define kDateErr -6749
#define kUnderrunErr -6750
#define kOverrunErr -6751
#define kEndingErr -6752
#define kConnectionErr -6753
#define kAuthenticationErr -6754
#define kOpenErr -6755
#define kTypeErr -6756
#define kSkipErr -6757
#define kNoAckErr -6758
#define kCollisionErr -6759
#define kBackoffErr -6760
#define kNoAddressAckErr -6761
#define kBusyErr -6762
#define kNoSpaceErr -6763
#define kGenericErrorEnd -6779 // Last generic error code (inclusive)
#if 0
#pragma mark == Mac Compatibility ==
#endif
//===========================================================================================================================
// Mac Compatibility
//===========================================================================================================================
//---------------------------------------------------------------------------------------------------------------------------
/*! @enum Duration
@abstract Type used to specify a duration of time.
@constant kDurationImmediate Indicates no delay/wait time.
@constant kDurationMicrosecond Microsecond units.
@constant kDurationMillisecond Millisecond units.
@constant kDurationSecond Second units.
@constant kDurationMinute Minute units.
@constant kDurationHour Hour units.
@constant kDurationDay Day units.
@constant kDurationForever Infinite period of time (no timeout).
@discussion
Duration values are intended to be multiplied by the specific interval to achieve an actual duration. For example,
to wait for 5 seconds you would use "5 * kDurationSecond".
*/
#if( TARGET_LANGUAGE_C_LIKE )
#if( !TARGET_OS_MAC )
typedef int32_t Duration;
#endif
#endif
#define kDurationImmediate 0L
#define kDurationMicrosecond -1L
#define kDurationMillisecond 1L
#define kDurationSecond ( 1000L * kDurationMillisecond )
#define kDurationMinute ( 60L * kDurationSecond )
#define kDurationHour ( 60L * kDurationMinute )
#define kDurationDay ( 24L * kDurationHour )
#define kDurationForever 0x7FFFFFFFL
// Seconds <-> Minutes <-> Hours <-> Days <-> Weeks <-> Months <-> Years conversions
#define kNanosecondsPerMicrosecond 1000
#define kNanosecondsPerMillisecond 1000000
#define kNanosecondsPerSecond 1000000000
#define kMicrosecondsPerSecond 1000000
#define kMicrosecondsPerMillisecond 1000
#define kMillisecondsPerSecond 1000
#define kSecondsPerMinute 60
#define kSecondsPerHour ( 60 * 60 ) // 3600
#define kSecondsPerDay ( 60 * 60 * 24 ) // 86400
#define kSecondsPerWeek ( 60 * 60 * 24 * 7 ) // 604800
#define kMinutesPerHour 60
#define kMinutesPerDay ( 60 * 24 ) // 1440
#define kHoursPerDay 24
#define kDaysPerWeek 7
#define kWeeksPerYear 52
#define kMonthsPerYear 12
//---------------------------------------------------------------------------------------------------------------------------
/*! @defined VersionStages
@abstract NumVersion-style version stages.
*/
#define kVersionStageDevelopment 0x20
#define kVersionStageAlpha 0x40
#define kVersionStageBeta 0x60
#define kVersionStageFinal 0x80
//---------------------------------------------------------------------------------------------------------------------------
/*! @function NumVersionBuild
@abstract Builds a 32-bit Mac-style NumVersion value (e.g. NumVersionBuild( 1, 2, 3, kVersionStageBeta, 4 ) -> 1.2.3b4).
*/
#define NumVersionBuild( MAJOR, MINOR, BUGFIX, STAGE, REV ) \
( ( ( ( MAJOR ) & 0xFF ) << 24 ) | \
( ( ( MINOR ) & 0x0F ) << 20 ) | \
( ( ( BUGFIX ) & 0x0F ) << 16 ) | \
( ( ( STAGE ) & 0xFF ) << 8 ) | \
( ( ( REV ) & 0xFF ) ) )
#define NumVersionExtractMajor( VERSION ) ( (uint8_t)( ( ( VERSION ) >> 24 ) & 0xFF ) )
#define NumVersionExtractMinorAndBugFix( VERSION ) ( (uint8_t)( ( ( VERSION ) >> 16 ) & 0xFF ) )
#define NumVersionExtractMinor( VERSION ) ( (uint8_t)( ( ( VERSION ) >> 20 ) & 0x0F ) )
#define NumVersionExtractBugFix( VERSION ) ( (uint8_t)( ( ( VERSION ) >> 16 ) & 0x0F ) )
#define NumVersionExtractStage( VERSION ) ( (uint8_t)( ( ( VERSION ) >> 8 ) & 0xFF ) )
#define NumVersionExtractRevision( VERSION ) ( (uint8_t)( ( VERSION ) & 0xFF ) )
//---------------------------------------------------------------------------------------------------------------------------
/*! @function NumVersionCompare
@abstract Compares two NumVersion values and returns the following values:
left < right -> -1
left > right -> 1
left = right -> 0
*/
#if( TARGET_LANGUAGE_C_LIKE )
int NumVersionCompare( uint32_t inLeft, uint32_t inRight );
#endif
#if 0
#pragma mark == Binary Constants ==
#endif
//---------------------------------------------------------------------------------------------------------------------------
/*! @defined binary_4
@abstract Macro to generate an 4-bit constant using binary notation (e.g. binary_4( 1010 ) == 0xA).
*/
#define binary_4( a ) binary_4_hex_wrap( hex_digit4( a ) )
#define binary_4_hex_wrap( a ) binary_4_hex( a )
#define binary_4_hex( a ) ( 0x ## a )
//---------------------------------------------------------------------------------------------------------------------------
/*! @defined binary_8
@abstract Macro to generate an 8-bit constant using binary notation (e.g. binary_8( 01111011 ) == 0x7B).
*/
#define binary_8( a ) binary_8_hex_wrap( hex_digit8( a ) )
#define binary_8_hex_wrap( a ) binary_8_hex( a )
#define binary_8_hex( a ) ( 0x ## a )
//---------------------------------------------------------------------------------------------------------------------------
/*! @defined binary_16
@abstract Macro to generate an 16-bit constant using binary notation (e.g. binary_16( 01111011, 01111011 ) == 0x7B7B).
*/
#define binary_16( a, b ) binary_16_hex_wrap( hex_digit8( a ), hex_digit8( b ) )
#define binary_16_hex_wrap( a, b ) binary_16_hex( a, b )
#define binary_16_hex( a, b ) ( 0x ## a ## b )
//---------------------------------------------------------------------------------------------------------------------------
/*! @defined binary_32
@abstract Macro to generate an 32-bit constant using binary notation
(e.g. binary_32( 01111011, 01111011, 01111011, 01111011 ) == 0x7B7B7B7B).
*/
#define binary_32( a, b, c, d ) binary_32_hex_wrap( hex_digit8( a ), hex_digit8( b ), hex_digit8( c ), hex_digit8( d ) )
#define binary_32_hex_wrap( a, b, c, d ) binary_32_hex( a, b, c, d )
#define binary_32_hex( a, b, c, d ) ( 0x ## a ## b ## c ## d )
// Binary Constant Helpers
#define hex_digit8( a ) HEX_DIGIT_ ## a
#define hex_digit4( a ) HEX_DIGIT_ ## 0000 ## a
#define HEX_DIGIT_00000000 00
#define HEX_DIGIT_00000001 01
#define HEX_DIGIT_00000010 02
#define HEX_DIGIT_00000011 03
#define HEX_DIGIT_00000100 04
#define HEX_DIGIT_00000101 05
#define HEX_DIGIT_00000110 06
#define HEX_DIGIT_00000111 07
#define HEX_DIGIT_00001000 08
#define HEX_DIGIT_00001001 09
#define HEX_DIGIT_00001010 0A
#define HEX_DIGIT_00001011 0B
#define HEX_DIGIT_00001100 0C
#define HEX_DIGIT_00001101 0D
#define HEX_DIGIT_00001110 0E
#define HEX_DIGIT_00001111 0F
#define HEX_DIGIT_00010000 10
#define HEX_DIGIT_00010001 11
#define HEX_DIGIT_00010010 12
#define HEX_DIGIT_00010011 13
#define HEX_DIGIT_00010100 14
#define HEX_DIGIT_00010101 15
#define HEX_DIGIT_00010110 16
#define HEX_DIGIT_00010111 17
#define HEX_DIGIT_00011000 18
#define HEX_DIGIT_00011001 19
#define HEX_DIGIT_00011010 1A
#define HEX_DIGIT_00011011 1B
#define HEX_DIGIT_00011100 1C
#define HEX_DIGIT_00011101 1D
#define HEX_DIGIT_00011110 1E
#define HEX_DIGIT_00011111 1F
#define HEX_DIGIT_00100000 20
#define HEX_DIGIT_00100001 21
#define HEX_DIGIT_00100010 22
#define HEX_DIGIT_00100011 23
#define HEX_DIGIT_00100100 24
#define HEX_DIGIT_00100101 25
#define HEX_DIGIT_00100110 26
#define HEX_DIGIT_00100111 27
#define HEX_DIGIT_00101000 28
#define HEX_DIGIT_00101001 29
#define HEX_DIGIT_00101010 2A
#define HEX_DIGIT_00101011 2B
#define HEX_DIGIT_00101100 2C
#define HEX_DIGIT_00101101 2D
#define HEX_DIGIT_00101110 2E
#define HEX_DIGIT_00101111 2F
#define HEX_DIGIT_00110000 30
#define HEX_DIGIT_00110001 31
#define HEX_DIGIT_00110010 32
#define HEX_DIGIT_00110011 33
#define HEX_DIGIT_00110100 34
#define HEX_DIGIT_00110101 35
#define HEX_DIGIT_00110110 36
#define HEX_DIGIT_00110111 37
#define HEX_DIGIT_00111000 38
#define HEX_DIGIT_00111001 39
#define HEX_DIGIT_00111010 3A
#define HEX_DIGIT_00111011 3B
#define HEX_DIGIT_00111100 3C
#define HEX_DIGIT_00111101 3D
#define HEX_DIGIT_00111110 3E
#define HEX_DIGIT_00111111 3F
#define HEX_DIGIT_01000000 40
#define HEX_DIGIT_01000001 41
#define HEX_DIGIT_01000010 42
#define HEX_DIGIT_01000011 43
#define HEX_DIGIT_01000100 44
#define HEX_DIGIT_01000101 45
#define HEX_DIGIT_01000110 46
#define HEX_DIGIT_01000111 47
#define HEX_DIGIT_01001000 48
#define HEX_DIGIT_01001001 49
#define HEX_DIGIT_01001010 4A
#define HEX_DIGIT_01001011 4B
#define HEX_DIGIT_01001100 4C
#define HEX_DIGIT_01001101 4D
#define HEX_DIGIT_01001110 4E
#define HEX_DIGIT_01001111 4F
#define HEX_DIGIT_01010000 50
#define HEX_DIGIT_01010001 51
#define HEX_DIGIT_01010010 52
#define HEX_DIGIT_01010011 53
#define HEX_DIGIT_01010100 54
#define HEX_DIGIT_01010101 55
#define HEX_DIGIT_01010110 56
#define HEX_DIGIT_01010111 57
#define HEX_DIGIT_01011000 58
#define HEX_DIGIT_01011001 59
#define HEX_DIGIT_01011010 5A
#define HEX_DIGIT_01011011 5B
#define HEX_DIGIT_01011100 5C
#define HEX_DIGIT_01011101 5D
#define HEX_DIGIT_01011110 5E
#define HEX_DIGIT_01011111 5F
#define HEX_DIGIT_01100000 60
#define HEX_DIGIT_01100001 61
#define HEX_DIGIT_01100010 62
#define HEX_DIGIT_01100011 63
#define HEX_DIGIT_01100100 64
#define HEX_DIGIT_01100101 65
#define HEX_DIGIT_01100110 66
#define HEX_DIGIT_01100111 67
#define HEX_DIGIT_01101000 68
#define HEX_DIGIT_01101001 69
#define HEX_DIGIT_01101010 6A
#define HEX_DIGIT_01101011 6B
#define HEX_DIGIT_01101100 6C
#define HEX_DIGIT_01101101 6D
#define HEX_DIGIT_01101110 6E
#define HEX_DIGIT_01101111 6F
#define HEX_DIGIT_01110000 70
#define HEX_DIGIT_01110001 71
#define HEX_DIGIT_01110010 72
#define HEX_DIGIT_01110011 73
#define HEX_DIGIT_01110100 74
#define HEX_DIGIT_01110101 75
#define HEX_DIGIT_01110110 76
#define HEX_DIGIT_01110111 77
#define HEX_DIGIT_01111000 78
#define HEX_DIGIT_01111001 79
#define HEX_DIGIT_01111010 7A
#define HEX_DIGIT_01111011 7B
#define HEX_DIGIT_01111100 7C
#define HEX_DIGIT_01111101 7D
#define HEX_DIGIT_01111110 7E
#define HEX_DIGIT_01111111 7F
#define HEX_DIGIT_10000000 80
#define HEX_DIGIT_10000001 81
#define HEX_DIGIT_10000010 82
#define HEX_DIGIT_10000011 83
#define HEX_DIGIT_10000100 84
#define HEX_DIGIT_10000101 85
#define HEX_DIGIT_10000110 86
#define HEX_DIGIT_10000111 87
#define HEX_DIGIT_10001000 88
#define HEX_DIGIT_10001001 89
#define HEX_DIGIT_10001010 8A
#define HEX_DIGIT_10001011 8B
#define HEX_DIGIT_10001100 8C
#define HEX_DIGIT_10001101 8D
#define HEX_DIGIT_10001110 8E
#define HEX_DIGIT_10001111 8F
#define HEX_DIGIT_10010000 90
#define HEX_DIGIT_10010001 91
#define HEX_DIGIT_10010010 92
#define HEX_DIGIT_10010011 93
#define HEX_DIGIT_10010100 94
#define HEX_DIGIT_10010101 95
#define HEX_DIGIT_10010110 96
#define HEX_DIGIT_10010111 97
#define HEX_DIGIT_10011000 98
#define HEX_DIGIT_10011001 99
#define HEX_DIGIT_10011010 9A
#define HEX_DIGIT_10011011 9B
#define HEX_DIGIT_10011100 9C
#define HEX_DIGIT_10011101 9D
#define HEX_DIGIT_10011110 9E
#define HEX_DIGIT_10011111 9F
#define HEX_DIGIT_10100000 A0
#define HEX_DIGIT_10100001 A1
#define HEX_DIGIT_10100010 A2
#define HEX_DIGIT_10100011 A3
#define HEX_DIGIT_10100100 A4
#define HEX_DIGIT_10100101 A5
#define HEX_DIGIT_10100110 A6
#define HEX_DIGIT_10100111 A7
#define HEX_DIGIT_10101000 A8
#define HEX_DIGIT_10101001 A9
#define HEX_DIGIT_10101010 AA
#define HEX_DIGIT_10101011 AB
#define HEX_DIGIT_10101100 AC
#define HEX_DIGIT_10101101 AD
#define HEX_DIGIT_10101110 AE
#define HEX_DIGIT_10101111 AF
#define HEX_DIGIT_10110000 B0
#define HEX_DIGIT_10110001 B1
#define HEX_DIGIT_10110010 B2
#define HEX_DIGIT_10110011 B3
#define HEX_DIGIT_10110100 B4
#define HEX_DIGIT_10110101 B5
#define HEX_DIGIT_10110110 B6
#define HEX_DIGIT_10110111 B7
#define HEX_DIGIT_10111000 B8
#define HEX_DIGIT_10111001 B9
#define HEX_DIGIT_10111010 BA
#define HEX_DIGIT_10111011 BB
#define HEX_DIGIT_10111100 BC
#define HEX_DIGIT_10111101 BD
#define HEX_DIGIT_10111110 BE
#define HEX_DIGIT_10111111 BF
#define HEX_DIGIT_11000000 C0
#define HEX_DIGIT_11000001 C1
#define HEX_DIGIT_11000010 C2
#define HEX_DIGIT_11000011 C3
#define HEX_DIGIT_11000100 C4
#define HEX_DIGIT_11000101 C5
#define HEX_DIGIT_11000110 C6
#define HEX_DIGIT_11000111 C7
#define HEX_DIGIT_11001000 C8
#define HEX_DIGIT_11001001 C9
#define HEX_DIGIT_11001010 CA
#define HEX_DIGIT_11001011 CB
#define HEX_DIGIT_11001100 CC
#define HEX_DIGIT_11001101 CD
#define HEX_DIGIT_11001110 CE
#define HEX_DIGIT_11001111 CF
#define HEX_DIGIT_11010000 D0
#define HEX_DIGIT_11010001 D1
#define HEX_DIGIT_11010010 D2
#define HEX_DIGIT_11010011 D3
#define HEX_DIGIT_11010100 D4
#define HEX_DIGIT_11010101 D5
#define HEX_DIGIT_11010110 D6
#define HEX_DIGIT_11010111 D7
#define HEX_DIGIT_11011000 D8
#define HEX_DIGIT_11011001 D9
#define HEX_DIGIT_11011010 DA
#define HEX_DIGIT_11011011 DB
#define HEX_DIGIT_11011100 DC
#define HEX_DIGIT_11011101 DD
#define HEX_DIGIT_11011110 DE
#define HEX_DIGIT_11011111 DF
#define HEX_DIGIT_11100000 E0
#define HEX_DIGIT_11100001 E1
#define HEX_DIGIT_11100010 E2
#define HEX_DIGIT_11100011 E3
#define HEX_DIGIT_11100100 E4
#define HEX_DIGIT_11100101 E5
#define HEX_DIGIT_11100110 E6
#define HEX_DIGIT_11100111 E7
#define HEX_DIGIT_11101000 E8
#define HEX_DIGIT_11101001 E9
#define HEX_DIGIT_11101010 EA
#define HEX_DIGIT_11101011 EB
#define HEX_DIGIT_11101100 EC
#define HEX_DIGIT_11101101 ED
#define HEX_DIGIT_11101110 EE
#define HEX_DIGIT_11101111 EF
#define HEX_DIGIT_11110000 F0
#define HEX_DIGIT_11110001 F1
#define HEX_DIGIT_11110010 F2
#define HEX_DIGIT_11110011 F3
#define HEX_DIGIT_11110100 F4
#define HEX_DIGIT_11110101 F5
#define HEX_DIGIT_11110110 F6
#define HEX_DIGIT_11110111 F7
#define HEX_DIGIT_11111000 F8
#define HEX_DIGIT_11111001 F9
#define HEX_DIGIT_11111010 FA
#define HEX_DIGIT_11111011 FB
#define HEX_DIGIT_11111100 FC
#define HEX_DIGIT_11111101 FD
#define HEX_DIGIT_11111110 FE
#define HEX_DIGIT_11111111 FF
#if 0
#pragma mark == Debugging ==
#endif
//---------------------------------------------------------------------------------------------------------------------------
/*! @function CommonServicesTest
@abstract Unit test.
*/
#if( DEBUG )
#if( TARGET_LANGUAGE_C_LIKE )
OSStatus CommonServicesTest( void );
#endif
#endif
#ifdef __cplusplus
}
#endif
#endif // __COMMON_SERVICES__