X-Git-Url: https://pd.if.org/git/?a=blobdiff_plain;f=internals%2F_PDCLIB_aux.h;h=5183c9fdc3c08d6ef7759097178391d555b96dac;hb=48b352165d2cb89126ddde1323a138820687970a;hp=4ef019e9c386b89d30dd672fdf4aee551cc83303;hpb=02c1ddcae6c88b55d2f4de825ee6c6456150b8ae;p=pdclib diff --git a/internals/_PDCLIB_aux.h b/internals/_PDCLIB_aux.h index 4ef019e..5183c9f 100644 --- a/internals/_PDCLIB_aux.h +++ b/internals/_PDCLIB_aux.h @@ -1,6 +1,5 @@ -/* $Id$ */ - -/* Release $Name$ */ +#ifndef _PDCLIB_AUX_H +#define _PDCLIB_AUX_H /* Auxiliary PDCLib code <_PDCLIB_aux.h> @@ -8,6 +7,11 @@ Permission is granted to use, modify, and / or redistribute at will. */ +/* -------------------------------------------------------------------------- */ +/* You should not have to edit anything in this file; if you DO have to, it */ +/* would be considered a bug / missing feature: notify the author(s). */ +/* -------------------------------------------------------------------------- */ + /* -------------------------------------------------------------------------- */ /* Standard Version */ /* -------------------------------------------------------------------------- */ @@ -18,21 +22,133 @@ #error Compiler does not define _ _STDC_ _ to 1 (not standard-compliant)! #endif -#ifndef __STDC_VERSION__ -#define _PDCLIB_C_VERSION 90 -#define _PDCLIB_restrict +#if defined(_PDCLIB_C_VERSION) + /* Pass - conditional simplification case */ +#elif !defined(__STDC_VERSION__) + #define _PDCLIB_C_VERSION 1990 #elif __STDC_VERSION__ == 199409L -#define _PDCLIB_C_VERSION 95 -#define _PDCLIB_restrict + #define _PDCLIB_C_VERSION 1995 #elif __STDC_VERSION__ == 199901L -#define _PDCLIB_C_VERSION 99 -#define _PDCLIB_restrict restrict + #define _PDCLIB_C_VERSION 1999 +#elif __STDC_VERSION__ == 201112L + #define _PDCLIB_C_VERSION 2011 +#else + #error Unsupported _ _STDC_VERSION_ _ (__STDC_VERSION__) (supported: ISO/IEC 9899:1990, 9899/AMD1:1995, 9899:1999, 9899:2011). +#endif + +#if !defined(__cplusplus) || defined(_PDCLIB_CXX_VERSION) + #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 +#elif __cplusplus == 199711L + #define _PDCLIB_CXX_VERSION 1997 #else -#error Unsupported _ _STDC_VERSION_ _ (__STDC_VERSION__) (supported: ISO/IEC 9899:1990, 9899/AMD1:1995, and 9899:1999). + #error Unsupported _ _cplusplus (__cplusplus) (supported: ISO/IEC 14882:1997, ISO/IEC 14882:2011). +#endif + +#if _PDCLIB_C_VERSION >= 1999 || defined(__cplusplus) + #ifndef __cplusplus + #define _PDCLIB_restrict restrict + #endif + #define _PDCLIB_inline inline +#endif + +#if _PDCLIB_CXX_VERSION >= 2011 + #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 + + #ifndef _PDCLIB_inline + #define _PDCLIB_inline __inline + #endif + + #ifndef _PDCLIB_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 + +#ifndef _PDCLIB_inline + #define _PDCLIB_inline +#endif + +#ifndef _PDCLIB_noreturn + #define _PDCLIB_noreturn #endif #ifndef __STDC_HOSTED__ -#warning Compiler does not define _ _STDC_HOSTED_ _ (not standard-compliant)! +#error Compiler does not define _ _STDC_HOSTED_ _ (not standard-compliant)! #elif __STDC_HOSTED__ == 0 #define _PDCLIB_HOSTED 0 #elif __STDC_HOSTED__ == 1 @@ -41,11 +157,18 @@ #error Compiler does not define _ _STDC_HOSTED_ _ to 0 or 1 (not standard-compliant)! #endif -#if _PDCLIB_C_VERSION != 99 -#warning Up to and including v1.x, PDCLib is only aiming at ISO/IEC 9899:1999 (C99). -#warning PDCLib might not be fully conforming to either C89 or C95 prior to v2.x. +#ifdef __cplusplus + #define _PDCLIB_BEGIN_EXTERN_C extern "C" { + #define _PDCLIB_END_EXTERN_C } +#else + #define _PDCLIB_BEGIN_EXTERN_C + #define _PDCLIB_END_EXTERN_C #endif +/*#if _PDCLIB_C_VERSION != 1999 +#error PDCLib might not be fully conforming to either C89 or C95 prior to v2.x. +#endif*/ + /* -------------------------------------------------------------------------- */ /* Helper macros: */ /* _PDCLIB_cc( x, y ) concatenates two preprocessor tokens without extending */ @@ -57,5 +180,75 @@ #define _PDCLIB_symbol2value( x ) #x #define _PDCLIB_symbol2string( x ) _PDCLIB_symbol2value( x ) -#define _PDCLIB_symbol2identity( x ) x +/* 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 + +#endif