1 /* 2 * Helpful macros for TAP header files. 3 * 4 * This is not, strictly speaking, related to TAP, but any TAP add-on is 5 * probably going to need these macros, so define them in one place so that 6 * everyone can pull them in. 7 * 8 * This file is part of C TAP Harness. The current version plus supporting 9 * documentation is at <https://www.eyrie.org/~eagle/software/c-tap-harness/>. 10 * 11 * Copyright 2008, 2012-2013, 2015 Russ Allbery <eagle@eyrie.org> 12 * 13 * Permission is hereby granted, free of charge, to any person obtaining a 14 * copy of this software and associated documentation files (the "Software"), 15 * to deal in the Software without restriction, including without limitation 16 * the rights to use, copy, modify, merge, publish, distribute, sublicense, 17 * and/or sell copies of the Software, and to permit persons to whom the 18 * Software is furnished to do so, subject to the following conditions: 19 * 20 * The above copyright notice and this permission notice shall be included in 21 * all copies or substantial portions of the Software. 22 * 23 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 24 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 25 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 26 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 27 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 28 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 29 * DEALINGS IN THE SOFTWARE. 30 * 31 * SPDX-License-Identifier: MIT 32 */ 33 34 #ifndef TAP_MACROS_H 35 #define TAP_MACROS_H 1 36 37 /* 38 * __attribute__ is available in gcc 2.5 and later, but only with gcc 2.7 39 * could you use the __format__ form of the attributes, which is what we use 40 * (to avoid confusion with other macros), and only with gcc 2.96 can you use 41 * the attribute __malloc__. 2.96 is very old, so don't bother trying to get 42 * the other attributes to work with GCC versions between 2.7 and 2.96. 43 */ 44 #ifndef __attribute__ 45 # if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 96) 46 # define __attribute__(spec) /* empty */ 47 # endif 48 #endif 49 50 /* 51 * We use __alloc_size__, but it was only available in fairly recent versions 52 * of GCC. Suppress warnings about the unknown attribute if GCC is too old. 53 * We know that we're GCC at this point, so we can use the GCC variadic macro 54 * extension, which will still work with versions of GCC too old to have C99 55 * variadic macro support. 56 */ 57 #if !defined(__attribute__) && !defined(__alloc_size__) 58 # if defined(__GNUC__) && !defined(__clang__) 59 # if __GNUC__ < 4 || (__GNUC__ == 4 && __GNUC_MINOR__ < 3) 60 # define __alloc_size__(spec, args...) /* empty */ 61 # endif 62 # endif 63 #endif 64 65 /* Suppress __warn_unused_result__ if gcc is too old. */ 66 #if !defined(__attribute__) && !defined(__warn_unused_result__) 67 # if __GNUC__ < 3 || (__GNUC__ == 3 && __GNUC_MINOR__ < 4) 68 # define __warn_unused_result__ /* empty */ 69 # endif 70 #endif 71 72 /* 73 * LLVM and Clang pretend to be GCC but don't support all of the __attribute__ 74 * settings that GCC does. For them, suppress warnings about unknown 75 * attributes on declarations. This unfortunately will affect the entire 76 * compilation context, but there's no push and pop available. 77 */ 78 #if !defined(__attribute__) && (defined(__llvm__) || defined(__clang__)) 79 # pragma GCC diagnostic ignored "-Wattributes" 80 #endif 81 82 /* Used for unused parameters to silence gcc warnings. */ 83 #define UNUSED __attribute__((__unused__)) 84 85 /* 86 * BEGIN_DECLS is used at the beginning of declarations so that C++ 87 * compilers don't mangle their names. END_DECLS is used at the end. 88 */ 89 #undef BEGIN_DECLS 90 #undef END_DECLS 91 #ifdef __cplusplus 92 # define BEGIN_DECLS extern "C" { 93 # define END_DECLS } 94 #else 95 # define BEGIN_DECLS /* empty */ 96 # define END_DECLS /* empty */ 97 #endif 98 99 #endif /* TAP_MACROS_H */ 100