mirror of
https://github.com/autc04/Retro68.git
synced 2024-11-26 22:51:01 +00:00
Use a simple CMake build for libelf (autoconf is causing trouble on Mac OS 10.4)
This commit is contained in:
parent
4897a9e039
commit
8240fa9358
@ -55,6 +55,13 @@ configure_file(cmake/intree.toolchain.cmake.in cmake/intree.toolchain.cmake @ONL
|
||||
configure_file(cmake/intreeppc.toolchain.cmake.in cmake/intreeppc.toolchain.cmake @ONLY)
|
||||
configure_file(cmake/intreecarbon.toolchain.cmake.in cmake/intreecarbon.toolchain.cmake @ONLY)
|
||||
|
||||
file(GLOB ELF_FILES elfutils/libelf/*.c elfutils/libelf/*.h)
|
||||
add_library(ELF ${ELF_FILES}
|
||||
)
|
||||
target_include_directories(ELF PRIVATE elfutils/libelf)
|
||||
target_link_libraries(ELF -lz)
|
||||
target_compile_definitions(ELF PRIVATE HAVE_CONFIG_H)
|
||||
|
||||
add_subdirectory(ResourceFiles)
|
||||
add_subdirectory(MakeAPPL)
|
||||
add_subdirectory(Rez)
|
||||
|
@ -20,7 +20,7 @@ cmake_minimum_required(VERSION 3.1)
|
||||
find_package(Boost COMPONENTS REQUIRED)
|
||||
|
||||
add_executable(Elf2Mac Elf2Mac.h Elf2Mac.cc SegmentMap.cc LdScript.cc)
|
||||
target_link_libraries(Elf2Mac ResourceFiles ${CMAKE_INSTALL_PREFIX}/lib/libelf.a -lz)
|
||||
target_link_libraries(Elf2Mac ResourceFiles ELF)
|
||||
|
||||
target_include_directories(Elf2Mac PRIVATE ${CMAKE_INSTALL_PREFIX}/include)
|
||||
target_include_directories(Elf2Mac PRIVATE ${Boost_INCLUDE_DIR})
|
||||
|
190
elfutils/libelf/config.h
Normal file
190
elfutils/libelf/config.h
Normal file
@ -0,0 +1,190 @@
|
||||
/* Configuration definitions.
|
||||
Copyright (C) 2008, 2009 Red Hat, Inc.
|
||||
This file is part of elfutils.
|
||||
|
||||
This file is free software; you can redistribute it and/or modify
|
||||
it under the terms of either
|
||||
|
||||
* the GNU Lesser General Public License as published by the Free
|
||||
Software Foundation; either version 3 of the License, or (at
|
||||
your option) any later version
|
||||
|
||||
or
|
||||
|
||||
* the GNU General Public License as published by the Free
|
||||
Software Foundation; either version 2 of the License, or (at
|
||||
your option) any later version
|
||||
|
||||
or both in parallel, as here.
|
||||
|
||||
elfutils 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
|
||||
General Public License for more details.
|
||||
|
||||
You should have received copies of the GNU General Public License and
|
||||
the GNU Lesser General Public License along with this program. If
|
||||
not, see <http://www.gnu.org/licenses/>. */
|
||||
|
||||
#ifndef EU_CONFIG_H
|
||||
#define EU_CONFIG_H 1
|
||||
|
||||
#ifdef USE_LOCKS
|
||||
# include <pthread.h>
|
||||
# include <assert.h>
|
||||
# define rwlock_define(class,name) class pthread_rwlock_t name
|
||||
# define RWLOCK_CALL(call) \
|
||||
({ int _err = pthread_rwlock_ ## call; assert_perror (_err); })
|
||||
# define rwlock_init(lock) RWLOCK_CALL (init (&lock, NULL))
|
||||
# define rwlock_fini(lock) RWLOCK_CALL (destroy (&lock))
|
||||
# define rwlock_rdlock(lock) RWLOCK_CALL (rdlock (&lock))
|
||||
# define rwlock_wrlock(lock) RWLOCK_CALL (wrlock (&lock))
|
||||
# define rwlock_unlock(lock) RWLOCK_CALL (unlock (&lock))
|
||||
#else
|
||||
/* Eventually we will allow multi-threaded applications to use the
|
||||
libraries. Therefore we will add the necessary locking although
|
||||
the macros used expand to nothing for now. */
|
||||
# define rwlock_define(class,name) class int name
|
||||
# define rwlock_init(lock) ((void) (lock))
|
||||
# define rwlock_fini(lock) ((void) (lock))
|
||||
# define rwlock_rdlock(lock) ((void) (lock))
|
||||
# define rwlock_wrlock(lock) ((void) (lock))
|
||||
# define rwlock_unlock(lock) ((void) (lock))
|
||||
#endif /* USE_LOCKS */
|
||||
|
||||
/* gettext helper macro. */
|
||||
#define N_(Str) Str
|
||||
|
||||
/* Compiler-specific definitions. */
|
||||
#define strong_alias(name, aliasname) \
|
||||
extern __typeof (name) aliasname __attribute__ ((alias (#name)));
|
||||
|
||||
#ifdef __i386__
|
||||
# define internal_function __attribute__ ((regparm (3), stdcall))
|
||||
#else
|
||||
# define internal_function /* nothing */
|
||||
#endif
|
||||
|
||||
#define internal_strong_alias(name, aliasname) \
|
||||
extern __typeof (name) aliasname __attribute__ ((alias (#name))) internal_function;
|
||||
|
||||
#define attribute_hidden \
|
||||
__attribute__ ((visibility ("hidden")))
|
||||
|
||||
/* Define ALLOW_UNALIGNED if the architecture allows operations on
|
||||
unaligned memory locations. */
|
||||
#define SANITIZE_UNDEFINED 1
|
||||
#if (defined __i386__ || defined __x86_64__) && ! CHECK_UNDEFINED
|
||||
# define ALLOW_UNALIGNED 1
|
||||
#else
|
||||
# define ALLOW_UNALIGNED 0
|
||||
#endif
|
||||
|
||||
#if DEBUGPRED
|
||||
# ifdef __x86_64__
|
||||
asm (".section predict_data, \"aw\"; .previous\n"
|
||||
".section predict_line, \"a\"; .previous\n"
|
||||
".section predict_file, \"a\"; .previous");
|
||||
# ifndef PIC
|
||||
# define debugpred__(e, E) \
|
||||
({ long int _e = !!(e); \
|
||||
asm volatile (".pushsection predict_data; ..predictcnt%=: .quad 0; .quad 0\n" \
|
||||
".section predict_line; .quad %c1\n" \
|
||||
".section predict_file; .quad %c2; .popsection\n" \
|
||||
"addq $1,..predictcnt%=(,%0,8)" \
|
||||
: : "r" (_e == E), "i" (__LINE__), "i" (__FILE__)); \
|
||||
__builtin_expect (_e, E); \
|
||||
})
|
||||
# endif
|
||||
# elif defined __i386__
|
||||
asm (".section predict_data, \"aw\"; .previous\n"
|
||||
".section predict_line, \"a\"; .previous\n"
|
||||
".section predict_file, \"a\"; .previous");
|
||||
# ifndef PIC
|
||||
# define debugpred__(e, E) \
|
||||
({ long int _e = !!(e); \
|
||||
asm volatile (".pushsection predict_data; ..predictcnt%=: .long 0; .long 0\n" \
|
||||
".section predict_line; .long %c1\n" \
|
||||
".section predict_file; .long %c2; .popsection\n" \
|
||||
"incl ..predictcnt%=(,%0,8)" \
|
||||
: : "r" (_e == E), "i" (__LINE__), "i" (__FILE__)); \
|
||||
__builtin_expect (_e, E); \
|
||||
})
|
||||
# endif
|
||||
# endif
|
||||
# ifdef debugpred__
|
||||
# define unlikely(e) debugpred__ (e,0)
|
||||
# define likely(e) debugpred__ (e,1)
|
||||
# endif
|
||||
#endif
|
||||
#ifndef likely
|
||||
# define unlikely(expr) __builtin_expect (!!(expr), 0)
|
||||
# define likely(expr) __builtin_expect (!!(expr), 1)
|
||||
#endif
|
||||
|
||||
#define obstack_calloc(ob, size) \
|
||||
({ size_t _s = (size); memset (obstack_alloc (ob, _s), '\0', _s); })
|
||||
#define obstack_strdup(ob, str) \
|
||||
({ const char *_s = (str); obstack_copy0 (ob, _s, strlen (_s)); })
|
||||
#define obstack_strndup(ob, str, n) \
|
||||
({ const char *_s = (str); obstack_copy0 (ob, _s, strnlen (_s, n)); })
|
||||
|
||||
#if __STDC_VERSION__ >= 199901L
|
||||
# define flexarr_size /* empty */
|
||||
#else
|
||||
# define flexarr_size 0
|
||||
#endif
|
||||
|
||||
/* Calling conventions. */
|
||||
#ifdef __i386__
|
||||
# define CALLING_CONVENTION regparm (3), stdcall
|
||||
# define AND_CALLING_CONVENTION , regparm (3), stdcall
|
||||
#else
|
||||
# define CALLING_CONVENTION
|
||||
# define AND_CALLING_CONVENTION
|
||||
#endif
|
||||
|
||||
/* Avoid PLT entries. */
|
||||
#ifdef PIC
|
||||
# define INTUSE(name) _INTUSE(name)
|
||||
# define _INTUSE(name) __##name##_internal
|
||||
# define INTDEF(name) _INTDEF(name)
|
||||
# define _INTDEF(name) \
|
||||
extern __typeof__ (name) __##name##_internal __attribute__ ((alias (#name)));
|
||||
# define INTDECL(name) _INTDECL(name)
|
||||
# define _INTDECL(name) \
|
||||
extern __typeof__ (name) __##name##_internal attribute_hidden;
|
||||
#else
|
||||
# define INTUSE(name) name
|
||||
# define INTDEF(name) /* empty */
|
||||
# define INTDECL(name) /* empty */
|
||||
#endif
|
||||
|
||||
/* This macro is used by the tests conditionalize for standalone building. */
|
||||
#define ELFUTILS_HEADER(name) <lib##name.h>
|
||||
|
||||
|
||||
#ifdef SYMBOL_VERSIONING
|
||||
# define OLD_VERSION(name, version) \
|
||||
asm (".globl _compat." #version "." #name "\n" \
|
||||
"_compat." #version "." #name " = " #name "\n" \
|
||||
".symver _compat." #version "." #name "," #name "@" #version);
|
||||
# define NEW_VERSION(name, version) \
|
||||
asm (".symver " #name "," #name "@@@" #version);
|
||||
# define COMPAT_VERSION_NEWPROTO(name, version, prefix) \
|
||||
asm (".symver _compat." #version "." #name "," #name "@" #version); \
|
||||
__typeof (_compat_##prefix##_##name) _compat_##prefix##_##name \
|
||||
asm ("_compat." #version "." #name);
|
||||
# define COMPAT_VERSION(name, version, prefix) \
|
||||
asm (".symver _compat." #version "." #name "," #name "@" #version); \
|
||||
__typeof (name) _compat_##prefix##_##name asm ("_compat." #version "." #name);
|
||||
#else
|
||||
# define OLD_VERSION(name, version) /* Nothing for static linking. */
|
||||
# define NEW_VERSION(name, version) /* Nothing for static linking. */
|
||||
# define COMPAT_VERSION_NEWPROTO(name, version, prefix) \
|
||||
error "should use #ifdef SYMBOL_VERSIONING"
|
||||
# define COMPAT_VERSION(name, version, prefix) error "should use #ifdef SYMBOL_VERSIONING"
|
||||
#endif
|
||||
|
||||
|
||||
#endif /* eu-config.h */
|
272
elfutils/libelf/fixedsizehash.h
Normal file
272
elfutils/libelf/fixedsizehash.h
Normal file
@ -0,0 +1,272 @@
|
||||
/* Fixed size hash table with internal linking.
|
||||
Copyright (C) 2000, 2001, 2002, 2004, 2005 Red Hat, Inc.
|
||||
This file is part of elfutils.
|
||||
Written by Ulrich Drepper <drepper@redhat.com>, 2000.
|
||||
|
||||
This file is free software; you can redistribute it and/or modify
|
||||
it under the terms of either
|
||||
|
||||
* the GNU Lesser General Public License as published by the Free
|
||||
Software Foundation; either version 3 of the License, or (at
|
||||
your option) any later version
|
||||
|
||||
or
|
||||
|
||||
* the GNU General Public License as published by the Free
|
||||
Software Foundation; either version 2 of the License, or (at
|
||||
your option) any later version
|
||||
|
||||
or both in parallel, as here.
|
||||
|
||||
elfutils 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
|
||||
General Public License for more details.
|
||||
|
||||
You should have received copies of the GNU General Public License and
|
||||
the GNU Lesser General Public License along with this program. If
|
||||
not, see <http://www.gnu.org/licenses/>. */
|
||||
|
||||
#include <errno.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <sys/cdefs.h>
|
||||
|
||||
#include <system.h>
|
||||
|
||||
#ifdef __CONCAT
|
||||
#define CONCAT(t1,t2) __CONCAT (t1,t2)
|
||||
#else
|
||||
#define STROF(t2) t2
|
||||
#define CONCAT_EXPANDED(t1,t2) t1 ## t2
|
||||
#define CONCAT(t1,t2) CONCAT_EXPANDED(t1,t2)
|
||||
#endif
|
||||
|
||||
/* Before including this file the following macros must be defined:
|
||||
|
||||
TYPE data type of the hash table entries
|
||||
HASHFCT name of the hashing function to use
|
||||
HASHTYPE type used for the hashing value
|
||||
COMPARE comparison function taking two pointers to TYPE objects
|
||||
CLASS can be defined to `static' to avoid exporting the functions
|
||||
PREFIX prefix to be used for function and data type names
|
||||
STORE_POINTER if defined the table stores a pointer and not an element
|
||||
of type TYPE
|
||||
INSERT_HASH if defined alternate insert function which takes a hash
|
||||
value is defined
|
||||
NO_FINI_FCT if defined the fini function is not defined
|
||||
*/
|
||||
|
||||
|
||||
/* Defined separately. */
|
||||
extern size_t next_prime (size_t seed);
|
||||
|
||||
|
||||
/* Set default values. */
|
||||
#ifndef HASHTYPE
|
||||
# define HASHTYPE size_t
|
||||
#endif
|
||||
|
||||
#ifndef CLASS
|
||||
# define CLASS
|
||||
#endif
|
||||
|
||||
#ifndef PREFIX
|
||||
# define PREFIX
|
||||
#endif
|
||||
|
||||
|
||||
/* The data structure. */
|
||||
struct CONCAT(PREFIX,fshash)
|
||||
{
|
||||
size_t nslots;
|
||||
struct CONCAT(PREFIX,fshashent)
|
||||
{
|
||||
HASHTYPE hval;
|
||||
#ifdef STORE_POINTER
|
||||
# define ENTRYP(el) (el).entry
|
||||
TYPE *entry;
|
||||
#else
|
||||
# define ENTRYP(el) &(el).entry
|
||||
TYPE entry;
|
||||
#endif
|
||||
} table[0];
|
||||
};
|
||||
|
||||
|
||||
/* Constructor for the hashing table. */
|
||||
CLASS struct CONCAT(PREFIX,fshash) *
|
||||
CONCAT(PREFIX,fshash_init) (size_t nelems)
|
||||
{
|
||||
struct CONCAT(PREFIX,fshash) *result;
|
||||
/* We choose a size for the hashing table 150% over the number of
|
||||
entries. This will guarantee short medium search lengths. */
|
||||
const size_t max_size_t = ~((size_t) 0);
|
||||
|
||||
if (nelems >= (max_size_t / 3) * 2)
|
||||
{
|
||||
errno = EINVAL;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* Adjust the size to be used for the hashing table. */
|
||||
nelems = next_prime (MAX ((nelems * 3) / 2, 10));
|
||||
|
||||
/* Allocate the data structure for the result. */
|
||||
result = (struct CONCAT(PREFIX,fshash) *)
|
||||
xcalloc (sizeof (struct CONCAT(PREFIX,fshash))
|
||||
+ (nelems + 1) * sizeof (struct CONCAT(PREFIX,fshashent)), 1);
|
||||
if (result == NULL)
|
||||
return NULL;
|
||||
|
||||
result->nslots = nelems;
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
#ifndef NO_FINI_FCT
|
||||
CLASS void
|
||||
CONCAT(PREFIX,fshash_fini) (struct CONCAT(PREFIX,fshash) *htab)
|
||||
{
|
||||
free (htab);
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
static struct CONCAT(PREFIX,fshashent) *
|
||||
CONCAT(PREFIX,fshash_lookup) (struct CONCAT(PREFIX,fshash) *htab,
|
||||
HASHTYPE hval, TYPE *data)
|
||||
{
|
||||
size_t idx = 1 + hval % htab->nslots;
|
||||
|
||||
if (htab->table[idx].hval != 0)
|
||||
{
|
||||
HASHTYPE hash;
|
||||
|
||||
/* See whether this is the same entry. */
|
||||
if (htab->table[idx].hval == hval
|
||||
&& COMPARE (data, ENTRYP (htab->table[idx])) == 0)
|
||||
return &htab->table[idx];
|
||||
|
||||
/* Second hash function as suggested in [Knuth]. */
|
||||
hash = 1 + hval % (htab->nslots - 2);
|
||||
|
||||
do
|
||||
{
|
||||
if (idx <= hash)
|
||||
idx = htab->nslots + idx - hash;
|
||||
else
|
||||
idx -= hash;
|
||||
|
||||
if (htab->table[idx].hval == hval
|
||||
&& COMPARE (data, ENTRYP(htab->table[idx])) == 0)
|
||||
return &htab->table[idx];
|
||||
}
|
||||
while (htab->table[idx].hval != 0);
|
||||
}
|
||||
|
||||
return &htab->table[idx];
|
||||
}
|
||||
|
||||
|
||||
CLASS int
|
||||
__attribute__ ((unused))
|
||||
CONCAT(PREFIX,fshash_insert) (struct CONCAT(PREFIX,fshash) *htab,
|
||||
const char *str,
|
||||
size_t len __attribute__ ((unused)), TYPE *data)
|
||||
{
|
||||
HASHTYPE hval = HASHFCT (str, len ?: strlen (str));
|
||||
struct CONCAT(PREFIX,fshashent) *slot;
|
||||
|
||||
slot = CONCAT(PREFIX,fshash_lookup) (htab, hval, data);
|
||||
if (slot->hval != 0)
|
||||
/* We don't want to overwrite the old value. */
|
||||
return -1;
|
||||
|
||||
slot->hval = hval;
|
||||
#ifdef STORE_POINTER
|
||||
slot->entry = data;
|
||||
#else
|
||||
slot->entry = *data;
|
||||
#endif
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
#ifdef INSERT_HASH
|
||||
CLASS int
|
||||
__attribute__ ((unused))
|
||||
CONCAT(PREFIX,fshash_insert_hash) (struct CONCAT(PREFIX,fshash) *htab,
|
||||
HASHTYPE hval, TYPE *data)
|
||||
{
|
||||
struct CONCAT(PREFIX,fshashent) *slot;
|
||||
|
||||
slot = CONCAT(PREFIX,fshash_lookup) (htab, hval, data);
|
||||
if (slot->hval != 0)
|
||||
/* We don't want to overwrite the old value. */
|
||||
return -1;
|
||||
|
||||
slot->hval = hval;
|
||||
#ifdef STORE_POINTER
|
||||
slot->entry = data;
|
||||
#else
|
||||
slot->entry = *data;
|
||||
#endif
|
||||
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
CLASS int
|
||||
__attribute__ ((unused))
|
||||
CONCAT(PREFIX,fshash_overwrite) (struct CONCAT(PREFIX,fshash) *htab,
|
||||
const char *str,
|
||||
size_t len __attribute__ ((unused)),
|
||||
TYPE *data)
|
||||
{
|
||||
HASHTYPE hval = HASHFCT (str, len ?: strlen (str));
|
||||
struct CONCAT(PREFIX,fshashent) *slot;
|
||||
|
||||
slot = CONCAT(PREFIX,fshash_lookup) (htab, hval, data);
|
||||
slot->hval = hval;
|
||||
#ifdef STORE_POINTER
|
||||
slot->entry = data;
|
||||
#else
|
||||
slot->entry = *data;
|
||||
#endif
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
CLASS const TYPE *
|
||||
CONCAT(PREFIX,fshash_find) (const struct CONCAT(PREFIX,fshash) *htab,
|
||||
const char *str,
|
||||
size_t len __attribute__ ((unused)), TYPE *data)
|
||||
{
|
||||
HASHTYPE hval = HASHFCT (str, len ?: strlen (str));
|
||||
struct CONCAT(PREFIX,fshashent) *slot;
|
||||
|
||||
slot = CONCAT(PREFIX,fshash_lookup) ((struct CONCAT(PREFIX,fshash) *) htab,
|
||||
hval, data);
|
||||
if (slot->hval == 0)
|
||||
/* Not found. */
|
||||
return NULL;
|
||||
|
||||
return ENTRYP(*slot);
|
||||
}
|
||||
|
||||
|
||||
/* Unset the macros we expect. */
|
||||
#undef TYPE
|
||||
#undef HASHFCT
|
||||
#undef HASHTYPE
|
||||
#undef COMPARE
|
||||
#undef CLASS
|
||||
#undef PREFIX
|
||||
#undef INSERT_HASH
|
||||
#undef STORE_POINTER
|
||||
#undef NO_FINI_FCT
|
150
elfutils/libelf/system.h
Normal file
150
elfutils/libelf/system.h
Normal file
@ -0,0 +1,150 @@
|
||||
/* Declarations for common convenience functions.
|
||||
Copyright (C) 2006-2011 Red Hat, Inc.
|
||||
This file is part of elfutils.
|
||||
|
||||
This file is free software; you can redistribute it and/or modify
|
||||
it under the terms of either
|
||||
|
||||
* the GNU Lesser General Public License as published by the Free
|
||||
Software Foundation; either version 3 of the License, or (at
|
||||
your option) any later version
|
||||
|
||||
or
|
||||
|
||||
* the GNU General Public License as published by the Free
|
||||
Software Foundation; either version 2 of the License, or (at
|
||||
your option) any later version
|
||||
|
||||
or both in parallel, as here.
|
||||
|
||||
elfutils 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
|
||||
General Public License for more details.
|
||||
|
||||
You should have received copies of the GNU General Public License and
|
||||
the GNU Lesser General Public License along with this program. If
|
||||
not, see <http://www.gnu.org/licenses/>. */
|
||||
|
||||
#ifndef LIB_SYSTEM_H
|
||||
#define LIB_SYSTEM_H 1
|
||||
|
||||
#include <errno.h>
|
||||
#include <stddef.h>
|
||||
#include <stdint.h>
|
||||
#include <sys/param.h>
|
||||
#include <endian.h>
|
||||
#include <byteswap.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#if __BYTE_ORDER == __LITTLE_ENDIAN
|
||||
# define LE32(n) (n)
|
||||
# define LE64(n) (n)
|
||||
# define BE32(n) bswap_32 (n)
|
||||
# define BE64(n) bswap_64 (n)
|
||||
#elif __BYTE_ORDER == __BIG_ENDIAN
|
||||
# define BE32(n) (n)
|
||||
# define BE64(n) (n)
|
||||
# define LE32(n) bswap_32 (n)
|
||||
# define LE64(n) bswap_64 (n)
|
||||
#else
|
||||
# error "Unknown byte order"
|
||||
#endif
|
||||
|
||||
#ifndef MAX
|
||||
#define MAX(m, n) ((m) < (n) ? (n) : (m))
|
||||
#endif
|
||||
|
||||
#ifndef MIN
|
||||
#define MIN(m, n) ((m) < (n) ? (m) : (n))
|
||||
#endif
|
||||
|
||||
#if !HAVE_DECL_MEMPCPY
|
||||
#define mempcpy(dest, src, n) \
|
||||
((void *) ((char *) memcpy (dest, src, n) + (size_t) n))
|
||||
#endif
|
||||
|
||||
/* A special gettext function we use if the strings are too short. */
|
||||
#define sgettext(Str) \
|
||||
({ const char *__res = strrchr (gettext (Str), '|'); \
|
||||
__res ? __res + 1 : Str; })
|
||||
|
||||
#define gettext_noop(Str) Str
|
||||
|
||||
#ifndef TEMP_FAILURE_RETRY
|
||||
#define TEMP_FAILURE_RETRY(expression) \
|
||||
({ ssize_t __res; \
|
||||
do \
|
||||
__res = expression; \
|
||||
while (__res == -1 && errno == EINTR); \
|
||||
__res; })
|
||||
#endif
|
||||
|
||||
static inline ssize_t __attribute__ ((unused))
|
||||
pwrite_retry (int fd, const void *buf, size_t len, off_t off)
|
||||
{
|
||||
ssize_t recvd = 0;
|
||||
|
||||
do
|
||||
{
|
||||
ssize_t ret = TEMP_FAILURE_RETRY (pwrite (fd, buf + recvd, len - recvd,
|
||||
off + recvd));
|
||||
if (ret <= 0)
|
||||
return ret < 0 ? ret : recvd;
|
||||
|
||||
recvd += ret;
|
||||
}
|
||||
while ((size_t) recvd < len);
|
||||
|
||||
return recvd;
|
||||
}
|
||||
|
||||
static inline ssize_t __attribute__ ((unused))
|
||||
write_retry (int fd, const void *buf, size_t len)
|
||||
{
|
||||
ssize_t recvd = 0;
|
||||
|
||||
do
|
||||
{
|
||||
ssize_t ret = TEMP_FAILURE_RETRY (write (fd, buf + recvd, len - recvd));
|
||||
if (ret <= 0)
|
||||
return ret < 0 ? ret : recvd;
|
||||
|
||||
recvd += ret;
|
||||
}
|
||||
while ((size_t) recvd < len);
|
||||
|
||||
return recvd;
|
||||
}
|
||||
|
||||
static inline ssize_t __attribute__ ((unused))
|
||||
pread_retry (int fd, void *buf, size_t len, off_t off)
|
||||
{
|
||||
ssize_t recvd = 0;
|
||||
|
||||
do
|
||||
{
|
||||
ssize_t ret = TEMP_FAILURE_RETRY (pread (fd, buf + recvd, len - recvd,
|
||||
off + recvd));
|
||||
if (ret <= 0)
|
||||
return ret < 0 ? ret : recvd;
|
||||
|
||||
recvd += ret;
|
||||
}
|
||||
while ((size_t) recvd < len);
|
||||
|
||||
return recvd;
|
||||
}
|
||||
|
||||
/* The demangler from libstdc++. */
|
||||
extern char *__cxa_demangle (const char *mangled_name, char *output_buffer,
|
||||
size_t *length, int *status);
|
||||
|
||||
/* A static assertion. This will cause a compile-time error if EXPR,
|
||||
which must be a compile-time constant, is false. */
|
||||
|
||||
#define eu_static_assert(expr) \
|
||||
extern int never_defined_just_used_for_checking[(expr) ? 1 : -1] \
|
||||
__attribute__ ((unused))
|
||||
|
||||
#endif /* system.h */
|
Loading…
Reference in New Issue
Block a user