2006-01-23 04:25:11 +05:30
|
|
|
/*
|
|
|
|
Copyright 2006, Bernhard Fischer
|
|
|
|
|
|
|
|
Licensed under the GPL v2 or later, see the file LICENSE in this tarball.
|
|
|
|
*/
|
|
|
|
#ifndef __PLATFORM_H
|
|
|
|
#define __PLATFORM_H 1
|
|
|
|
|
|
|
|
/* Convenience macros to test the version of gcc. */
|
|
|
|
#undef __GNUC_PREREQ
|
|
|
|
#if defined __GNUC__ && defined __GNUC_MINOR__
|
|
|
|
# define __GNUC_PREREQ(maj, min) \
|
|
|
|
((__GNUC__ << 16) + __GNUC_MINOR__ >= ((maj) << 16) + (min))
|
|
|
|
#else
|
|
|
|
# define __GNUC_PREREQ(maj, min) 0
|
|
|
|
#endif
|
|
|
|
|
|
|
|
/* __restrict is known in EGCS 1.2 and above. */
|
|
|
|
#if !__GNUC_PREREQ (2,92)
|
|
|
|
# ifndef __restrict
|
|
|
|
# define __restrict /* Ignore */
|
|
|
|
# endif
|
|
|
|
#endif
|
|
|
|
|
|
|
|
/* Define macros for some gcc attributes. This permits us to use the
|
|
|
|
macros freely, and know that they will come into play for the
|
|
|
|
version of gcc in which they are supported. */
|
|
|
|
|
|
|
|
#if !__GNUC_PREREQ (2,7)
|
|
|
|
# ifndef __attribute__
|
|
|
|
# define __attribute__(x)
|
|
|
|
# endif
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#ifndef ATTRIBUTE_UNUSED
|
2006-03-28 08:05:56 +05:30
|
|
|
# define ATTRIBUTE_UNUSED __attribute__ ((__unused__))
|
2006-01-23 04:25:11 +05:30
|
|
|
#endif /* ATTRIBUTE_UNUSED */
|
|
|
|
|
|
|
|
#ifndef ATTRIBUTE_NORETURN
|
2006-03-28 08:05:56 +05:30
|
|
|
# define ATTRIBUTE_NORETURN __attribute__ ((__noreturn__))
|
2006-01-23 04:25:11 +05:30
|
|
|
#endif /* ATTRIBUTE_NORETURN */
|
|
|
|
|
|
|
|
#ifndef ATTRIBUTE_PACKED
|
2006-03-28 08:05:56 +05:30
|
|
|
# define ATTRIBUTE_PACKED __attribute__ ((__packed__))
|
2006-03-23 07:36:29 +05:30
|
|
|
#endif /* ATTRIBUTE_PACKED */
|
2006-01-23 04:25:11 +05:30
|
|
|
|
2006-01-31 15:23:53 +05:30
|
|
|
#ifndef ATTRIBUTE_ALIGNED
|
2006-03-28 08:05:56 +05:30
|
|
|
# define ATTRIBUTE_ALIGNED(m) __attribute__ ((__aligned__(m)))
|
2006-01-31 15:23:53 +05:30
|
|
|
#endif /* ATTRIBUTE_ALIGNED */
|
|
|
|
|
2006-01-23 04:25:11 +05:30
|
|
|
/* -fwhole-program makes all symbols local. The attribute externally_visible
|
|
|
|
forces a symbol global. */
|
|
|
|
#ifndef ATTRIBUTE_EXTERNALLY_VISIBLE
|
|
|
|
# if __GNUC_PREREQ (4,1)
|
2006-03-28 08:05:56 +05:30
|
|
|
# define ATTRIBUTE_EXTERNALLY_VISIBLE __attribute__ ((__externally_visible__))
|
2006-01-23 04:25:11 +05:30
|
|
|
# else
|
2006-03-28 08:05:56 +05:30
|
|
|
# define ATTRIBUTE_EXTERNALLY_VISIBLE
|
2006-01-23 04:25:11 +05:30
|
|
|
# endif /* GNUC >= 4.1 */
|
|
|
|
#endif /* ATTRIBUTE_EXTERNALLY_VISIBLE */
|
|
|
|
|
|
|
|
/* We use __extension__ in some places to suppress -pedantic warnings
|
|
|
|
about GCC extensions. This feature didn't work properly before
|
|
|
|
gcc 2.8. */
|
|
|
|
#if !__GNUC_PREREQ (2,8)
|
|
|
|
# ifndef __extension__
|
|
|
|
# define __extension__
|
|
|
|
# endif
|
|
|
|
#endif
|
|
|
|
|
2006-05-05 02:52:27 +05:30
|
|
|
#ifdef __GNUC__
|
|
|
|
#define strlen(x) bb_strlen(x)
|
|
|
|
extern size_t bb_strlen(const char *string);
|
|
|
|
#endif
|
|
|
|
|
2006-02-21 12:14:43 +05:30
|
|
|
/* ---- Endian Detection ------------------------------------ */
|
|
|
|
#ifndef __APPLE__
|
2006-03-28 08:05:56 +05:30
|
|
|
# include <byteswap.h>
|
|
|
|
# include <endian.h>
|
2006-02-21 12:14:43 +05:30
|
|
|
#endif
|
|
|
|
|
|
|
|
#ifdef __BIG_ENDIAN__
|
2006-03-28 08:05:56 +05:30
|
|
|
# define BB_BIG_ENDIAN 1
|
|
|
|
# define BB_LITTLE_ENDIAN 0
|
2006-02-21 12:14:43 +05:30
|
|
|
#elif __BYTE_ORDER == __BIG_ENDIAN
|
2006-03-28 08:05:56 +05:30
|
|
|
# define BB_BIG_ENDIAN 1
|
|
|
|
# define BB_LITTLE_ENDIAN 0
|
2006-02-23 19:55:15 +05:30
|
|
|
#else
|
2006-03-28 08:05:56 +05:30
|
|
|
# define BB_BIG_ENDIAN 0
|
|
|
|
# define BB_LITTLE_ENDIAN 1
|
2006-02-21 12:14:43 +05:30
|
|
|
#endif
|
|
|
|
|
2006-03-10 04:09:08 +05:30
|
|
|
/* ---- Networking ------------------------------------------ */
|
|
|
|
#ifndef __APPLE__
|
2006-03-28 08:05:56 +05:30
|
|
|
# include <arpa/inet.h>
|
2006-03-10 04:09:08 +05:30
|
|
|
#else
|
2006-03-28 08:05:56 +05:30
|
|
|
# include <netinet/in.h>
|
2006-03-10 04:09:08 +05:30
|
|
|
#endif
|
|
|
|
|
2006-02-23 19:55:15 +05:30
|
|
|
/* ---- miscellaneous --------------------------------------- */
|
|
|
|
/* NLS stuff */
|
2006-03-10 04:09:08 +05:30
|
|
|
/* THIS SHOULD BE CLEANED OUT OF THE TREE ENTIRELY */
|
2006-02-23 19:55:15 +05:30
|
|
|
#define _(Text) Text
|
|
|
|
#define N_(Text) (Text)
|
2006-02-21 12:14:43 +05:30
|
|
|
|
2006-01-23 04:25:11 +05:30
|
|
|
#endif /* platform.h */
|