]> pd.if.org Git - pdclib/blob - internals/_PDCLIB_aux.h
PDCLIB-8: First phase of intergation of new I/O backend system (with minimal
[pdclib] / internals / _PDCLIB_aux.h
1 #ifndef _PDCLIB_AUX_H
2 #define _PDCLIB_AUX_H
3
4 /* Auxiliary PDCLib code <_PDCLIB_aux.h>
5
6    This file is part of the Public Domain C Library (PDCLib).
7    Permission is granted to use, modify, and / or redistribute at will.
8 */
9
10 /* -------------------------------------------------------------------------- */
11 /* You should not have to edit anything in this file; if you DO have to, it   */
12 /* would be considered a bug / missing feature: notify the author(s).         */
13 /* -------------------------------------------------------------------------- */
14
15 /* -------------------------------------------------------------------------- */
16 /* Standard Version                                                           */
17 /* -------------------------------------------------------------------------- */
18
19 /* Many a compiler gets this wrong, so you might have to hardcode it instead. */
20
21 #if __STDC__ != 1
22 #error Compiler does not define _ _STDC_ _ to 1 (not standard-compliant)!
23 #endif
24
25 #if defined(_PDCLIB_C_VERSION)
26         /* Pass - conditional simplification case */
27 #elif !defined(__STDC_VERSION__)
28         #define _PDCLIB_C_VERSION 1990
29 #elif __STDC_VERSION__ == 199409L
30         #define _PDCLIB_C_VERSION 1995
31 #elif __STDC_VERSION__ == 199901L
32         #define _PDCLIB_C_VERSION 1999
33 #elif __STDC_VERSION__ == 201112L
34         #define _PDCLIB_C_VERSION 2011
35 #else
36         #error Unsupported _ _STDC_VERSION_ _ (__STDC_VERSION__) (supported: ISO/IEC 9899:1990, 9899/AMD1:1995, 9899:1999, 9899:2011).
37 #endif
38
39 #if !defined(__cplusplus) || defined(_PDCLIB_CXX_VERSION)
40    #define _PDCLIB_CXX_VERSION 0
41 #elif __cplusplus == 201103L
42         #define _PDCLIB_CXX_VERSION 2011
43     /* TODO: Do we want this? */
44         #if _PDCLIB_C_VERSION < 2011
45                 #undef _PDCLIB_C_VERSION
46                 #define _PDCLIB_C_VERSION 2011
47         #endif
48 #elif __cplusplus == 199711L
49    #define _PDCLIB_CXX_VERSION 1997
50 #else
51    #error Unsupported _ _cplusplus (__cplusplus) (supported: ISO/IEC 14882:1997, ISO/IEC 14882:2011).
52 #endif
53
54 #if _PDCLIB_C_VERSION >= 1999 || defined(__cplusplus)
55         #ifndef __cplusplus
56                 #define _PDCLIB_restrict restrict
57         #endif
58         #define _PDCLIB_inline   inline
59 #endif
60
61 #if _PDCLIB_CXX_VERSION >= 2011
62   #define _PDCLIB_nothrow     noexcept
63   #define _PDCLIB_noexcept(x) noexcept(x)
64 #elif _PDCLIB_CXX_VERSION
65   #define _PDCLIB_nothrow     throw()
66   #define _PDCLIB_noexcept
67 #endif
68
69 #if _PDCLIB_CXX_VERSION >= 2011
70   // Hold off on C++ attribute syntax for now
71   // #define _PDCLIB_noreturn [[noreturn]]
72 #elif _PDCLIB_C_VERSION >= 2011
73         #define _PDCLIB_noreturn _Noreturn
74 #endif
75
76 #ifdef _WIN32
77    #define _PDCLIB_EXPORT __declspec(dllexport)
78    #define _PDCLIB_IMPORT __declspec(dllimport)
79 #endif
80
81 #ifdef __GNUC__
82           #ifndef _PDCLIB_EXPORT
83             #define _PDCLIB_EXPORT __attribute__((__visibility__("protected")))
84     #endif
85
86         #ifndef _PDCLIB_IMPORT
87                 #define _PDCLIB_IMPORT
88         #endif
89
90         #ifndef _PDCLIB_HIDDEN
91                 #define _PDCLIB_HIDDEN __attribute__((__visibility__("hidden")))
92         #endif
93
94     #ifndef _PDCLIB_nothrow
95       #define _PDCLIB_nothrow __attribute__((__nothrow__))
96       #define _PDCLIB_noexcept
97     #endif
98
99         #ifndef _PDCLIB_restrict
100                 #define _PDCLIB_restrict __restrict
101         #endif
102
103         #ifndef _PDCLIB_inline
104                 #define _PDCLIB_inline __inline
105         #endif
106
107         #ifndef _PDCLIB_noreturn
108     /* If you don't use __noreturn__, then stdnoreturn.h will break things! */
109                 #define _PDCLIB_noreturn __attribute__((__noreturn__))
110         #endif
111 #endif
112
113 #ifndef _PDCLIB_nothrow
114   #define _PDCLIB_nothrow
115   #define _PDCLIB_noexcept
116 #endif
117
118 #ifndef _PDCLIB_EXPORT
119         #define _PDCLIB_EXPORT
120 #endif
121 #ifndef _PDCLIB_IMPORT
122         #define _PDCLIB_IMPORT
123 #endif
124 #ifndef _PDCLIB_HIDDEN
125         #define _PDCLIB_HIDDEN
126 #endif
127
128 #if defined(_PDCLIB_SHARED) 
129         #if defined(_PDCLIB_BUILD)
130                 #define _PDCLIB_API _PDCLIB_EXPORT
131         #else
132                 #define _PDCLIB_API _PDCLIB_IMPORT
133         #endif
134 #else
135         #define _PDCLIB_API
136 #endif
137
138 #ifndef _PDCLIB_restrict
139         #define _PDCLIB_restrict
140 #endif
141
142 #ifndef _PDCLIB_inline
143         #define _PDCLIB_inline
144 #endif
145
146 #ifndef _PDCLIB_noreturn
147         #define _PDCLIB_noreturn
148 #endif
149
150 #ifndef __STDC_HOSTED__
151 #error Compiler does not define _ _STDC_HOSTED_ _ (not standard-compliant)!
152 #elif __STDC_HOSTED__ == 0
153 #define _PDCLIB_HOSTED 0
154 #elif __STDC_HOSTED__ == 1
155 #define _PDCLIB_HOSTED 1
156 #else
157 #error Compiler does not define _ _STDC_HOSTED_ _ to 0 or 1 (not standard-compliant)!
158 #endif
159
160 #ifdef __cplusplus
161         #define _PDCLIB_BEGIN_EXTERN_C extern "C" {
162         #define _PDCLIB_END_EXTERN_C }
163   typedef bool _PDCLIB_bool;
164 #else
165   #define _PDCLIB_BEGIN_EXTERN_C
166   #define _PDCLIB_END_EXTERN_C
167   typedef _Bool _PDCLIB_bool;
168 #endif
169
170 /*#if _PDCLIB_C_VERSION != 1999
171 #error PDCLib might not be fully conforming to either C89 or C95 prior to v2.x.
172 #endif*/
173
174 /* -------------------------------------------------------------------------- */
175 /* Helper macros:                                                             */
176 /* _PDCLIB_cc( x, y ) concatenates two preprocessor tokens without extending  */
177 /* _PDCLIB_concat( x, y ) concatenates two preprocessor tokens with extending */
178 /* -------------------------------------------------------------------------- */
179
180 #define _PDCLIB_cc( x, y )     x ## y
181 #define _PDCLIB_concat( x, y ) _PDCLIB_cc( x, y )
182 #define _PDCLIB_concat3( x, y, z ) _PDCLIB_concat( _PDCLIB_concat( x, y ), z )
183
184 #define _PDCLIB_symbol2value( x ) #x
185 #define _PDCLIB_symbol2string( x ) _PDCLIB_symbol2value( x )
186
187 /* Feature test macros
188  *
189  * All of the feature test macros come in the following forms
190  *   _PDCLIB_*_MIN(min):            Available in versions > min
191  *   _PDCLIB_*_MINMAX(min, max):    Available in versions > min < max
192  *   _PDCLIB_*_MAX(max):            Availabel in versions < max
193  *
194  * The defined tests are:
195  *   C:     C standard versions 
196  *              1990, 1995, 1999, 2011
197  *   CXX:   C++ standard versions 
198  *              1997, 2011
199  *   POSIX: POSIX extension versions.
200  *              1 (POSIX.2), 2 (POSIX.2), 199309L (POSIX.1b), 
201  *              199506L (POSIX.1c), 200112L (2001), 200809L (2008)
202  *   XOPEN: X/Open System Interface (XSI)/Single Unix Specification
203  *              0 (XPG4), 500 (SUSv2/UNIX98), 600 (SUSv3/UNIX03), 700 (SUSv4)
204  *
205  *   Additionally, the macros
206  *     _BSD_SOURCE, _SVID_SOURCE and _GNU_SOURCE
207  *   are adhered to. If _GNU_SOURCE is defined, _XOPEN_SOURCE and 
208  *   _POSIX_C_SOURCE are defined to their most recent values to match glibc 
209  *   behaviour
210  *
211  *   The intention of supporting these feature test macros is to ease 
212  *   application portability from these systems to PDCLib systems; in addition,
213  *   it eases support for these standards by systems supporting them which are 
214  *   using PDCLib as their default C library.
215  *
216  *   Applications targetting purely PDClib/PDCLib based platforms may define 
217  *   just _PDCLIB_EXTENSIONS, which will enable all supported extensions, plus
218  *   all features from all supported versions of C and C++.
219  *
220  */
221 #define _PDCLIB_C_MIN(min)         _PDCLIB_C_MINMAX(min, 3000)
222 #define _PDCLIB_CXX_MIN(min)     _PDCLIB_CXX_MINMAX(min, 3000)
223 #define _PDCLIB_XOPEN_MIN(min) _PDCLIB_XOPEN_MINMAX(min, 30000000)
224 #define _PDCLIB_POSIX_MIN(min) _PDCLIB_POSIX_MINMAX(min, 30000000)
225 #define _PDCLIB_C_MAX(max)         _PDCLIB_C_MINMAX(0, max)
226 #define _PDCLIB_CXX_MAX(max)     _PDCLIB_CXX_MINMAX(0, max)
227 #define _PDCLIB_XOPEN_MAX(max) _PDCLIB_XOPEN_MINMAX(0, max)
228 #define _PDCLIB_POSIX_MAX(max) _PDCLIB_POSIX_MINMAX(0, max)
229 #if defined(_PDCLIB_EXTENSIONS) || defined(_PDCLIB_BUILD)
230     #define _PDCLIB_C_MINMAX(min, max) 1
231     #define _PDCLIB_CXX_MINMAX(min, max) 1
232     #define _PDCLIB_POSIX_MINMAX(min, max) 1
233     #define _PDCLIB_XOPEN_MINMAX(min, max) 1
234
235     #undef _PDCLIB_EXTENSIONS
236     #undef _PDCLIB_BSD_SOURCE 
237     #undef _PDCLIB_SVID_SOURCE
238     #undef _PDCLIB_GNU_SOURCE
239
240     #define _PDCLIB_EXTENSIONS 1
241     #define _PDCLIB_BSD_SOURCE 1
242     #define _PDCLIB_SVID_SOURCE 1
243     #define _PDCLIB_GNU_SOURCE 1
244 #else
245     #define _PDCLIB_C_MINMAX(min, max) \
246         (_PDCLIB_C_VERSION >= (min) && _PDCLIB_C_VERSION <= (max))
247     #define _PDCLIB_CXX_MINMAX(min, max) \
248         (_PDCLIB_CXX_VERSION >= (min) && _PDCLIB_CXX_VERSION <= (max))
249     #define _PDCLIB_XOPEN_MINMAX(min, max) \
250         (defined(_XOPEN_SOURCE) \
251             && _XOPEN_SOURCE >= (min) && _XOPEN_SOURCE <= (max))
252     #define _PDCLIB_POSIX_MINMAX(min, max) \
253         (defined(_POSIX_C_SOURCE) \
254             && _POSIX_C_SOURCE >= (min) && _POSIX_C_SOURCE <= (max))
255
256     #if defined(_XOPEN_SOURCE) && (_XOPEN_SOURCE-1 == -1)
257         /* If _XOPEN_SOURCE is defined as empty, redefine here as zero */
258         #undef _XOPEN_SOURCE
259         #define _XOPEN_SOURCE 0
260     #endif
261
262     #if defined(_GNU_SOURCE)
263         #define _PDCLIB_GNU_SOURCE 1
264         #define _PDCLIB_SVID_SOURCE 1
265         #define _PDCLIB_BSD_SOURCE 1
266         #undef _XOPEN_SOURCE
267         #define _XOPEN_SOURCE 700
268     #else
269         #define _PDCLIB_GNU_SOURCE 0
270     #endif
271
272     #if defined(_PDCLIB_BSD_SOURCE)
273         // pass
274     #elif defined(_BSD_SOURCE)
275         #define _PDCLIB_BSD_SOURCE 1
276     #else
277         #define _PDCLIB_BSD_SOURCE 0
278     #endif
279
280     #if defined(_PDCLIB_SVID_SOURCE)
281         // pass
282     #elif defined(_SVID_SOURCE)
283         #define _PDCLIB_SVID_SOURCE 1
284     #else
285         #define _PDCLIB_SVID_SOURCE 0
286     #endif
287
288     #if _PDCLIB_XOPEN_MIN(700) && !_PDCLIB_POSIX_MIN(200809L)
289         #undef _POSIX_C_SOURCE
290         #define _POSIX_C_SOURCE 2008098L    
291     #elif _PDCLIB_XOPEN_MIN(600) && !_PDCLIB_POSIX_MIN(200112L)
292         #undef _POSIX_C_SOURCE
293         #define _POSIX_C_SOURCE 200112L
294     #elif _PDCLIB_XOPEN_MIN(0) && !_PDCLIB_POSIX_MIN(2)
295         #undef _POSIX_C_SOURCE
296         #define _POSIX_C_SOURCE 2
297     #endif
298
299     #if defined(_POSIX_SOURCE) && !defined(_POSIX_C_SOURCE)
300         #define _POSIX_C_SOURCE 1
301     #endif
302 #endif
303
304 #endif