| 1 | 
 /* ANSI and traditional C compatability macros | 
 
 
 
 
 
 | 2 | 
    Copyright (C) 1991-2021 Free Software Foundation, Inc. | 
 
 
 
 
 
 | 3 | 
    This file is part of the GNU C Library. | 
 
 
 
 
 
 | 4 | 
  | 
 
 
 
 
 
 | 5 | 
 This program is free software; you can redistribute it and/or modify | 
 
 
 
 
 
 | 6 | 
 it under the terms of the GNU General Public License as published by | 
 
 
 
 
 
 | 7 | 
 the Free Software Foundation; either version 2 of the License, or | 
 
 
 
 
 
 | 8 | 
 (at your option) any later version. | 
 
 
 
 
 
 | 9 | 
  | 
 
 
 
 
 
 | 10 | 
 This program is distributed in the hope that it will be useful, | 
 
 
 
 
 
 | 11 | 
 but WITHOUT ANY WARRANTY; without even the implied warranty of | 
 
 
 
 
 
 | 12 | 
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | 
 
 
 
 
 
 | 13 | 
 GNU General Public License for more details. | 
 
 
 
 
 
 | 14 | 
  | 
 
 
 
 
 
 | 15 | 
 You should have received a copy of the GNU General Public License | 
 
 
 
 
 
 | 16 | 
 along with this program; if not, write to the Free Software | 
 
 
 
 
 
 | 17 | 
 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.  */ | 
 
 
 
 
 
 | 18 | 
  | 
 
 
 
 
 
 | 19 | 
 /* ANSI and traditional C compatibility macros | 
 
 
 
 
 
 | 20 | 
  | 
 
 
 
 
 
 | 21 | 
    ANSI C is assumed if __STDC__ is #defined. | 
 
 
 
 
 
 | 22 | 
  | 
 
 
 
 
 
 | 23 | 
    Macro                ANSI C definition       Traditional C definition | 
 
 
 
 
 
 | 24 | 
    -----                ---- - ----------       ----------- - ---------- | 
 
 
 
 
 
 | 25 | 
    PTR                  `void *'                `char *' | 
 
 
 
 
 
 | 26 | 
    const                not defined             `' | 
 
 
 
 
 
 | 27 | 
    volatile             not defined             `' | 
 
 
 
 
 
 | 28 | 
    signed               not defined             `' | 
 
 
 
 
 
 | 29 | 
  | 
 
 
 
 
 
 | 30 | 
    For ease of writing code which uses GCC extensions but needs to be | 
 
 
 
 
 
 | 31 | 
    portable to other compilers, we provide the GCC_VERSION macro that | 
 
 
 
 
 
 | 32 | 
    simplifies testing __GNUC__ and __GNUC_MINOR__ together, and various | 
 
 
 
 
 
 | 33 | 
    wrappers around __attribute__.  Also, __extension__ will be #defined | 
 
 
 
 
 
 | 34 | 
    to nothing if it doesn't work.  See below.  */ | 
 
 
 
 
 
 | 35 | 
  | 
 
 
 
 
 
 | 36 | 
 #ifndef _ANSIDECL_H | 
 
 
 
 
 
 | 37 | 
 #define _ANSIDECL_H     1 | 
 
 
 
 
 
 | 38 | 
  | 
 
 
 
 
 
 | 39 | 
 #ifdef __cplusplus | 
 
 
 
 
 
 | 40 | 
 extern "C" { | 
 
 
 
 
 
 | 41 | 
 #endif | 
 
 
 
 
 
 | 42 | 
  | 
 
 
 
 
 
 | 43 | 
 /* Every source file includes this file, | 
 
 
 
 
 
 | 44 | 
    so they will all get the switch for lint.  */ | 
 
 
 
 
 
 | 45 | 
 /* LINTLIBRARY */ | 
 
 
 
 
 
 | 46 | 
  | 
 
 
 
 
 
 | 47 | 
 /* Using MACRO(x,y) in cpp #if conditionals does not work with some | 
 
 
 
 
 
 | 48 | 
    older preprocessors.  Thus we can't define something like this: | 
 
 
 
 
 
 | 49 | 
  | 
 
 
 
 
 
 | 50 | 
 #define HAVE_GCC_VERSION(MAJOR, MINOR) \ | 
 
 
 
 
 
 | 51 | 
   (__GNUC__ > (MAJOR) || (__GNUC__ == (MAJOR) && __GNUC_MINOR__ >= (MINOR))) | 
 
 
 
 
 
 | 52 | 
  | 
 
 
 
 
 
 | 53 | 
 and then test "#if HAVE_GCC_VERSION(2,7)". | 
 
 
 
 
 
 | 54 | 
  | 
 
 
 
 
 
 | 55 | 
 So instead we use the macro below and test it against specific values.  */ | 
 
 
 
 
 
 | 56 | 
  | 
 
 
 
 
 
 | 57 | 
 /* This macro simplifies testing whether we are using gcc, and if it | 
 
 
 
 
 
 | 58 | 
    is of a particular minimum version. (Both major & minor numbers are | 
 
 
 
 
 
 | 59 | 
    significant.)  This macro will evaluate to 0 if we are not using | 
 
 
 
 
 
 | 60 | 
    gcc at all.  */ | 
 
 
 
 
 
 | 61 | 
 #ifndef GCC_VERSION | 
 
 
 
 
 
 | 62 | 
 #define GCC_VERSION (__GNUC__ * 1000 + __GNUC_MINOR__) | 
 
 
 
 
 
 | 63 | 
 #endif /* GCC_VERSION */ | 
 
 
 
 
 
 | 64 | 
  | 
 
 
 
 
 
 | 65 | 
 #if defined (__STDC__) || defined(__cplusplus) || defined (_AIX) || (defined (__mips) && defined (_SYSTYPE_SVR4)) || defined(_WIN32) | 
 
 
 
 
 
 | 66 | 
 /* All known AIX compilers implement these things (but don't always | 
 
 
 
 
 
 | 67 | 
    define __STDC__).  The RISC/OS MIPS compiler defines these things | 
 
 
 
 
 
 | 68 | 
    in SVR4 mode, but does not define __STDC__.  */ | 
 
 
 
 
 
 | 69 | 
 /* eraxxon@alumni.rice.edu: The Compaq C++ compiler, unlike many other | 
 
 
 
 
 
 | 70 | 
    C++ compilers, does not define __STDC__, though it acts as if this | 
 
 
 
 
 
 | 71 | 
    was so. (Verified versions: 5.7, 6.2, 6.3, 6.5) */ | 
 
 
 
 
 
 | 72 | 
  | 
 
 
 
 
 
 | 73 | 
 #define PTR             void * | 
 
 
 
 
 
 | 74 | 
  | 
 
 
 
 
 
 | 75 | 
 #undef const | 
 
 
 
 
 
 | 76 | 
 #undef volatile | 
 
 
 
 
 
 | 77 | 
 #undef signed | 
 
 
 
 
 
 | 78 | 
  | 
 
 
 
 
 
 | 79 | 
 /* inline requires special treatment; it's in C99, and GCC >=2.7 supports | 
 
 
 
 
 
 | 80 | 
    it too, but it's not in C89.  */ | 
 
 
 
 
 
 | 81 | 
 #undef inline | 
 
 
 
 
 
 | 82 | 
 #if __STDC_VERSION__ >= 199901L || defined(__cplusplus) || (defined(__SUNPRO_C) && defined(__C99FEATURES__)) | 
 
 
 
 
 
 | 83 | 
 /* it's a keyword */ | 
 
 
 
 
 
 | 84 | 
 #else | 
 
 
 
 
 
 | 85 | 
 # if GCC_VERSION >= 2007 | 
 
 
 
 
 
 | 86 | 
 #  define inline __inline__   /* __inline__ prevents -pedantic warnings */ | 
 
 
 
 
 
 | 87 | 
 # else | 
 
 
 
 
 
 | 88 | 
 #  define inline  /* nothing */ | 
 
 
 
 
 
 | 89 | 
 # endif | 
 
 
 
 
 
 | 90 | 
 #endif | 
 
 
 
 
 
 | 91 | 
  | 
 
 
 
 
 
 | 92 | 
 #else   /* Not ANSI C.  */ | 
 
 
 
 
 
 | 93 | 
  | 
 
 
 
 
 
 | 94 | 
 #define PTR             char * | 
 
 
 
 
 
 | 95 | 
  | 
 
 
 
 
 
 | 96 | 
 /* some systems define these in header files for non-ansi mode */ | 
 
 
 
 
 
 | 97 | 
 #undef const | 
 
 
 
 
 
 | 98 | 
 #undef volatile | 
 
 
 
 
 
 | 99 | 
 #undef signed | 
 
 
 
 
 
 | 100 | 
 #undef inline | 
 
 
 
 
 
 | 101 | 
 #define const | 
 
 
 
 
 
 | 102 | 
 #define volatile | 
 
 
 
 
 
 | 103 | 
 #define signed | 
 
 
 
 
 
 | 104 | 
 #define inline | 
 
 
 
 
 
 | 105 | 
  | 
 
 
 
 
 
 | 106 | 
 #endif  /* ANSI C.  */ | 
 
 
 
 
 
 | 107 | 
  | 
 
 
 
 
 
 | 108 | 
 /* Define macros for some gcc attributes.  This permits us to use the | 
 
 
 
 
 
 | 109 | 
    macros freely, and know that they will come into play for the | 
 
 
 
 
 
 | 110 | 
    version of gcc in which they are supported.  */ | 
 
 
 
 
 
 | 111 | 
  | 
 
 
 
 
 
 | 112 | 
 #if (GCC_VERSION < 2007) | 
 
 
 
 
 
 | 113 | 
 # define __attribute__(x) | 
 
 
 
 
 
 | 114 | 
 #endif | 
 
 
 
 
 
 | 115 | 
  | 
 
 
 
 
 
 | 116 | 
 /* Attribute __malloc__ on functions was valid as of gcc 2.96. */ | 
 
 
 
 
 
 | 117 | 
 #ifndef ATTRIBUTE_MALLOC | 
 
 
 
 
 
 | 118 | 
 # if (GCC_VERSION >= 2096) | 
 
 
 
 
 
 | 119 | 
 #  define ATTRIBUTE_MALLOC __attribute__ ((__malloc__)) | 
 
 
 
 
 
 | 120 | 
 # else | 
 
 
 
 
 
 | 121 | 
 #  define ATTRIBUTE_MALLOC | 
 
 
 
 
 
 | 122 | 
 # endif /* GNUC >= 2.96 */ | 
 
 
 
 
 
 | 123 | 
 #endif /* ATTRIBUTE_MALLOC */ | 
 
 
 
 
 
 | 124 | 
  | 
 
 
 
 
 
 | 125 | 
 /* Attributes on labels were valid as of gcc 2.93 and g++ 4.5.  For | 
 
 
 
 
 
 | 126 | 
    g++ an attribute on a label must be followed by a semicolon.  */ | 
 
 
 
 
 
 | 127 | 
 #ifndef ATTRIBUTE_UNUSED_LABEL | 
 
 
 
 
 
 | 128 | 
 # ifndef __cplusplus | 
 
 
 
 
 
 | 129 | 
 #  if GCC_VERSION >= 2093 | 
 
 
 
 
 
 | 130 | 
 #   define ATTRIBUTE_UNUSED_LABEL ATTRIBUTE_UNUSED | 
 
 
 
 
 
 | 131 | 
 #  else | 
 
 
 
 
 
 | 132 | 
 #   define ATTRIBUTE_UNUSED_LABEL | 
 
 
 
 
 
 | 133 | 
 #  endif | 
 
 
 
 
 
 | 134 | 
 # else | 
 
 
 
 
 
 | 135 | 
 #  if GCC_VERSION >= 4005 | 
 
 
 
 
 
 | 136 | 
 #   define ATTRIBUTE_UNUSED_LABEL ATTRIBUTE_UNUSED ; | 
 
 
 
 
 
 | 137 | 
 #  else | 
 
 
 
 
 
 | 138 | 
 #   define ATTRIBUTE_UNUSED_LABEL | 
 
 
 
 
 
 | 139 | 
 #  endif | 
 
 
 
 
 
 | 140 | 
 # endif | 
 
 
 
 
 
 | 141 | 
 #endif | 
 
 
 
 
 
 | 142 | 
  | 
 
 
 
 
 
 | 143 | 
 /* Similarly to ARG_UNUSED below.  Prior to GCC 3.4, the C++ frontend | 
 
 
 
 
 
 | 144 | 
    couldn't parse attributes placed after the identifier name, and now | 
 
 
 
 
 
 | 145 | 
    the entire compiler is built with C++.  */ | 
 
 
 
 
 
 | 146 | 
 #ifndef ATTRIBUTE_UNUSED | 
 
 
 
 
 
 | 147 | 
 #if GCC_VERSION >= 3004 | 
 
 
 
 
 
 | 148 | 
 #  define ATTRIBUTE_UNUSED __attribute__ ((__unused__)) | 
 
 
 
 
 
 | 149 | 
 #else | 
 
 
 
 
 
 | 150 | 
 #define ATTRIBUTE_UNUSED | 
 
 
 
 
 
 | 151 | 
 #endif | 
 
 
 
 
 
 | 152 | 
 #endif /* ATTRIBUTE_UNUSED */ | 
 
 
 
 
 
 | 153 | 
  | 
 
 
 
 
 
 | 154 | 
 /* Before GCC 3.4, the C++ frontend couldn't parse attributes placed after the | 
 
 
 
 
 
 | 155 | 
    identifier name.  */ | 
 
 
 
 
 
 | 156 | 
 #if ! defined(__cplusplus) || (GCC_VERSION >= 3004) | 
 
 
 
 
 
 | 157 | 
 # define ARG_UNUSED(NAME) NAME ATTRIBUTE_UNUSED | 
 
 
 
 
 
 | 158 | 
 #else /* !__cplusplus || GNUC >= 3.4 */ | 
 
 
 
 
 
 | 159 | 
 # define ARG_UNUSED(NAME) NAME | 
 
 
 
 
 
 | 160 | 
 #endif /* !__cplusplus || GNUC >= 3.4 */ | 
 
 
 
 
 
 | 161 | 
  | 
 
 
 
 
 
 | 162 | 
 #ifndef ATTRIBUTE_NORETURN | 
 
 
 
 
 
 | 163 | 
 #define ATTRIBUTE_NORETURN __attribute__ ((__noreturn__)) | 
 
 
 
 
 
 | 164 | 
 #endif /* ATTRIBUTE_NORETURN */ | 
 
 
 
 
 
 | 165 | 
  | 
 
 
 
 
 
 | 166 | 
 /* Attribute `nonnull' was valid as of gcc 3.3.  */ | 
 
 
 
 
 
 | 167 | 
 #ifndef ATTRIBUTE_NONNULL | 
 
 
 
 
 
 | 168 | 
 # if (GCC_VERSION >= 3003) | 
 
 
 
 
 
 | 169 | 
 #  define ATTRIBUTE_NONNULL(m) __attribute__ ((__nonnull__ (m))) | 
 
 
 
 
 
 | 170 | 
 # else | 
 
 
 
 
 
 | 171 | 
 #  define ATTRIBUTE_NONNULL(m) | 
 
 
 
 
 
 | 172 | 
 # endif /* GNUC >= 3.3 */ | 
 
 
 
 
 
 | 173 | 
 #endif /* ATTRIBUTE_NONNULL */ | 
 
 
 
 
 
 | 174 | 
  | 
 
 
 
 
 
 | 175 | 
 /* Attribute `returns_nonnull' was valid as of gcc 4.9.  */ | 
 
 
 
 
 
 | 176 | 
 #ifndef ATTRIBUTE_RETURNS_NONNULL | 
 
 
 
 
 
 | 177 | 
 # if (GCC_VERSION >= 4009) | 
 
 
 
 
 
 | 178 | 
 #  define ATTRIBUTE_RETURNS_NONNULL __attribute__ ((__returns_nonnull__)) | 
 
 
 
 
 
 | 179 | 
 # else | 
 
 
 
 
 
 | 180 | 
 #  define ATTRIBUTE_RETURNS_NONNULL | 
 
 
 
 
 
 | 181 | 
 # endif /* GNUC >= 4.9 */ | 
 
 
 
 
 
 | 182 | 
 #endif /* ATTRIBUTE_RETURNS_NONNULL */ | 
 
 
 
 
 
 | 183 | 
  | 
 
 
 
 
 
 | 184 | 
 /* Attribute `pure' was valid as of gcc 3.0.  */ | 
 
 
 
 
 
 | 185 | 
 #ifndef ATTRIBUTE_PURE | 
 
 
 
 
 
 | 186 | 
 # if (GCC_VERSION >= 3000) | 
 
 
 
 
 
 | 187 | 
 #  define ATTRIBUTE_PURE __attribute__ ((__pure__)) | 
 
 
 
 
 
 | 188 | 
 # else | 
 
 
 
 
 
 | 189 | 
 #  define ATTRIBUTE_PURE | 
 
 
 
 
 
 | 190 | 
 # endif /* GNUC >= 3.0 */ | 
 
 
 
 
 
 | 191 | 
 #endif /* ATTRIBUTE_PURE */ | 
 
 
 
 
 
 | 192 | 
  | 
 
 
 
 
 
 | 193 | 
 /* Use ATTRIBUTE_PRINTF when the format specifier must not be NULL. | 
 
 
 
 
 
 | 194 | 
    This was the case for the `printf' format attribute by itself | 
 
 
 
 
 
 | 195 | 
    before GCC 3.3, but as of 3.3 we need to add the `nonnull' | 
 
 
 
 
 
 | 196 | 
    attribute to retain this behavior.  */ | 
 
 
 
 
 
 | 197 | 
 #ifndef ATTRIBUTE_PRINTF | 
 
 
 
 
 
 | 198 | 
 #define ATTRIBUTE_PRINTF(m, n) __attribute__ ((__format__ (gnu_printf, m, n))) ATTRIBUTE_NONNULL(m) | 
 
 
 
 
 
 | 199 | 
 #define ATTRIBUTE_PRINTF_1 ATTRIBUTE_PRINTF(1, 2) | 
 
 
 
 
 
 | 200 | 
 #define ATTRIBUTE_PRINTF_2 ATTRIBUTE_PRINTF(2, 3) | 
 
 
 
 
 
 | 201 | 
 #define ATTRIBUTE_PRINTF_3 ATTRIBUTE_PRINTF(3, 4) | 
 
 
 
 
 
 | 202 | 
 #define ATTRIBUTE_PRINTF_4 ATTRIBUTE_PRINTF(4, 5) | 
 
 
 
 
 
 | 203 | 
 #define ATTRIBUTE_PRINTF_5 ATTRIBUTE_PRINTF(5, 6) | 
 
 
 
 
 
 | 204 | 
 #endif /* ATTRIBUTE_PRINTF */ | 
 
 
 
 
 
 | 205 | 
  | 
 
 
 
 
 
 | 206 | 
 /* Use ATTRIBUTE_FPTR_PRINTF when the format attribute is to be set on | 
 
 
 
 
 
 | 207 | 
    a function pointer.  Format attributes were allowed on function | 
 
 
 
 
 
 | 208 | 
    pointers as of gcc 3.1.  */ | 
 
 
 
 
 
 | 209 | 
 #ifndef ATTRIBUTE_FPTR_PRINTF | 
 
 
 
 
 
 | 210 | 
 # if (GCC_VERSION >= 3001) | 
 
 
 
 
 
 | 211 | 
 #  define ATTRIBUTE_FPTR_PRINTF(m, n) ATTRIBUTE_PRINTF(m, n) | 
 
 
 
 
 
 | 212 | 
 # else | 
 
 
 
 
 
 | 213 | 
 #  define ATTRIBUTE_FPTR_PRINTF(m, n) | 
 
 
 
 
 
 | 214 | 
 # endif /* GNUC >= 3.1 */ | 
 
 
 
 
 
 | 215 | 
 # define ATTRIBUTE_FPTR_PRINTF_1 ATTRIBUTE_FPTR_PRINTF(1, 2) | 
 
 
 
 
 
 | 216 | 
 # define ATTRIBUTE_FPTR_PRINTF_2 ATTRIBUTE_FPTR_PRINTF(2, 3) | 
 
 
 
 
 
 | 217 | 
 # define ATTRIBUTE_FPTR_PRINTF_3 ATTRIBUTE_FPTR_PRINTF(3, 4) | 
 
 
 
 
 
 | 218 | 
 # define ATTRIBUTE_FPTR_PRINTF_4 ATTRIBUTE_FPTR_PRINTF(4, 5) | 
 
 
 
 
 
 | 219 | 
 # define ATTRIBUTE_FPTR_PRINTF_5 ATTRIBUTE_FPTR_PRINTF(5, 6) | 
 
 
 
 
 
 | 220 | 
 #endif /* ATTRIBUTE_FPTR_PRINTF */ | 
 
 
 
 
 
 | 221 | 
  | 
 
 
 
 
 
 | 222 | 
 /* Use ATTRIBUTE_NULL_PRINTF when the format specifier may be NULL.  A | 
 
 
 
 
 
 | 223 | 
    NULL format specifier was allowed as of gcc 3.3.  */ | 
 
 
 
 
 
 | 224 | 
 #ifndef ATTRIBUTE_NULL_PRINTF | 
 
 
 
 
 
 | 225 | 
 # if (GCC_VERSION >= 3003) | 
 
 
 
 
 
 | 226 | 
 #  define ATTRIBUTE_NULL_PRINTF(m, n) __attribute__ ((__format__ (gnu_printf, m, n))) | 
 
 
 
 
 
 | 227 | 
 # else | 
 
 
 
 
 
 | 228 | 
 #  define ATTRIBUTE_NULL_PRINTF(m, n) | 
 
 
 
 
 
 | 229 | 
 # endif /* GNUC >= 3.3 */ | 
 
 
 
 
 
 | 230 | 
 # define ATTRIBUTE_NULL_PRINTF_1 ATTRIBUTE_NULL_PRINTF(1, 2) | 
 
 
 
 
 
 | 231 | 
 # define ATTRIBUTE_NULL_PRINTF_2 ATTRIBUTE_NULL_PRINTF(2, 3) | 
 
 
 
 
 
 | 232 | 
 # define ATTRIBUTE_NULL_PRINTF_3 ATTRIBUTE_NULL_PRINTF(3, 4) | 
 
 
 
 
 
 | 233 | 
 # define ATTRIBUTE_NULL_PRINTF_4 ATTRIBUTE_NULL_PRINTF(4, 5) | 
 
 
 
 
 
 | 234 | 
 # define ATTRIBUTE_NULL_PRINTF_5 ATTRIBUTE_NULL_PRINTF(5, 6) | 
 
 
 
 
 
 | 235 | 
 #endif /* ATTRIBUTE_NULL_PRINTF */ | 
 
 
 
 
 
 | 236 | 
  | 
 
 
 
 
 
 | 237 | 
 /* Attribute `sentinel' was valid as of gcc 3.5.  */ | 
 
 
 
 
 
 | 238 | 
 #ifndef ATTRIBUTE_SENTINEL | 
 
 
 
 
 
 | 239 | 
 # if (GCC_VERSION >= 3005) | 
 
 
 
 
 
 | 240 | 
 #  define ATTRIBUTE_SENTINEL __attribute__ ((__sentinel__)) | 
 
 
 
 
 
 | 241 | 
 # else | 
 
 
 
 
 
 | 242 | 
 #  define ATTRIBUTE_SENTINEL | 
 
 
 
 
 
 | 243 | 
 # endif /* GNUC >= 3.5 */ | 
 
 
 
 
 
 | 244 | 
 #endif /* ATTRIBUTE_SENTINEL */ | 
 
 
 
 
 
 | 245 | 
  | 
 
 
 
 
 
 | 246 | 
  | 
 
 
 
 
 
 | 247 | 
 #ifndef ATTRIBUTE_ALIGNED_ALIGNOF | 
 
 
 
 
 
 | 248 | 
 # if (GCC_VERSION >= 3000) | 
 
 
 
 
 
 | 249 | 
 #  define ATTRIBUTE_ALIGNED_ALIGNOF(m) __attribute__ ((__aligned__ (__alignof__ (m)))) | 
 
 
 
 
 
 | 250 | 
 # else | 
 
 
 
 
 
 | 251 | 
 #  define ATTRIBUTE_ALIGNED_ALIGNOF(m) | 
 
 
 
 
 
 | 252 | 
 # endif /* GNUC >= 3.0 */ | 
 
 
 
 
 
 | 253 | 
 #endif /* ATTRIBUTE_ALIGNED_ALIGNOF */ | 
 
 
 
 
 
 | 254 | 
  | 
 
 
 
 
 
 | 255 | 
 /* Useful for structures whose layout must match some binary specification | 
 
 
 
 
 
 | 256 | 
    regardless of the alignment and padding qualities of the compiler.  */ | 
 
 
 
 
 
 | 257 | 
 #ifndef ATTRIBUTE_PACKED | 
 
 
 
 
 
 | 258 | 
 # define ATTRIBUTE_PACKED __attribute__ ((packed)) | 
 
 
 
 
 
 | 259 | 
 #endif | 
 
 
 
 
 
 | 260 | 
  | 
 
 
 
 
 
 | 261 | 
 /* Attribute `hot' and `cold' was valid as of gcc 4.3.  */ | 
 
 
 
 
 
 | 262 | 
 #ifndef ATTRIBUTE_COLD | 
 
 
 
 
 
 | 263 | 
 # if (GCC_VERSION >= 4003) | 
 
 
 
 
 
 | 264 | 
 #  define ATTRIBUTE_COLD __attribute__ ((__cold__)) | 
 
 
 
 
 
 | 265 | 
 # else | 
 
 
 
 
 
 | 266 | 
 #  define ATTRIBUTE_COLD | 
 
 
 
 
 
 | 267 | 
 # endif /* GNUC >= 4.3 */ | 
 
 
 
 
 
 | 268 | 
 #endif /* ATTRIBUTE_COLD */ | 
 
 
 
 
 
 | 269 | 
 #ifndef ATTRIBUTE_HOT | 
 
 
 
 
 
 | 270 | 
 # if (GCC_VERSION >= 4003) | 
 
 
 
 
 
 | 271 | 
 #  define ATTRIBUTE_HOT __attribute__ ((__hot__)) | 
 
 
 
 
 
 | 272 | 
 # else | 
 
 
 
 
 
 | 273 | 
 #  define ATTRIBUTE_HOT | 
 
 
 
 
 
 | 274 | 
 # endif /* GNUC >= 4.3 */ | 
 
 
 
 
 
 | 275 | 
 #endif /* ATTRIBUTE_HOT */ | 
 
 
 
 
 
 | 276 | 
  | 
 
 
 
 
 
 | 277 | 
 /* Attribute 'no_sanitize_undefined' was valid as of gcc 4.9.  */ | 
 
 
 
 
 
 | 278 | 
 #ifndef ATTRIBUTE_NO_SANITIZE_UNDEFINED | 
 
 
 
 
 
 | 279 | 
 # if (GCC_VERSION >= 4009) | 
 
 
 
 
 
 | 280 | 
 #  define ATTRIBUTE_NO_SANITIZE_UNDEFINED __attribute__ ((no_sanitize_undefined)) | 
 
 
 
 
 
 | 281 | 
 # else | 
 
 
 
 
 
 | 282 | 
 #  define ATTRIBUTE_NO_SANITIZE_UNDEFINED | 
 
 
 
 
 
 | 283 | 
 # endif /* GNUC >= 4.9 */ | 
 
 
 
 
 
 | 284 | 
 #endif /* ATTRIBUTE_NO_SANITIZE_UNDEFINED */ | 
 
 
 
 
 
 | 285 | 
  | 
 
 
 
 
 
 | 286 | 
 /* Attribute 'nonstring' was valid as of gcc 8.  */ | 
 
 
 
 
 
 | 287 | 
 #ifndef ATTRIBUTE_NONSTRING | 
 
 
 
 
 
 | 288 | 
 # if GCC_VERSION >= 8000 | 
 
 
 
 
 
 | 289 | 
 #  define ATTRIBUTE_NONSTRING __attribute__ ((__nonstring__)) | 
 
 
 
 
 
 | 290 | 
 # else | 
 
 
 
 
 
 | 291 | 
 #  define ATTRIBUTE_NONSTRING | 
 
 
 
 
 
 | 292 | 
 # endif | 
 
 
 
 
 
 | 293 | 
 #endif | 
 
 
 
 
 
 | 294 | 
  | 
 
 
 
 
 
 | 295 | 
 /* Attribute `alloc_size' was valid as of gcc 4.3.  */ | 
 
 
 
 
 
 | 296 | 
 #ifndef ATTRIBUTE_RESULT_SIZE_1 | 
 
 
 
 
 
 | 297 | 
 # if (GCC_VERSION >= 4003) | 
 
 
 
 
 
 | 298 | 
 #  define ATTRIBUTE_RESULT_SIZE_1 __attribute__ ((alloc_size (1))) | 
 
 
 
 
 
 | 299 | 
 # else | 
 
 
 
 
 
 | 300 | 
 #  define ATTRIBUTE_RESULT_SIZE_1 | 
 
 
 
 
 
 | 301 | 
 #endif | 
 
 
 
 
 
 | 302 | 
 #endif | 
 
 
 
 
 
 | 303 | 
  | 
 
 
 
 
 
 | 304 | 
 #ifndef ATTRIBUTE_RESULT_SIZE_2 | 
 
 
 
 
 
 | 305 | 
 # if (GCC_VERSION >= 4003) | 
 
 
 
 
 
 | 306 | 
 #  define ATTRIBUTE_RESULT_SIZE_2 __attribute__ ((alloc_size (2))) | 
 
 
 
 
 
 | 307 | 
 # else | 
 
 
 
 
 
 | 308 | 
 #  define ATTRIBUTE_RESULT_SIZE_2 | 
 
 
 
 
 
 | 309 | 
 #endif | 
 
 
 
 
 
 | 310 | 
 #endif | 
 
 
 
 
 
 | 311 | 
  | 
 
 
 
 
 
 | 312 | 
 #ifndef ATTRIBUTE_RESULT_SIZE_1_2 | 
 
 
 
 
 
 | 313 | 
 # if (GCC_VERSION >= 4003) | 
 
 
 
 
 
 | 314 | 
 #  define ATTRIBUTE_RESULT_SIZE_1_2 __attribute__ ((alloc_size (1, 2))) | 
 
 
 
 
 
 | 315 | 
 # else | 
 
 
 
 
 
 | 316 | 
 #  define ATTRIBUTE_RESULT_SIZE_1_2 | 
 
 
 
 
 
 | 317 | 
 #endif | 
 
 
 
 
 
 | 318 | 
 #endif | 
 
 
 
 
 
 | 319 | 
  | 
 
 
 
 
 
 | 320 | 
 /* Attribute `warn_unused_result' was valid as of gcc 3.3.  */ | 
 
 
 
 
 
 | 321 | 
 #ifndef ATTRIBUTE_WARN_UNUSED_RESULT | 
 
 
 
 
 
 | 322 | 
 # if GCC_VERSION >= 3003 | 
 
 
 
 
 
 | 323 | 
 #  define ATTRIBUTE_WARN_UNUSED_RESULT __attribute__ ((warn_unused_result)) | 
 
 
 
 
 
 | 324 | 
 # else | 
 
 
 
 
 
 | 325 | 
 #  define ATTRIBUTE_WARN_UNUSED_RESULT | 
 
 
 
 
 
 | 326 | 
 # endif | 
 
 
 
 
 
 | 327 | 
 #endif | 
 
 
 
 
 
 | 328 | 
  | 
 
 
 
 
 
 | 329 | 
 /* We use __extension__ in some places to suppress -pedantic warnings | 
 
 
 
 
 
 | 330 | 
    about GCC extensions.  This feature didn't work properly before | 
 
 
 
 
 
 | 331 | 
    gcc 2.8.  */ | 
 
 
 
 
 
 | 332 | 
 #if GCC_VERSION < 2008 | 
 
 
 
 
 
 | 333 | 
 #define __extension__ | 
 
 
 
 
 
 | 334 | 
 #endif | 
 
 
 
 
 
 | 335 | 
  | 
 
 
 
 
 
 | 336 | 
 /* This is used to declare a const variable which should be visible | 
 
 
 
 
 
 | 337 | 
    outside of the current compilation unit.  Use it as | 
 
 
 
 
 
 | 338 | 
      EXPORTED_CONST int i = 1; | 
 
 
 
 
 
 | 339 | 
    This is because the semantics of const are different in C and C++. | 
 
 
 
 
 
 | 340 | 
    "extern const" is permitted in C but it looks strange, and gcc | 
 
 
 
 
 
 | 341 | 
    warns about it when -Wc++-compat is not used.  */ | 
 
 
 
 
 
 | 342 | 
 #ifdef __cplusplus | 
 
 
 
 
 
 | 343 | 
 #define EXPORTED_CONST extern const | 
 
 
 
 
 
 | 344 | 
 #else | 
 
 
 
 
 
 | 345 | 
 #define EXPORTED_CONST const | 
 
 
 
 
 
 | 346 | 
 #endif | 
 
 
 
 
 
 | 347 | 
  | 
 
 
 
 
 
 | 348 | 
 /* Be conservative and only use enum bitfields with C++ or GCC. | 
 
 
 
 
 
 | 349 | 
    FIXME: provide a complete autoconf test for buggy enum bitfields.  */ | 
 
 
 
 
 
 | 350 | 
  | 
 
 
 
 
 
 | 351 | 
 #ifdef __cplusplus | 
 
 
 
 
 
 | 352 | 
 #define ENUM_BITFIELD(TYPE) enum TYPE | 
 
 
 
 
 
 | 353 | 
 #elif (GCC_VERSION > 2000) | 
 
 
 
 
 
 | 354 | 
 #define ENUM_BITFIELD(TYPE) __extension__ enum TYPE | 
 
 
 
 
 
 | 355 | 
 #else | 
 
 
 
 
 
 | 356 | 
 #define ENUM_BITFIELD(TYPE) unsigned int | 
 
 
 
 
 
 | 357 | 
 #endif | 
 
 
 
 
 
 | 358 | 
  | 
 
 
 
 
 
 | 359 | 
 #if __cpp_constexpr >= 200704 | 
 
 
 
 
 
 | 360 | 
 #define CONSTEXPR constexpr | 
 
 
 
 
 
 | 361 | 
 #else | 
 
 
 
 
 
 | 362 | 
 #define CONSTEXPR | 
 
 
 
 
 
 | 363 | 
 #endif | 
 
 
 
 
 
 | 364 | 
  | 
 
 
 
 
 
 | 365 | 
 /* C++11 adds the ability to add "override" after an implementation of a | 
 
 
 
 
 
 | 366 | 
    virtual function in a subclass, to: | 
 
 
 
 
 
 | 367 | 
      (A) document that this is an override of a virtual function | 
 
 
 
 
 
 | 368 | 
      (B) allow the compiler to issue a warning if it isn't (e.g. a mismatch | 
 
 
 
 
 
 | 369 | 
          of the type signature). | 
 
 
 
 
 
 | 370 | 
  | 
 
 
 
 
 
 | 371 | 
    Similarly, it allows us to add a "final" to indicate that no subclass | 
 
 
 
 
 
 | 372 | 
    may subsequently override the vfunc. | 
 
 
 
 
 
 | 373 | 
  | 
 
 
 
 
 
 | 374 | 
    Provide OVERRIDE and FINAL as macros, allowing us to get these benefits | 
 
 
 
 
 
 | 375 | 
    when compiling with C++11 support, but without requiring C++11. | 
 
 
 
 
 
 | 376 | 
  | 
 
 
 
 
 
 | 377 | 
    For gcc, use "-std=c++11" to enable C++11 support; gcc 6 onwards enables | 
 
 
 
 
 
 | 378 | 
    this by default (actually GNU++14).  */ | 
 
 
 
 
 
 | 379 | 
  | 
 
 
 
 
 
 | 380 | 
 #if defined __cplusplus | 
 
 
 
 
 
 | 381 | 
 # if __cplusplus >= 201103 | 
 
 
 
 
 
 | 382 | 
    /* C++11 claims to be available: use it.  Final/override were only | 
 
 
 
 
 
 | 383 | 
       implemented in 4.7, though.  */ | 
 
 
 
 
 
 | 384 | 
 #  if GCC_VERSION < 4007 | 
 
 
 
 
 
 | 385 | 
 #   define OVERRIDE | 
 
 
 
 
 
 | 386 | 
 #   define FINAL | 
 
 
 
 
 
 | 387 | 
 #  else | 
 
 
 
 
 
 | 388 | 
 #   define OVERRIDE override | 
 
 
 
 
 
 | 389 | 
 #   define FINAL final | 
 
 
 
 
 
 | 390 | 
 #  endif | 
 
 
 
 
 
 | 391 | 
 # elif GCC_VERSION >= 4007 | 
 
 
 
 
 
 | 392 | 
    /* G++ 4.7 supports __final in C++98.  */ | 
 
 
 
 
 
 | 393 | 
 #  define OVERRIDE | 
 
 
 
 
 
 | 394 | 
 #  define FINAL __final | 
 
 
 
 
 
 | 395 | 
 # else | 
 
 
 
 
 
 | 396 | 
    /* No C++11 support; leave the macros empty.  */ | 
 
 
 
 
 
 | 397 | 
 #  define OVERRIDE | 
 
 
 
 
 
 | 398 | 
 #  define FINAL | 
 
 
 
 
 
 | 399 | 
 # endif | 
 
 
 
 
 
 | 400 | 
 #else | 
 
 
 
 
 
 | 401 | 
   /* No C++11 support; leave the macros empty.  */ | 
 
 
 
 
 
 | 402 | 
 # define OVERRIDE | 
 
 
 
 
 
 | 403 | 
 # define FINAL | 
 
 
 
 
 
 | 404 | 
 #endif | 
 
 
 
 
 
 | 405 | 
  | 
 
 
 
 
 
 | 406 | 
 /* A macro to disable the copy constructor and assignment operator. | 
 
 
 
 
 
 | 407 | 
    When building with C++11 and above, the methods are explicitly | 
 
 
 
 
 
 | 408 | 
    deleted, causing a compile-time error if something tries to copy. | 
 
 
 
 
 
 | 409 | 
    For C++03, this just declares the methods, causing a link-time | 
 
 
 
 
 
 | 410 | 
    error if the methods end up called (assuming you don't | 
 
 
 
 
 
 | 411 | 
    define them).  For C++03, for best results, place the macro | 
 
 
 
 
 
 | 412 | 
    under the private: access specifier, like this, | 
 
 
 
 
 
 | 413 | 
  | 
 
 
 
 
 
 | 414 | 
    class name_lookup | 
 
 
 
 
 
 | 415 | 
    { | 
 
 
 
 
 
 | 416 | 
      private: | 
 
 
 
 
 
 | 417 | 
        DISABLE_COPY_AND_ASSIGN (name_lookup); | 
 
 
 
 
 
 | 418 | 
    }; | 
 
 
 
 
 
 | 419 | 
  | 
 
 
 
 
 
 | 420 | 
    so that most attempts at copy are caught at compile-time.  */ | 
 
 
 
 
 
 | 421 | 
  | 
 
 
 
 
 
 | 422 | 
 #if __cplusplus >= 201103 | 
 
 
 
 
 
 | 423 | 
 #define DISABLE_COPY_AND_ASSIGN(TYPE)           \ | 
 
 
 
 
 
 | 424 | 
   TYPE (const TYPE&) = delete;                  \ | 
 
 
 
 
 
 | 425 | 
   void operator= (const TYPE &) = delete | 
 
 
 
 
 
 | 426 | 
   #else | 
 
 
 
 
 
 | 427 | 
 #define DISABLE_COPY_AND_ASSIGN(TYPE)           \ | 
 
 
 
 
 
 | 428 | 
   TYPE (const TYPE&);                           \ | 
 
 
 
 
 
 | 429 | 
   void operator= (const TYPE &) | 
 
 
 
 
 
 | 430 | 
 #endif /* __cplusplus >= 201103 */ | 
 
 
 
 
 
 | 431 | 
  | 
 
 
 
 
 
 | 432 | 
 #ifdef __cplusplus | 
 
 
 
 
 
 | 433 | 
 } | 
 
 
 
 
 
 | 434 | 
 #endif | 
 
 
 
 
 
 | 435 | 
  | 
 
 
 
 
 
 | 436 | 
 #endif  /* ansidecl.h   */ |