Home | History | Annotate | Line # | Download | only in mDNSShared
      1 /* -*- Mode: C; tab-width: 4 -*-
      2  *
      3  * Copyright (c) 1997-2023 Apple Computer, Inc. All rights reserved.
      4  *
      5  * Licensed under the Apache License, Version 2.0 (the "License");
      6  * you may not use this file except in compliance with the License.
      7  * You may obtain a copy of the License at
      8  *
      9  *     http://www.apache.org/licenses/LICENSE-2.0
     10  *
     11  * Unless required by applicable law or agreed to in writing, software
     12  * distributed under the License is distributed on an "AS IS" BASIS,
     13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     14  * See the License for the specific language governing permissions and
     15  * limitations under the License.
     16  */
     17 
     18 //---------------------------------------------------------------------------------------------------------------------------
     19 /*!	@header		CommonServices
     20 
     21     Common Services for Mac OS X, Linux, Palm, Windows, and Windows CE.
     22  */
     23 
     24 #ifndef __COMMON_SERVICES__
     25 #define __COMMON_SERVICES__
     26 
     27 #ifdef  __cplusplus
     28 extern "C" {
     29 #endif
     30 
     31 #if 0
     32 #pragma mark == Target ==
     33 #endif
     34 
     35 //===========================================================================================================================
     36 //	 Target
     37 //===========================================================================================================================
     38 
     39 // Macintosh
     40 
     41 #if ( !defined( TARGET_OS_MAC ) )
     42     #if ( ( macintosh || __MACH__ ) && (!defined(KERNEL) || !KERNEL) )
     43 // ConditionalMacros.h in CoreServices will define this TARGET_* flag.
     44     #else
     45         #define TARGET_OS_MAC           0
     46     #endif
     47 #endif
     48 
     49 #if ( !defined( TARGET_API_MAC_OSX_KERNEL ) )
     50     #if ( __MACH__ && defined(KERNEL) && KERNEL )
     51         #define TARGET_API_MAC_OSX_KERNEL       1
     52     #else
     53         #define TARGET_API_MAC_OSX_KERNEL       0
     54     #endif
     55 #endif
     56 
     57 // FreeBSD || NetBSD
     58 
     59 #if ( !defined( TARGET_OS_BSD ) )
     60     #if ( defined( __FreeBSD__ )  || defined( __NetBSD__ ))
     61         #define TARGET_OS_BSD       1
     62     #else
     63         #define TARGET_OS_BSD       0
     64     #endif
     65 #endif
     66 
     67 // Linux
     68 
     69 #if ( !defined( TARGET_OS_LINUX ) )
     70     #if ( defined( __linux__ ) )
     71         #define TARGET_OS_LINUX         1
     72     #else
     73         #define TARGET_OS_LINUX         0
     74     #endif
     75 #endif
     76 
     77 // Solaris
     78 
     79 #if ( !defined( TARGET_OS_SOLARIS ) )
     80     #if ( defined(solaris) || (defined(__SVR4) && defined(sun)) )
     81         #define TARGET_OS_SOLARIS       1
     82     #else
     83         #define TARGET_OS_SOLARIS       0
     84     #endif
     85 #endif
     86 
     87 // Palm
     88 
     89 #if ( !defined( TARGET_OS_PALM ) )
     90     #if ( defined( __PALMOS_TRAPS__ ) || defined( __PALMOS_ARMLET__ ) )
     91         #define TARGET_OS_PALM          1
     92     #else
     93         #define TARGET_OS_PALM          0
     94     #endif
     95 #endif
     96 
     97 // Windows
     98 
     99 #if ( !defined( TARGET_OS_WIN32 ) )
    100     #if ( macintosh || __MACH__ )
    101         #define TARGET_OS_WIN32         0
    102     #else
    103         #if ( defined( _WIN32 ) )
    104             #define TARGET_OS_WIN32     1
    105         #else
    106             #define TARGET_OS_WIN32     0
    107         #endif
    108     #endif
    109 #endif
    110 
    111 // Windows CE
    112 
    113 #if ( !defined( TARGET_OS_WINDOWS_CE ) )
    114     #if ( defined( _WIN32_WCE ) )
    115         #define TARGET_OS_WINDOWS_CE    1
    116     #else
    117         #define TARGET_OS_WINDOWS_CE    0
    118     #endif
    119 #endif
    120 
    121 #if 0
    122 #pragma mark == Includes ==
    123 #endif
    124 
    125 //===========================================================================================================================
    126 //	 Includes
    127 //===========================================================================================================================
    128 
    129 #if ( !defined(KERNEL) || !KERNEL )
    130     #if defined(WIN32) && !defined(_WSPIAPI_COUNTOF)
    131         #define _WSPIAPI_COUNTOF(_Array) (sizeof(_Array) / sizeof(_Array[0]))
    132     #endif
    133     #include    <stddef.h>
    134 #endif
    135 
    136 #if ( ( (defined(macintosh) && macintosh) || __MACH__ ) && (!defined(KERNEL) || !KERNEL) )
    137 
    138     #if ( defined( __MWERKS__ ) )
    139         #if ( __option( c9x ) )
    140             #include    <stdbool.h>
    141         #endif
    142     #else
    143         #include    <stdbool.h>
    144     #endif
    145 
    146     #include    <stdint.h>
    147 
    148     #if ( __MACH__ )
    149 
    150 // Mac OS X
    151 
    152         #include    <sys/types.h>
    153         #include    <netinet/in.h>
    154         #include    <arpa/inet.h>
    155         #include    <fcntl.h>
    156         #include    <MacTypes.h>
    157         #include    <pthread.h>
    158         #include    <sys/ioctl.h>
    159         #include    <sys/socket.h>
    160         #include    <unistd.h>
    161 
    162     #else
    163 
    164 // Classic Mac OS
    165 
    166         #include    <ConditionalMacros.h>
    167         #include    <MacTypes.h>
    168 
    169     #endif
    170 
    171 #elif ( KERNEL )
    172 
    173 // Mac OS X Kernel
    174 
    175     #include    <stdint.h>
    176 
    177     #include    <libkern/OSTypes.h>
    178     #include    <sys/types.h>
    179 
    180 #elif ( TARGET_OS_BSD )
    181 
    182 // BSD
    183     #include    <stdint.h>
    184     #include    <pthread.h>
    185     #include    <netinet/in.h>
    186     #include    <arpa/inet.h>
    187     #include    <sys/socket.h>
    188 
    189 #elif ( TARGET_OS_LINUX )
    190 
    191 // Linux
    192 
    193     #include    <stdint.h>
    194     #include    <arpa/inet.h>
    195 
    196 #elif ( TARGET_OS_SOLARIS )
    197 
    198 // Solaris
    199 
    200     #include    <stdint.h>
    201 
    202     #include    <arpa/inet.h>
    203     #include    <arpa/nameser.h>
    204 
    205     #if ( defined( BYTE_ORDER ) && defined( LITTLE_ENDIAN ) && ( BYTE_ORDER == LITTLE_ENDIAN ) )
    206         #define TARGET_RT_LITTLE_ENDIAN     1
    207     #endif
    208     #if ( defined( BYTE_ORDER ) && defined( BIG_ENDIAN ) && ( BYTE_ORDER == BIG_ENDIAN ) )
    209         #define TARGET_RT_BIG_ENDIAN        1
    210     #endif
    211 
    212 #elif ( TARGET_OS_PALM )
    213 
    214 // Palm (no special includes yet).
    215 
    216 #elif ( TARGET_OS_WIN32 )
    217 
    218 // Windows
    219 
    220     #if ( !defined( WIN32_WINDOWS ) )
    221         #define WIN32_WINDOWS       0x0401
    222     #endif
    223 
    224     #if ( !defined( _WIN32_WINDOWS ) )
    225         #define _WIN32_WINDOWS      0x0401
    226     #endif
    227 
    228     #if ( !defined( WIN32_LEAN_AND_MEAN ) )
    229         #define WIN32_LEAN_AND_MEAN         // Needed to avoid redefinitions by Windows interfaces.
    230     #endif
    231 
    232     #if ( defined( __MWERKS__ ) )
    233 
    234         #if ( __option( c9x ) )
    235             #include    <stdbool.h>
    236         #endif
    237 
    238         #include    <stdint.h>
    239 
    240     #elif ( defined( _MSC_VER ) )
    241 
    242     #include    "VisualStudioSupport.h"
    243 
    244         #if ( _MSC_VER >= 1900 )
    245             #include    <stdint.h>
    246             #include    <stdbool.h>
    247         #endif
    248 
    249         #pragma warning( disable:4127 ) // Disable "conditional expression is constant" warning for debug macros.
    250         #pragma warning( disable:4706 ) // Disable "assignment within conditional expression" for Microsoft headers.
    251 
    252     #endif
    253 
    254     #include    <windows.h>
    255     #include    <winsock2.h>
    256     #include    <Ws2tcpip.h>
    257 
    258     #if ( defined( _MSC_VER ) )
    259         #pragma warning( default:4706 )
    260     #endif
    261 
    262 #else
    263     #error unknown OS - update this file to support your OS
    264 #endif
    265 
    266 #if ( !defined( TARGET_BUILD_MAIN ) )
    267     #define TARGET_BUILD_MAIN       1
    268 #endif
    269 
    270 #if 0
    271 #pragma mark == CPU ==
    272 #endif
    273 
    274 //===========================================================================================================================
    275 //	CPU
    276 //===========================================================================================================================
    277 
    278 // PowerPC
    279 
    280 #if ( !defined( TARGET_CPU_PPC ) )
    281     #if ( defined( __ppc__ ) || defined( __PPC__ ) || defined( powerpc ) || defined( ppc ) || defined( _M_MPPC ) )
    282         #define TARGET_CPU_PPC              1
    283     #else
    284         #define TARGET_CPU_PPC              0
    285     #endif
    286 #endif
    287 
    288 // x86
    289 
    290 #if ( !defined( TARGET_CPU_X86 ) )
    291     #if ( __INTEL__ || defined( __i386__ ) || defined( i386 ) || defined( intel ) || defined( _M_IX86 ) )
    292         #define TARGET_CPU_X86              1
    293     #else
    294         #define TARGET_CPU_X86              0
    295     #endif
    296 #endif
    297 
    298 // MIPS
    299 
    300 #if ( !defined( TARGET_CPU_MIPS ) )
    301     #if ( __MIPS__ || defined( MIPS32 ) || defined( R3000 ) || defined( R4000 ) || defined( R4650 ) || defined( _M_MRX000 ) )
    302         #define TARGET_CPU_MIPS             1
    303     #else
    304         #define TARGET_CPU_MIPS             0
    305     #endif
    306 #endif
    307 
    308 #if ( !defined( TARGET_CPU_PPC ) && !defined( TARGET_CPU_X86 ) && !defined( TARGET_CPU_MIPS ) )
    309     #error unknown CPU - update this file to support your CPU
    310 #endif
    311 
    312 #if 0
    313 #pragma mark == Byte Order ==
    314 #endif
    315 
    316 //===========================================================================================================================
    317 //	Byte Order
    318 //===========================================================================================================================
    319 
    320 // TARGET_RT_LITTLE_ENDIAN
    321 
    322 #if ( !defined( TARGET_RT_LITTLE_ENDIAN ) )
    323     #if ( MIPSEL || IL_LITTLE_ENDIAN || defined( __LITTLE_ENDIAN__ )                                         || \
    324     ( defined(   BYTE_ORDER ) && defined(   LITTLE_ENDIAN ) && (   BYTE_ORDER ==   LITTLE_ENDIAN ) )   || \
    325     ( defined(  _BYTE_ORDER ) && defined(  _LITTLE_ENDIAN ) && (  _BYTE_ORDER ==  _LITTLE_ENDIAN ) )   || \
    326     ( defined( __BYTE_ORDER ) && defined( __LITTLE_ENDIAN ) && ( __BYTE_ORDER == __LITTLE_ENDIAN ) )   || \
    327     TARGET_CPU_X86 || ( defined( TARGET_RT_BIG_ENDIAN ) && !TARGET_RT_BIG_ENDIAN ) )
    328         #define TARGET_RT_LITTLE_ENDIAN     1
    329     #else
    330         #define TARGET_RT_LITTLE_ENDIAN     0
    331     #endif
    332 #endif
    333 
    334 // TARGET_RT_BIG_ENDIAN
    335 
    336 #if ( !defined( TARGET_RT_BIG_ENDIAN ) )
    337     #if ( MIPSEB || IL_BIG_ENDIAN || defined( __BIG_ENDIAN__ )                                       || \
    338     ( defined(   BYTE_ORDER ) && defined(   BIG_ENDIAN ) && (   BYTE_ORDER ==   BIG_ENDIAN ) ) || \
    339     ( defined(  _BYTE_ORDER ) && defined(  _BIG_ENDIAN ) && (  _BYTE_ORDER ==  _BIG_ENDIAN ) ) || \
    340     ( defined( __BYTE_ORDER ) && defined( __BIG_ENDIAN ) && ( __BYTE_ORDER == __BIG_ENDIAN ) ) || \
    341     ( defined( TARGET_RT_LITTLE_ENDIAN ) && !TARGET_RT_LITTLE_ENDIAN ) )
    342         #define TARGET_RT_BIG_ENDIAN        1
    343     #else
    344         #define TARGET_RT_BIG_ENDIAN        0
    345     #endif
    346 #endif
    347 
    348 #if ( defined( TARGET_RT_LITTLE_ENDIAN ) && !defined( TARGET_RT_BIG_ENDIAN ) )
    349     #if ( TARGET_RT_LITTLE_ENDIAN )
    350         #define TARGET_RT_BIG_ENDIAN        0
    351     #else
    352         #define TARGET_RT_BIG_ENDIAN        1
    353     #endif
    354 #endif
    355 
    356 #if ( defined( TARGET_RT_BIG_ENDIAN ) && !defined( TARGET_RT_LITTLE_ENDIAN ) )
    357     #if ( TARGET_RT_BIG_ENDIAN )
    358         #define TARGET_RT_LITTLE_ENDIAN     0
    359     #else
    360         #define TARGET_RT_LITTLE_ENDIAN     1
    361     #endif
    362 #endif
    363 
    364 #if ( !defined( TARGET_RT_LITTLE_ENDIAN ) || !defined( TARGET_RT_BIG_ENDIAN ) )
    365     #error unknown byte order - update this file to support your byte order
    366 #endif
    367 
    368 // TARGET_RT_BYTE_ORDER
    369 
    370 #if ( !defined( TARGET_RT_BYTE_ORDER_BIG_ENDIAN ) )
    371     #define TARGET_RT_BYTE_ORDER_BIG_ENDIAN         1234
    372 #endif
    373 
    374 #if ( !defined( TARGET_RT_BYTE_ORDER_LITTLE_ENDIAN ) )
    375     #define TARGET_RT_BYTE_ORDER_LITTLE_ENDIAN      4321
    376 #endif
    377 
    378 #if ( !defined( TARGET_RT_BYTE_ORDER ) )
    379     #if ( TARGET_RT_LITTLE_ENDIAN )
    380         #define TARGET_RT_BYTE_ORDER                TARGET_RT_BYTE_ORDER_LITTLE_ENDIAN
    381     #else
    382         #define TARGET_RT_BYTE_ORDER                TARGET_RT_BYTE_ORDER_BIG_ENDIAN
    383     #endif
    384 #endif
    385 
    386 #if 0
    387 #pragma mark == Constants ==
    388 #endif
    389 
    390 //===========================================================================================================================
    391 //	Constants
    392 //===========================================================================================================================
    393 
    394 #if ( !TARGET_OS_MAC )
    395     #define CR      '\r'
    396 #endif
    397 
    398 #define LF          '\n'
    399 #define CRSTR       "\r"
    400 #define LFSTR       "\n"
    401 #define CRLF        "\r\n"
    402 #define CRCR        "\r\r"
    403 
    404 #if 0
    405 #pragma mark == Compatibility ==
    406 #endif
    407 
    408 //===========================================================================================================================
    409 //	Compatibility
    410 //===========================================================================================================================
    411 
    412 // Macros to allow the same code to work on Windows and other sockets API-compatible platforms.
    413 
    414 #if ( TARGET_OS_WIN32 )
    415     #define close_compat( X )       closesocket( X )
    416     #define errno_compat()          (int) GetLastError()
    417     #define set_errno_compat( X )   SetLastError( X )
    418     #define EWOULDBLOCK_compat      WSAEWOULDBLOCK
    419     #define ETIMEDOUT_compat        WSAETIMEDOUT
    420     #define ENOTCONN_compat         WSAENOTCONN
    421     #define IsValidSocket( X )      ( ( X ) != INVALID_SOCKET )
    422     #define kInvalidSocketRef       INVALID_SOCKET
    423 typedef SOCKET SocketRef;
    424 #else
    425     #define close_compat( X )       close( X )
    426     #define errno_compat()          errno
    427     #define set_errno_compat( X )   do { errno = ( X ); } while( 0 )
    428     #define EWOULDBLOCK_compat      EWOULDBLOCK
    429     #define ETIMEDOUT_compat        ETIMEDOUT
    430     #define ENOTCONN_compat         ENOTCONN
    431     #define IsValidSocket( X )      ( ( X ) >= 0 )
    432     #define kInvalidSocketRef       -1
    433 typedef int SocketRef;
    434 #endif
    435 
    436 // socklen_t is not defined on the following platforms so emulate it if not defined:
    437 //
    438 // - Pre-Panther Mac OS X. Panther defines SO_NOADDRERR so trigger off that.
    439 // - Windows SDK prior to 2003. 2003+ SDK's define EAI_AGAIN so trigger off that.
    440 
    441 #if ( ( TARGET_OS_MAC && !defined( SO_NOADDRERR ) ) || ( TARGET_OS_WIN32 && !defined( EAI_AGAIN ) ) )
    442 typedef int socklen_t;
    443 #endif
    444 
    445 // ssize_t is not defined on the following platforms so emulate it if not defined:
    446 //
    447 // - Mac OS X when not building with BSD headers
    448 // - Windows
    449 
    450 #if ( !defined(_SSIZE_T) && ( TARGET_OS_WIN32 || !defined( _BSD_SSIZE_T_DEFINED_ ) ) && !TARGET_OS_BSD && !TARGET_OS_LINUX && !TARGET_OS_MAC)
    451 typedef int ssize_t;
    452 #endif
    453 
    454 // sockaddr_storage is not supported on non-IPv6 machines so alias it to an IPv4-compatible structure.
    455 
    456 #if ( !defined( AF_INET6 ) )
    457         #define sockaddr_storage        sockaddr_in
    458         #define ss_family               sin_family
    459 #endif
    460 
    461 //---------------------------------------------------------------------------------------------------------------------------
    462 /*!	@defined	SOCKADDR_IS_IP_LOOPBACK
    463 
    464     @abstract	Determines if a sockaddr is an IPv4 or IPv6 loopback address (if IPv6 is supported).
    465  */
    466 
    467 #if ( defined( AF_INET6 ) )
    468     #define SOCKADDR_IS_IP_LOOPBACK( SA )                                                           \
    469     ( ( (const struct sockaddr *)( SA ) )->sa_family == AF_INET )                               \
    470     ? ( ( (const struct sockaddr_in *)( SA ) )->sin_addr.s_addr == htonl( INADDR_LOOPBACK ) )   \
    471     : ( ( (const struct sockaddr *)( SA ) )->sa_family == AF_INET6 )                            \
    472     ? IN6_IS_ADDR_LOOPBACK( &( (const struct sockaddr_in6 *)( SA ) )->sin6_addr )           \
    473     : 0
    474 #else
    475     #define SOCKADDR_IS_IP_LOOPBACK( SA )                                                           \
    476     ( ( (const struct sockaddr *)( SA ) )->sa_family == AF_INET )                               \
    477     ? ( ( (const struct sockaddr_in *)( SA ) )->sin_addr.s_addr == htonl( INADDR_LOOPBACK ) )   \
    478     : 0
    479 #endif
    480 
    481 //---------------------------------------------------------------------------------------------------------------------------
    482 /*!	@defined	SOCKADDR_IS_IP_LINK_LOCAL
    483 
    484     @abstract	Determines if a sockaddr is an IPv4 or IPv6 link-local address (if IPv6 is supported).
    485  */
    486 
    487 #if ( defined( AF_INET6 ) )
    488     #define SOCKADDR_IS_IP_LINK_LOCAL( SA )                                                             \
    489     ( ( ( (const struct sockaddr *)( SA ) )->sa_family == AF_INET )                                 \
    490       ? ( ( ( (uint8_t *)( &( (const struct sockaddr_in *)( SA ) )->sin_addr ) )[ 0 ] == 169 ) &&   \
    491           ( ( (uint8_t *)( &( (const struct sockaddr_in *)( SA ) )->sin_addr ) )[ 1 ] == 254 ) )    \
    492       : IN6_IS_ADDR_LOOPBACK( &( (const struct sockaddr_in6 *)( SA ) )->sin6_addr ) )
    493 #else
    494     #define SOCKADDR_IS_IP_LINK_LOCAL( SA )                                                             \
    495     ( ( ( (const struct sockaddr *)( SA ) )->sa_family == AF_INET )                                 \
    496       ? ( ( ( (uint8_t *)( &( (const struct sockaddr_in *)( SA ) )->sin_addr ) )[ 0 ] == 169 ) &&   \
    497           ( ( (uint8_t *)( &( (const struct sockaddr_in *)( SA ) )->sin_addr ) )[ 1 ] == 254 ) )    \
    498       : 0 )
    499 #endif
    500 
    501 // _beginthreadex and _endthreadex are not supported on Windows CE 2.1 or later (the C runtime issues with leaking
    502 // resources have apparently been resolved and they seem to have just ripped out support for the API) so map it to
    503 // CreateThread on Windows CE.
    504 
    505 #if ( TARGET_OS_WINDOWS_CE )
    506     #define _beginthreadex_compat( SECURITY_PTR, STACK_SIZE, START_ADDRESS, ARG_LIST, FLAGS, THREAD_ID_PTR )            \
    507     (uintptr_t) CreateThread( SECURITY_PTR, STACK_SIZE, (LPTHREAD_START_ROUTINE) START_ADDRESS, ARG_LIST, FLAGS,    \
    508                               (LPDWORD) THREAD_ID_PTR )
    509 
    510     #define _endthreadex_compat( RESULT )       ExitThread( (DWORD) RESULT )
    511 #elif ( TARGET_OS_WIN32 )
    512     #define _beginthreadex_compat               _beginthreadex
    513     #define _endthreadex_compat                 _endthreadex
    514 #endif
    515 
    516 // The C99 "inline" keyword is not supported by Microsoft compilers, but they do support __inline so map it when needed.
    517 
    518 #if ( defined( _MSC_VER ) )
    519     #define inline_compat       __inline
    520 #else
    521     #define inline_compat       inline
    522 #endif
    523 
    524 // Calling conventions
    525 
    526 #if ( !defined( CALLBACK_COMPAT ) )
    527     #if ( TARGET_OS_WIN32 || TARGET_OS_WINDOWS_CE )
    528         #define CALLBACK_COMPAT     CALLBACK
    529     #else
    530         #define CALLBACK_COMPAT
    531     #endif
    532 #endif
    533 
    534 #if 0
    535 #pragma mark == Macros ==
    536 #endif
    537 
    538 //---------------------------------------------------------------------------------------------------------------------------
    539 /*!	@defined	kSizeCString
    540 
    541     @abstract	A meta-value to pass to supported routines to indicate the size should be calculated with strlen.
    542  */
    543 
    544 #define kSizeCString        ( (size_t) -1 )
    545 
    546 //---------------------------------------------------------------------------------------------------------------------------
    547 /*!	@defined	sizeof_array
    548 
    549     @abstract	Determines the number of elements in an array.
    550  */
    551 
    552 #define sizeof_array( X )       ( sizeof( X ) / sizeof( X[ 0 ] ) )
    553 
    554 //---------------------------------------------------------------------------------------------------------------------------
    555 /*!	@defined	sizeof_element
    556 
    557     @abstract	Determines the size of an array element.
    558  */
    559 
    560 #define sizeof_element( X )     sizeof( X[ 0 ] )
    561 
    562 //---------------------------------------------------------------------------------------------------------------------------
    563 /*!	@defined	sizeof_string
    564 
    565     @abstract	Determines the size of a constant C string, excluding the null terminator.
    566  */
    567 
    568 #define sizeof_string( X )      ( sizeof( ( X ) ) - 1 )
    569 
    570 //---------------------------------------------------------------------------------------------------------------------------
    571 /*!	@defined	sizeof_field
    572 
    573     @abstract	Determines the size of a field of a type.
    574  */
    575 
    576 #define sizeof_field( TYPE, FIELD )     sizeof( ( ( (TYPE *) 0 )->FIELD ) )
    577 
    578 //---------------------------------------------------------------------------------------------------------------------------
    579 /*!	@function	RoundUp
    580 
    581     @abstract	Rounds X up to a multiple of Y.
    582  */
    583 
    584 #define RoundUp( X, Y )     ( ( X ) + ( ( Y ) -( ( X ) % ( Y ) ) ) )
    585 
    586 //---------------------------------------------------------------------------------------------------------------------------
    587 /*!	@function	IsAligned
    588 
    589     @abstract	Returns non-zero if X is aligned to a Y byte boundary and 0 if not. Y must be a power of 2.
    590  */
    591 
    592 #define IsAligned( X, Y )       ( ( ( X ) &( ( Y ) -1 ) ) == 0 )
    593 
    594 //---------------------------------------------------------------------------------------------------------------------------
    595 /*!	@function	IsFieldAligned
    596 
    597     @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.
    598  */
    599 
    600 #define IsFieldAligned( X, TYPE, FIELD, Y )     IsAligned( ( (uintptr_t)( X ) ) + offsetof( TYPE, FIELD ), ( Y ) )
    601 
    602 //---------------------------------------------------------------------------------------------------------------------------
    603 /*!	@function	AlignDown
    604 
    605     @abstract	Aligns X down to a Y byte boundary. Y must be a power of 2.
    606  */
    607 
    608 #define AlignDown( X, Y )       ( ( X ) &~( ( Y ) -1 ) )
    609 
    610 //---------------------------------------------------------------------------------------------------------------------------
    611 /*!	@function	AlignUp
    612 
    613     @abstract	Aligns X up to a Y byte boundary. Y must be a power of 2.
    614  */
    615 
    616 #define AlignUp( X, Y )     ( ( ( X ) + ( ( Y ) -1 ) ) & ~( ( Y ) -1 ) )
    617 
    618 //---------------------------------------------------------------------------------------------------------------------------
    619 /*!	@function	Min
    620 
    621     @abstract	Returns the lesser of X and Y.
    622  */
    623 
    624 #if ( !defined( Min ) )
    625     #define Min( X, Y )     ( ( ( X ) < ( Y ) ) ? ( X ) : ( Y ) )
    626 #endif
    627 
    628 //---------------------------------------------------------------------------------------------------------------------------
    629 /*!	@function	Max
    630 
    631     @abstract	Returns the greater of X and Y.
    632  */
    633 
    634 #if ( !defined( Max ) )
    635     #define Max( X, Y )     ( ( ( X ) > ( Y ) ) ? ( X ) : ( Y ) )
    636 #endif
    637 
    638 //---------------------------------------------------------------------------------------------------------------------------
    639 /*!	@function	InsertBits
    640 
    641     @abstract	Inserts BITS (both 0 and 1 bits) into X, controlled by MASK and SHIFT, and returns the result.
    642 
    643     @discussion
    644 
    645     MASK is the bitmask of the bits in the final position.
    646     SHIFT is the number of bits to shift left for 1 to reach the first bit position of MASK.
    647 
    648     For example, if you wanted to insert 0x3 into the leftmost 4 bits of a 32-bit value:
    649 
    650     InsertBits( 0, 0x3, 0xF0000000U, 28 ) == 0x30000000
    651  */
    652 
    653 #define InsertBits( X, BITS, MASK, SHIFT )      ( ( ( X ) &~( MASK ) ) | ( ( ( BITS ) << ( SHIFT ) ) & ( MASK ) ) )
    654 
    655 //---------------------------------------------------------------------------------------------------------------------------
    656 /*!	@function	ExtractBits
    657 
    658     @abstract	Extracts bits from X, controlled by MASK and SHIFT, and returns the result.
    659 
    660     @discussion
    661 
    662     MASK is the bitmask of the bits in the final position.
    663     SHIFT is the number of bits to shift right to right justify MASK.
    664 
    665     For example, if you had a 32-bit value (e.g. 0x30000000) wanted the left-most 4 bits (e.g. 3 in this example):
    666 
    667     ExtractBits( 0x30000000U, 0xF0000000U, 28 ) == 0x3
    668  */
    669 
    670 #define ExtractBits( X, MASK, SHIFT )           ( ( ( X ) >> ( SHIFT ) ) & ( ( MASK ) >> ( SHIFT ) ) )
    671 
    672 //---------------------------------------------------------------------------------------------------------------------------
    673 /*!	@function	Stringify
    674 
    675     @abstract	Stringify's an expression.
    676 
    677     @discussion
    678 
    679     Stringify macros to process raw text passed via -D options to C string constants. The double-wrapping is necessary
    680     because the C preprocessor doesn't perform its normal argument expansion pre-scan with stringified macros so the
    681     -D macro needs to be expanded once via the wrapper macro then stringified so the raw text is stringified. Otherwise,
    682     the replacement value would be used instead of the symbolic name (only for preprocessor symbols like #defines).
    683 
    684     For example:
    685 
    686  #define	kMyConstant		1
    687 
    688         printf( "%s", Stringify( kMyConstant ) );			// Prints "kMyConstant"
    689         printf( "%s", StringifyExpansion( kMyConstant ) );	// Prints "1"
    690 
    691     Non-preprocessor symbols do not have this issue. For example:
    692 
    693         enum
    694         {
    695             kMyConstant = 1
    696         };
    697 
    698         printf( "%s", Stringify( kMyConstant ) );			// Prints "kMyConstant"
    699         printf( "%s", StringifyExpansion( kMyConstant ) );	// Prints "kMyConstant"
    700 
    701     See <http://gcc.gnu.org/onlinedocs/cpp/Argument-Prescan.html> for more info on C preprocessor pre-scanning.
    702  */
    703 
    704 #define Stringify( X )              # X
    705 #define StringifyExpansion( X )     Stringify( X )
    706 
    707 #if 0
    708 #pragma mark == Types ==
    709 #endif
    710 
    711 //===========================================================================================================================
    712 //	 Standard Types
    713 //===========================================================================================================================
    714 
    715 #if ( !defined( INT8_MIN ) )
    716 
    717     #define INT8_MIN                    SCHAR_MIN
    718 
    719     #if ( defined( _MSC_VER ) )
    720 
    721 // C99 stdint.h not supported in VC++/VS.NET yet.
    722 
    723 typedef INT8 int8_t;
    724 typedef UINT8 uint8_t;
    725 typedef INT16 int16_t;
    726 typedef UINT16 uint16_t;
    727 typedef INT32 int32_t;
    728 typedef UINT32 uint32_t;
    729 typedef __int64 int64_t;
    730 typedef unsigned __int64 uint64_t;
    731     #endif
    732 
    733 typedef int8_t int_least8_t;
    734 typedef int16_t int_least16_t;
    735 typedef int32_t int_least32_t;
    736 typedef int64_t int_least64_t;
    737 
    738 typedef uint8_t uint_least8_t;
    739 typedef uint16_t uint_least16_t;
    740 typedef uint32_t uint_least32_t;
    741 typedef uint64_t uint_least64_t;
    742 
    743 typedef int8_t int_fast8_t;
    744 typedef int16_t int_fast16_t;
    745 typedef int32_t int_fast32_t;
    746 typedef int64_t int_fast64_t;
    747 
    748 typedef uint8_t uint_fast8_t;
    749 typedef uint16_t uint_fast16_t;
    750 typedef uint32_t uint_fast32_t;
    751 typedef uint64_t uint_fast64_t;
    752 
    753     #if ( !defined( _MSC_VER ) || TARGET_OS_WINDOWS_CE )
    754 typedef long int intptr_t;
    755 typedef unsigned long int uintptr_t;
    756     #endif
    757 
    758 #endif
    759 
    760 // Macros for minimum-width integer constants
    761 
    762 #if ( !defined( INT8_C ) )
    763     #define INT8_C( value )         value
    764 #endif
    765 
    766 #if ( !defined( INT16_C ) )
    767     #define INT16_C( value )        value
    768 #endif
    769 
    770 #if ( !defined( INT32_C ) )
    771     #define INT32_C( value )        value ## L
    772 #endif
    773 
    774 #if ( !defined( INT64_C ) )
    775     #if ( defined( _MSC_VER ) )
    776         #define INT64_C( value )    value ## i64
    777     #else
    778         #define INT64_C( value )    value ## LL
    779     #endif
    780 #endif
    781 
    782 #if ( !defined( UINT8_C ) )
    783     #define UINT8_C( value )        value ## U
    784 #endif
    785 
    786 #if ( !defined( UINT16_C ) )
    787     #define UINT16_C( value )       value ## U
    788 #endif
    789 
    790 #if ( !defined( UINT32_C ) )
    791     #define UINT32_C( value )       value ## UL
    792 #endif
    793 
    794 #if ( !defined( UINT64_C ) )
    795     #if ( defined( _MSC_VER ) )
    796         #define UINT64_C( value )   value ## UI64
    797     #else
    798         #define UINT64_C( value )   value ## ULL
    799     #endif
    800 #endif
    801 
    802 // Limits
    803 
    804 #if( !defined( UINT32_MAX ) )
    805     #define UINT32_MAX      UINT32_C( 4294967295 )
    806 #endif
    807 
    808 #if 0
    809 #pragma mark == bool ==
    810 #endif
    811 
    812 //===========================================================================================================================
    813 //	 Boolean Constants and Types
    814 //===========================================================================================================================
    815 
    816 // C++ defines bool, true, and false. Metrowerks allows this to be controlled by the "bool" option though.
    817 // C99 defines __bool_true_false_are_defined when bool, true, and false are defined.
    818 // MacTypes.h defines true and false (Mac builds only).
    819 //
    820 // Note: The Metrowerks has to be in its own block because Microsoft Visual Studio .NET does not completely
    821 // short-circuit and gets confused by the option( bool ) portion of the conditional.
    822 
    823 #if ( defined( __MWERKS__ ) )
    824 
    825 // Note: The following test is done on separate lines because CodeWarrior doesn't like it all on one line.
    826 
    827     #if ( !__bool_true_false_are_defined && ( !defined( __cplusplus ) || !__option( bool ) ) )
    828         #define COMMON_SERVICES_NEEDS_BOOL      1
    829     #else
    830         #define COMMON_SERVICES_NEEDS_BOOL      0
    831     #endif
    832 
    833 // Workaround when building with CodeWarrior, but using the Apple stdbool.h header, which uses _Bool.
    834 
    835     #if ( __bool_true_false_are_defined && !defined( __cplusplus ) && !__option( c9x ) )
    836         #define _Bool int
    837     #endif
    838 
    839 // Workaround when building with CodeWarrior for C++ with bool disabled and using the Apple stdbool.h header,
    840 // which defines true and false to map to C++ true and false (which are not enabled). Serenity Now!
    841 
    842     #if ( __bool_true_false_are_defined && defined( __cplusplus ) && !__option( bool ) )
    843         #define true    1
    844         #define false   0
    845     #endif
    846 #else
    847     #if ( !defined( __cplusplus ) && !__bool_true_false_are_defined )
    848         #define COMMON_SERVICES_NEEDS_BOOL      1
    849     #else
    850         #define COMMON_SERVICES_NEEDS_BOOL      0
    851     #endif
    852 #endif
    853 
    854 #if ( COMMON_SERVICES_NEEDS_BOOL )
    855 
    856 typedef int bool;
    857 
    858     #define bool bool
    859 
    860     #if ( !defined( __MACTYPES__ ) && !defined( true ) && !defined( false ) )
    861         #define true    1
    862         #define false   0
    863     #endif
    864 
    865     #define __bool_true_false_are_defined       1
    866 #endif
    867 
    868 // IOKit IOTypes.h typedef's bool if TYPE_BOOL is not defined so define it here to prevent redefinition by IOTypes.h.
    869 
    870 #if ( TARGET_API_MAC_OSX_KERNEL )
    871     #define TYPE_BOOL       1
    872 #endif
    873 
    874 //---------------------------------------------------------------------------------------------------------------------------
    875 /*!	@typedef	CStr255
    876 
    877     @abstract	255 character null-terminated (C-style) string.
    878  */
    879 
    880 typedef char CStr255[ 256 ];
    881 
    882 //---------------------------------------------------------------------------------------------------------------------------
    883 /*!	@defined	TYPE_LONGLONG_NATIVE
    884 
    885     @abstract	Defines whether long long (or its equivalent) is natively supported or requires special libraries.
    886  */
    887 
    888 #if ( !defined( TYPE_LONGLONG_NATIVE ) )
    889     #define TYPE_LONGLONG_NATIVE            1
    890 #endif
    891 
    892 //---------------------------------------------------------------------------------------------------------------------------
    893 /*!	@defined	long_long_compat
    894 
    895     @abstract	Compatibility type to map to the closest thing to long long and unsigned long long.
    896 
    897     @discussion
    898 
    899     Neither long long nor unsigned long long are supported by Microsoft compilers, but they do support proprietary
    900     "__int64" and "unsigned __int64" equivalents so map to those types if the real long long is not supported.
    901  */
    902 
    903 #if ( TARGET_OS_WIN32 )
    904 typedef __int64 long_long_compat;
    905 typedef unsigned __int64 unsigned_long_long_compat;
    906 #else
    907 typedef signed long long long_long_compat;
    908 typedef unsigned long long unsigned_long_long_compat;
    909 #endif
    910 
    911 #if 0
    912 #pragma mark == Errors ==
    913 #endif
    914 
    915 //---------------------------------------------------------------------------------------------------------------------------
    916 /*!	@enum		OSStatus
    917 
    918     @abstract	Status Code
    919 
    920     @constant	kNoErr						    0 No error occurred.
    921     @constant	kInProgressErr				    1 Operation in progress.
    922     @constant	kUnknownErr					-6700 Unknown error occurred.
    923     @constant	kOptionErr					-6701 Option was not acceptable.
    924     @constant	kSelectorErr				-6702 Selector passed in is invalid or unknown.
    925     @constant	kExecutionStateErr			-6703 Call made in the wrong execution state (e.g. called at interrupt time).
    926     @constant	kPathErr					-6704 Path is invalid, too long, or otherwise not usable.
    927     @constant	kParamErr					-6705 Parameter is incorrect, missing, or not appropriate.
    928     @constant	kParamCountErr				-6706 Incorrect or unsupported number of parameters.
    929     @constant	kCommandErr					-6707 Command invalid or not supported.
    930     @constant	kIDErr						-6708 Unknown, invalid, or inappropriate identifier.
    931     @constant	kStateErr					-6709 Not in appropriate state to perform operation.
    932     @constant	kRangeErr					-6710 Index is out of range or not valid.
    933     @constant	kRequestErr					-6711 Request was improperly formed or not appropriate.
    934     @constant	kResponseErr				-6712 Response was incorrect or out of sequence.
    935     @constant	kChecksumErr				-6713 Checksum does not match the actual data.
    936     @constant	kNotHandledErr				-6714 Operation was not handled (or not handled completely).
    937     @constant	kVersionErr					-6715 Version is not incorrect or not compatibile.
    938     @constant	kSignatureErr				-6716 Signature did not match what was expected.
    939     @constant	kFormatErr					-6717 Unknown, invalid, or inappropriate file/data format.
    940     @constant	kNotInitializedErr			-6718 Action request before needed services were initialized.
    941     @constant	kAlreadyInitializedErr		-6719 Attempt made to initialize when already initialized.
    942     @constant	kNotInUseErr				-6720 Object not in use (e.g. cannot abort if not already in use).
    943     @constant	kInUseErr					-6721 Object is in use (e.g. cannot reuse active param blocks).
    944     @constant	kTimeoutErr					-6722 Timeout occurred.
    945     @constant	kCanceledErr				-6723 Operation canceled (successful cancel).
    946     @constant	kAlreadyCanceledErr			-6724 Operation has already been canceled.
    947     @constant	kCannotCancelErr			-6725 Operation could not be canceled (maybe already done or invalid).
    948     @constant	kDeletedErr					-6726 Object has already been deleted.
    949     @constant	kNotFoundErr				-6727 Something was not found.
    950     @constant	kNoMemoryErr				-6728 Not enough memory was available to perform the operation.
    951     @constant	kNoResourcesErr				-6729 Resources unavailable to perform the operation.
    952     @constant	kDuplicateErr				-6730 Duplicate found or something is a duplicate.
    953     @constant	kImmutableErr				-6731 Entity is not changeable.
    954     @constant	kUnsupportedDataErr			-6732 Data is unknown or not supported.
    955     @constant	kIntegrityErr				-6733 Data is corrupt.
    956     @constant	kIncompatibleErr			-6734 Data is not compatible or it is in an incompatible format.
    957     @constant	kUnsupportedErr				-6735 Feature or option is not supported.
    958     @constant	kUnexpectedErr				-6736 Error occurred that was not expected.
    959     @constant	kValueErr					-6737 Value is not appropriate.
    960     @constant	kNotReadableErr				-6738 Could not read or reading is not allowed.
    961     @constant	kNotWritableErr				-6739 Could not write or writing is not allowed.
    962     @constant	kBadReferenceErr			-6740 An invalid or inappropriate reference was specified.
    963     @constant	kFlagErr					-6741 An invalid, inappropriate, or unsupported flag was specified.
    964     @constant	kMalformedErr				-6742 Something was not formed correctly.
    965     @constant	kSizeErr					-6743 Size was too big, too small, or not appropriate.
    966     @constant	kNameErr					-6744 Name was not correct, allowed, or appropriate.
    967     @constant	kNotReadyErr				-6745 Device or service is not ready.
    968     @constant	kReadErr					-6746 Could not read.
    969     @constant	kWriteErr					-6747 Could not write.
    970     @constant	kMismatchErr				-6748 Something does not match.
    971     @constant	kDateErr					-6749 Date is invalid or out-of-range.
    972     @constant	kUnderrunErr				-6750 Less data than expected.
    973     @constant	kOverrunErr					-6751 More data than expected.
    974     @constant	kEndingErr					-6752 Connection, session, or something is ending.
    975     @constant	kConnectionErr				-6753 Connection failed or could not be established.
    976     @constant	kAuthenticationErr			-6754 Authentication failed or is not supported.
    977     @constant	kOpenErr					-6755 Could not open file, pipe, device, etc.
    978     @constant	kTypeErr					-6756 Incorrect or incompatible type (e.g. file, data, etc.).
    979     @constant	kSkipErr					-6757 Items should be or was skipped.
    980     @constant	kNoAckErr					-6758 No acknowledge.
    981     @constant	kCollisionErr				-6759 Collision occurred (e.g. two on bus at same time).
    982     @constant	kBackoffErr					-6760 Backoff in progress and operation intentionally failed.
    983     @constant	kNoAddressAckErr			-6761 No acknowledge of address.
    984     @constant	kBusyErr					-6762 Cannot perform because something is busy.
    985     @constant	kNoSpaceErr					-6763 Not enough space to perform operation.
    986  */
    987 
    988 #if ( !TARGET_OS_MAC && !TARGET_API_MAC_OSX_KERNEL )
    989 typedef int32_t OSStatus;
    990 #endif
    991 
    992 #define kNoErr                      0
    993 #define kInProgressErr              1
    994 
    995 // Generic error codes are in the range -6700 to -6779.
    996 
    997 #define kGenericErrorBase           -6700   // Starting error code for all generic errors.
    998 
    999 #define kUnknownErr                 -6700
   1000 #define kOptionErr                  -6701
   1001 #define kSelectorErr                -6702
   1002 #define kExecutionStateErr          -6703
   1003 #define kPathErr                    -6704
   1004 #define kParamErr                   -6705
   1005 #define kParamCountErr              -6706
   1006 #define kCommandErr                 -6707
   1007 #define kIDErr                      -6708
   1008 #define kStateErr                   -6709
   1009 #define kRangeErr                   -6710
   1010 #define kRequestErr                 -6711
   1011 #define kResponseErr                -6712
   1012 #define kChecksumErr                -6713
   1013 #define kNotHandledErr              -6714
   1014 #define kVersionErr                 -6715
   1015 #define kSignatureErr               -6716
   1016 #define kFormatErr                  -6717
   1017 #define kNotInitializedErr          -6718
   1018 #define kAlreadyInitializedErr      -6719
   1019 #define kNotInUseErr                -6720
   1020 #define kInUseErr                   -6721
   1021 #define kTimeoutErr                 -6722
   1022 #define kCanceledErr                -6723
   1023 #define kAlreadyCanceledErr         -6724
   1024 #define kCannotCancelErr            -6725
   1025 #define kDeletedErr                 -6726
   1026 #define kNotFoundErr                -6727
   1027 #define kNoMemoryErr                -6728
   1028 #define kNoResourcesErr             -6729
   1029 #define kDuplicateErr               -6730
   1030 #define kImmutableErr               -6731
   1031 #define kUnsupportedDataErr         -6732
   1032 #define kIntegrityErr               -6733
   1033 #define kIncompatibleErr            -6734
   1034 #define kUnsupportedErr             -6735
   1035 #define kUnexpectedErr              -6736
   1036 #define kValueErr                   -6737
   1037 #define kNotReadableErr             -6738
   1038 #define kNotWritableErr             -6739
   1039 #define kBadReferenceErr            -6740
   1040 #define kFlagErr                    -6741
   1041 #define kMalformedErr               -6742
   1042 #define kSizeErr                    -6743
   1043 #define kNameErr                    -6744
   1044 #define kNotReadyErr                -6745
   1045 #define kReadErr                    -6746
   1046 #define kWriteErr                   -6747
   1047 #define kMismatchErr                -6748
   1048 #define kDateErr                    -6749
   1049 #define kUnderrunErr                -6750
   1050 #define kOverrunErr                 -6751
   1051 #define kEndingErr                  -6752
   1052 #define kConnectionErr              -6753
   1053 #define kAuthenticationErr          -6754
   1054 #define kOpenErr                    -6755
   1055 #define kTypeErr                    -6756
   1056 #define kSkipErr                    -6757
   1057 #define kNoAckErr                   -6758
   1058 #define kCollisionErr               -6759
   1059 #define kBackoffErr                 -6760
   1060 #define kNoAddressAckErr            -6761
   1061 #define kBusyErr                    -6762
   1062 #define kNoSpaceErr                 -6763
   1063 
   1064 #define kGenericErrorEnd            -6779   // Last generic error code (inclusive)
   1065 
   1066 #if 0
   1067 #pragma mark == Mac Compatibility ==
   1068 #endif
   1069 
   1070 //===========================================================================================================================
   1071 //	Mac Compatibility
   1072 //===========================================================================================================================
   1073 
   1074 //---------------------------------------------------------------------------------------------------------------------------
   1075 /*!	@enum		Duration
   1076 
   1077     @abstract	Type used to specify a duration of time.
   1078 
   1079     @constant	kDurationImmediate			Indicates no delay/wait time.
   1080     @constant	kDurationMicrosecond		Microsecond units.
   1081     @constant	kDurationMillisecond		Millisecond units.
   1082     @constant	kDurationSecond				Second units.
   1083     @constant	kDurationMinute				Minute units.
   1084     @constant	kDurationHour				Hour units.
   1085     @constant	kDurationDay				Day units.
   1086     @constant	kDurationForever			Infinite period of time (no timeout).
   1087 
   1088     @discussion
   1089 
   1090     Duration values are intended to be multiplied by the specific interval to achieve an actual duration. For example,
   1091     to wait for 5 seconds you would use "5 * kDurationSecond".
   1092  */
   1093 
   1094 #if ( !TARGET_OS_MAC )
   1095 typedef int32_t Duration;
   1096 #endif
   1097 
   1098 #define kDurationImmediate              0L
   1099 #define kDurationMicrosecond            -1L
   1100 #define kDurationMillisecond            1L
   1101 #define kDurationSecond                 ( 1000L * kDurationMillisecond )
   1102 #define kDurationMinute                 ( 60L * kDurationSecond )
   1103 #define kDurationHour                   ( 60L * kDurationMinute )
   1104 #define kDurationDay                    ( 24L * kDurationHour )
   1105 #define kDurationForever                0x7FFFFFFFL
   1106 
   1107 // Seconds <-> Minutes <-> Hours <-> Days <-> Weeks <-> Months <-> Years conversions
   1108 
   1109 #define kNanosecondsPerMicrosecond      1000
   1110 #define kNanosecondsPerMillisecond      1000000
   1111 #define kNanosecondsPerSecond           1000000000
   1112 #define kMicrosecondsPerSecond          1000000
   1113 #define kMicrosecondsPerMillisecond     1000
   1114 #define kMillisecondsPerSecond          1000
   1115 #define kSecondsPerMinute               60
   1116 #define kSecondsPerHour                 ( 60 * 60 )             // 3600
   1117 #define kSecondsPerDay                  ( 60 * 60 * 24 )        // 86400
   1118 #define kSecondsPerWeek                 ( 60 * 60 * 24 * 7 )    // 604800
   1119 #define kMinutesPerHour                 60
   1120 #define kMinutesPerDay                  ( 60 * 24 )             // 1440
   1121 #define kHoursPerDay                    24
   1122 #define kDaysPerWeek                    7
   1123 #define kWeeksPerYear                   52
   1124 #define kMonthsPerYear                  12
   1125 
   1126 //---------------------------------------------------------------------------------------------------------------------------
   1127 /*!	@defined	VersionStages
   1128 
   1129     @abstract	NumVersion-style version stages.
   1130  */
   1131 
   1132 #define kVersionStageDevelopment        0x20
   1133 #define kVersionStageAlpha              0x40
   1134 #define kVersionStageBeta               0x60
   1135 #define kVersionStageFinal              0x80
   1136 
   1137 //---------------------------------------------------------------------------------------------------------------------------
   1138 /*!	@function	NumVersionBuild
   1139 
   1140     @abstract	Builds a 32-bit Mac-style NumVersion value (e.g. NumVersionBuild( 1, 2, 3, kVersionStageBeta, 4 ) -> 1.2.3b4).
   1141  */
   1142 
   1143 #define NumVersionBuild( MAJOR, MINOR, BUGFIX, STAGE, REV ) \
   1144     ( ( ( ( MAJOR )  & 0xFF ) << 24 ) |                     \
   1145       ( ( ( MINOR )  & 0x0F ) << 20 ) |                     \
   1146       ( ( ( BUGFIX ) & 0x0F ) << 16 ) |                     \
   1147       ( ( ( STAGE )  & 0xFF ) <<  8 ) |                     \
   1148       ( ( ( REV )    & 0xFF )       ) )
   1149 
   1150 #define NumVersionExtractMajor( VERSION )               ( (uint8_t)( ( ( VERSION ) >> 24 ) & 0xFF ) )
   1151 #define NumVersionExtractMinorAndBugFix( VERSION )      ( (uint8_t)( ( ( VERSION ) >> 16 ) & 0xFF ) )
   1152 #define NumVersionExtractMinor( VERSION )               ( (uint8_t)( ( ( VERSION ) >> 20 ) & 0x0F ) )
   1153 #define NumVersionExtractBugFix( VERSION )              ( (uint8_t)( ( ( VERSION ) >> 16 ) & 0x0F ) )
   1154 #define NumVersionExtractStage( VERSION )               ( (uint8_t)( ( ( VERSION ) >>  8 ) & 0xFF ) )
   1155 #define NumVersionExtractRevision( VERSION )            ( (uint8_t)(   ( VERSION )         & 0xFF ) )
   1156 
   1157 //---------------------------------------------------------------------------------------------------------------------------
   1158 /*!	@function	NumVersionCompare
   1159 
   1160     @abstract	Compares two NumVersion values and returns the following values:
   1161 
   1162         left < right -> -1
   1163         left > right ->  1
   1164         left = right ->  0
   1165  */
   1166 
   1167 int NumVersionCompare( uint32_t inLeft, uint32_t inRight );
   1168 
   1169 #if 0
   1170 #pragma mark == Binary Constants ==
   1171 #endif
   1172 
   1173 //---------------------------------------------------------------------------------------------------------------------------
   1174 /*!	@defined	binary_4
   1175 
   1176     @abstract	Macro to generate an 4-bit constant using binary notation (e.g. binary_4( 1010 ) == 0xA).
   1177  */
   1178 
   1179 #define binary_4( a )                       binary_4_hex_wrap( hex_digit4( a ) )
   1180 #define binary_4_hex_wrap( a )              binary_4_hex( a )
   1181 #define binary_4_hex( a )                   ( 0x ## a )
   1182 
   1183 //---------------------------------------------------------------------------------------------------------------------------
   1184 /*!	@defined	binary_8
   1185 
   1186     @abstract	Macro to generate an 8-bit constant using binary notation (e.g. binary_8( 01111011 ) == 0x7B).
   1187  */
   1188 
   1189 #define binary_8( a )                       binary_8_hex_wrap( hex_digit8( a ) )
   1190 #define binary_8_hex_wrap( a )              binary_8_hex( a )
   1191 #define binary_8_hex( a )                   ( 0x ## a )
   1192 
   1193 //---------------------------------------------------------------------------------------------------------------------------
   1194 /*!	@defined	binary_16
   1195 
   1196     @abstract	Macro to generate an 16-bit constant using binary notation (e.g. binary_16( 01111011, 01111011 ) == 0x7B7B).
   1197  */
   1198 
   1199 #define binary_16( a, b )                   binary_16_hex_wrap( hex_digit8( a ), hex_digit8( b ) )
   1200 #define binary_16_hex_wrap( a, b )          binary_16_hex( a, b )
   1201 #define binary_16_hex( a, b )               ( 0x ## a ## b )
   1202 
   1203 //---------------------------------------------------------------------------------------------------------------------------
   1204 /*!	@defined	binary_32
   1205 
   1206     @abstract	Macro to generate an 32-bit constant using binary notation
   1207                 (e.g. binary_32( 01111011, 01111011, 01111011, 01111011 ) == 0x7B7B7B7B).
   1208  */
   1209 
   1210 #define binary_32( a, b, c, d )             binary_32_hex_wrap( hex_digit8( a ), hex_digit8( b ), hex_digit8( c ), hex_digit8( d ) )
   1211 #define binary_32_hex_wrap( a, b, c, d )    binary_32_hex( a, b, c, d )
   1212 #define binary_32_hex( a, b, c, d )         ( 0x ## a ## b ## c ## d )
   1213 
   1214 // Binary Constant Helpers
   1215 
   1216 #define hex_digit8( a )                     HEX_DIGIT_ ## a
   1217 #define hex_digit4( a )                     HEX_DIGIT_ ## 0000 ## a
   1218 
   1219 #define HEX_DIGIT_00000000                  00
   1220 #define HEX_DIGIT_00000001                  01
   1221 #define HEX_DIGIT_00000010                  02
   1222 #define HEX_DIGIT_00000011                  03
   1223 #define HEX_DIGIT_00000100                  04
   1224 #define HEX_DIGIT_00000101                  05
   1225 #define HEX_DIGIT_00000110                  06
   1226 #define HEX_DIGIT_00000111                  07
   1227 #define HEX_DIGIT_00001000                  08
   1228 #define HEX_DIGIT_00001001                  09
   1229 #define HEX_DIGIT_00001010                  0A
   1230 #define HEX_DIGIT_00001011                  0B
   1231 #define HEX_DIGIT_00001100                  0C
   1232 #define HEX_DIGIT_00001101                  0D
   1233 #define HEX_DIGIT_00001110                  0E
   1234 #define HEX_DIGIT_00001111                  0F
   1235 #define HEX_DIGIT_00010000                  10
   1236 #define HEX_DIGIT_00010001                  11
   1237 #define HEX_DIGIT_00010010                  12
   1238 #define HEX_DIGIT_00010011                  13
   1239 #define HEX_DIGIT_00010100                  14
   1240 #define HEX_DIGIT_00010101                  15
   1241 #define HEX_DIGIT_00010110                  16
   1242 #define HEX_DIGIT_00010111                  17
   1243 #define HEX_DIGIT_00011000                  18
   1244 #define HEX_DIGIT_00011001                  19
   1245 #define HEX_DIGIT_00011010                  1A
   1246 #define HEX_DIGIT_00011011                  1B
   1247 #define HEX_DIGIT_00011100                  1C
   1248 #define HEX_DIGIT_00011101                  1D
   1249 #define HEX_DIGIT_00011110                  1E
   1250 #define HEX_DIGIT_00011111                  1F
   1251 #define HEX_DIGIT_00100000                  20
   1252 #define HEX_DIGIT_00100001                  21
   1253 #define HEX_DIGIT_00100010                  22
   1254 #define HEX_DIGIT_00100011                  23
   1255 #define HEX_DIGIT_00100100                  24
   1256 #define HEX_DIGIT_00100101                  25
   1257 #define HEX_DIGIT_00100110                  26
   1258 #define HEX_DIGIT_00100111                  27
   1259 #define HEX_DIGIT_00101000                  28
   1260 #define HEX_DIGIT_00101001                  29
   1261 #define HEX_DIGIT_00101010                  2A
   1262 #define HEX_DIGIT_00101011                  2B
   1263 #define HEX_DIGIT_00101100                  2C
   1264 #define HEX_DIGIT_00101101                  2D
   1265 #define HEX_DIGIT_00101110                  2E
   1266 #define HEX_DIGIT_00101111                  2F
   1267 #define HEX_DIGIT_00110000                  30
   1268 #define HEX_DIGIT_00110001                  31
   1269 #define HEX_DIGIT_00110010                  32
   1270 #define HEX_DIGIT_00110011                  33
   1271 #define HEX_DIGIT_00110100                  34
   1272 #define HEX_DIGIT_00110101                  35
   1273 #define HEX_DIGIT_00110110                  36
   1274 #define HEX_DIGIT_00110111                  37
   1275 #define HEX_DIGIT_00111000                  38
   1276 #define HEX_DIGIT_00111001                  39
   1277 #define HEX_DIGIT_00111010                  3A
   1278 #define HEX_DIGIT_00111011                  3B
   1279 #define HEX_DIGIT_00111100                  3C
   1280 #define HEX_DIGIT_00111101                  3D
   1281 #define HEX_DIGIT_00111110                  3E
   1282 #define HEX_DIGIT_00111111                  3F
   1283 #define HEX_DIGIT_01000000                  40
   1284 #define HEX_DIGIT_01000001                  41
   1285 #define HEX_DIGIT_01000010                  42
   1286 #define HEX_DIGIT_01000011                  43
   1287 #define HEX_DIGIT_01000100                  44
   1288 #define HEX_DIGIT_01000101                  45
   1289 #define HEX_DIGIT_01000110                  46
   1290 #define HEX_DIGIT_01000111                  47
   1291 #define HEX_DIGIT_01001000                  48
   1292 #define HEX_DIGIT_01001001                  49
   1293 #define HEX_DIGIT_01001010                  4A
   1294 #define HEX_DIGIT_01001011                  4B
   1295 #define HEX_DIGIT_01001100                  4C
   1296 #define HEX_DIGIT_01001101                  4D
   1297 #define HEX_DIGIT_01001110                  4E
   1298 #define HEX_DIGIT_01001111                  4F
   1299 #define HEX_DIGIT_01010000                  50
   1300 #define HEX_DIGIT_01010001                  51
   1301 #define HEX_DIGIT_01010010                  52
   1302 #define HEX_DIGIT_01010011                  53
   1303 #define HEX_DIGIT_01010100                  54
   1304 #define HEX_DIGIT_01010101                  55
   1305 #define HEX_DIGIT_01010110                  56
   1306 #define HEX_DIGIT_01010111                  57
   1307 #define HEX_DIGIT_01011000                  58
   1308 #define HEX_DIGIT_01011001                  59
   1309 #define HEX_DIGIT_01011010                  5A
   1310 #define HEX_DIGIT_01011011                  5B
   1311 #define HEX_DIGIT_01011100                  5C
   1312 #define HEX_DIGIT_01011101                  5D
   1313 #define HEX_DIGIT_01011110                  5E
   1314 #define HEX_DIGIT_01011111                  5F
   1315 #define HEX_DIGIT_01100000                  60
   1316 #define HEX_DIGIT_01100001                  61
   1317 #define HEX_DIGIT_01100010                  62
   1318 #define HEX_DIGIT_01100011                  63
   1319 #define HEX_DIGIT_01100100                  64
   1320 #define HEX_DIGIT_01100101                  65
   1321 #define HEX_DIGIT_01100110                  66
   1322 #define HEX_DIGIT_01100111                  67
   1323 #define HEX_DIGIT_01101000                  68
   1324 #define HEX_DIGIT_01101001                  69
   1325 #define HEX_DIGIT_01101010                  6A
   1326 #define HEX_DIGIT_01101011                  6B
   1327 #define HEX_DIGIT_01101100                  6C
   1328 #define HEX_DIGIT_01101101                  6D
   1329 #define HEX_DIGIT_01101110                  6E
   1330 #define HEX_DIGIT_01101111                  6F
   1331 #define HEX_DIGIT_01110000                  70
   1332 #define HEX_DIGIT_01110001                  71
   1333 #define HEX_DIGIT_01110010                  72
   1334 #define HEX_DIGIT_01110011                  73
   1335 #define HEX_DIGIT_01110100                  74
   1336 #define HEX_DIGIT_01110101                  75
   1337 #define HEX_DIGIT_01110110                  76
   1338 #define HEX_DIGIT_01110111                  77
   1339 #define HEX_DIGIT_01111000                  78
   1340 #define HEX_DIGIT_01111001                  79
   1341 #define HEX_DIGIT_01111010                  7A
   1342 #define HEX_DIGIT_01111011                  7B
   1343 #define HEX_DIGIT_01111100                  7C
   1344 #define HEX_DIGIT_01111101                  7D
   1345 #define HEX_DIGIT_01111110                  7E
   1346 #define HEX_DIGIT_01111111                  7F
   1347 #define HEX_DIGIT_10000000                  80
   1348 #define HEX_DIGIT_10000001                  81
   1349 #define HEX_DIGIT_10000010                  82
   1350 #define HEX_DIGIT_10000011                  83
   1351 #define HEX_DIGIT_10000100                  84
   1352 #define HEX_DIGIT_10000101                  85
   1353 #define HEX_DIGIT_10000110                  86
   1354 #define HEX_DIGIT_10000111                  87
   1355 #define HEX_DIGIT_10001000                  88
   1356 #define HEX_DIGIT_10001001                  89
   1357 #define HEX_DIGIT_10001010                  8A
   1358 #define HEX_DIGIT_10001011                  8B
   1359 #define HEX_DIGIT_10001100                  8C
   1360 #define HEX_DIGIT_10001101                  8D
   1361 #define HEX_DIGIT_10001110                  8E
   1362 #define HEX_DIGIT_10001111                  8F
   1363 #define HEX_DIGIT_10010000                  90
   1364 #define HEX_DIGIT_10010001                  91
   1365 #define HEX_DIGIT_10010010                  92
   1366 #define HEX_DIGIT_10010011                  93
   1367 #define HEX_DIGIT_10010100                  94
   1368 #define HEX_DIGIT_10010101                  95
   1369 #define HEX_DIGIT_10010110                  96
   1370 #define HEX_DIGIT_10010111                  97
   1371 #define HEX_DIGIT_10011000                  98
   1372 #define HEX_DIGIT_10011001                  99
   1373 #define HEX_DIGIT_10011010                  9A
   1374 #define HEX_DIGIT_10011011                  9B
   1375 #define HEX_DIGIT_10011100                  9C
   1376 #define HEX_DIGIT_10011101                  9D
   1377 #define HEX_DIGIT_10011110                  9E
   1378 #define HEX_DIGIT_10011111                  9F
   1379 #define HEX_DIGIT_10100000                  A0
   1380 #define HEX_DIGIT_10100001                  A1
   1381 #define HEX_DIGIT_10100010                  A2
   1382 #define HEX_DIGIT_10100011                  A3
   1383 #define HEX_DIGIT_10100100                  A4
   1384 #define HEX_DIGIT_10100101                  A5
   1385 #define HEX_DIGIT_10100110                  A6
   1386 #define HEX_DIGIT_10100111                  A7
   1387 #define HEX_DIGIT_10101000                  A8
   1388 #define HEX_DIGIT_10101001                  A9
   1389 #define HEX_DIGIT_10101010                  AA
   1390 #define HEX_DIGIT_10101011                  AB
   1391 #define HEX_DIGIT_10101100                  AC
   1392 #define HEX_DIGIT_10101101                  AD
   1393 #define HEX_DIGIT_10101110                  AE
   1394 #define HEX_DIGIT_10101111                  AF
   1395 #define HEX_DIGIT_10110000                  B0
   1396 #define HEX_DIGIT_10110001                  B1
   1397 #define HEX_DIGIT_10110010                  B2
   1398 #define HEX_DIGIT_10110011                  B3
   1399 #define HEX_DIGIT_10110100                  B4
   1400 #define HEX_DIGIT_10110101                  B5
   1401 #define HEX_DIGIT_10110110                  B6
   1402 #define HEX_DIGIT_10110111                  B7
   1403 #define HEX_DIGIT_10111000                  B8
   1404 #define HEX_DIGIT_10111001                  B9
   1405 #define HEX_DIGIT_10111010                  BA
   1406 #define HEX_DIGIT_10111011                  BB
   1407 #define HEX_DIGIT_10111100                  BC
   1408 #define HEX_DIGIT_10111101                  BD
   1409 #define HEX_DIGIT_10111110                  BE
   1410 #define HEX_DIGIT_10111111                  BF
   1411 #define HEX_DIGIT_11000000                  C0
   1412 #define HEX_DIGIT_11000001                  C1
   1413 #define HEX_DIGIT_11000010                  C2
   1414 #define HEX_DIGIT_11000011                  C3
   1415 #define HEX_DIGIT_11000100                  C4
   1416 #define HEX_DIGIT_11000101                  C5
   1417 #define HEX_DIGIT_11000110                  C6
   1418 #define HEX_DIGIT_11000111                  C7
   1419 #define HEX_DIGIT_11001000                  C8
   1420 #define HEX_DIGIT_11001001                  C9
   1421 #define HEX_DIGIT_11001010                  CA
   1422 #define HEX_DIGIT_11001011                  CB
   1423 #define HEX_DIGIT_11001100                  CC
   1424 #define HEX_DIGIT_11001101                  CD
   1425 #define HEX_DIGIT_11001110                  CE
   1426 #define HEX_DIGIT_11001111                  CF
   1427 #define HEX_DIGIT_11010000                  D0
   1428 #define HEX_DIGIT_11010001                  D1
   1429 #define HEX_DIGIT_11010010                  D2
   1430 #define HEX_DIGIT_11010011                  D3
   1431 #define HEX_DIGIT_11010100                  D4
   1432 #define HEX_DIGIT_11010101                  D5
   1433 #define HEX_DIGIT_11010110                  D6
   1434 #define HEX_DIGIT_11010111                  D7
   1435 #define HEX_DIGIT_11011000                  D8
   1436 #define HEX_DIGIT_11011001                  D9
   1437 #define HEX_DIGIT_11011010                  DA
   1438 #define HEX_DIGIT_11011011                  DB
   1439 #define HEX_DIGIT_11011100                  DC
   1440 #define HEX_DIGIT_11011101                  DD
   1441 #define HEX_DIGIT_11011110                  DE
   1442 #define HEX_DIGIT_11011111                  DF
   1443 #define HEX_DIGIT_11100000                  E0
   1444 #define HEX_DIGIT_11100001                  E1
   1445 #define HEX_DIGIT_11100010                  E2
   1446 #define HEX_DIGIT_11100011                  E3
   1447 #define HEX_DIGIT_11100100                  E4
   1448 #define HEX_DIGIT_11100101                  E5
   1449 #define HEX_DIGIT_11100110                  E6
   1450 #define HEX_DIGIT_11100111                  E7
   1451 #define HEX_DIGIT_11101000                  E8
   1452 #define HEX_DIGIT_11101001                  E9
   1453 #define HEX_DIGIT_11101010                  EA
   1454 #define HEX_DIGIT_11101011                  EB
   1455 #define HEX_DIGIT_11101100                  EC
   1456 #define HEX_DIGIT_11101101                  ED
   1457 #define HEX_DIGIT_11101110                  EE
   1458 #define HEX_DIGIT_11101111                  EF
   1459 #define HEX_DIGIT_11110000                  F0
   1460 #define HEX_DIGIT_11110001                  F1
   1461 #define HEX_DIGIT_11110010                  F2
   1462 #define HEX_DIGIT_11110011                  F3
   1463 #define HEX_DIGIT_11110100                  F4
   1464 #define HEX_DIGIT_11110101                  F5
   1465 #define HEX_DIGIT_11110110                  F6
   1466 #define HEX_DIGIT_11110111                  F7
   1467 #define HEX_DIGIT_11111000                  F8
   1468 #define HEX_DIGIT_11111001                  F9
   1469 #define HEX_DIGIT_11111010                  FA
   1470 #define HEX_DIGIT_11111011                  FB
   1471 #define HEX_DIGIT_11111100                  FC
   1472 #define HEX_DIGIT_11111101                  FD
   1473 #define HEX_DIGIT_11111110                  FE
   1474 #define HEX_DIGIT_11111111                  FF
   1475 
   1476 #if 0
   1477 #pragma mark == Debugging ==
   1478 #endif
   1479 
   1480 //---------------------------------------------------------------------------------------------------------------------------
   1481 /*!	@function	CommonServicesTest
   1482 
   1483     @abstract	Unit test.
   1484  */
   1485 
   1486 #if ( defined( DEBUG ) && DEBUG )
   1487 OSStatus    CommonServicesTest( void );
   1488 #endif
   1489 
   1490 #ifdef  __cplusplus
   1491 }
   1492 #endif
   1493 
   1494 #endif  // __COMMON_SERVICES__
   1495