summaryrefslogtreecommitdiff
path: root/lib/unistring/cdefs.h
blob: 91e329261c43878524f97f5a8b6a3fc268980893 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
/* Common macro definitions for C include files.
   Copyright (C) 2008-2021 Free Software Foundation, Inc.

   This program is free software: you can redistribute it and/or modify it
   under the terms of the GNU Lesser General Public License as published
   by the Free Software Foundation; either version 3 of the License, or
   (at your option) any later version.

   This program is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
   Lesser General Public License for more details.

   You should have received a copy of the GNU Lesser General Public License
   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */

#ifndef _UNISTRING_CDEFS_H
#define _UNISTRING_CDEFS_H

/* _GL_UNUSED_PARAMETER is a marker that can be prepended to function parameter
   declarations for parameters that are not used.  This helps to reduce
   warnings, such as from GCC -Wunused-parameter.  The syntax is as follows:
       _GL_UNUSED_PARAMETER type param
   or more generally
       _GL_UNUSED_PARAMETER param_decl
   For example:
       _GL_UNUSED_PARAMETER int param
       _GL_UNUSED_PARAMETER int *(*param) (void)
 */
#ifndef _GL_UNUSED_PARAMETER
# define _GL_UNUSED_PARAMETER _UC_ATTRIBUTE_MAYBE_UNUSED
#endif

#ifndef _GL_ATTRIBUTE_MALLOC
# define _GL_ATTRIBUTE_MALLOC _UC_ATTRIBUTE_MALLOC
#endif

/* _GL_ATTRIBUTE_DEALLOC (F, I) is for functions returning pointers
   that can be freed by passing them as the Ith argument to the
   function F.  _UC_ATTRIBUTE_DEALLOC_FREE is for functions that
   return pointers that can be freed via 'free'; it can be used
   only after including stdlib.h.  These macros cannot be used on
   inline functions.  */
#ifndef _GL_ATTRIBUTE_DEALLOC
# define _GL_ATTRIBUTE_DEALLOC _UC_ATTRIBUTE_DEALLOC
#endif
#ifndef _GL_ATTRIBUTE_DEALLOC_FREE
# define _GL_ATTRIBUTE_DEALLOC_FREE _UC_ATTRIBUTE_DEALLOC_FREE
#endif

/* The definitions below are taken from gnulib/m4/gnulib-common.m4,
   with prefix _UC instead of prefix _GL.  */

/* True if the compiler says it groks GNU C version MAJOR.MINOR.  */
#if defined __GNUC__ && defined __GNUC_MINOR__
# define _UC_GNUC_PREREQ(major, minor) \
    ((major) < __GNUC__ + ((minor) <= __GNUC_MINOR__))
#else
# define _UC_GNUC_PREREQ(major, minor) 0
#endif

#if (defined __has_attribute \
     && (!defined __clang_minor__ \
         || 3 < __clang_major__ + (5 <= __clang_minor__)))
# define _UC_HAS_ATTRIBUTE(attr) __has_attribute (__##attr##__)
#else
# define _UC_HAS_ATTRIBUTE(attr) _UC_ATTR_##attr
# define _UC_ATTR_malloc _UC_GNUC_PREREQ (3, 0)
# define _UC_ATTR_unused _UC_GNUC_PREREQ (2, 7)
#endif

#ifdef __has_c_attribute
# define _UC_HAS_C_ATTRIBUTE(attr) __has_c_attribute (__##attr##__)
#else
# define _UC_HAS_C_ATTRIBUTE(attr) 0
#endif

#if _UC_GNUC_PREREQ (11, 0)
# define _UC_ATTRIBUTE_DEALLOC(f, i) __attribute__ ((__malloc__ (f, i)))
#else
# define _UC_ATTRIBUTE_DEALLOC(f, i)
#endif
#define _UC_ATTRIBUTE_DEALLOC_FREE _UC_ATTRIBUTE_DEALLOC (free, 1)

#if _UC_HAS_ATTRIBUTE (malloc)
# define _UC_ATTRIBUTE_MALLOC __attribute__ ((__malloc__))
#else
# define _UC_ATTRIBUTE_MALLOC
#endif

#if _UC_HAS_C_ATTRIBUTE (maybe_unused)
# define _UC_ATTRIBUTE_MAYBE_UNUSED [[__maybe_unused__]]
#else
# define _UC_ATTRIBUTE_MAYBE_UNUSED _UC_ATTRIBUTE_UNUSED
#endif

#if _UC_HAS_ATTRIBUTE (unused)
# define _UC_ATTRIBUTE_UNUSED __attribute__ ((__unused__))
#else
# define _UC_ATTRIBUTE_UNUSED
#endif

#endif /* _UNISTRING_CDEFS_H */