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