zig

fork of https://codeberg.org/ziglang/zig
Log | Files | Refs | README | LICENSE

OSByteOrder.h (10968B) - Raw


      1 /*
      2  * Copyright (c) 2000-2006 Apple Computer, Inc. All rights reserved.
      3  *
      4  * @APPLE_OSREFERENCE_LICENSE_HEADER_START@
      5  *
      6  * This file contains Original Code and/or Modifications of Original Code
      7  * as defined in and that are subject to the Apple Public Source License
      8  * Version 2.0 (the 'License'). You may not use this file except in
      9  * compliance with the License. The rights granted to you under the License
     10  * may not be used to create, or enable the creation or redistribution of,
     11  * unlawful or unlicensed copies of an Apple operating system, or to
     12  * circumvent, violate, or enable the circumvention or violation of, any
     13  * terms of an Apple operating system software license agreement.
     14  *
     15  * Please obtain a copy of the License at
     16  * http://www.opensource.apple.com/apsl/ and read it before using this file.
     17  *
     18  * The Original Code and all software distributed under the License are
     19  * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
     20  * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
     21  * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
     22  * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
     23  * Please see the License for the specific language governing rights and
     24  * limitations under the License.
     25  *
     26  * @APPLE_OSREFERENCE_LICENSE_HEADER_END@
     27  */
     28 
     29 #ifndef _OS_OSBYTEORDER_H
     30 #define _OS_OSBYTEORDER_H
     31 
     32 #include <stdint.h>
     33 #include <libkern/_OSByteOrder.h>
     34 
     35 /* Macros for swapping constant values in the preprocessing stage. */
     36 #define OSSwapConstInt16(x)     __DARWIN_OSSwapConstInt16(x)
     37 #define OSSwapConstInt32(x)     __DARWIN_OSSwapConstInt32(x)
     38 #define OSSwapConstInt64(x)     __DARWIN_OSSwapConstInt64(x)
     39 
     40 #if !defined(__DARWIN_OS_INLINE)
     41 # if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L
     42 #        define __DARWIN_OS_INLINE static inline
     43 # elif defined(__MWERKS__) || defined(__cplusplus)
     44 #        define __DARWIN_OS_INLINE static inline
     45 # else
     46 #        define __DARWIN_OS_INLINE static __inline__
     47 # endif
     48 #endif
     49 
     50 #if defined(__GNUC__)
     51 
     52 #if (defined(__i386__) || defined(__x86_64__))
     53 #include <libkern/i386/OSByteOrder.h>
     54 #elif defined (__arm__) || defined(__arm64__)
     55 #include <libkern/arm/OSByteOrder.h>
     56 #else
     57 #include <libkern/machine/OSByteOrder.h>
     58 #endif
     59 
     60 #else /* ! __GNUC__ */
     61 
     62 #include <libkern/machine/OSByteOrder.h>
     63 
     64 #endif /* __GNUC__ */
     65 
     66 #define OSSwapInt16(x)  __DARWIN_OSSwapInt16(x)
     67 #define OSSwapInt32(x)  __DARWIN_OSSwapInt32(x)
     68 #define OSSwapInt64(x)  __DARWIN_OSSwapInt64(x)
     69 
     70 enum {
     71 	OSUnknownByteOrder,
     72 	OSLittleEndian,
     73 	OSBigEndian
     74 };
     75 
     76 __DARWIN_OS_INLINE
     77 int32_t
     78 OSHostByteOrder(void)
     79 {
     80 #if defined(__LITTLE_ENDIAN__)
     81 	return OSLittleEndian;
     82 #elif defined(__BIG_ENDIAN__)
     83 	return OSBigEndian;
     84 #else
     85 	return OSUnknownByteOrder;
     86 #endif
     87 }
     88 
     89 #define OSReadBigInt(x, y)              OSReadBigInt32(x, y)
     90 #define OSWriteBigInt(x, y, z)          OSWriteBigInt32(x, y, z)
     91 #define OSSwapBigToHostInt(x)           OSSwapBigToHostInt32(x)
     92 #define OSSwapHostToBigInt(x)           OSSwapHostToBigInt32(x)
     93 #define OSReadLittleInt(x, y)           OSReadLittleInt32(x, y)
     94 #define OSWriteLittleInt(x, y, z)       OSWriteLittleInt32(x, y, z)
     95 #define OSSwapHostToLittleInt(x)        OSSwapHostToLittleInt32(x)
     96 #define OSSwapLittleToHostInt(x)        OSSwapLittleToHostInt32(x)
     97 
     98 /* Functions for loading native endian values. */
     99 
    100 __DARWIN_OS_INLINE
    101 uint16_t
    102 _OSReadInt16(
    103 	const volatile void               * base,
    104 	uintptr_t                     byteOffset
    105 	)
    106 {
    107 	return *(volatile uint16_t *)((uintptr_t)base + byteOffset);
    108 }
    109 
    110 __DARWIN_OS_INLINE
    111 uint32_t
    112 _OSReadInt32(
    113 	const volatile void               * base,
    114 	uintptr_t                     byteOffset
    115 	)
    116 {
    117 	return *(volatile uint32_t *)((uintptr_t)base + byteOffset);
    118 }
    119 
    120 __DARWIN_OS_INLINE
    121 uint64_t
    122 _OSReadInt64(
    123 	const volatile void               * base,
    124 	uintptr_t                     byteOffset
    125 	)
    126 {
    127 	return *(volatile uint64_t *)((uintptr_t)base + byteOffset);
    128 }
    129 
    130 /* Functions for storing native endian values. */
    131 
    132 __DARWIN_OS_INLINE
    133 void
    134 _OSWriteInt16(
    135 	volatile void               * base,
    136 	uintptr_t                     byteOffset,
    137 	uint16_t                      data
    138 	)
    139 {
    140 	*(volatile uint16_t *)((uintptr_t)base + byteOffset) = data;
    141 }
    142 
    143 __DARWIN_OS_INLINE
    144 void
    145 _OSWriteInt32(
    146 	volatile void               * base,
    147 	uintptr_t                     byteOffset,
    148 	uint32_t                      data
    149 	)
    150 {
    151 	*(volatile uint32_t *)((uintptr_t)base + byteOffset) = data;
    152 }
    153 
    154 __DARWIN_OS_INLINE
    155 void
    156 _OSWriteInt64(
    157 	volatile void               * base,
    158 	uintptr_t                     byteOffset,
    159 	uint64_t                      data
    160 	)
    161 {
    162 	*(volatile uint64_t *)((uintptr_t)base + byteOffset) = data;
    163 }
    164 
    165 #if             defined(__BIG_ENDIAN__)
    166 
    167 /* Functions for loading big endian to host endianess. */
    168 
    169 #define OSReadBigInt16(base, byteOffset) _OSReadInt16(base, byteOffset)
    170 #define OSReadBigInt32(base, byteOffset) _OSReadInt32(base, byteOffset)
    171 #define OSReadBigInt64(base, byteOffset) _OSReadInt64(base, byteOffset)
    172 
    173 /* Functions for storing host endianess to big endian. */
    174 
    175 #define OSWriteBigInt16(base, byteOffset, data) _OSWriteInt16(base, byteOffset, data)
    176 #define OSWriteBigInt32(base, byteOffset, data) _OSWriteInt32(base, byteOffset, data)
    177 #define OSWriteBigInt64(base, byteOffset, data) _OSWriteInt64(base, byteOffset, data)
    178 
    179 /* Functions for loading little endian to host endianess. */
    180 
    181 #define OSReadLittleInt16(base, byteOffset) OSReadSwapInt16(base, byteOffset)
    182 #define OSReadLittleInt32(base, byteOffset) OSReadSwapInt32(base, byteOffset)
    183 #define OSReadLittleInt64(base, byteOffset) OSReadSwapInt64(base, byteOffset)
    184 
    185 /* Functions for storing host endianess to little endian. */
    186 
    187 #define OSWriteLittleInt16(base, byteOffset, data) OSWriteSwapInt16(base, byteOffset, data)
    188 #define OSWriteLittleInt32(base, byteOffset, data) OSWriteSwapInt32(base, byteOffset, data)
    189 #define OSWriteLittleInt64(base, byteOffset, data) OSWriteSwapInt64(base, byteOffset, data)
    190 
    191 /* Host endianess to big endian byte swapping macros for constants. */
    192 
    193 #define OSSwapHostToBigConstInt16(x) ((uint16_t)(x))
    194 #define OSSwapHostToBigConstInt32(x) ((uint32_t)(x))
    195 #define OSSwapHostToBigConstInt64(x) ((uint64_t)(x))
    196 
    197 /* Generic host endianess to big endian byte swapping functions. */
    198 
    199 #define OSSwapHostToBigInt16(x) ((uint16_t)(x))
    200 #define OSSwapHostToBigInt32(x) ((uint32_t)(x))
    201 #define OSSwapHostToBigInt64(x) ((uint64_t)(x))
    202 
    203 /* Host endianess to little endian byte swapping macros for constants. */
    204 
    205 #define OSSwapHostToLittleConstInt16(x) OSSwapConstInt16(x)
    206 #define OSSwapHostToLittleConstInt32(x) OSSwapConstInt32(x)
    207 #define OSSwapHostToLittleConstInt64(x) OSSwapConstInt64(x)
    208 
    209 /* Generic host endianess to little endian byte swapping functions. */
    210 
    211 #define OSSwapHostToLittleInt16(x) OSSwapInt16(x)
    212 #define OSSwapHostToLittleInt32(x) OSSwapInt32(x)
    213 #define OSSwapHostToLittleInt64(x) OSSwapInt64(x)
    214 
    215 /* Big endian to host endianess byte swapping macros for constants. */
    216 
    217 #define OSSwapBigToHostConstInt16(x) ((uint16_t)(x))
    218 #define OSSwapBigToHostConstInt32(x) ((uint32_t)(x))
    219 #define OSSwapBigToHostConstInt64(x) ((uint64_t)(x))
    220 
    221 /* Generic big endian to host endianess byte swapping functions. */
    222 
    223 #define OSSwapBigToHostInt16(x) ((uint16_t)(x))
    224 #define OSSwapBigToHostInt32(x) ((uint32_t)(x))
    225 #define OSSwapBigToHostInt64(x) ((uint64_t)(x))
    226 
    227 /* Little endian to host endianess byte swapping macros for constants. */
    228 
    229 #define OSSwapLittleToHostConstInt16(x) OSSwapConstInt16(x)
    230 #define OSSwapLittleToHostConstInt32(x) OSSwapConstInt32(x)
    231 #define OSSwapLittleToHostConstInt64(x) OSSwapConstInt64(x)
    232 
    233 /* Generic little endian to host endianess byte swapping functions. */
    234 
    235 #define OSSwapLittleToHostInt16(x) OSSwapInt16(x)
    236 #define OSSwapLittleToHostInt32(x) OSSwapInt32(x)
    237 #define OSSwapLittleToHostInt64(x) OSSwapInt64(x)
    238 
    239 #elif           defined(__LITTLE_ENDIAN__)
    240 
    241 /* Functions for loading big endian to host endianess. */
    242 
    243 #define OSReadBigInt16(base, byteOffset) OSReadSwapInt16(base, byteOffset)
    244 #define OSReadBigInt32(base, byteOffset) OSReadSwapInt32(base, byteOffset)
    245 #define OSReadBigInt64(base, byteOffset) OSReadSwapInt64(base, byteOffset)
    246 
    247 /* Functions for storing host endianess to big endian. */
    248 
    249 #define OSWriteBigInt16(base, byteOffset, data) OSWriteSwapInt16(base, byteOffset, data)
    250 #define OSWriteBigInt32(base, byteOffset, data) OSWriteSwapInt32(base, byteOffset, data)
    251 #define OSWriteBigInt64(base, byteOffset, data) OSWriteSwapInt64(base, byteOffset, data)
    252 
    253 /* Functions for loading little endian to host endianess. */
    254 
    255 #define OSReadLittleInt16(base, byteOffset) _OSReadInt16(base, byteOffset)
    256 #define OSReadLittleInt32(base, byteOffset) _OSReadInt32(base, byteOffset)
    257 #define OSReadLittleInt64(base, byteOffset) _OSReadInt64(base, byteOffset)
    258 
    259 /* Functions for storing host endianess to little endian. */
    260 
    261 #define OSWriteLittleInt16(base, byteOffset, data) _OSWriteInt16(base, byteOffset, data)
    262 #define OSWriteLittleInt32(base, byteOffset, data) _OSWriteInt32(base, byteOffset, data)
    263 #define OSWriteLittleInt64(base, byteOffset, data) _OSWriteInt64(base, byteOffset, data)
    264 
    265 /* Host endianess to big endian byte swapping macros for constants. */
    266 
    267 #define OSSwapHostToBigConstInt16(x) OSSwapConstInt16(x)
    268 #define OSSwapHostToBigConstInt32(x) OSSwapConstInt32(x)
    269 #define OSSwapHostToBigConstInt64(x) OSSwapConstInt64(x)
    270 
    271 /* Generic host endianess to big endian byte swapping functions. */
    272 
    273 #define OSSwapHostToBigInt16(x) OSSwapInt16(x)
    274 #define OSSwapHostToBigInt32(x) OSSwapInt32(x)
    275 #define OSSwapHostToBigInt64(x) OSSwapInt64(x)
    276 
    277 /* Host endianess to little endian byte swapping macros for constants. */
    278 
    279 #define OSSwapHostToLittleConstInt16(x) ((uint16_t)(x))
    280 #define OSSwapHostToLittleConstInt32(x) ((uint32_t)(x))
    281 #define OSSwapHostToLittleConstInt64(x) ((uint64_t)(x))
    282 
    283 /* Generic host endianess to little endian byte swapping functions. */
    284 
    285 #define OSSwapHostToLittleInt16(x) ((uint16_t)(x))
    286 #define OSSwapHostToLittleInt32(x) ((uint32_t)(x))
    287 #define OSSwapHostToLittleInt64(x) ((uint64_t)(x))
    288 
    289 /* Big endian to host endianess byte swapping macros for constants. */
    290 
    291 #define OSSwapBigToHostConstInt16(x) OSSwapConstInt16(x)
    292 #define OSSwapBigToHostConstInt32(x) OSSwapConstInt32(x)
    293 #define OSSwapBigToHostConstInt64(x) OSSwapConstInt64(x)
    294 
    295 /* Generic big endian to host endianess byte swapping functions. */
    296 
    297 #define OSSwapBigToHostInt16(x) OSSwapInt16(x)
    298 #define OSSwapBigToHostInt32(x) OSSwapInt32(x)
    299 #define OSSwapBigToHostInt64(x) OSSwapInt64(x)
    300 
    301 /* Little endian to host endianess byte swapping macros for constants. */
    302 
    303 #define OSSwapLittleToHostConstInt16(x) ((uint16_t)(x))
    304 #define OSSwapLittleToHostConstInt32(x) ((uint32_t)(x))
    305 #define OSSwapLittleToHostConstInt64(x) ((uint64_t)(x))
    306 
    307 /* Generic little endian to host endianess byte swapping functions. */
    308 
    309 #define OSSwapLittleToHostInt16(x) ((uint16_t)(x))
    310 #define OSSwapLittleToHostInt32(x) ((uint32_t)(x))
    311 #define OSSwapLittleToHostInt64(x) ((uint64_t)(x))
    312 
    313 #else
    314 #error Unknown endianess.
    315 #endif
    316 
    317 #endif /* ! _OS_OSBYTEORDER_H */