]> pd.if.org Git - pdclib/blobdiff - internals/_PDCLIB_aux.h
<float.h> is now implemented in the platform independent portion. It is based
[pdclib] / internals / _PDCLIB_aux.h
index d34dfb57e28aee30eb7755c9c0e97ba7d66b33ca..3de8d4a9deeac2361fd981b4d1fcfc9406d6beb4 100644 (file)
 #endif
 
 #if !defined(__cplusplus) || defined(_PDCLIB_CXX_VERSION)
-       /* Pass - conditional simplification case */
+   #define _PDCLIB_CXX_VERSION 0
 #elif __cplusplus == 201103L
        #define _PDCLIB_CXX_VERSION 2011
+    /* TODO: Do we want this? */
        #if _PDCLIB_C_VERSION < 2011
                #undef _PDCLIB_C_VERSION
                #define _PDCLIB_C_VERSION 2011
 #endif
 
 #if _PDCLIB_CXX_VERSION >= 2011
-       #define _PDCLIB_noreturn [[noreturn]]
+  #define _PDCLIB_nothrow     noexcept
+  #define _PDCLIB_noexcept(x) noexcept(x)
+#elif _PDCLIB_CXX_VERSION
+  #define _PDCLIB_nothrow     throw()
+  #define _PDCLIB_noexcept
+#endif
+
+#if _PDCLIB_CXX_VERSION >= 2011
+  // Hold off on C++ attribute syntax for now
+  // #define _PDCLIB_noreturn [[noreturn]]
 #elif _PDCLIB_C_VERSION >= 2011
        #define _PDCLIB_noreturn _Noreturn
 #endif
 
+#ifdef _WIN32
+   #define _PDCLIB_EXPORT __declspec(dllexport)
+   #define _PDCLIB_IMPORT __declspec(dllimport)
+#endif
+
 #ifdef __GNUC__
+         #ifndef _PDCLIB_EXPORT
+           #define _PDCLIB_EXPORT __attribute__((__visibility__("protected")))
+    #endif
+
+       #ifndef _PDCLIB_IMPORT
+               #define _PDCLIB_IMPORT
+       #endif
+
+       #ifndef _PDCLIB_HIDDEN
+               #define _PDCLIB_HIDDEN __attribute__((__visibility__("hidden")))
+       #endif
+
+    #ifndef _PDCLIB_nothrow
+      #define _PDCLIB_nothrow __attribute__((__nothrow__))
+      #define _PDCLIB_noexcept
+    #endif
+
        #ifndef _PDCLIB_restrict
                #define _PDCLIB_restrict __restrict
        #endif
        #endif
 
        #ifndef _PDCLIB_noreturn
-               #define _PDCLIB_noreturn __attribute__((noreturn))
+    /* If you don't use __noreturn__, then stdnoreturn.h will break things! */
+               #define _PDCLIB_noreturn __attribute__((__noreturn__))
        #endif
 #endif
 
+#ifndef _PDCLIB_nothrow
+  #define _PDCLIB_nothrow
+  #define _PDCLIB_noexcept
+#endif
+
+#ifndef _PDCLIB_EXPORT
+       #define _PDCLIB_EXPORT
+#endif
+#ifndef _PDCLIB_IMPORT
+       #define _PDCLIB_IMPORT
+#endif
+#ifndef _PDCLIB_HIDDEN
+       #define _PDCLIB_HIDDEN
+#endif
+
+#if defined(_PDCLIB_SHARED) 
+       #if defined(_PDCLIB_BUILD)
+               #define _PDCLIB_API _PDCLIB_EXPORT
+       #else
+               #define _PDCLIB_API _PDCLIB_IMPORT
+       #endif
+#else
+       #define _PDCLIB_API
+#endif
+
 #ifndef _PDCLIB_restrict
        #define _PDCLIB_restrict
 #endif
 
 #define _PDCLIB_cc( x, y )     x ## y
 #define _PDCLIB_concat( x, y ) _PDCLIB_cc( x, y )
+#define _PDCLIB_concat3( x, y, z ) _PDCLIB_concat( _PDCLIB_concat( x, y ), z )
 
 #define _PDCLIB_symbol2value( x ) #x
 #define _PDCLIB_symbol2string( x ) _PDCLIB_symbol2value( x )
 
-#ifndef __PDCLIB_PURE
-    #define __PDCLIB_PURE 0
+/* Feature test macros
+ *
+ * All of the feature test macros come in the following forms
+ *   _PDCLIB_*_MIN(min):            Available in versions > min
+ *   _PDCLIB_*_MINMAX(min, max):    Available in versions > min < max
+ *   _PDCLIB_*_MAX(max):            Availabel in versions < max
+ *
+ * The defined tests are:
+ *   C:     C standard versions 
+ *              1990, 1995, 1999, 2011
+ *   CXX:   C++ standard versions 
+ *              1997, 2011
+ *   POSIX: POSIX extension versions.
+ *              1 (POSIX.2), 2 (POSIX.2), 199309L (POSIX.1b), 
+ *              199506L (POSIX.1c), 200112L (2001), 200809L (2008)
+ *   XOPEN: X/Open System Interface (XSI)/Single Unix Specification
+ *              0 (XPG4), 500 (SUSv2/UNIX98), 600 (SUSv3/UNIX03), 700 (SUSv4)
+ *
+ * PDCLib does not attempt or claim POSIX comformance, but makes available these
+ * extensions as
+ *   (a) useful, and
+ *   (b) 
+ */
+#define _PDCLIB_C_MIN(min)         _PDCLIB_C_MINMAX(min, 3000)
+#define _PDCLIB_CXX_MIN(min)     _PDCLIB_CXX_MINMAX(min, 3000)
+#define _PDCLIB_XOPEN_MIN(min) _PDCLIB_XOPEN_MINMAX(min, 30000000)
+#define _PDCLIB_POSIX_MIN(min) _PDCLIB_POSIX_MINMAX(min, 30000000)
+#define _PDCLIB_C_MAX(max)         _PDCLIB_C_MINMAX(0, max)
+#define _PDCLIB_CXX_MAX(max)     _PDCLIB_CXX_MINMAX(0, max)
+#define _PDCLIB_XOPEN_MAX(max) _PDCLIB_XOPEN_MINMAX(0, max)
+#define _PDCLIB_POSIX_MAX(max) _PDCLIB_POSIX_MINMAX(0, max)
+#if defined(_PDCLIB_EXTENSIONS) || defined(_PDCLIB_BUILD)
+    #define _PDCLIB_C_MINMAX(min, max) 1
+    #define _PDCLIB_CXX_MINMAX(min, max) 1
+    #define _PDCLIB_POSIX_MINMAX(min, max) 1
+    #define _PDCLIB_XOPEN_MINMAX(min, max) 1
+#else
+    #define _PDCLIB_C_MINMAX(min, max) \
+        (_PDCLIB_C_VERSION >= (min) && _PDCLIB_C_VERSION <= (max))
+    #define _PDCLIB_CXX_MINMAX(min, max) \
+        (_PDCLIB_CXX_VERSION >= (min) && _PDCLIB_CXX_VERSION <= (max))
+    #define _PDCLIB_XOPEN_MINMAX(min, max) \
+        (defined(_XOPEN_SOURCE) \
+            && _XOPEN_SOURCE >= (min) && _XOPEN_SOURCE <= (max))
+    #define _PDCLIB_POSIX_MINMAX(min, max) \
+        (defined(_POSIX_C_SOURCE) \
+            && _POSIX_C_SOURCE >= (min) && _POSIX_C_SOURCE <= (max))
+
+    #if defined(_XOPEN_SOURCE) && (_XOPEN_SOURCE-1 == -1)
+        /* If _XOPEN_SOURCE is defined as empty, redefine here as zero */
+        #undef _XOPEN_SOURCE
+        #define _XOPEN_SOURCE 0
+    #endif
+
+    #if _PDCLIB_XOPEN_MIN(700) && !_PDCLIB_POSIX_MIN(200809L)
+        #undef _POSIX_C_SOURCE
+        #define _POSIX_C_SOURCE 2008098L    
+    #elif _PDCLIB_XOPEN_MIN(600) && !_PDCLIB_POSIX_MIN(200112L)
+        #undef _POSIX_C_SOURCE
+        #define _POSIX_C_SOURCE 200112L
+    #elif _PDCLIB_XOPEN_MIN(0) && !_PDCLIB_POSIX_MIN(2)
+        #undef _POSIX_C_SOURCE
+        #define _POSIX_C_SOURCE 2
+    #endif
+
+    #if defined(_POSIX_SOURCE) && !defined(_POSIX_C_SOURCE)
+        #define _POSIX_C_SOURCE 1
+    #endif
 #endif
 
-#ifndef _PDCLIB_POSIX_EX
-    #define _PDCLIB_POSIX_EX (!__PDCLIB_PURE)
 #endif
-#endif
\ No newline at end of file