- 8 DB models (services, incidents, monitors, subscribers, etc.) - Full CRUD API for services, incidents, monitors - Public status page with live data - Incident detail page with timeline - API key authentication - Uptime monitoring scheduler - 13 tests passing - TECHNICAL_DESIGN.md with full spec
84 lines
2.4 KiB
C
84 lines
2.4 KiB
C
#ifndef BASE64_ENV_H
|
|
#define BASE64_ENV_H
|
|
|
|
#include <stdint.h>
|
|
|
|
// This header file contains macro definitions that describe certain aspects of
|
|
// the compile-time environment. Compatibility and portability macros go here.
|
|
|
|
// Define machine endianness. This is for GCC:
|
|
#if (__BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__)
|
|
# define BASE64_LITTLE_ENDIAN 1
|
|
#else
|
|
# define BASE64_LITTLE_ENDIAN 0
|
|
#endif
|
|
|
|
// This is for Clang:
|
|
#ifdef __LITTLE_ENDIAN__
|
|
# define BASE64_LITTLE_ENDIAN 1
|
|
#endif
|
|
|
|
#ifdef __BIG_ENDIAN__
|
|
# define BASE64_LITTLE_ENDIAN 0
|
|
#endif
|
|
|
|
// MSVC++ needs intrin.h for _byteswap_uint64 (issue #68):
|
|
#if BASE64_LITTLE_ENDIAN && defined(_MSC_VER)
|
|
# include <intrin.h>
|
|
#endif
|
|
|
|
// Endian conversion functions:
|
|
#if BASE64_LITTLE_ENDIAN
|
|
# ifdef _MSC_VER
|
|
// Microsoft Visual C++:
|
|
# define BASE64_HTOBE32(x) _byteswap_ulong(x)
|
|
# define BASE64_HTOBE64(x) _byteswap_uint64(x)
|
|
# else
|
|
// GCC and Clang:
|
|
# define BASE64_HTOBE32(x) __builtin_bswap32(x)
|
|
# define BASE64_HTOBE64(x) __builtin_bswap64(x)
|
|
# endif
|
|
#else
|
|
// No conversion needed:
|
|
# define BASE64_HTOBE32(x) (x)
|
|
# define BASE64_HTOBE64(x) (x)
|
|
#endif
|
|
|
|
// Detect word size:
|
|
#if defined (__x86_64__)
|
|
// This also works for the x32 ABI, which has a 64-bit word size.
|
|
# define BASE64_WORDSIZE 64
|
|
#elif SIZE_MAX == UINT32_MAX
|
|
# define BASE64_WORDSIZE 32
|
|
#elif SIZE_MAX == UINT64_MAX
|
|
# define BASE64_WORDSIZE 64
|
|
#else
|
|
# error BASE64_WORDSIZE_NOT_DEFINED
|
|
#endif
|
|
|
|
// End-of-file definitions.
|
|
// Almost end-of-file when waiting for the last '=' character:
|
|
#define BASE64_AEOF 1
|
|
// End-of-file when stream end has been reached or invalid input provided:
|
|
#define BASE64_EOF 2
|
|
|
|
// GCC 7 defaults to issuing a warning for fallthrough in switch statements,
|
|
// unless the fallthrough cases are marked with an attribute. As we use
|
|
// fallthrough deliberately, define an alias for the attribute:
|
|
#if __GNUC__ >= 7
|
|
# define BASE64_FALLTHROUGH __attribute__((fallthrough));
|
|
#else
|
|
# define BASE64_FALLTHROUGH
|
|
#endif
|
|
|
|
// Declare macros to ensure that functions that are intended to be inlined, are
|
|
// actually inlined, even when no optimization is applied. A lot of inner loop
|
|
// code is factored into separate functions for reasons of readability, but
|
|
// that code should always be inlined (and optimized) in the main loop.
|
|
#ifdef _MSC_VER
|
|
# define BASE64_FORCE_INLINE __forceinline
|
|
#else
|
|
# define BASE64_FORCE_INLINE inline __attribute__((always_inline))
|
|
#endif
|
|
|
|
#endif // BASE64_ENV_H
|