2023-10-31 20:26:31 +03:00
|
|
|
/**
|
|
|
|
* @file defines.h
|
|
|
|
*
|
|
|
|
* Macro definitions used throughout the prism library.
|
|
|
|
*
|
|
|
|
* This file should be included first by any *.h or *.c in prism for consistency
|
|
|
|
* and to ensure that the macros are defined before they are used.
|
|
|
|
*/
|
2023-09-27 19:24:48 +03:00
|
|
|
#ifndef PRISM_DEFINES_H
|
|
|
|
#define PRISM_DEFINES_H
|
2023-06-20 18:53:02 +03:00
|
|
|
|
2023-06-30 21:30:24 +03:00
|
|
|
#include <ctype.h>
|
|
|
|
#include <stdarg.h>
|
|
|
|
#include <stddef.h>
|
2023-08-29 17:48:20 +03:00
|
|
|
#include <stdint.h>
|
2023-06-30 21:30:24 +03:00
|
|
|
#include <stdio.h>
|
|
|
|
#include <string.h>
|
2024-02-16 08:40:52 +03:00
|
|
|
#include <unistd.h>
|
2023-06-30 21:30:24 +03:00
|
|
|
|
2024-01-19 16:38:37 +03:00
|
|
|
/**
|
|
|
|
* We want to be able to use the PRI* macros for printing out integers, but on
|
|
|
|
* some platforms they aren't included unless this is already defined.
|
|
|
|
*/
|
|
|
|
#define __STDC_FORMAT_MACROS
|
|
|
|
|
|
|
|
#include <inttypes.h>
|
|
|
|
|
2023-10-31 22:40:50 +03:00
|
|
|
/**
|
2023-10-31 20:26:31 +03:00
|
|
|
* By default, we compile with -fvisibility=hidden. When this is enabled, we
|
|
|
|
* need to mark certain functions as being publically-visible. This macro does
|
|
|
|
* that in a compiler-agnostic way.
|
|
|
|
*/
|
2023-09-27 19:24:48 +03:00
|
|
|
#ifndef PRISM_EXPORTED_FUNCTION
|
|
|
|
# ifdef PRISM_EXPORT_SYMBOLS
|
2023-07-31 22:26:34 +03:00
|
|
|
# ifdef _WIN32
|
2023-09-27 19:24:48 +03:00
|
|
|
# define PRISM_EXPORTED_FUNCTION __declspec(dllexport) extern
|
2023-06-20 18:53:02 +03:00
|
|
|
# else
|
2023-09-27 19:24:48 +03:00
|
|
|
# define PRISM_EXPORTED_FUNCTION __attribute__((__visibility__("default"))) extern
|
2023-06-20 18:53:02 +03:00
|
|
|
# endif
|
2023-07-31 22:26:34 +03:00
|
|
|
# else
|
2023-09-27 19:24:48 +03:00
|
|
|
# define PRISM_EXPORTED_FUNCTION
|
2023-06-20 18:53:02 +03:00
|
|
|
# endif
|
|
|
|
#endif
|
|
|
|
|
2023-10-31 20:26:31 +03:00
|
|
|
/**
|
|
|
|
* Certain compilers support specifying that a function accepts variadic
|
|
|
|
* parameters that look like printf format strings to provide a better developer
|
|
|
|
* experience when someone is using the function. This macro does that in a
|
|
|
|
* compiler-agnostic way.
|
|
|
|
*/
|
2023-10-27 05:04:54 +03:00
|
|
|
#if defined(__GNUC__)
|
|
|
|
# define PRISM_ATTRIBUTE_FORMAT(string_index, argument_index) __attribute__((format(printf, string_index, argument_index)))
|
|
|
|
#elif defined(__clang__)
|
|
|
|
# define PRISM_ATTRIBUTE_FORMAT(string_index, argument_index) __attribute__((__format__(__printf__, string_index, argument_index)))
|
|
|
|
#else
|
|
|
|
# define PRISM_ATTRIBUTE_FORMAT(string_index, argument_index)
|
|
|
|
#endif
|
|
|
|
|
2023-10-31 20:26:31 +03:00
|
|
|
/**
|
|
|
|
* GCC will warn if you specify a function or parameter that is unused at
|
|
|
|
* runtime. This macro allows you to mark a function or parameter as unused in a
|
|
|
|
* compiler-agnostic way.
|
|
|
|
*/
|
2023-06-20 18:53:02 +03:00
|
|
|
#if defined(__GNUC__)
|
2023-09-27 19:24:48 +03:00
|
|
|
# define PRISM_ATTRIBUTE_UNUSED __attribute__((unused))
|
2023-06-20 18:53:02 +03:00
|
|
|
#else
|
2023-09-27 19:24:48 +03:00
|
|
|
# define PRISM_ATTRIBUTE_UNUSED
|
2023-06-20 18:53:02 +03:00
|
|
|
#endif
|
|
|
|
|
2023-10-31 20:26:31 +03:00
|
|
|
/**
|
|
|
|
* Old Visual Studio versions do not support the inline keyword, so we need to
|
|
|
|
* define it to be __inline.
|
|
|
|
*/
|
2023-06-20 18:53:02 +03:00
|
|
|
#if defined(_MSC_VER) && !defined(inline)
|
|
|
|
# define inline __inline
|
|
|
|
#endif
|
|
|
|
|
2023-10-31 20:26:31 +03:00
|
|
|
/**
|
|
|
|
* Old Visual Studio versions before 2015 do not implement sprintf, but instead
|
|
|
|
* implement _snprintf. We standard that here.
|
|
|
|
*/
|
2023-09-05 19:23:35 +03:00
|
|
|
#if !defined(snprintf) && defined(_MSC_VER) && (_MSC_VER < 1900)
|
2023-08-17 01:42:56 +03:00
|
|
|
# define snprintf _snprintf
|
|
|
|
#endif
|
|
|
|
|
2023-12-04 20:51:22 +03:00
|
|
|
/**
|
|
|
|
* A simple utility macro to concatenate two tokens together, necessary when one
|
|
|
|
* of the tokens is itself a macro.
|
|
|
|
*/
|
|
|
|
#define PM_CONCATENATE(left, right) left ## right
|
|
|
|
|
|
|
|
/**
|
|
|
|
* We want to be able to use static assertions, but they weren't standardized
|
|
|
|
* until C11. As such, we polyfill it here by making a hacky typedef that will
|
|
|
|
* fail to compile due to a negative array size if the condition is false.
|
|
|
|
*/
|
|
|
|
#if defined(_Static_assert)
|
|
|
|
# define PM_STATIC_ASSERT(line, condition, message) _Static_assert(condition, message)
|
|
|
|
#else
|
|
|
|
# define PM_STATIC_ASSERT(line, condition, message) typedef char PM_CONCATENATE(static_assert_, line)[(condition) ? 1 : -1]
|
|
|
|
#endif
|
|
|
|
|
2024-01-22 09:17:40 +03:00
|
|
|
/**
|
|
|
|
* In general, libc for embedded systems does not support memory-mapped files.
|
|
|
|
* If the target platform is POSIX or Windows, we can map a file in memory and
|
|
|
|
* read it in a more efficient manner.
|
|
|
|
*/
|
|
|
|
#if defined(_POSIX_MAPPED_FILES) || defined(_WIN32)
|
|
|
|
# define PRISM_HAS_MMAP
|
|
|
|
#endif
|
|
|
|
|
2023-06-20 18:53:02 +03:00
|
|
|
#endif
|