/*++

Copyright (c) 2015 Minoca Corp.

    This file is licensed under the terms of the GNU Lesser General Public
    License version 3. Alternative licensing terms are available. Contact
    info@minocacorp.com for details.

Module Name:

    endian.h

Abstract:

    This header contains definitions for the endian-ness of the machine.

Author:

    Evan Green 16-Apr-2015

--*/

#ifndef _ENDIAN_H
#define _ENDIAN_H

//
// ------------------------------------------------------------------- Includes
//

//
// ---------------------------------------------------------------- Definitions
//

//
// This machine is little endian.
//

#define BYTE_ORDER LITTLE_ENDIAN

#define LITTLE_ENDIAN 1234
#define BIG_ENDIAN 4321

//
// Define the byteswapping macros. For now, use the builtin, though this is
// a little compiler-specific.
//

#define __byteswap16(_Value) __builtin_bswap16(_Value)
#define __byteswap32(_Value) __builtin_bswap32(_Value)
#define __byteswap64(_Value) __builtin_bswap64(_Value)

#if BYTE_ORDER == LITTLE_ENDIAN

#define htobe16(_Value) __byteswap16(_Value)
#define htole16(_Value) (_Value)
#define be16toh(_Value) __byteswap16(_Value)
#define le16toh(_Value) (_Value)

#define htobe32(_Value) __byteswap32(_Value)
#define htole32(_Value) (_Value)
#define be32toh(_Value) __byteswap32(_Value)
#define le32toh(_Value) (_Value)

#define htobe64(_Value) __byteswap64(_Value)
#define htole64(_Value) (_Value)
#define be64toh(_Value) __byteswap64(_Value)
#define le64toh(_Value) (_Value)

#else

#define htobe16(_Value) (_Value)
#define htole16(_Value) __byteswap16(_Value)
#define be16toh(_Value) (_Value)
#define le16toh(_Value) __byteswap16(_Value)

#define htobe32(_Value) (_Value)
#define htole32(_Value) __byteswap32(_Value)
#define be32toh(_Value) (_Value)
#define le32toh(_Value) __byteswap32(_Value)

#define htobe64(_Value) (_Value)
#define htole64(_Value) __byteswap64(_Value)
#define be64toh(_Value) (_Value)
#define le64toh(_Value) __byteswap64(_Value)

#endif

//
// ------------------------------------------------------ Data Type Definitions
//

//
// -------------------------------------------------------------------- Globals
//

//
// -------------------------------------------------------- Function Prototypes
//

#endif

