plibsys 0.0.5
pmacros.h
Go to the documentation of this file.
1/*
2 * The MIT License
3 *
4 * Copyright (C) 2010-2017 Alexander Saprykin <saprykin.spb@gmail.com>
5 *
6 * Permission is hereby granted, free of charge, to any person obtaining
7 * a copy of this software and associated documentation files (the
8 * 'Software'), to deal in the Software without restriction, including
9 * without limitation the rights to use, copy, modify, merge, publish,
10 * distribute, sublicense, and/or sell copies of the Software, and to
11 * permit persons to whom the Software is furnished to do so, subject to
12 * the following conditions:
13 *
14 * The above copyright notice and this permission notice shall be
15 * included in all copies or substantial portions of the Software.
16 *
17 * THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
18 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
19 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
20 * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
21 * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
22 * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
23 * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
24 */
25
39#if !defined (PLIBSYS_H_INSIDE) && !defined (PLIBSYS_COMPILATION)
40# error "Header files shouldn't be included directly, consider using <plibsys.h> instead."
41#endif
42
43#ifndef PLIBSYS_HEADER_PMACROS_H
44#define PLIBSYS_HEADER_PMACROS_H
45
46#include <pmacroscompiler.h>
47#include <pmacroscpu.h>
48#include <pmacrosos.h>
49
50#include <stdio.h>
51
52/* For Clang */
53#ifndef __has_attribute
54# define __has_attribute(x) 0
55#endif
56
57#ifndef __has_builtin
58# define __has_builtin(x) 0
59#endif
60
68#if (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4)) || \
69 __has_attribute(warn_unused_result)
70# define P_GNUC_WARN_UNUSED_RESULT __attribute__((warn_unused_result))
71#else
72# define P_GNUC_WARN_UNUSED_RESULT
73#endif
74
101/*
102 * Oracle Solaris Studio since version 12 has visibility attribute for C
103 * compiler, and since version 12.2 for C++ compiler, or since version 8.0
104 * specific __global attribute which is the same.
105 * IBM XL C has support for visibility attributes since version 13.1.
106 * HP C/aC++ has support for visibility attributes since version A.06.15.
107 */
108
109#if defined(P_CC_MSVC) || defined(P_CC_BORLAND) || defined(P_CC_WATCOM) || \
110 defined(P_OS_OS2) || (defined(P_OS_BEOS) && !defined(P_CC_GNU)) || \
111 (defined(P_OS_WIN) && defined(P_CC_PGI)) || \
112 ((defined(P_OS_WIN) || defined(P_OS_CYGWIN) || defined(P_OS_MSYS)) && defined(P_CC_GNU))
113# define P_LIB_GLOBAL_API __declspec(dllexport)
114# define P_LIB_INTERNAL_API
115#elif ((__GNUC__ >= 4) && !defined(P_OS_SOLARIS) && !defined(P_OS_HPUX) && !defined(P_OS_AIX)) || \
116 (defined(P_CC_SUN) && __SUNPRO_C >= 0x590) || \
117 (defined(P_CC_SUN) && __SUNPRO_CC >= 0x5110) || \
118 (defined(P_CC_XLC) && __xlC__ >= 0x0D01) || \
119 (defined(P_CC_HP) && __HP_aCC >= 0x061500) || \
120 (defined(P_CC_HP) && __HP_cc >= 0x061500) || \
121 __has_attribute(visibility)
122# define P_LIB_GLOBAL_API __attribute__ ((visibility ("default")))
123# define P_LIB_INTERNAL_API __attribute__ ((visibility ("hidden")))
124#elif defined(__SUNPRO_C) && (__SUNPRO_C >= 0x550)
125# define P_LIB_GLOBAL_API __global
126# define P_LIB_INTERNAL_API __hidden
127#else
128# define P_LIB_GLOBAL_API
129# define P_LIB_INTERNAL_API
130#endif
131
138#define P_LIB_API P_LIB_GLOBAL_API
139
140/* Oracle Solaris Studio at least since 12.2 has ((noreturn)) attribute */
141
149#if defined (__STDC_VERSION__) && (__STDC_VERSION__ >= 201112L)
150# define P_NO_RETURN _Noreturn
151#elif defined(P_CC_MSVC) || (defined(P_CC_BORLAND) && __BORLANDC__ >= 0x0550)
152# define P_NO_RETURN __declspec(noreturn)
153#elif __has_attribute(noreturn) || \
154 defined(P_CC_GNU) || \
155 (defined(P_CC_SUN) && __SUNPRO_C >= 0x5110) || \
156 (defined(P_CC_SUN) && __SUNPRO_CC >= 0x5110)
157# define P_NO_RETURN __attribute__((noreturn))
158#else
159# define P_NO_RETURN
160#endif
161
176#if (defined(P_CC_GNU) && (__GNUC__ > 2 && __GNUC_MINOR__ > 0)) || \
177 (defined(P_CC_INTEL) && __INTEL_COMPILER >= 800) || \
178 (defined(P_CC_XLC) && __xlC__ >= 0x0900) || \
179 __has_builtin(__builtin_expect)
180# define P_LIKELY(x) __builtin_expect(!!(x), 1)
181# define P_UNLIKELY(x) __builtin_expect(!!(x), 0)
182#else
183# define P_LIKELY(x) (x)
184# define P_UNLIKELY(x) (x)
185#endif
186
192#define P_UNUSED(a) ((void) a)
193
200#define P_WARNING(msg) printf ("** Warning: %s **\n", msg)
201
208#define P_ERROR(msg) printf ("** Error: %s **\n", msg)
209
216#define P_DEBUG(msg) printf ("** Debug: %s **\n", msg)
217
218#ifdef DOXYGEN
219# define PLIBSYS_VERSION_MAJOR
220# define PLIBSYS_VERSION_MINOR
221# define PLIBSYS_VERSION_PATCH
222# define PLIBSYS_VERSION_STR
223# define PLIBSYS_VERSION
224#endif
225
279#define PLIBSYS_VERSION_CHECK(major, minor, patch) ((major << 16) | (minor << 8) | (patch))
280
294#ifdef __cplusplus
295# define P_BEGIN_DECLS extern "C" {
296# define P_END_DECLS }
297#else
298# define P_BEGIN_DECLS
299# define P_END_DECLS
300#endif
301
302#endif /* PLIBSYS_HEADER_PMACROS_H */
Compiler detection macros.
CPU detection macros.
OS detection macros.