aboutsummaryrefslogtreecommitdiffstats
path: root/src/zix/attributes.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/zix/attributes.h')
-rw-r--r--src/zix/attributes.h81
1 files changed, 81 insertions, 0 deletions
diff --git a/src/zix/attributes.h b/src/zix/attributes.h
new file mode 100644
index 0000000..602fac8
--- /dev/null
+++ b/src/zix/attributes.h
@@ -0,0 +1,81 @@
+// Copyright 2021 David Robillard <d@drobilla.net>
+// SPDX-License-Identifier: ISC
+
+#ifndef ZIX_ATTRIBUTES_H
+#define ZIX_ATTRIBUTES_H
+
+/**
+ @addtogroup zix
+ @{
+*/
+
+// ZIX_API must be used to decorate things in the public API
+#ifndef ZIX_API
+# if defined(_WIN32) && !defined(ZIX_STATIC) && defined(ZIX_INTERNAL)
+# define ZIX_API __declspec(dllexport)
+# elif defined(_WIN32) && !defined(ZIX_STATIC)
+# define ZIX_API __declspec(dllimport)
+# elif defined(__GNUC__)
+# define ZIX_API __attribute__((visibility("default")))
+# else
+# define ZIX_API
+# endif
+#endif
+
+// GCC pure/const/malloc attributes
+#ifdef __GNUC__
+# define ZIX_PURE_FUNC __attribute__((pure))
+# define ZIX_CONST_FUNC __attribute__((const))
+# define ZIX_MALLOC_FUNC __attribute__((malloc))
+#else
+# define ZIX_PURE_FUNC
+# define ZIX_CONST_FUNC
+# define ZIX_MALLOC_FUNC
+#endif
+
+#define ZIX_PURE_API \
+ ZIX_API \
+ ZIX_PURE_FUNC
+
+#define ZIX_CONST_API \
+ ZIX_API \
+ ZIX_CONST_FUNC
+
+#define ZIX_MALLOC_API \
+ ZIX_API \
+ ZIX_MALLOC_FUNC
+
+// Printf-like format functions
+#ifdef __GNUC__
+# define ZIX_LOG_FUNC(fmt, arg1) __attribute__((format(printf, fmt, arg1)))
+#else
+# define ZIX_LOG_FUNC(fmt, arg1)
+#endif
+
+// Unused parameter macro to suppresses warnings and make it impossible to use
+#if defined(__cplusplus)
+# define ZIX_UNUSED(name)
+#elif defined(__GNUC__)
+# define ZIX_UNUSED(name) name##_unused __attribute__((__unused__))
+#elif defined(_MSC_VER)
+# define ZIX_UNUSED(name) __pragma(warning(suppress : 4100)) name
+#else
+# define ZIX_UNUSED(name) name
+#endif
+
+// Clang nullability annotations
+#if defined(__clang__) && __clang_major__ >= 7
+# define ZIX_NONNULL _Nonnull
+# define ZIX_NULLABLE _Nullable
+# define ZIX_ALLOCATED _Null_unspecified
+#else
+# define ZIX_NONNULL
+# define ZIX_NULLABLE
+# define ZIX_ALLOCATED
+#endif
+
+/**
+ @}
+*/
+
+#endif /* ZIX_ATTRIBUTES_H */