tzh
2024-08-22 c7d0944258c7d0943aa7b2211498fd612971ce27
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
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_ */