Home | History | Annotate | Download | only in sys
      1 /*-
      2  * Copyright (c) 1997 Niklas Hallqvist.  All rights reserved.
      3  *
      4  * Redistribution and use in source and binary forms, with or without
      5  * modification, are permitted provided that the following conditions
      6  * are met:
      7  * 1. Redistributions of source code must retain the above copyright
      8  *    notice, this list of conditions and the following disclaimer.
      9  * 2. Redistributions in binary form must reproduce the above copyright
     10  *    notice, this list of conditions and the following disclaimer in the
     11  *    documentation and/or other materials provided with the distribution.
     12  *
     13  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
     14  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
     15  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
     16  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
     17  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
     18  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
     19  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
     20  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     21  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
     22  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     23  */
     24 
     25 #ifndef _SYS_ENDIAN_H_
     26 #define _SYS_ENDIAN_H_
     27 
     28 #include <sys/cdefs.h>
     29 
     30 #include <stdint.h>
     31 
     32 #define _LITTLE_ENDIAN	1234
     33 #define _BIG_ENDIAN	4321
     34 #define _PDP_ENDIAN	3412
     35 #define _BYTE_ORDER _LITTLE_ENDIAN
     36 #define __LITTLE_ENDIAN_BITFIELD
     37 
     38 #ifndef __LITTLE_ENDIAN
     39 #define __LITTLE_ENDIAN _LITTLE_ENDIAN
     40 #endif
     41 #ifndef __BIG_ENDIAN
     42 #define __BIG_ENDIAN _BIG_ENDIAN
     43 #endif
     44 #define __BYTE_ORDER _BYTE_ORDER
     45 
     46 #define __swap16 __builtin_bswap16
     47 #define __swap32 __builtin_bswap32
     48 #define __swap64(x) __BIONIC_CAST(static_cast,uint64_t,__builtin_bswap64(x))
     49 
     50 /* glibc compatibility. */
     51 __BEGIN_DECLS
     52 uint32_t htonl(uint32_t __x) __attribute_const__ __INTRODUCED_IN(21);
     53 uint16_t htons(uint16_t __x) __attribute_const__ __INTRODUCED_IN(21);
     54 uint32_t ntohl(uint32_t __x) __attribute_const__ __INTRODUCED_IN(21);
     55 uint16_t ntohs(uint16_t __x) __attribute_const__ __INTRODUCED_IN(21);
     56 __END_DECLS
     57 
     58 #define htonl(x) __swap32(x)
     59 #define htons(x) __swap16(x)
     60 #define ntohl(x) __swap32(x)
     61 #define ntohs(x) __swap16(x)
     62 
     63 /* Bionic additions */
     64 #define htonq(x) __swap64(x)
     65 #define ntohq(x) __swap64(x)
     66 
     67 #if defined(__USE_BSD) || defined(__BIONIC__) /* Historically bionic exposed these. */
     68 #define LITTLE_ENDIAN _LITTLE_ENDIAN
     69 #define BIG_ENDIAN _BIG_ENDIAN
     70 #define PDP_ENDIAN _PDP_ENDIAN
     71 #define BYTE_ORDER _BYTE_ORDER
     72 
     73 #define	NTOHL(x) (x) = ntohl(__BIONIC_CAST(static_cast,u_int32_t,(x)))
     74 #define	NTOHS(x) (x) = ntohs(__BIONIC_CAST(static_cast,u_int16_t,(x)))
     75 #define	HTONL(x) (x) = htonl(__BIONIC_CAST(static_cast,u_int32_t,(x)))
     76 #define	HTONS(x) (x) = htons(__BIONIC_CAST(static_cast,u_int16_t,(x)))
     77 
     78 #define htobe16(x) __swap16(x)
     79 #define htobe32(x) __swap32(x)
     80 #define htobe64(x) __swap64(x)
     81 #define betoh16(x) __swap16(x)
     82 #define betoh32(x) __swap32(x)
     83 #define betoh64(x) __swap64(x)
     84 
     85 #define htole16(x) (x)
     86 #define htole32(x) (x)
     87 #define htole64(x) (x)
     88 #define letoh16(x) (x)
     89 #define letoh32(x) (x)
     90 #define letoh64(x) (x)
     91 
     92 /*
     93  * glibc-compatible beXXtoh/leXXtoh synonyms for htobeXX/htoleXX.
     94  * The BSDs export both sets of names, bionic historically only
     95  * exported the ones above (or on the rhs here), and glibc only
     96  * exports these names (on the lhs).
     97  */
     98 #define be16toh(x) htobe16(x)
     99 #define be32toh(x) htobe32(x)
    100 #define be64toh(x) htobe64(x)
    101 #define le16toh(x) htole16(x)
    102 #define le32toh(x) htole32(x)
    103 #define le64toh(x) htole64(x)
    104 
    105 #endif
    106 
    107 #endif
    108