Team Fortress 2 Source Code as on 22/4/2020
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

802 lines
20 KiB

  1. /*
  2. File: Endian.h
  3. Contains: Endian swapping utilties
  4. Version: QuickTime 7.3
  5. Copyright: (c) 2007 (c) 1997-2001 by Apple Computer, Inc., all rights reserved
  6. Bugs?: For bug reports, consult the following page on
  7. the World Wide Web:
  8. http://developer.apple.com/bugreporter/
  9. */
  10. #ifndef __ENDIAN__
  11. #define __ENDIAN__
  12. #ifndef __CONDITIONALMACROS__
  13. #include <ConditionalMacros.h>
  14. #endif
  15. #ifndef __MACTYPES__
  16. #include <MacTypes.h>
  17. #endif
  18. #if PRAGMA_ONCE
  19. #pragma once
  20. #endif
  21. #ifdef __cplusplus
  22. extern "C" {
  23. #endif
  24. #if PRAGMA_IMPORT
  25. #pragma import on
  26. #endif
  27. #if PRAGMA_STRUCT_ALIGN
  28. #pragma options align=mac68k
  29. #elif PRAGMA_STRUCT_PACKPUSH
  30. #pragma pack(push, 2)
  31. #elif PRAGMA_STRUCT_PACK
  32. #pragma pack(2)
  33. #endif
  34. /*
  35. This file provides Endian Flipping routines for dealing with converting data
  36. between Big-Endian and Little-Endian machines. These routines are useful
  37. when writing code to compile for both Big and Little Endian machines and
  38. which must handle other endian number formats, such as reading or writing
  39. to a file or network packet.
  40. These routines are named as follows:
  41. Endian<U><W>_<S>to<D>
  42. where
  43. <U> is whether the integer is signed ('S') or unsigned ('U')
  44. <W> is integer bit width: 16, 32, or 64
  45. <S> is the source endian format: 'B' for big, 'L' for little, or 'N' for native
  46. <D> is the destination endian format: 'B' for big, 'L' for little, or 'N' for native
  47. For example, to convert a Big Endian 32-bit unsigned integer to the current native format use:
  48. long i = EndianU32_BtoN(data);
  49. This file is set up so that the function macro to nothing when the target runtime already
  50. is the desired format (e.g. on Big Endian machines, EndianU32_BtoN() macros away).
  51. If long long's are not supported, you cannot get 64-bit quantities as a single value.
  52. The macros are not defined in that case.
  53. <<< W A R N I N G >>>
  54. It is very important not to put any autoincrements inside the macros. This
  55. will produce erroneous results because each time the address is accessed in the macro,
  56. the increment occurs.
  57. */
  58. /*
  59. Note: These functions are currently not implemented in any library
  60. and are only listed here as function prototypes to document the macros
  61. */
  62. #if CALL_NOT_IN_CARBON
  63. /*
  64. * EndianS16_BtoN()
  65. *
  66. * Availability:
  67. * Non-Carbon CFM: not available
  68. * CarbonLib: not available
  69. * Mac OS X: not available
  70. */
  71. EXTERN_API_C( SInt16 )
  72. EndianS16_BtoN(SInt16 value);
  73. /*
  74. * EndianS16_NtoB()
  75. *
  76. * Availability:
  77. * Non-Carbon CFM: not available
  78. * CarbonLib: not available
  79. * Mac OS X: not available
  80. */
  81. EXTERN_API_C( SInt16 )
  82. EndianS16_NtoB(SInt16 value);
  83. /*
  84. * EndianS16_LtoN()
  85. *
  86. * Availability:
  87. * Non-Carbon CFM: not available
  88. * CarbonLib: not available
  89. * Mac OS X: not available
  90. */
  91. EXTERN_API_C( SInt16 )
  92. EndianS16_LtoN(SInt16 value);
  93. /*
  94. * EndianS16_NtoL()
  95. *
  96. * Availability:
  97. * Non-Carbon CFM: not available
  98. * CarbonLib: not available
  99. * Mac OS X: not available
  100. */
  101. EXTERN_API_C( SInt16 )
  102. EndianS16_NtoL(SInt16 value);
  103. /*
  104. * EndianS16_LtoB()
  105. *
  106. * Availability:
  107. * Non-Carbon CFM: not available
  108. * CarbonLib: not available
  109. * Mac OS X: not available
  110. */
  111. EXTERN_API_C( SInt16 )
  112. EndianS16_LtoB(SInt16 value);
  113. /*
  114. * EndianS16_BtoL()
  115. *
  116. * Availability:
  117. * Non-Carbon CFM: not available
  118. * CarbonLib: not available
  119. * Mac OS X: not available
  120. */
  121. EXTERN_API_C( SInt16 )
  122. EndianS16_BtoL(SInt16 value);
  123. /*
  124. * EndianU16_BtoN()
  125. *
  126. * Availability:
  127. * Non-Carbon CFM: not available
  128. * CarbonLib: not available
  129. * Mac OS X: not available
  130. */
  131. EXTERN_API_C( UInt16 )
  132. EndianU16_BtoN(UInt16 value);
  133. /*
  134. * EndianU16_NtoB()
  135. *
  136. * Availability:
  137. * Non-Carbon CFM: not available
  138. * CarbonLib: not available
  139. * Mac OS X: not available
  140. */
  141. EXTERN_API_C( UInt16 )
  142. EndianU16_NtoB(UInt16 value);
  143. /*
  144. * EndianU16_LtoN()
  145. *
  146. * Availability:
  147. * Non-Carbon CFM: not available
  148. * CarbonLib: not available
  149. * Mac OS X: not available
  150. */
  151. EXTERN_API_C( UInt16 )
  152. EndianU16_LtoN(UInt16 value);
  153. /*
  154. * EndianU16_NtoL()
  155. *
  156. * Availability:
  157. * Non-Carbon CFM: not available
  158. * CarbonLib: not available
  159. * Mac OS X: not available
  160. */
  161. EXTERN_API_C( UInt16 )
  162. EndianU16_NtoL(UInt16 value);
  163. /*
  164. * EndianU16_LtoB()
  165. *
  166. * Availability:
  167. * Non-Carbon CFM: not available
  168. * CarbonLib: not available
  169. * Mac OS X: not available
  170. */
  171. EXTERN_API_C( UInt16 )
  172. EndianU16_LtoB(UInt16 value);
  173. /*
  174. * EndianU16_BtoL()
  175. *
  176. * Availability:
  177. * Non-Carbon CFM: not available
  178. * CarbonLib: not available
  179. * Mac OS X: not available
  180. */
  181. EXTERN_API_C( UInt16 )
  182. EndianU16_BtoL(UInt16 value);
  183. /*
  184. * EndianS32_BtoN()
  185. *
  186. * Availability:
  187. * Non-Carbon CFM: not available
  188. * CarbonLib: not available
  189. * Mac OS X: not available
  190. */
  191. EXTERN_API_C( SInt32 )
  192. EndianS32_BtoN(SInt32 value);
  193. /*
  194. * EndianS32_NtoB()
  195. *
  196. * Availability:
  197. * Non-Carbon CFM: not available
  198. * CarbonLib: not available
  199. * Mac OS X: not available
  200. */
  201. EXTERN_API_C( SInt32 )
  202. EndianS32_NtoB(SInt32 value);
  203. /*
  204. * EndianS32_LtoN()
  205. *
  206. * Availability:
  207. * Non-Carbon CFM: not available
  208. * CarbonLib: not available
  209. * Mac OS X: not available
  210. */
  211. EXTERN_API_C( SInt32 )
  212. EndianS32_LtoN(SInt32 value);
  213. /*
  214. * EndianS32_NtoL()
  215. *
  216. * Availability:
  217. * Non-Carbon CFM: not available
  218. * CarbonLib: not available
  219. * Mac OS X: not available
  220. */
  221. EXTERN_API_C( SInt32 )
  222. EndianS32_NtoL(SInt32 value);
  223. /*
  224. * EndianS32_LtoB()
  225. *
  226. * Availability:
  227. * Non-Carbon CFM: not available
  228. * CarbonLib: not available
  229. * Mac OS X: not available
  230. */
  231. EXTERN_API_C( SInt32 )
  232. EndianS32_LtoB(SInt32 value);
  233. /*
  234. * EndianS32_BtoL()
  235. *
  236. * Availability:
  237. * Non-Carbon CFM: not available
  238. * CarbonLib: not available
  239. * Mac OS X: not available
  240. */
  241. EXTERN_API_C( SInt32 )
  242. EndianS32_BtoL(SInt32 value);
  243. /*
  244. * EndianU32_BtoN()
  245. *
  246. * Availability:
  247. * Non-Carbon CFM: not available
  248. * CarbonLib: not available
  249. * Mac OS X: not available
  250. */
  251. EXTERN_API_C( UInt32 )
  252. EndianU32_BtoN(UInt32 value);
  253. /*
  254. * EndianU32_NtoB()
  255. *
  256. * Availability:
  257. * Non-Carbon CFM: not available
  258. * CarbonLib: not available
  259. * Mac OS X: not available
  260. */
  261. EXTERN_API_C( UInt32 )
  262. EndianU32_NtoB(UInt32 value);
  263. /*
  264. * EndianU32_LtoN()
  265. *
  266. * Availability:
  267. * Non-Carbon CFM: not available
  268. * CarbonLib: not available
  269. * Mac OS X: not available
  270. */
  271. EXTERN_API_C( UInt32 )
  272. EndianU32_LtoN(UInt32 value);
  273. /*
  274. * EndianU32_NtoL()
  275. *
  276. * Availability:
  277. * Non-Carbon CFM: not available
  278. * CarbonLib: not available
  279. * Mac OS X: not available
  280. */
  281. EXTERN_API_C( UInt32 )
  282. EndianU32_NtoL(UInt32 value);
  283. /*
  284. * EndianU32_LtoB()
  285. *
  286. * Availability:
  287. * Non-Carbon CFM: not available
  288. * CarbonLib: not available
  289. * Mac OS X: not available
  290. */
  291. EXTERN_API_C( UInt32 )
  292. EndianU32_LtoB(UInt32 value);
  293. /*
  294. * EndianU32_BtoL()
  295. *
  296. * Availability:
  297. * Non-Carbon CFM: not available
  298. * CarbonLib: not available
  299. * Mac OS X: not available
  300. */
  301. EXTERN_API_C( UInt32 )
  302. EndianU32_BtoL(UInt32 value);
  303. #endif /* CALL_NOT_IN_CARBON */
  304. #if !TYPE_LONGLONG
  305. /*
  306. Note: If these Int64 functions ever were implemented in a library,
  307. we would need two libraries, one for compilers that
  308. support long long and one for other compilers.
  309. */
  310. #if CALL_NOT_IN_CARBON
  311. /*
  312. * EndianS64_BtoN()
  313. *
  314. * Availability:
  315. * Non-Carbon CFM: not available
  316. * CarbonLib: not available
  317. * Mac OS X: not available
  318. */
  319. EXTERN_API_C( SInt64 )
  320. EndianS64_BtoN(SInt64 value);
  321. /*
  322. * EndianS64_NtoB()
  323. *
  324. * Availability:
  325. * Non-Carbon CFM: not available
  326. * CarbonLib: not available
  327. * Mac OS X: not available
  328. */
  329. EXTERN_API_C( SInt64 )
  330. EndianS64_NtoB(SInt64 value);
  331. /*
  332. * EndianS64_LtoN()
  333. *
  334. * Availability:
  335. * Non-Carbon CFM: not available
  336. * CarbonLib: not available
  337. * Mac OS X: not available
  338. */
  339. EXTERN_API_C( SInt64 )
  340. EndianS64_LtoN(SInt64 value);
  341. /*
  342. * EndianS64_NtoL()
  343. *
  344. * Availability:
  345. * Non-Carbon CFM: not available
  346. * CarbonLib: not available
  347. * Mac OS X: not available
  348. */
  349. EXTERN_API_C( SInt64 )
  350. EndianS64_NtoL(SInt64 value);
  351. /*
  352. * EndianS64_LtoB()
  353. *
  354. * Availability:
  355. * Non-Carbon CFM: not available
  356. * CarbonLib: not available
  357. * Mac OS X: not available
  358. */
  359. EXTERN_API_C( SInt64 )
  360. EndianS64_LtoB(SInt64 value);
  361. /*
  362. * EndianS64_BtoL()
  363. *
  364. * Availability:
  365. * Non-Carbon CFM: not available
  366. * CarbonLib: not available
  367. * Mac OS X: not available
  368. */
  369. EXTERN_API_C( SInt64 )
  370. EndianS64_BtoL(SInt64 value);
  371. /*
  372. * EndianU64_BtoN()
  373. *
  374. * Availability:
  375. * Non-Carbon CFM: not available
  376. * CarbonLib: not available
  377. * Mac OS X: not available
  378. */
  379. EXTERN_API_C( UInt64 )
  380. EndianU64_BtoN(UInt64 value);
  381. /*
  382. * EndianU64_NtoB()
  383. *
  384. * Availability:
  385. * Non-Carbon CFM: not available
  386. * CarbonLib: not available
  387. * Mac OS X: not available
  388. */
  389. EXTERN_API_C( UInt64 )
  390. EndianU64_NtoB(UInt64 value);
  391. /*
  392. * EndianU64_LtoN()
  393. *
  394. * Availability:
  395. * Non-Carbon CFM: not available
  396. * CarbonLib: not available
  397. * Mac OS X: not available
  398. */
  399. EXTERN_API_C( UInt64 )
  400. EndianU64_LtoN(UInt64 value);
  401. /*
  402. * EndianU64_NtoL()
  403. *
  404. * Availability:
  405. * Non-Carbon CFM: not available
  406. * CarbonLib: not available
  407. * Mac OS X: not available
  408. */
  409. EXTERN_API_C( UInt64 )
  410. EndianU64_NtoL(UInt64 value);
  411. /*
  412. * EndianU64_LtoB()
  413. *
  414. * Availability:
  415. * Non-Carbon CFM: not available
  416. * CarbonLib: not available
  417. * Mac OS X: not available
  418. */
  419. EXTERN_API_C( UInt64 )
  420. EndianU64_LtoB(UInt64 value);
  421. /*
  422. * EndianU64_BtoL()
  423. *
  424. * Availability:
  425. * Non-Carbon CFM: not available
  426. * CarbonLib: not available
  427. * Mac OS X: not available
  428. */
  429. EXTERN_API_C( UInt64 )
  430. EndianU64_BtoL(UInt64 value);
  431. #endif /* CALL_NOT_IN_CARBON */
  432. #endif /* !TYPE_LONGLONG */
  433. /*
  434. These types are used for structures that contain data that is
  435. always in BigEndian format. This extra typing prevents little
  436. endian code from directly changing the data, thus saving much
  437. time in the debugger.
  438. */
  439. #if TARGET_RT_LITTLE_ENDIAN
  440. struct BigEndianLong {
  441. long bigEndianValue;
  442. };
  443. typedef struct BigEndianLong BigEndianLong;
  444. struct BigEndianUnsignedLong {
  445. unsigned long bigEndianValue;
  446. };
  447. typedef struct BigEndianUnsignedLong BigEndianUnsignedLong;
  448. struct BigEndianShort {
  449. short bigEndianValue;
  450. };
  451. typedef struct BigEndianShort BigEndianShort;
  452. struct BigEndianUnsignedShort {
  453. unsigned short bigEndianValue;
  454. };
  455. typedef struct BigEndianUnsignedShort BigEndianUnsignedShort;
  456. struct BigEndianFixed {
  457. Fixed bigEndianValue;
  458. };
  459. typedef struct BigEndianFixed BigEndianFixed;
  460. struct BigEndianUnsignedFixed {
  461. UnsignedFixed bigEndianValue;
  462. };
  463. typedef struct BigEndianUnsignedFixed BigEndianUnsignedFixed;
  464. struct BigEndianOSType {
  465. OSType bigEndianValue;
  466. };
  467. typedef struct BigEndianOSType BigEndianOSType;
  468. #else
  469. typedef long BigEndianLong;
  470. typedef unsigned long BigEndianUnsignedLong;
  471. typedef short BigEndianShort;
  472. typedef unsigned short BigEndianUnsignedShort;
  473. typedef Fixed BigEndianFixed;
  474. typedef UnsignedFixed BigEndianUnsignedFixed;
  475. typedef OSType BigEndianOSType;
  476. #endif /* TARGET_RT_LITTLE_ENDIAN */
  477. /*
  478. Macro away no-op functions
  479. */
  480. #if TARGET_RT_BIG_ENDIAN
  481. #define EndianS16_BtoN(value) (value)
  482. #define EndianS16_NtoB(value) (value)
  483. #define EndianU16_BtoN(value) (value)
  484. #define EndianU16_NtoB(value) (value)
  485. #define EndianS32_BtoN(value) (value)
  486. #define EndianS32_NtoB(value) (value)
  487. #define EndianU32_BtoN(value) (value)
  488. #define EndianU32_NtoB(value) (value)
  489. #define EndianS64_BtoN(value) (value)
  490. #define EndianS64_NtoB(value) (value)
  491. #define EndianU64_BtoN(value) (value)
  492. #define EndianU64_NtoB(value) (value)
  493. #else
  494. #define EndianS16_LtoN(value) (value)
  495. #define EndianS16_NtoL(value) (value)
  496. #define EndianU16_LtoN(value) (value)
  497. #define EndianU16_NtoL(value) (value)
  498. #define EndianS32_LtoN(value) (value)
  499. #define EndianS32_NtoL(value) (value)
  500. #define EndianU32_LtoN(value) (value)
  501. #define EndianU32_NtoL(value) (value)
  502. #define EndianS64_LtoN(value) (value)
  503. #define EndianS64_NtoL(value) (value)
  504. #define EndianU64_LtoN(value) (value)
  505. #define EndianU64_NtoL(value) (value)
  506. #endif
  507. /*
  508. Map native to actual
  509. */
  510. #if TARGET_RT_BIG_ENDIAN
  511. #define EndianS16_LtoN(value) EndianS16_LtoB(value)
  512. #define EndianS16_NtoL(value) EndianS16_BtoL(value)
  513. #define EndianU16_LtoN(value) EndianU16_LtoB(value)
  514. #define EndianU16_NtoL(value) EndianU16_BtoL(value)
  515. #define EndianS32_LtoN(value) EndianS32_LtoB(value)
  516. #define EndianS32_NtoL(value) EndianS32_BtoL(value)
  517. #define EndianU32_LtoN(value) EndianU32_LtoB(value)
  518. #define EndianU32_NtoL(value) EndianU32_BtoL(value)
  519. #define EndianS64_LtoN(value) EndianS64_LtoB(value)
  520. #define EndianS64_NtoL(value) EndianS64_BtoL(value)
  521. #define EndianU64_LtoN(value) EndianU64_LtoB(value)
  522. #define EndianU64_NtoL(value) EndianU64_BtoL(value)
  523. #else
  524. #define EndianS16_BtoN(value) EndianS16_BtoL(value)
  525. #define EndianS16_NtoB(value) EndianS16_LtoB(value)
  526. #define EndianU16_BtoN(value) EndianU16_BtoL(value)
  527. #define EndianU16_NtoB(value) EndianU16_LtoB(value)
  528. #define EndianS32_BtoN(value) EndianS32_BtoL(value)
  529. #define EndianS32_NtoB(value) EndianS32_LtoB(value)
  530. #define EndianU32_BtoN(value) EndianU32_BtoL(value)
  531. #define EndianU32_NtoB(value) EndianU32_LtoB(value)
  532. #define EndianS64_BtoN(value) EndianS64_BtoL(value)
  533. #define EndianS64_NtoB(value) EndianS64_LtoB(value)
  534. #define EndianU64_BtoN(value) EndianU64_BtoL(value)
  535. #define EndianU64_NtoB(value) EndianU64_LtoB(value)
  536. #endif
  537. /*
  538. Implement LtoB and BtoL
  539. */
  540. #define EndianS16_LtoB(value) ((SInt16)Endian16_Swap(value))
  541. #define EndianS16_BtoL(value) ((SInt16)Endian16_Swap(value))
  542. #define EndianU16_LtoB(value) ((UInt16)Endian16_Swap(value))
  543. #define EndianU16_BtoL(value) ((UInt16)Endian16_Swap(value))
  544. #define EndianS32_LtoB(value) ((SInt32)Endian32_Swap(value))
  545. #define EndianS32_BtoL(value) ((SInt32)Endian32_Swap(value))
  546. #define EndianU32_LtoB(value) ((UInt32)Endian32_Swap(value))
  547. #define EndianU32_BtoL(value) ((UInt32)Endian32_Swap(value))
  548. #define EndianS64_LtoB(value) ((SInt64)Endian64_Swap((UInt64)value))
  549. #define EndianS64_BtoL(value) ((SInt64)Endian64_Swap((UInt64)value))
  550. #define EndianU64_LtoB(value) ((UInt64)Endian64_Swap(value))
  551. #define EndianU64_BtoL(value) ((UInt64)Endian64_Swap(value))
  552. /*
  553. Implement low level *_Swap functions.
  554. extern UInt16 Endian16_Swap(UInt16 value);
  555. extern UInt32 Endian32_Swap(UInt32 value);
  556. extern UInt64 Endian64_Swap(UInt64 value);
  557. Note: Depending on the processor, you might want to implement
  558. these as function calls instead of macros.
  559. */
  560. #if CALL_NOT_IN_CARBON
  561. /*
  562. * Endian16_Swap()
  563. *
  564. * Availability:
  565. * Non-Carbon CFM: not available
  566. * CarbonLib: not available
  567. * Mac OS X: not available
  568. */
  569. #if TARGET_OS_MAC && TARGET_CPU_68K && !TARGET_RT_MAC_CFM
  570. #pragma parameter __D0 Endian16_Swap(__D0)
  571. #endif
  572. EXTERN_API( UInt16 )
  573. Endian16_Swap(UInt16 value) ONEWORDINLINE(0xE158);
  574. /*
  575. * Endian32_Swap()
  576. *
  577. * Availability:
  578. * Non-Carbon CFM: not available
  579. * CarbonLib: not available
  580. * Mac OS X: not available
  581. */
  582. #if TARGET_OS_MAC && TARGET_CPU_68K && !TARGET_RT_MAC_CFM
  583. #pragma parameter __D0 Endian32_Swap(__D0)
  584. #endif
  585. EXTERN_API( UInt32 )
  586. Endian32_Swap(UInt32 value) THREEWORDINLINE(0xE158, 0x4840, 0xE158);
  587. #endif /* CALL_NOT_IN_CARBON */
  588. /* override with macros */
  589. #define Endian16_Swap(value) \
  590. (((((UInt16)value)<<8) & 0xFF00) | \
  591. ((((UInt16)value)>>8) & 0x00FF))
  592. #define Endian32_Swap(value) \
  593. (((((UInt32)value)<<24) & 0xFF000000) | \
  594. ((((UInt32)value)<< 8) & 0x00FF0000) | \
  595. ((((UInt32)value)>> 8) & 0x0000FF00) | \
  596. ((((UInt32)value)>>24) & 0x000000FF))
  597. #if TYPE_LONGLONG
  598. #if TARGET_OS_WIN32
  599. /* the inline macros crash MSDEV's optimizer on Windows. */
  600. extern UInt64 Endian64_Swap(UInt64 value);
  601. #elif defined(__MWERKS__) && (__MWERKS__ < 0x1800)
  602. /* older Metrowerks compilers errored on LL suffix */
  603. #define Endian64_Swap(value) \
  604. (((((UInt64)value)<<56) & 0xFF00000000000000) | \
  605. ((((UInt64)value)<<40) & 0x00FF000000000000) | \
  606. ((((UInt64)value)<<24) & 0x0000FF0000000000) | \
  607. ((((UInt64)value)<< 8) & 0x000000FF00000000) | \
  608. ((((UInt64)value)>> 8) & 0x00000000FF000000) | \
  609. ((((UInt64)value)>>24) & 0x0000000000FF0000) | \
  610. ((((UInt64)value)>>40) & 0x000000000000FF00) | \
  611. ((((UInt64)value)>>56) & 0x00000000000000FF))
  612. #else
  613. #define Endian64_Swap(value) \
  614. (((((UInt64)value)<<56) & 0xFF00000000000000ULL) | \
  615. ((((UInt64)value)<<40) & 0x00FF000000000000ULL) | \
  616. ((((UInt64)value)<<24) & 0x0000FF0000000000ULL) | \
  617. ((((UInt64)value)<< 8) & 0x000000FF00000000ULL) | \
  618. ((((UInt64)value)>> 8) & 0x00000000FF000000ULL) | \
  619. ((((UInt64)value)>>24) & 0x0000000000FF0000ULL) | \
  620. ((((UInt64)value)>>40) & 0x000000000000FF00ULL) | \
  621. ((((UInt64)value)>>56) & 0x00000000000000FFULL))
  622. #endif
  623. #else
  624. /*
  625. Note: When using compilers that don't support "long long",
  626. Endian64_Swap must be implemented as glue.
  627. */
  628. #ifdef __cplusplus
  629. inline static UInt64 Endian64_Swap(UInt64 value)
  630. {
  631. UInt64 temp;
  632. ((UnsignedWide*)&temp)->lo = Endian32_Swap(((UnsignedWide*)&value)->hi);
  633. ((UnsignedWide*)&temp)->hi = Endian32_Swap(((UnsignedWide*)&value)->lo);
  634. return temp;
  635. }
  636. #else
  637. #if CALL_NOT_IN_CARBON
  638. /*
  639. * Endian64_Swap()
  640. *
  641. * Availability:
  642. * Non-Carbon CFM: not available
  643. * CarbonLib: not available
  644. * Mac OS X: not available
  645. */
  646. EXTERN_API_C( UInt64 )
  647. Endian64_Swap(UInt64 value);
  648. #endif /* CALL_NOT_IN_CARBON */
  649. #endif
  650. #endif /* TYPE_LONGLONG */
  651. #if PRAGMA_STRUCT_ALIGN
  652. #pragma options align=reset
  653. #elif PRAGMA_STRUCT_PACKPUSH
  654. #pragma pack(pop)
  655. #elif PRAGMA_STRUCT_PACK
  656. #pragma pack()
  657. #endif
  658. #ifdef PRAGMA_IMPORT_OFF
  659. #pragma import off
  660. #elif PRAGMA_IMPORT
  661. #pragma import reset
  662. #endif
  663. #ifdef __cplusplus
  664. }
  665. #endif
  666. #endif /* __ENDIAN__ */