mirror of
				https://github.com/0xFEEDC0DE64/arduino-esp32.git
				synced 2025-11-03 23:51:39 +01:00 
			
		
		
		
	
		
			
	
	
		
			141 lines
		
	
	
		
			4.2 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
		
		
			
		
	
	
			141 lines
		
	
	
		
			4.2 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 __GNUC_PREREQ (3, 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 _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
							 | 
						||
| 
								 | 
							
								#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.  Likewise, a function declared
							 | 
						||
| 
								 | 
							
								  without either 'extern' or 'static' defaults to extern linkage
							 | 
						||
| 
								 | 
							
								  (C99 6.2.2p5), and the compiler may choose whether to use the
							 | 
						||
| 
								 | 
							
								  inline version or call the extern linkage version (6.7.4p6).
							 | 
						||
| 
								 | 
							
								  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 use
							 | 
						||
| 
								 | 
							
								  'static 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 static __inline__
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#if __GNUC_PREREQ (3, 1)
							 | 
						||
| 
								 | 
							
								#define _NOINLINE		__attribute__ ((__noinline__))
							 | 
						||
| 
								 | 
							
								#define _NOINLINE_STATIC	_NOINLINE static
							 | 
						||
| 
								 | 
							
								#else
							 | 
						||
| 
								 | 
							
								/* On non-GNU compilers and GCC prior to version 3.1 the compiler can't be
							 | 
						||
| 
								 | 
							
								   trusted not to inline if it is static. */
							 | 
						||
| 
								 | 
							
								#define _NOINLINE
							 | 
						||
| 
								 | 
							
								#define _NOINLINE_STATIC
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#endif /* _ANSIDECL_H_ */
							 |