/*
* Copyright (c) Likewise Software. All rights Reserved.
*
* This library is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation; either version 2.1 of the license, or (at
* your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser
* General Public License for more details. You should have received a copy
* of the GNU Lesser General Public License along with this program. If
* not, see .
*
* LIKEWISE SOFTWARE MAKES THIS SOFTWARE AVAILABLE UNDER OTHER LICENSING
* TERMS AS WELL. IF YOU HAVE ENTERED INTO A SEPARATE LICENSE AGREEMENT
* WITH LIKEWISE SOFTWARE, THEN YOU MAY ELECT TO USE THE SOFTWARE UNDER THE
* TERMS OF THAT SOFTWARE LICENSE AGREEMENT INSTEAD OF THE TERMS OF THE GNU
* LESSER GENERAL PUBLIC LICENSE, NOTWITHSTANDING THE ABOVE NOTICE. IF YOU
* HAVE QUESTIONS, OR WISH TO REQUEST A COPY OF THE ALTERNATE LICENSING
* TERMS OFFERED BY LIKEWISE SOFTWARE, PLEASE CONTACT LIKEWISE SOFTWARE AT
* license@likewisesoftware.com
*/
/*
* Module Name:
*
* swab.h
*
* Abstract:
*
* Swap Bytes for Endian Conversions
*
* Authors: Danilo Almeida (dalmeida@likewise.com)
*
*/
#ifndef __LWBASE_SWAB_H__
#define __LWBASE_SWAB_H__
//
// _LW_SWAB - Swap Bytes for N-bit Values
//
#define _LW_SWAB16(Value) \
((((LW_USHORT)(Value) & 0xFF00) >> 8) | \
(((LW_USHORT)(Value) & 0x00FF) << 8))
#define _LW_SWAB32(Value) \
((((LW_ULONG)(Value) & 0xFF000000) >> 24) | \
(((LW_ULONG)(Value) & 0x00FF0000) >> 8) | \
(((LW_ULONG)(Value) & 0x0000FF00) << 8) | \
(((LW_ULONG)(Value) & 0x000000FF) << 24))
#if 0
#define _LW_SWAB32(Value) \
(((LW_ULONG)(_LW_SWAB16(((LW_ULONG)(Value) & 0xFFFF0000) >> 16))) | \
(((LW_ULONG)_LW_SWAB16(((LW_ULONG)(Value) & 0x0000FFFF))) << 16))
#endif
#define _LW_SWAB64(Value) \
(((LW_ULONG64)(_LW_SWAB32(((LW_ULONG64)(Value) & 0xFFFFFFFF00000000LL) >> 32))) | \
(((LW_ULONG64)_LW_SWAB32(((LW_ULONG64)(Value) & 0x00000000FFFFFFFFLL))) << 32))
#if defined(WORDS_BIGENDIAN)
#define LW_HTOL16(x) _LW_SWAB16(x)
#define LW_HTOL32(x) _LW_SWAB32(x)
#define LW_HTOL64(x) _LW_SWAB64(x)
#define LW_LTOH16(x) _LW_SWAB16(x)
#define LW_LTOH32(x) _LW_SWAB32(x)
#define LW_LTOH64(x) _LW_SWAB64(x)
#define LW_HTOB16(x) (x)
#define LW_HTOB32(x) (x)
#define LW_HTOB64(x) (x)
#define LW_BTOH16(x) (x)
#define LW_BTOH32(x) (x)
#define LW_BTOH64(x) (x)
#else
#define LW_HTOL16(x) (x)
#define LW_HTOL32(x) (x)
#define LW_HTOL64(x) (x)
#define LW_LTOH16(x) (x)
#define LW_LTOH32(x) (x)
#define LW_LTOH64(x) (x)
#define LW_HTOB16(x) _LW_SWAB16(x)
#define LW_HTOB32(x) _LW_SWAB32(x)
#define LW_HTOB64(x) _LW_SWAB64(x)
#define LW_BTOH16(x) _LW_SWAB16(x)
#define LW_BTOH32(x) _LW_SWAB32(x)
#define LW_BTOH64(x) _LW_SWAB64(x)
#endif
// No-ops, but for readability.
#define LW_HTOL8(x) (x)
#define LW_LTOH8(x) (x)
#define LW_HTOB8(x) (x)
#define LW_BTOH8(x) (x)
#define LW_HTOL8_INPLACE(x) ((x) = LW_HTOL8(x))
#define LW_HTOL16_INPLACE(x) ((x) = LW_HTOL16(x))
#define LW_HTOL32_INPLACE(x) ((x) = LW_HTOL32(x))
#define LW_HTOL64_INPLACE(x) ((x) = LW_HTOL64(x))
#define LW_LTOH8_INPLACE(x) ((x) = LW_LTOH8(x))
#define LW_LTOH16_INPLACE(x) ((x) = LW_LTOH16(x))
#define LW_LTOH32_INPLACE(x) ((x) = LW_LTOH32(x))
#define LW_LTOH64_INPLACE(x) ((x) = LW_LTOH64(x))
#define LW_HTOB8_INPLACE(x) ((x) = LW_HTOB8(x))
#define LW_HTOB16_INPLACE(x) ((x) = LW_HTOB16(x))
#define LW_HTOB32_INPLACE(x) ((x) = LW_HTOB32(x))
#define LW_HTOB64_INPLACE(x) ((x) = LW_HTOB64(x))
#define LW_BTOH8_INPLACE(x) ((x) = LW_BTOH8(x))
#define LW_BTOH16_INPLACE(x) ((x) = LW_BTOH16(x))
#define LW_BTOH32_INPLACE(x) ((x) = LW_BTOH32(x))
#define LW_BTOH64_INPLACE(x) ((x) = LW_BTOH64(x))
#endif /* __LWBASE_SWAB_H__ */