Blame lib/system.h

Packit 032894
/* Declarations for common convenience functions.
Packit 032894
   Copyright (C) 2006-2011 Red Hat, Inc.
Packit 032894
   This file is part of elfutils.
Packit 032894
Packit 032894
   This file is free software; you can redistribute it and/or modify
Packit 032894
   it under the terms of either
Packit 032894
Packit 032894
     * the GNU Lesser General Public License as published by the Free
Packit 032894
       Software Foundation; either version 3 of the License, or (at
Packit 032894
       your option) any later version
Packit 032894
Packit 032894
   or
Packit 032894
Packit 032894
     * the GNU General Public License as published by the Free
Packit 032894
       Software Foundation; either version 2 of the License, or (at
Packit 032894
       your option) any later version
Packit 032894
Packit 032894
   or both in parallel, as here.
Packit 032894
Packit 032894
   elfutils is distributed in the hope that it will be useful, but
Packit 032894
   WITHOUT ANY WARRANTY; without even the implied warranty of
Packit 032894
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Packit 032894
   General Public License for more details.
Packit 032894
Packit 032894
   You should have received copies of the GNU General Public License and
Packit 032894
   the GNU Lesser General Public License along with this program.  If
Packit 032894
   not, see <http://www.gnu.org/licenses/>.  */
Packit 032894
Packit 032894
#ifndef LIB_SYSTEM_H
Packit 032894
#define LIB_SYSTEM_H	1
Packit 032894
Packit 032894
#include <errno.h>
Packit 032894
#include <error.h>
Packit 032894
#include <stddef.h>
Packit 032894
#include <stdint.h>
Packit 032894
#include <sys/param.h>
Packit 032894
#include <endian.h>
Packit 032894
#include <byteswap.h>
Packit 032894
#include <unistd.h>
Packit 032894
Packit 032894
#if __BYTE_ORDER == __LITTLE_ENDIAN
Packit 032894
# define LE32(n)	(n)
Packit 032894
# define LE64(n)	(n)
Packit 032894
# define BE32(n)	bswap_32 (n)
Packit 032894
# define BE64(n)	bswap_64 (n)
Packit 032894
#elif __BYTE_ORDER == __BIG_ENDIAN
Packit 032894
# define BE32(n)	(n)
Packit 032894
# define BE64(n)	(n)
Packit 032894
# define LE32(n)	bswap_32 (n)
Packit 032894
# define LE64(n)	bswap_64 (n)
Packit 032894
#else
Packit 032894
# error "Unknown byte order"
Packit 032894
#endif
Packit 032894
Packit 032894
#ifndef MAX
Packit 032894
#define MAX(m, n) ((m) < (n) ? (n) : (m))
Packit 032894
#endif
Packit 032894
Packit 032894
#ifndef MIN
Packit 032894
#define MIN(m, n) ((m) < (n) ? (m) : (n))
Packit 032894
#endif
Packit 032894
Packit 032894
#if !HAVE_DECL_POWEROF2
Packit 032894
#define powerof2(x) (((x) & ((x) - 1)) == 0)
Packit 032894
#endif
Packit 032894
Packit 032894
#if !HAVE_DECL_MEMPCPY
Packit 032894
#define mempcpy(dest, src, n) \
Packit 032894
    ((void *) ((char *) memcpy (dest, src, n) + (size_t) n))
Packit 032894
#endif
Packit 032894
Packit 032894
/* A special gettext function we use if the strings are too short.  */
Packit 032894
#define sgettext(Str) \
Packit 032894
  ({ const char *__res = strrchr (gettext (Str), '|');			      \
Packit 032894
     __res ? __res + 1 : Str; })
Packit 032894
Packit 032894
#define gettext_noop(Str) Str
Packit 032894
Packit 032894
#ifndef TEMP_FAILURE_RETRY
Packit 032894
#define TEMP_FAILURE_RETRY(expression) \
Packit 032894
  ({ ssize_t __res; \
Packit 032894
     do \
Packit 032894
       __res = expression; \
Packit 032894
     while (__res == -1 && errno == EINTR); \
Packit 032894
     __res; })
Packit 032894
#endif
Packit 032894
Packit 032894
static inline ssize_t __attribute__ ((unused))
Packit 032894
pwrite_retry (int fd, const void *buf, size_t len, off_t off)
Packit 032894
{
Packit 032894
  ssize_t recvd = 0;
Packit 032894
Packit 032894
  do
Packit 032894
    {
Packit 032894
      ssize_t ret = TEMP_FAILURE_RETRY (pwrite (fd, buf + recvd, len - recvd,
Packit 032894
						off + recvd));
Packit 032894
      if (ret <= 0)
Packit 032894
	return ret < 0 ? ret : recvd;
Packit 032894
Packit 032894
      recvd += ret;
Packit 032894
    }
Packit 032894
  while ((size_t) recvd < len);
Packit 032894
Packit 032894
  return recvd;
Packit 032894
}
Packit 032894
Packit 032894
static inline ssize_t __attribute__ ((unused))
Packit 032894
write_retry (int fd, const void *buf, size_t len)
Packit 032894
{
Packit 032894
  ssize_t recvd = 0;
Packit 032894
Packit 032894
  do
Packit 032894
    {
Packit 032894
      ssize_t ret = TEMP_FAILURE_RETRY (write (fd, buf + recvd, len - recvd));
Packit 032894
      if (ret <= 0)
Packit 032894
	return ret < 0 ? ret : recvd;
Packit 032894
Packit 032894
      recvd += ret;
Packit 032894
    }
Packit 032894
  while ((size_t) recvd < len);
Packit 032894
Packit 032894
  return recvd;
Packit 032894
}
Packit 032894
Packit 032894
static inline ssize_t __attribute__ ((unused))
Packit 032894
pread_retry (int fd, void *buf, size_t len, off_t off)
Packit 032894
{
Packit 032894
  ssize_t recvd = 0;
Packit 032894
Packit 032894
  do
Packit 032894
    {
Packit 032894
      ssize_t ret = TEMP_FAILURE_RETRY (pread (fd, buf + recvd, len - recvd,
Packit 032894
					       off + recvd));
Packit 032894
      if (ret <= 0)
Packit 032894
	return ret < 0 ? ret : recvd;
Packit 032894
Packit 032894
      recvd += ret;
Packit 032894
    }
Packit 032894
  while ((size_t) recvd < len);
Packit 032894
Packit 032894
  return recvd;
Packit 032894
}
Packit 032894
Packit 032894
/* The demangler from libstdc++.  */
Packit 032894
extern char *__cxa_demangle (const char *mangled_name, char *output_buffer,
Packit 032894
			     size_t *length, int *status);
Packit 032894
Packit 032894
/* A static assertion.  This will cause a compile-time error if EXPR,
Packit 032894
   which must be a compile-time constant, is false.  */
Packit 032894
Packit 032894
#define eu_static_assert(expr)						\
Packit 032894
  extern int never_defined_just_used_for_checking[(expr) ? 1 : -1]	\
Packit 032894
    __attribute__ ((unused))
Packit 032894
Packit 032894
#endif /* system.h */