Blame include/cdio/bytesex.h

Packit dd8086
/*
Packit dd8086
    Copyright (C) 2000, 2004 Herbert Valerio Riedel <hvr@gnu.org>
Packit dd8086
    Copyright (C) 2005, 2008, 2012, 2015 Rocky Bernstein <rocky@gnu.org>
Packit dd8086
Packit dd8086
    This program is free software: you can redistribute it and/or modify
Packit dd8086
    it under the terms of the GNU General Public License as published by
Packit dd8086
    the Free Software Foundation, either version 3 of the License, or
Packit dd8086
    (at your option) any later version.
Packit dd8086
Packit dd8086
    This program is distributed in the hope that it will be useful,
Packit dd8086
    but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit dd8086
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
Packit dd8086
    GNU General Public License for more details.
Packit dd8086
Packit dd8086
    You should have received a copy of the GNU General Public License
Packit dd8086
    along with this program.  If not, see <http://www.gnu.org/licenses/>.
Packit dd8086
*/
Packit dd8086

Packit dd8086
/** \file bytesex.h
Packit dd8086
 *  \brief  Generic Byte-swapping routines.
Packit dd8086
 *
Packit dd8086
 *   Note: this header will is slated to get removed and libcdio will
Packit dd8086
 *   use glib.h routines instead.
Packit dd8086
*/
Packit dd8086
Packit dd8086
#ifndef CDIO_BYTESEX_H_
Packit dd8086
#define CDIO_BYTESEX_H_
Packit dd8086
Packit dd8086
#include <cdio/types.h>
Packit dd8086
#include <cdio/bytesex_asm.h> /* also defines CDIO_INLINE */
Packit dd8086
#include <cdio/logging.h>
Packit dd8086
Packit dd8086
/** 16-bit big-endian to little-endian */
Packit dd8086
#define UINT16_SWAP_LE_BE_C(val) ((uint16_t) ( \
Packit dd8086
    (((uint16_t) (val) & (uint16_t) 0x00ffU) << 8) | \
Packit dd8086
    (((uint16_t) (val) & (uint16_t) 0xff00U) >> 8)))
Packit dd8086
Packit dd8086
/** 32-bit big-endian to little-endian */
Packit dd8086
#define UINT32_SWAP_LE_BE_C(val) ((uint32_t) ( \
Packit dd8086
    (((uint32_t) (val) & (uint32_t) 0x000000ffU) << 24) | \
Packit dd8086
    (((uint32_t) (val) & (uint32_t) 0x0000ff00U) <<  8) | \
Packit dd8086
    (((uint32_t) (val) & (uint32_t) 0x00ff0000U) >>  8) | \
Packit dd8086
    (((uint32_t) (val) & (uint32_t) 0xff000000U) >> 24)))
Packit dd8086
Packit dd8086
/** 64-bit big-endian to little-endian */
Packit dd8086
#define UINT64_SWAP_LE_BE_C(val) ((uint64_t) ( \
Packit dd8086
    (((uint64_t) (val) & (uint64_t) UINT64_C(0x00000000000000ff)) << 56) | \
Packit dd8086
    (((uint64_t) (val) & (uint64_t) UINT64_C(0x000000000000ff00)) << 40) | \
Packit dd8086
    (((uint64_t) (val) & (uint64_t) UINT64_C(0x0000000000ff0000)) << 24) | \
Packit dd8086
    (((uint64_t) (val) & (uint64_t) UINT64_C(0x00000000ff000000)) <<  8) | \
Packit dd8086
    (((uint64_t) (val) & (uint64_t) UINT64_C(0x000000ff00000000)) >>  8) | \
Packit dd8086
    (((uint64_t) (val) & (uint64_t) UINT64_C(0x0000ff0000000000)) >> 24) | \
Packit dd8086
    (((uint64_t) (val) & (uint64_t) UINT64_C(0x00ff000000000000)) >> 40) | \
Packit dd8086
    (((uint64_t) (val) & (uint64_t) UINT64_C(0xff00000000000000)) >> 56)))
Packit dd8086
Packit dd8086
#ifndef UINT16_SWAP_LE_BE
Packit dd8086
# define UINT16_SWAP_LE_BE UINT16_SWAP_LE_BE_C
Packit dd8086
#endif
Packit dd8086
Packit dd8086
#ifndef UINT32_SWAP_LE_BE
Packit dd8086
# define UINT32_SWAP_LE_BE UINT32_SWAP_LE_BE_C
Packit dd8086
#endif
Packit dd8086
Packit dd8086
#ifndef UINT64_SWAP_LE_BE
Packit dd8086
# define UINT64_SWAP_LE_BE UINT64_SWAP_LE_BE_C
Packit dd8086
#endif
Packit dd8086
Packit dd8086
static CDIO_INLINE
Packit dd8086
uint16_t uint16_swap_le_be (const uint16_t val)
Packit dd8086
{
Packit dd8086
  return UINT16_SWAP_LE_BE (val);
Packit dd8086
}
Packit dd8086
Packit dd8086
static CDIO_INLINE
Packit dd8086
uint32_t uint32_swap_le_be (const uint32_t val)
Packit dd8086
{
Packit dd8086
  return UINT32_SWAP_LE_BE (val);
Packit dd8086
}
Packit dd8086
Packit dd8086
static CDIO_INLINE
Packit dd8086
uint64_t uint64_swap_le_be (const uint64_t val)
Packit dd8086
{
Packit dd8086
  return UINT64_SWAP_LE_BE (val);
Packit dd8086
}
Packit dd8086
Packit dd8086
# define UINT8_TO_BE(val)      ((uint8_t) (val))
Packit dd8086
# define UINT8_TO_LE(val)      ((uint8_t) (val))
Packit dd8086
#ifdef WORDS_BIGENDIAN
Packit dd8086
# define UINT16_TO_BE(val)     ((uint16_t) (val))
Packit dd8086
# define UINT16_TO_LE(val)     ((uint16_t) UINT16_SWAP_LE_BE(val))
Packit dd8086
Packit dd8086
# define UINT32_TO_BE(val)     ((uint32_t) (val))
Packit dd8086
# define UINT32_TO_LE(val)     ((uint32_t) UINT32_SWAP_LE_BE(val))
Packit dd8086
Packit dd8086
# define UINT64_TO_BE(val)     ((uint64_t) (val))
Packit dd8086
# define UINT64_TO_LE(val)     ((uint64_t) UINT64_SWAP_LE_BE(val))
Packit dd8086
#else
Packit dd8086
# define UINT16_TO_BE(val)     ((uint16_t) UINT16_SWAP_LE_BE(val))
Packit dd8086
# define UINT16_TO_LE(val)     ((uint16_t) (val))
Packit dd8086
Packit dd8086
# define UINT32_TO_BE(val)     ((uint32_t) UINT32_SWAP_LE_BE(val))
Packit dd8086
# define UINT32_TO_LE(val)     ((uint32_t) (val))
Packit dd8086
Packit dd8086
# define UINT64_TO_BE(val)     ((uint64_t) UINT64_SWAP_LE_BE(val))
Packit dd8086
# define UINT64_TO_LE(val)     ((uint64_t) (val))
Packit dd8086
#endif
Packit dd8086
Packit dd8086
/** symmetric conversions */
Packit dd8086
#define UINT8_FROM_BE(val)     (UINT8_TO_BE (val))
Packit dd8086
#define UINT8_FROM_LE(val)     (UINT8_TO_LE (val))
Packit dd8086
#define UINT16_FROM_BE(val)    (UINT16_TO_BE (val))
Packit dd8086
#define UINT16_FROM_LE(val)    (UINT16_TO_LE (val))
Packit dd8086
#define UINT32_FROM_BE(val)    (UINT32_TO_BE (val))
Packit dd8086
#define UINT32_FROM_LE(val)    (UINT32_TO_LE (val))
Packit dd8086
#define UINT64_FROM_BE(val)    (UINT64_TO_BE (val))
Packit dd8086
#define UINT64_FROM_LE(val)    (UINT64_TO_LE (val))
Packit dd8086
Packit dd8086
/** converter function template */
Packit dd8086
#define CVT_TO_FUNC(bits) \
Packit dd8086
 static CDIO_INLINE uint ## bits ## _t \
Packit dd8086
 uint ## bits ## _to_be (uint ## bits ## _t val) \
Packit dd8086
 { return UINT ## bits ## _TO_BE (val); } \
Packit dd8086
 static CDIO_INLINE uint ## bits ## _t \
Packit dd8086
 uint ## bits ## _to_le (uint ## bits ## _t val) \
Packit dd8086
 { return UINT ## bits ## _TO_LE (val); } \
Packit dd8086
Packit dd8086
CVT_TO_FUNC(8)
Packit dd8086
CVT_TO_FUNC(16)
Packit dd8086
CVT_TO_FUNC(32)
Packit dd8086
CVT_TO_FUNC(64)
Packit dd8086
Packit dd8086
#undef CVT_TO_FUNC
Packit dd8086
Packit dd8086
#define uint8_from_be(val)     (uint8_to_be (val))
Packit dd8086
#define uint8_from_le(val)     (uint8_to_le (val))
Packit dd8086
#define uint16_from_be(val)    (uint16_to_be (val))
Packit dd8086
#define uint16_from_le(val)    (uint16_to_le (val))
Packit dd8086
#define uint32_from_be(val)    (uint32_to_be (val))
Packit dd8086
#define uint32_from_le(val)    (uint32_to_le (val))
Packit dd8086
#define uint64_from_be(val)    (uint64_to_be (val))
Packit dd8086
#define uint64_from_le(val)    (uint64_to_le (val))
Packit dd8086
Packit dd8086
/** ISO9660-related field conversion routines */
Packit dd8086
Packit dd8086
/** Convert from uint8_t to ISO 9660 7.1.1 format */
Packit dd8086
#define to_711(i)   uint8_to_le(i)
Packit dd8086
Packit dd8086
/** Convert from ISO 9660 7.1.1 format to uint8_t */
Packit dd8086
#define from_711(i) uint8_from_le(i)
Packit dd8086
Packit dd8086
/** Convert from uint16_t to ISO 9669 7.2.1 format */
Packit dd8086
#define to_721(i)   uint16_to_le(i)
Packit dd8086
Packit dd8086
/** Convert from ISO 9660 7.2.1 format to uint16_t */
Packit dd8086
#define from_721(i) uint16_from_le(i)
Packit dd8086
Packit dd8086
/** Convert from uint16_t to ISO 9669 7.2.2 format */
Packit dd8086
#define to_722(i)   uint16_to_be(i)
Packit dd8086
Packit dd8086
/** Convert from ISO 9660 7.2.2 format to uint16_t */
Packit dd8086
#define from_722(i) uint16_from_be(i)
Packit dd8086
Packit dd8086
/** Convert from uint16_t to ISO 9669 7.2.3 format */
Packit dd8086
static CDIO_INLINE uint32_t
Packit dd8086
to_723(uint16_t i)
Packit dd8086
{
Packit dd8086
  return uint32_swap_le_be(i) | i;
Packit dd8086
}
Packit dd8086
Packit dd8086
/** Convert from ISO 9660 7.2.3 format to uint16_t */
Packit dd8086
static CDIO_INLINE uint16_t
Packit dd8086
from_723 (uint32_t p)
Packit dd8086
{
Packit dd8086
  if (uint32_swap_le_be (p) != p)
Packit dd8086
    cdio_warn ("from_723: broken byte order");
Packit dd8086
Packit dd8086
  return (0xFFFF & p);
Packit dd8086
}
Packit dd8086
Packit dd8086
/** Convert from uint16_t to ISO 9669 7.3.1 format */
Packit dd8086
#define to_731(i)   uint32_to_le(i)
Packit dd8086
Packit dd8086
/** Convert from ISO 9660 7.3.1 format to uint32_t */
Packit dd8086
#define from_731(i) uint32_from_le(i)
Packit dd8086
Packit dd8086
/** Convert from uint32_t to ISO 9669 7.3.2 format */
Packit dd8086
#define to_732(i)   uint32_to_be(i)
Packit dd8086
Packit dd8086
/** Convert from ISO 9660 7.3.2 format to uint32_t */
Packit dd8086
#define from_732(i) uint32_from_be(i)
Packit dd8086
Packit dd8086
/** Convert from uint16_t to ISO 9669 7.3.3 format */
Packit dd8086
static CDIO_INLINE uint64_t
Packit dd8086
to_733(uint32_t i)
Packit dd8086
{
Packit dd8086
  return uint64_swap_le_be(i) | i;
Packit dd8086
}
Packit dd8086
Packit dd8086
/** Convert from ISO 9660 7.3.3 format to uint32_t */
Packit dd8086
static CDIO_INLINE uint32_t
Packit dd8086
from_733 (uint64_t p)
Packit dd8086
{
Packit dd8086
  if (uint64_swap_le_be (p) != p)
Packit dd8086
    cdio_warn ("from_733: broken byte order");
Packit dd8086
Packit dd8086
  return (UINT32_C(0xFFFFFFFF) & p);
Packit dd8086
}
Packit dd8086
Packit dd8086
static CDIO_INLINE uint32_t
Packit dd8086
from_733_with_err (uint64_t p, bool *err)
Packit dd8086
{
Packit dd8086
  if (uint64_swap_le_be (p) != p) {
Packit dd8086
    cdio_warn ("from_733: broken byte order");
Packit dd8086
    *err = true;
Packit dd8086
  } else {
Packit dd8086
    *err = false;
Packit dd8086
  }
Packit dd8086
  return (UINT32_C(0xFFFFFFFF) & p);
Packit dd8086
}
Packit dd8086
Packit dd8086
#endif /* CDIO_BYTESEX_H_ */
Packit dd8086
Packit dd8086

Packit dd8086
/*
Packit dd8086
 * Local variables:
Packit dd8086
 *  c-file-style: "gnu"
Packit dd8086
 *  tab-width: 8
Packit dd8086
 *  indent-tabs-mode: nil
Packit dd8086
 * End:
Packit dd8086
 */