X-Git-Url: https://pd.if.org/git/?a=blobdiff_plain;f=internals%2F_PDCLIB_aux.h;h=3de8d4a9deeac2361fd981b4d1fcfc9406d6beb4;hb=1755b59a8885757e3ceab7da3a35f7803905694c;hp=8ea40f4254ced580769d959e866a307b1f0c8dab;hpb=7015f5842d05bd5da32523048e4260e60e9e310c;p=pdclib diff --git a/internals/_PDCLIB_aux.h b/internals/_PDCLIB_aux.h index 8ea40f4..3de8d4a 100644 --- a/internals/_PDCLIB_aux.h +++ b/internals/_PDCLIB_aux.h @@ -37,9 +37,10 @@ #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 @@ -58,7 +59,16 @@ #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 @@ -69,9 +79,9 @@ #endif #ifdef __GNUC__ - #ifndef _PDCLIB_EXPORT - #define _PDCLIB_EXPORT __attribute__((__visibility__("protected"))) - #endif + #ifndef _PDCLIB_EXPORT + #define _PDCLIB_EXPORT __attribute__((__visibility__("protected"))) + #endif #ifndef _PDCLIB_IMPORT #define _PDCLIB_IMPORT @@ -81,6 +91,11 @@ #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 @@ -90,10 +105,16 @@ #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 @@ -111,7 +132,7 @@ #define _PDCLIB_API _PDCLIB_IMPORT #endif #else - #define _PDCLIB_API _PDCLIB_HIDDEN + #define _PDCLIB_API #endif #ifndef _PDCLIB_restrict @@ -156,15 +177,79 @@ #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