OSDN Git Service

projects clean up 1
[pinoc/pinoc.git] / pinoc_gcc / lib / include / _ansi.h
diff --git a/pinoc_gcc/lib/include/_ansi.h b/pinoc_gcc/lib/include/_ansi.h
new file mode 100644 (file)
index 0000000..e584ec3
--- /dev/null
@@ -0,0 +1,133 @@
+/* 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_ */