#ifndef _ENDIAN_UTIL_H_
#define _ENDIAN_UTIL_H_
#include "pkg_config.h"
#include <sys/types.h>
#include <inttypes.h>
#if defined(HAVE_DECL_BE16DEC) && !HAVE_DECL_BE16DEC
static __inline uint16_t
be16dec(const void *pp)
{
uint8_t const *p = (uint8_t const *)pp;
return ((p[0] << 8) | p[1]);
}
#endif
#if defined(HAVE_DECL_BE32DEC) && !HAVE_DECL_BE32DEC
static __inline uint32_t
be32dec(const void *pp)
{
uint8_t const *p = (uint8_t const *)pp;
return (((unsigned)p[0] << 24) | (p[1] << 16) | (p[2] << 8) | p[3]);
}
#endif
#if defined(HAVE_DECL_BE64DEC) && !HAVE_DECL_BE64DEC
static __inline uint64_t
be64dec(const void *pp)
{
uint8_t const *p = (uint8_t const *)pp;
return (((uint64_t)be32dec(p) << 32) | be32dec(p + 4));
}
#endif
#if defined(HAVE_DECL_LE16DEC) && !HAVE_DECL_LE16DEC
static __inline uint16_t
le16dec(const void *pp)
{
uint8_t const *p = (uint8_t const *)pp;
return ((p[1] << 8) | p[0]);
}
#endif
#if defined(HAVE_DECL_LE32DEC) && !HAVE_DECL_LE32DEC
static __inline uint32_t
le32dec(const void *pp)
{
uint8_t const *p = (uint8_t const *)pp;
return (((unsigned)p[3] << 24) | (p[2] << 16) | (p[1] << 8) | p[0]);
}
#endif
#if defined(HAVE_DECL_LE64DEC) && !HAVE_DECL_LE64DEC
static __inline uint64_t
le64dec(const void *pp)
{
uint8_t const *p = (uint8_t const *)pp;
return (((uint64_t)le32dec(p + 4) << 32) | le32dec(p));
}
#endif
#if defined(HAVE_DECL_BE16ENC) && !HAVE_DECL_BE16ENC
static __inline void
be16enc(void *pp, uint16_t u)
{
uint8_t *p = (uint8_t *)pp;
p[0] = (u >> 8) & 0xff;
p[1] = u & 0xff;
}
#endif
#if defined(HAVE_DECL_BE32ENC) && !HAVE_DECL_BE32ENC
static __inline void
be32enc(void *pp, uint32_t u)
{
uint8_t *p = (uint8_t *)pp;
p[0] = (u >> 24) & 0xff;
p[1] = (u >> 16) & 0xff;
p[2] = (u >> 8) & 0xff;
p[3] = u & 0xff;
}
#endif
#if defined(HAVE_DECL_BE64ENC) && !HAVE_DECL_BE64ENC
static __inline void
be64enc(void *pp, uint64_t u)
{
uint8_t *p = (uint8_t *)pp;
be32enc(p, (uint32_t)(u >> 32));
be32enc(p + 4, (uint32_t)(u & 0xffffffffU));
}
#endif
#if defined(HAVE_DECL_LE16ENC) && !HAVE_DECL_LE16ENC
static __inline void
le16enc(void *pp, uint16_t u)
{
uint8_t *p = (uint8_t *)pp;
p[0] = u & 0xff;
p[1] = (u >> 8) & 0xff;
}
#endif
#if defined(HAVE_DECL_LE32ENC) && !HAVE_DECL_LE32ENC
static __inline void
le32enc(void *pp, uint32_t u)
{
uint8_t *p = (uint8_t *)pp;
p[0] = u & 0xff;
p[1] = (u >> 8) & 0xff;
p[2] = (u >> 16) & 0xff;
p[3] = (u >> 24) & 0xff;
}
#endif
#if defined(HAVE_DECL_LE64ENC) && !HAVE_DECL_LE64ENC
static __inline void
le64enc(void *pp, uint64_t u)
{
uint8_t *p = (uint8_t *)pp;
le32enc(p, (uint32_t)(u & 0xffffffffU));
le32enc(p + 4, (uint32_t)(u >> 32));
}
#endif
#endif