mirror of
https://github.com/autc04/Retro68.git
synced 2024-11-28 05:51:04 +00:00
134 lines
3.9 KiB
C
134 lines
3.9 KiB
C
|
/* Provide support for both ANSI and non-ANSI environments. */
|
||
|
|
||
|
/* Some ANSI environments are "broken" in the sense that __STDC__ cannot be
|
||
|
relied upon to have it's intended meaning. Therefore we must use our own
|
||
|
concoction: _HAVE_STDC. Always use _HAVE_STDC instead of __STDC__ in newlib
|
||
|
sources!
|
||
|
|
||
|
To get a strict ANSI C environment, define macro __STRICT_ANSI__. This will
|
||
|
"comment out" the non-ANSI parts of the ANSI header files (non-ANSI header
|
||
|
files aren't affected). */
|
||
|
|
||
|
#ifndef _ANSIDECL_H_
|
||
|
#define _ANSIDECL_H_
|
||
|
|
||
|
#include <newlib.h>
|
||
|
#include <sys/config.h>
|
||
|
|
||
|
/* First try to figure out whether we really are in an ANSI C environment. */
|
||
|
/* FIXME: This probably needs some work. Perhaps sys/config.h can be
|
||
|
prevailed upon to give us a clue. */
|
||
|
|
||
|
#ifdef __STDC__
|
||
|
#define _HAVE_STDC
|
||
|
#endif
|
||
|
|
||
|
/* ISO C++. */
|
||
|
|
||
|
#ifdef __cplusplus
|
||
|
#if !(defined(_BEGIN_STD_C) && defined(_END_STD_C))
|
||
|
#ifdef _HAVE_STD_CXX
|
||
|
#define _BEGIN_STD_C namespace std { extern "C" {
|
||
|
#define _END_STD_C } }
|
||
|
#else
|
||
|
#define _BEGIN_STD_C extern "C" {
|
||
|
#define _END_STD_C }
|
||
|
#endif
|
||
|
#if defined(__GNUC__) && \
|
||
|
( (__GNUC__ >= 4) || \
|
||
|
( (__GNUC__ >= 3) && defined(__GNUC_MINOR__) && (__GNUC_MINOR__ >= 3) ) )
|
||
|
#define _NOTHROW __attribute__ ((nothrow))
|
||
|
#else
|
||
|
#define _NOTHROW throw()
|
||
|
#endif
|
||
|
#endif
|
||
|
#else
|
||
|
#define _BEGIN_STD_C
|
||
|
#define _END_STD_C
|
||
|
#define _NOTHROW
|
||
|
#endif
|
||
|
|
||
|
#ifdef _HAVE_STDC
|
||
|
#define _PTR void *
|
||
|
#define _AND ,
|
||
|
#define _NOARGS void
|
||
|
#define _CONST const
|
||
|
#define _VOLATILE volatile
|
||
|
#define _SIGNED signed
|
||
|
#define _DOTS , ...
|
||
|
#define _VOID void
|
||
|
#ifdef __CYGWIN__
|
||
|
#define _EXFUN_NOTHROW(name, proto) __cdecl name proto _NOTHROW
|
||
|
#define _EXFUN(name, proto) __cdecl name proto
|
||
|
#define _EXPARM(name, proto) (* __cdecl name) proto
|
||
|
#define _EXFNPTR(name, proto) (__cdecl * name) proto
|
||
|
#else
|
||
|
#define _EXFUN_NOTHROW(name, proto) name proto _NOTHROW
|
||
|
#define _EXFUN(name, proto) name proto
|
||
|
#define _EXPARM(name, proto) (* name) proto
|
||
|
#define _EXFNPTR(name, proto) (* name) proto
|
||
|
#endif
|
||
|
#define _DEFUN(name, arglist, args) name(args)
|
||
|
#define _DEFUN_VOID(name) name(_NOARGS)
|
||
|
#define _CAST_VOID (void)
|
||
|
#ifndef _LONG_DOUBLE
|
||
|
#define _LONG_DOUBLE long double
|
||
|
#endif
|
||
|
#ifndef _LONG_LONG_TYPE
|
||
|
#define _LONG_LONG_TYPE long long
|
||
|
#endif
|
||
|
#ifndef _PARAMS
|
||
|
#define _PARAMS(paramlist) paramlist
|
||
|
#endif
|
||
|
#else
|
||
|
#define _PTR char *
|
||
|
#define _AND ;
|
||
|
#define _NOARGS
|
||
|
#define _CONST
|
||
|
#define _VOLATILE
|
||
|
#define _SIGNED
|
||
|
#define _DOTS
|
||
|
#define _VOID void
|
||
|
#define _EXFUN(name, proto) name()
|
||
|
#define _EXFUN_NOTHROW(name, proto) name()
|
||
|
#define _DEFUN(name, arglist, args) name arglist args;
|
||
|
#define _DEFUN_VOID(name) name()
|
||
|
#define _CAST_VOID
|
||
|
#define _LONG_DOUBLE double
|
||
|
#define _LONG_LONG_TYPE long
|
||
|
#ifndef _PARAMS
|
||
|
#define _PARAMS(paramlist) ()
|
||
|
#endif
|
||
|
#endif
|
||
|
|
||
|
/* Support gcc's __attribute__ facility. */
|
||
|
|
||
|
#ifdef __GNUC__
|
||
|
#define _ATTRIBUTE(attrs) __attribute__ (attrs)
|
||
|
#else
|
||
|
#define _ATTRIBUTE(attrs)
|
||
|
#endif
|
||
|
|
||
|
/* The traditional meaning of 'extern inline' for GCC is not
|
||
|
to emit the function body unless the address is explicitly
|
||
|
taken. However this behaviour is changing to match the C99
|
||
|
standard, which uses 'extern inline' to indicate that the
|
||
|
function body *must* be emitted. If we are using GCC, but do
|
||
|
not have the new behaviour, we need to use extern inline; if
|
||
|
we are using a new GCC with the C99-compatible behaviour, or
|
||
|
a non-GCC compiler (which we will have to hope is C99, since
|
||
|
there is no other way to achieve the effect of omitting the
|
||
|
function if it isn't referenced) we just use plain 'inline',
|
||
|
which c99 defines to mean more-or-less the same as the Gnu C
|
||
|
'extern inline'. */
|
||
|
#if defined(__GNUC__) && !defined(__GNUC_STDC_INLINE__)
|
||
|
/* We're using GCC, but without the new C99-compatible behaviour. */
|
||
|
#define _ELIDABLE_INLINE extern __inline__ _ATTRIBUTE ((__always_inline__))
|
||
|
#else
|
||
|
/* We're using GCC in C99 mode, or an unknown compiler which
|
||
|
we just have to hope obeys the C99 semantics of inline. */
|
||
|
#define _ELIDABLE_INLINE __inline__
|
||
|
#endif
|
||
|
|
||
|
#endif /* _ANSIDECL_H_ */
|