2017-06-18 12:34:21 +00:00
|
|
|
/*
|
|
|
|
* This file Copyright (C) 2017 Mnemosyne LLC
|
|
|
|
*
|
|
|
|
* It may be used under the GNU GPL versions 2 or 3
|
|
|
|
* or any future license endorsed by Mnemosyne LLC.
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
|
|
|
|
#pragma once
|
|
|
|
|
|
|
|
/***
|
|
|
|
****
|
|
|
|
***/
|
|
|
|
|
|
|
|
#ifndef __has_feature
|
|
|
|
#define __has_feature(x) 0
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#ifndef __has_extension
|
|
|
|
#define __has_extension __has_feature
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#ifndef __has_attribute
|
|
|
|
#define __has_attribute(x) 0
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#ifndef __has_builtin
|
|
|
|
#define __has_builtin(x) 0
|
|
|
|
#endif
|
|
|
|
|
2017-11-27 22:22:44 +00:00
|
|
|
#ifdef _WIN32
|
|
|
|
#define TR_IF_WIN32(ThenValue, ElseValue) ThenValue
|
|
|
|
#else
|
|
|
|
#define TR_IF_WIN32(ThenValue, ElseValue) ElseValue
|
|
|
|
#endif
|
|
|
|
|
2017-06-18 12:34:21 +00:00
|
|
|
#ifdef __GNUC__
|
2021-08-15 09:41:48 +00:00
|
|
|
#define TR_GNUC_CHECK_VERSION(major, minor) (__GNUC__ > (major) || (__GNUC__ == (major) && __GNUC_MINOR__ >= (minor)))
|
2017-06-18 12:34:21 +00:00
|
|
|
#else
|
|
|
|
#define TR_GNUC_CHECK_VERSION(major, minor) 0
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#ifdef __UCLIBC__
|
|
|
|
#define TR_UCLIBC_CHECK_VERSION(major, minor, micro) \
|
2021-08-15 09:41:48 +00:00
|
|
|
(__UCLIBC_MAJOR__ > (major) || (__UCLIBC_MAJOR__ == (major) && __UCLIBC_MINOR__ > (minor)) || \
|
|
|
|
(__UCLIBC_MAJOR__ == (major) && __UCLIBC_MINOR__ == (minor) && __UCLIBC_SUBLEVEL__ >= (micro)))
|
2017-06-18 12:34:21 +00:00
|
|
|
#else
|
|
|
|
#define TR_UCLIBC_CHECK_VERSION(major, minor, micro) 0
|
|
|
|
#endif
|
|
|
|
|
|
|
|
/***
|
|
|
|
****
|
|
|
|
***/
|
|
|
|
|
2020-08-27 23:41:26 +00:00
|
|
|
// http://cnicholson.net/2009/02/stupid-c-tricks-adventures-in-assert/
|
2021-08-15 09:41:48 +00:00
|
|
|
#define TR_UNUSED(x) \
|
|
|
|
do \
|
|
|
|
{ \
|
|
|
|
((void)sizeof(x)); \
|
|
|
|
} while (0)
|
2017-06-18 12:34:21 +00:00
|
|
|
|
|
|
|
/***
|
|
|
|
****
|
|
|
|
***/
|
|
|
|
|
|
|
|
#if __has_builtin(__builtin_expect) || TR_GNUC_CHECK_VERSION(3, 0)
|
|
|
|
#define TR_LIKELY(x) __builtin_expect(!!(x), 1)
|
|
|
|
#define TR_UNLIKELY(x) __builtin_expect(!!(x), 0)
|
|
|
|
#else
|
|
|
|
#define TR_LIKELY(x) (x)
|
|
|
|
#define TR_UNLIKELY(x) (x)
|
|
|
|
#endif
|
|
|
|
|
|
|
|
/***
|
|
|
|
****
|
|
|
|
***/
|
|
|
|
|
|
|
|
#if __has_attribute(__noreturn__) || TR_GNUC_CHECK_VERSION(2, 5)
|
|
|
|
#define TR_NORETURN __attribute__((__noreturn__))
|
|
|
|
#elif defined(_MSC_VER)
|
|
|
|
#define TR_NORETURN __declspec(noreturn)
|
|
|
|
#else
|
|
|
|
#define TR_NORETURN
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#if __has_attribute(__deprecated__) || TR_GNUC_CHECK_VERSION(3, 1)
|
|
|
|
#define TR_DEPRECATED __attribute__((__deprecated__))
|
|
|
|
#elif defined(_MSC_VER)
|
|
|
|
#define TR_DEPRECATED __declspec(deprecated)
|
|
|
|
#else
|
|
|
|
#define TR_DEPRECATED
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#if __has_attribute(__format__) || TR_GNUC_CHECK_VERSION(2, 3)
|
|
|
|
#define TR_GNUC_PRINTF(fmt, args) __attribute__((__format__(printf, fmt, args)))
|
|
|
|
#else
|
|
|
|
#define TR_GNUC_PRINTF(fmt, args)
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#if __has_attribute(__nonnull__) || TR_GNUC_CHECK_VERSION(3, 3)
|
|
|
|
#define TR_GNUC_NONNULL(...) __attribute__((__nonnull__(__VA_ARGS__)))
|
|
|
|
#else
|
|
|
|
#define TR_GNUC_NONNULL(...)
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#if __has_attribute(__sentinel__) || TR_GNUC_CHECK_VERSION(4, 3)
|
|
|
|
#define TR_GNUC_NULL_TERMINATED __attribute__((__sentinel__))
|
|
|
|
#else
|
|
|
|
#define TR_GNUC_NULL_TERMINATED
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#if __has_attribute(__hot__) || TR_GNUC_CHECK_VERSION(4, 3)
|
|
|
|
#define TR_GNUC_HOT __attribute__((__hot__))
|
|
|
|
#else
|
|
|
|
#define TR_GNUC_HOT
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#if __has_attribute(__malloc__) || TR_GNUC_CHECK_VERSION(2, 96)
|
|
|
|
#define TR_GNUC_MALLOC __attribute__((__malloc__))
|
|
|
|
#else
|
|
|
|
#define TR_GNUC_MALLOC
|
|
|
|
#endif
|
|
|
|
|
fix: gcc warnings in libtransmission/ and utils/ (#843)
* fix: __attribute__(__printf__) warnings
* fix: implicit fallthrough warning
* fixup! fix: implicit fallthrough warning
* fix: disable warnings for 3rd party code
Since we want to leave upstream code as-is
* fixup! fix: disable warnings for 3rd party code
* fixup! fix: disable warnings for 3rd party code
* silence spurious alignment warning
Xrefs
Discussion: https://stackoverflow.com/a/35554349
Macro inspiration: https://pagure.io/SSSD/sssd/blob/90ac46f71068d131391492360a8553bdd005b5a7/f/src/util/util_safealign.h#_35
* fixup! fix: disable warnings for 3rd party code
* fixup! fix: implicit fallthrough warning
* make uncrustify happy
* remove uncrustify-test.sh
that's probably off-topic for this PR
* fixup! fix: __attribute__(__printf__) warnings
* Update libtransmission/CMakeLists.txt
Co-Authored-By: ckerr <ckerr@github.com>
* fixup! silence spurious alignment warning
* use -w for DISABLE_WARNINGS in Clang
* refactor: fix libtransmission deprecation warnings
* fix: pthread_create's start_routine's return value
This was defined as `void` on non-Windows but should have been `void*`
* chore: uncrustify
* fix: add DISABLE_WARNINGS option for SunPro Studio
* fix "unused in lambda capture" warnings by clang++
* fix 'increases required alignment' warning
Caused from storing int16_t's in a char array.
* fix net.c 'increases required alignment' warning
The code passes in a `struct sockaddr_storage*` which is a padded struct
large enough for the necessary alignment. Unfortunately it was recast as
a `struct sockaddr*` which has less padding and a smaller alignment. The
warning occrred because of these differing alignments.
* make building quieter so warnings are more visible
* fixup! fix 'increases required alignment' warning
* Fix -Wcast-function-type warnings in GTK+ app code
https://gitlab.gnome.org/GNOME/gnome-terminal/issues/96 talks about both
the issue and its solution.
GCC 8's -Wcast-function-type, enabled by -Wextra, is problematic in glib
applications because it's idiomatic there to recast function signatures,
e.g. `g_slist_free(list, (GFunc)g_free, NULL);`.
Disabling the warning with pragmas causes "unrecognized pragma" warnings
on clang and older versions of gcc, and disabling the warning could miss
actual bugs. GCC defines `void (*)(void)` as a special case that matches
anything so we can silence warnings by double-casting through GCallback.
In the previous example, the warning is silenced by changing the code to
read `g_slist_free(list, (GFunc)(GCallback)g_free, NULL);`).
* fixup! fix "unused in lambda capture" warnings by clang++
* fixup! fix "unused in lambda capture" warnings by clang++
* fix two more libtransmission compiler warnings
* fix: in watchdir, use TR_ENABLE_ASSERTS not NDEBUG
2019-11-06 17:27:03 +00:00
|
|
|
#if __has_attribute(__fallthrough__) || TR_GNUC_CHECK_VERSION(7, 0)
|
|
|
|
#define TR_GNUC_FALLTHROUGH __attribute__((__fallthrough__))
|
|
|
|
#else
|
|
|
|
#define TR_GNUC_FALLTHROUGH
|
|
|
|
#endif
|
|
|
|
|
2017-06-18 12:34:21 +00:00
|
|
|
/***
|
|
|
|
****
|
|
|
|
***/
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @def TR_STATIC_ASSERT
|
|
|
|
* @brief This helper allows to perform static checks at compile time
|
|
|
|
*/
|
2020-08-18 10:35:29 +00:00
|
|
|
#if defined(__cplusplus) || defined(static_assert)
|
2017-06-18 12:34:21 +00:00
|
|
|
#define TR_STATIC_ASSERT static_assert
|
2020-08-18 10:35:29 +00:00
|
|
|
#elif __has_feature(c_static_assert) || __has_extension(c_static_assert) || TR_GNUC_CHECK_VERSION(4, 6)
|
2017-06-18 12:34:21 +00:00
|
|
|
#define TR_STATIC_ASSERT _Static_assert
|
|
|
|
#else
|
2021-08-15 09:41:48 +00:00
|
|
|
#define TR_STATIC_ASSERT(x, msg) \
|
|
|
|
do \
|
|
|
|
{ \
|
|
|
|
((void)sizeof(x)); \
|
|
|
|
} while (0)
|
2017-06-18 12:34:21 +00:00
|
|
|
#endif
|
|
|
|
|
|
|
|
/* Sometimes the system defines MAX/MIN, sometimes not.
|
|
|
|
In the latter case, define those here since we will use them */
|
|
|
|
|
|
|
|
#ifndef MAX
|
|
|
|
#define MAX(a, b) ((a) > (b) ? (a) : (b))
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#ifndef MIN
|
|
|
|
#define MIN(a, b) ((a) > (b) ? (b) : (a))
|
|
|
|
#endif
|
|
|
|
|
|
|
|
/***
|
|
|
|
****
|
|
|
|
***/
|
|
|
|
|
fix: gcc warnings in libtransmission/ and utils/ (#843)
* fix: __attribute__(__printf__) warnings
* fix: implicit fallthrough warning
* fixup! fix: implicit fallthrough warning
* fix: disable warnings for 3rd party code
Since we want to leave upstream code as-is
* fixup! fix: disable warnings for 3rd party code
* fixup! fix: disable warnings for 3rd party code
* silence spurious alignment warning
Xrefs
Discussion: https://stackoverflow.com/a/35554349
Macro inspiration: https://pagure.io/SSSD/sssd/blob/90ac46f71068d131391492360a8553bdd005b5a7/f/src/util/util_safealign.h#_35
* fixup! fix: disable warnings for 3rd party code
* fixup! fix: implicit fallthrough warning
* make uncrustify happy
* remove uncrustify-test.sh
that's probably off-topic for this PR
* fixup! fix: __attribute__(__printf__) warnings
* Update libtransmission/CMakeLists.txt
Co-Authored-By: ckerr <ckerr@github.com>
* fixup! silence spurious alignment warning
* use -w for DISABLE_WARNINGS in Clang
* refactor: fix libtransmission deprecation warnings
* fix: pthread_create's start_routine's return value
This was defined as `void` on non-Windows but should have been `void*`
* chore: uncrustify
* fix: add DISABLE_WARNINGS option for SunPro Studio
* fix "unused in lambda capture" warnings by clang++
* fix 'increases required alignment' warning
Caused from storing int16_t's in a char array.
* fix net.c 'increases required alignment' warning
The code passes in a `struct sockaddr_storage*` which is a padded struct
large enough for the necessary alignment. Unfortunately it was recast as
a `struct sockaddr*` which has less padding and a smaller alignment. The
warning occrred because of these differing alignments.
* make building quieter so warnings are more visible
* fixup! fix 'increases required alignment' warning
* Fix -Wcast-function-type warnings in GTK+ app code
https://gitlab.gnome.org/GNOME/gnome-terminal/issues/96 talks about both
the issue and its solution.
GCC 8's -Wcast-function-type, enabled by -Wextra, is problematic in glib
applications because it's idiomatic there to recast function signatures,
e.g. `g_slist_free(list, (GFunc)g_free, NULL);`.
Disabling the warning with pragmas causes "unrecognized pragma" warnings
on clang and older versions of gcc, and disabling the warning could miss
actual bugs. GCC defines `void (*)(void)` as a special case that matches
anything so we can silence warnings by double-casting through GCallback.
In the previous example, the warning is silenced by changing the code to
read `g_slist_free(list, (GFunc)(GCallback)g_free, NULL);`).
* fixup! fix "unused in lambda capture" warnings by clang++
* fixup! fix "unused in lambda capture" warnings by clang++
* fix two more libtransmission compiler warnings
* fix: in watchdir, use TR_ENABLE_ASSERTS not NDEBUG
2019-11-06 17:27:03 +00:00
|
|
|
/* Only use this macro to suppress false-positive alignment warnings */
|
|
|
|
#define TR_DISCARD_ALIGN(ptr, type) ((type)(void*)(ptr))
|
|
|
|
|
2017-06-18 12:34:21 +00:00
|
|
|
#define SHA_DIGEST_LENGTH 20
|
|
|
|
|
|
|
|
#define TR_INET6_ADDRSTRLEN 46
|
|
|
|
|
2020-09-13 21:43:29 +00:00
|
|
|
#define TR_ADDRSTRLEN 64
|
|
|
|
|
2017-06-18 12:34:21 +00:00
|
|
|
#define TR_BAD_SIZE ((size_t)-1)
|
2020-08-11 18:11:55 +00:00
|
|
|
|
|
|
|
/* Guard C code in headers, while including them from C++ */
|
2021-08-15 09:41:48 +00:00
|
|
|
#ifdef __cplusplus
|
|
|
|
#define TR_BEGIN_DECLS \
|
|
|
|
extern "C" \
|
|
|
|
{
|
|
|
|
#define TR_END_DECLS }
|
2020-08-11 18:11:55 +00:00
|
|
|
#else
|
|
|
|
#define TR_BEGIN_DECLS
|
|
|
|
#define TR_END_DECLS
|
|
|
|
#endif
|
2021-08-15 09:41:48 +00:00
|
|
|
|
|
|
|
// Mostly to enforce better formatting
|
|
|
|
#define TR_ARG_TUPLE(...) __VA_ARGS__
|