This repository has been archived on 2023-08-20. You can view files and clone it. You cannot open issues or pull requests or push a commit.
Files

116 lines
2.1 KiB
C

#ident "$Id: ulint.h,v 1.3 2004/12/20 04:57:44 hpa Exp $"
/* ----------------------------------------------------------------------- *
*
* Copyright 2001-2004 H. Peter Anvin - All Rights Reserved
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, Inc., 675 Mass Ave, Cambridge MA 02139,
* USA; either version 2 of the License, or (at your option) any later
* version; incorporated herein by reference.
*
* ----------------------------------------------------------------------- */
/*
* ulint.h
*
* Basic operations on unaligned, littleendian integers
*/
#ifndef ULINT_H
#define ULINT_H
#include <inttypes.h>
/* These are unaligned, littleendian integer types */
typedef uint8_t le8_t; /* 8-bit byte */
typedef uint8_t le16_t[2]; /* 16-bit word */
typedef uint8_t le32_t[4]; /* 32-bit dword */
/* Read/write these quantities */
static inline unsigned char
read8(le8_t *_p)
{
return *_p;
}
static inline void
write8(le8_t *_p, uint8_t _v)
{
*_p = _v;
}
#if defined(__i386__) || defined(__x86_64__)
/* Littleendian architectures which support unaligned memory accesses */
static inline unsigned short
read16(le16_t *_p)
{
return *((const uint16_t *)_p);
}
static inline void
write16(le16_t *_p, unsigned short _v)
{
*((uint16_t *)_p) = _v;
}
static inline unsigned int
read32(le32_t *_p)
{
return *((const uint32_t *)_p);
}
static inline void
write32(le32_t *_p, uint32_t _v)
{
*((uint32_t *)_p) = _v;
}
#else
/* Generic, mostly portable versions */
static inline unsigned short
read16(le16_t *_p)
{
uint16_t _v;
_v = p[0];
_v |= p[1] << 8;
return _v;
}
static inline void
write16(le16_t *_p, uint16_t _v)
{
_p[0] = _v & 0xFF;
_p[1] = (_v >> 8) & 0xFF;
}
static inline unsigned int
read32(le32_t *_p)
{
_v = _p[0];
_v |= _p[1] << 8;
_v |= _p[2] << 16;
_v |= _p[3] << 24;
return _v;
}
static inline void
write32(le32_t *_p, uint32_t _v)
{
_p[0] = _v & 0xFF;
_p[1] = (_v >> 8) & 0xFF;
_p[2] = (_v >> 16) & 0xFF;
_p[3] = (_v >> 24) & 0xFF;
}
#endif
#endif /* ULINT_H */