// vim:fileencoding=utf-8:foldmethod=marker

#ifndef PLATFORM_H
#define PLATFORM_H

#if defined(__ANDROID__)
  #define WAPP_PLATFORM_ANDROID
  #define WAPP_PLATFORM_POSIX
#elif defined(__FreeBSD__)
  #define WAPP_PLATFORM_FREE_BSD
  #define WAPP_PLATFORM_BSD
  #define WAPP_PLATFORM_POSIX
#elif defined(__NetBSD__)
  #define WAPP_PLATFORM_NET_BSD
  #define WAPP_PLATFORM_BSD
  #define WAPP_PLATFORM_POSIX
#elif defined(__OpenBSD__)
  #define WAPP_PLATFORM_OPEN_BSD
  #define WAPP_PLATFORM_BSD
  #define WAPP_PLATFORM_POSIX
#elif defined(__DragonFly__)
  #define WAPP_PLATFORM_DRAGON_FLY
  #define WAPP_PLATFORM_BSD
  #define WAPP_PLATFORM_POSIX
#elif defined(__bsdi__)
  #define WAPP_PLATFORM_BSD
  #define WAPP_PLATFORM_POSIX
#elif defined(__linux__) || defined(linux) || defined(__linux) || defined(__gnu_linux__)
  #define WAPP_PLATFORM_LINUX
  #define WAPP_PLATFORM_POSIX
#elif defined(__GNU__) || defined(__gnu_hurd__)
  #define WAPP_PLATFORM_GNU
  #define WAPP_PLATFORM_POSIX
#elif defined(__APPLE__) || defined(__MACH__)
  #include <TargetConditionals.h>
  #if TARGET_OS_IPHONE
    #define WAPP_PLATFORM_IOS
    #define WAPP_PLATFORM_APPLE
    #define WAPP_PLATFORM_POSIX
  #elif TARGET_OS_MAC
    #define WAPP_PLATFORM_MACOS
    #define WAPP_PLATFORM_APPLE
    #define WAPP_PLATFORM_POSIX
  #else
    #error "Unrecognised Apple platform"
  #endif
#elif defined(_WIN64)
  #define WAPP_PLATFORM_WINDOWS64
  #define WAPP_PLATFORM_WINDOWS
#elif defined(_WIN32)
  #define WAPP_PLATFORM_WINDOWS32
  #define WAPP_PLATFORM_WINDOWS
#elif defined(__CYGWIN__)
  #define WAPP_PLATFORM_CYGWIN
  #define WAPP_PLATFORM_WINDOWS
#elif defined(__unix__) || defined(__unix)
  #define WAPP_PLATFORM_UNIX
  #define WAPP_PLATFORM_POSIX
#else
  #error "Unrecognised platform"
#endif

#ifdef __cplusplus
  #define WAPP_PLATFORM_CPP
  #define WAPP_PLATFORM_CPP_VERSION __cplusplus
  #define WAPP_PLATFORM_CPP98_VERSION 199711L
  #define WAPP_PLATFORM_CPP11_VERSION 201103L
  #define WAPP_PLATFORM_CPP14_VERSION 201402L
  #define WAPP_PLATFORM_CPP17_VERSION 201703L
  #define WAPP_PLATFORM_CPP20_VERSION 202002L
  #define WAPP_PLATFORM_CPP23_VERSION 202302L

  #if WAPP_PLATFORM_CPP_VERSION == WAPP_PLATFORM_CPP98_VERSION
    #define WAPP_PLATFORM_CPP98
  #elif WAPP_PLATFORM_CPP_VERSION == WAPP_PLATFORM_CPP11_VERSION
    #define WAPP_PLATFORM_CPP11
  #elif WAPP_PLATFORM_CPP_VERSION == WAPP_PLATFORM_CPP14_VERSION
    #define WAPP_PLATFORM_CPP14
  #elif WAPP_PLATFORM_CPP_VERSION == WAPP_PLATFORM_CPP17_VERSION
    #define WAPP_PLATFORM_CPP17
  #elif WAPP_PLATFORM_CPP_VERSION == WAPP_PLATFORM_CPP20_VERSION
    #define WAPP_PLATFORM_CPP20
  #elif WAPP_PLATFORM_CPP_VERSION == WAPP_PLATFORM_CPP23_VERSION
    #define WAPP_PLATFORM_CPP23
  #else
    #error "Unrecognised C++ version"
  #endif
#else
  #define WAPP_PLATFORM_C

  #if defined(__STDC_VERSION__)
    #define WAPP_PLATFORM_C_VERSION __STDC_VERSION__
    #define WAPP_PLATFORM_C99_VERSION 199901L
    #define WAPP_PLATFORM_C11_VERSION 201112L
    #define WAPP_PLATFORM_C17_VERSION 201710L
    #define WAPP_PLATFORM_C23_VERSION 202311L

    #if WAPP_PLATFORM_C_VERSION == WAPP_PLATFORM_C99_VERSION
      #define WAPP_PLATFORM_C99
    #elif WAPP_PLATFORM_C_VERSION == WAPP_PLATFORM_C11_VERSION
      #define WAPP_PLATFORM_C11
    #elif WAPP_PLATFORM_C_VERSION == WAPP_PLATFORM_C17_VERSION
      #define WAPP_PLATFORM_C17
    #elif WAPP_PLATFORM_C_VERSION == WAPP_PLATFORM_C23_VERSION
      #define WAPP_PLATFORM_C23
    #else
      #error "Unrecognised C version"
    #endif
  #else
    #define WAPP_PLATFORM_C89
  #endif
#endif // !__cplusplus

#endif // !PLATFORM_H
