Sun, 22 Dec 2024 22:10:04 +0100
don't trust that size_t always has word width
it should be the case on all platforms supported by UCX, but it's not strictly defined in POSIX that it must be the case
483
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
1 | /* |
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
2 | * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. |
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
3 | * |
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
4 | * Copyright 2021 Mike Becker, Olaf Wintermann All rights reserved. |
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
5 | * |
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
6 | * Redistribution and use in source and binary forms, with or without |
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
7 | * modification, are permitted provided that the following conditions are met: |
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
8 | * |
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
9 | * 1. Redistributions of source code must retain the above copyright |
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
10 | * notice, this list of conditions and the following disclaimer. |
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
11 | * |
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
12 | * 2. Redistributions in binary form must reproduce the above copyright |
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
13 | * notice, this list of conditions and the following disclaimer in the |
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
14 | * documentation and/or other materials provided with the distribution. |
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
15 | * |
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
16 | * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" |
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
17 | * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
18 | * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
19 | * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE |
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
20 | * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR |
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
21 | * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF |
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
22 | * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS |
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
23 | * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN |
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
24 | * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) |
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
25 | * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE |
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
26 | * POSSIBILITY OF SUCH DAMAGE. |
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
27 | */ |
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
28 | |
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
29 | /** |
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
30 | * \file common.h |
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
31 | * |
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
32 | * \brief Common definitions and feature checks. |
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
33 | * |
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
34 | * \author Mike Becker |
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
35 | * \author Olaf Wintermann |
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
36 | * \copyright 2-Clause BSD License |
485
6a86ad3d8c03
use same doxygen style in all files
Mike Becker <universe@uap-core.de>
parents:
484
diff
changeset
|
37 | * |
6a86ad3d8c03
use same doxygen style in all files
Mike Becker <universe@uap-core.de>
parents:
484
diff
changeset
|
38 | * \mainpage UAP Common Extensions |
6a86ad3d8c03
use same doxygen style in all files
Mike Becker <universe@uap-core.de>
parents:
484
diff
changeset
|
39 | * Library with common and useful functions, macros and data structures. |
6a86ad3d8c03
use same doxygen style in all files
Mike Becker <universe@uap-core.de>
parents:
484
diff
changeset
|
40 | * <p> |
6a86ad3d8c03
use same doxygen style in all files
Mike Becker <universe@uap-core.de>
parents:
484
diff
changeset
|
41 | * Latest available source:<br> |
6a86ad3d8c03
use same doxygen style in all files
Mike Becker <universe@uap-core.de>
parents:
484
diff
changeset
|
42 | * <a href="https://sourceforge.net/projects/ucx/files/">https://sourceforge.net/projects/ucx/files/</a> |
6a86ad3d8c03
use same doxygen style in all files
Mike Becker <universe@uap-core.de>
parents:
484
diff
changeset
|
43 | * </p> |
6a86ad3d8c03
use same doxygen style in all files
Mike Becker <universe@uap-core.de>
parents:
484
diff
changeset
|
44 | * |
6a86ad3d8c03
use same doxygen style in all files
Mike Becker <universe@uap-core.de>
parents:
484
diff
changeset
|
45 | * <p> |
6a86ad3d8c03
use same doxygen style in all files
Mike Becker <universe@uap-core.de>
parents:
484
diff
changeset
|
46 | * Repositories:<br> |
6a86ad3d8c03
use same doxygen style in all files
Mike Becker <universe@uap-core.de>
parents:
484
diff
changeset
|
47 | * <a href="https://sourceforge.net/p/ucx/code">https://sourceforge.net/p/ucx/code</a> |
6a86ad3d8c03
use same doxygen style in all files
Mike Becker <universe@uap-core.de>
parents:
484
diff
changeset
|
48 | * - or - |
6a86ad3d8c03
use same doxygen style in all files
Mike Becker <universe@uap-core.de>
parents:
484
diff
changeset
|
49 | * <a href="https://develop.uap-core.de/hg/ucx">https://develop.uap-core.de/hg/ucx</a> |
6a86ad3d8c03
use same doxygen style in all files
Mike Becker <universe@uap-core.de>
parents:
484
diff
changeset
|
50 | * </p> |
6a86ad3d8c03
use same doxygen style in all files
Mike Becker <universe@uap-core.de>
parents:
484
diff
changeset
|
51 | * |
6a86ad3d8c03
use same doxygen style in all files
Mike Becker <universe@uap-core.de>
parents:
484
diff
changeset
|
52 | * <h2>LICENCE</h2> |
6a86ad3d8c03
use same doxygen style in all files
Mike Becker <universe@uap-core.de>
parents:
484
diff
changeset
|
53 | * |
6a86ad3d8c03
use same doxygen style in all files
Mike Becker <universe@uap-core.de>
parents:
484
diff
changeset
|
54 | * Copyright 2021 Mike Becker, Olaf Wintermann All rights reserved. |
6a86ad3d8c03
use same doxygen style in all files
Mike Becker <universe@uap-core.de>
parents:
484
diff
changeset
|
55 | * |
6a86ad3d8c03
use same doxygen style in all files
Mike Becker <universe@uap-core.de>
parents:
484
diff
changeset
|
56 | * Redistribution and use in source and binary forms, with or without |
6a86ad3d8c03
use same doxygen style in all files
Mike Becker <universe@uap-core.de>
parents:
484
diff
changeset
|
57 | * modification, are permitted provided that the following conditions are met: |
6a86ad3d8c03
use same doxygen style in all files
Mike Becker <universe@uap-core.de>
parents:
484
diff
changeset
|
58 | * |
6a86ad3d8c03
use same doxygen style in all files
Mike Becker <universe@uap-core.de>
parents:
484
diff
changeset
|
59 | * 1. Redistributions of source code must retain the above copyright |
6a86ad3d8c03
use same doxygen style in all files
Mike Becker <universe@uap-core.de>
parents:
484
diff
changeset
|
60 | * notice, this list of conditions and the following disclaimer. |
6a86ad3d8c03
use same doxygen style in all files
Mike Becker <universe@uap-core.de>
parents:
484
diff
changeset
|
61 | * |
6a86ad3d8c03
use same doxygen style in all files
Mike Becker <universe@uap-core.de>
parents:
484
diff
changeset
|
62 | * 2. Redistributions in binary form must reproduce the above copyright |
6a86ad3d8c03
use same doxygen style in all files
Mike Becker <universe@uap-core.de>
parents:
484
diff
changeset
|
63 | * notice, this list of conditions and the following disclaimer in the |
6a86ad3d8c03
use same doxygen style in all files
Mike Becker <universe@uap-core.de>
parents:
484
diff
changeset
|
64 | * documentation and/or other materials provided with the distribution. |
6a86ad3d8c03
use same doxygen style in all files
Mike Becker <universe@uap-core.de>
parents:
484
diff
changeset
|
65 | * |
6a86ad3d8c03
use same doxygen style in all files
Mike Becker <universe@uap-core.de>
parents:
484
diff
changeset
|
66 | * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" |
6a86ad3d8c03
use same doxygen style in all files
Mike Becker <universe@uap-core.de>
parents:
484
diff
changeset
|
67 | * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
6a86ad3d8c03
use same doxygen style in all files
Mike Becker <universe@uap-core.de>
parents:
484
diff
changeset
|
68 | * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
6a86ad3d8c03
use same doxygen style in all files
Mike Becker <universe@uap-core.de>
parents:
484
diff
changeset
|
69 | * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE |
6a86ad3d8c03
use same doxygen style in all files
Mike Becker <universe@uap-core.de>
parents:
484
diff
changeset
|
70 | * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR |
6a86ad3d8c03
use same doxygen style in all files
Mike Becker <universe@uap-core.de>
parents:
484
diff
changeset
|
71 | * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF |
6a86ad3d8c03
use same doxygen style in all files
Mike Becker <universe@uap-core.de>
parents:
484
diff
changeset
|
72 | * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS |
6a86ad3d8c03
use same doxygen style in all files
Mike Becker <universe@uap-core.de>
parents:
484
diff
changeset
|
73 | * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN |
6a86ad3d8c03
use same doxygen style in all files
Mike Becker <universe@uap-core.de>
parents:
484
diff
changeset
|
74 | * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) |
6a86ad3d8c03
use same doxygen style in all files
Mike Becker <universe@uap-core.de>
parents:
484
diff
changeset
|
75 | * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE |
6a86ad3d8c03
use same doxygen style in all files
Mike Becker <universe@uap-core.de>
parents:
484
diff
changeset
|
76 | * POSSIBILITY OF SUCH DAMAGE. |
483
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
77 | */ |
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
78 | |
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
79 | #ifndef UCX_COMMON_H |
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
80 | #define UCX_COMMON_H |
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
81 | |
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
82 | /** Major UCX version as integer constant. */ |
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
83 | #define UCX_VERSION_MAJOR 3 |
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
84 | |
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
85 | /** Minor UCX version as integer constant. */ |
759
475335643af4
increase version number to 3.1
Mike Becker <universe@uap-core.de>
parents:
682
diff
changeset
|
86 | #define UCX_VERSION_MINOR 1 |
483
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
87 | |
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
88 | /** Version constant which ensures to increase monotonically. */ |
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
89 | #define UCX_VERSION (((UCX_VERSION_MAJOR)<<16)|UCX_VERSION_MINOR) |
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
90 | |
985
68754c7de906
major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents:
970
diff
changeset
|
91 | // --------------------------------------------------------------------------- |
68754c7de906
major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents:
970
diff
changeset
|
92 | // Common includes |
68754c7de906
major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents:
970
diff
changeset
|
93 | // --------------------------------------------------------------------------- |
682
34120a385fc8
work around some MSC problems
Mike Becker <universe@uap-core.de>
parents:
674
diff
changeset
|
94 | |
484
9e6900b1cf9d
add common.h include to all other header files
Mike Becker <universe@uap-core.de>
parents:
483
diff
changeset
|
95 | #include <stdlib.h> |
9e6900b1cf9d
add common.h include to all other header files
Mike Becker <universe@uap-core.de>
parents:
483
diff
changeset
|
96 | #include <stddef.h> |
487
4bd19279778c
use c99 bool + add test for low level find
Mike Becker <universe@uap-core.de>
parents:
485
diff
changeset
|
97 | #include <stdbool.h> |
650
77021e06b1a8
fix code not compiling under windows+mingw
Mike Becker <universe@uap-core.de>
parents:
628
diff
changeset
|
98 | #include <stdint.h> |
1016
fe177d6dabb8
add sys/types.h to the common includes to fix a problem with ssize_t
Mike Becker <universe@uap-core.de>
parents:
988
diff
changeset
|
99 | #include <sys/types.h> |
483
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
100 | |
985
68754c7de906
major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents:
970
diff
changeset
|
101 | // --------------------------------------------------------------------------- |
1018
c773da859bad
fix compilation for compilers which don't set __WORDSIZE
Mike Becker <universe@uap-core.de>
parents:
1016
diff
changeset
|
102 | // Architecture Detection |
c773da859bad
fix compilation for compilers which don't set __WORDSIZE
Mike Becker <universe@uap-core.de>
parents:
1016
diff
changeset
|
103 | // --------------------------------------------------------------------------- |
c773da859bad
fix compilation for compilers which don't set __WORDSIZE
Mike Becker <universe@uap-core.de>
parents:
1016
diff
changeset
|
104 | |
c773da859bad
fix compilation for compilers which don't set __WORDSIZE
Mike Becker <universe@uap-core.de>
parents:
1016
diff
changeset
|
105 | #if INTPTR_MAX == INT64_MAX |
1034
424b5b74a68f
add missing documentation of CX_WORDSIZE
Mike Becker <universe@uap-core.de>
parents:
1018
diff
changeset
|
106 | /** |
424b5b74a68f
add missing documentation of CX_WORDSIZE
Mike Becker <universe@uap-core.de>
parents:
1018
diff
changeset
|
107 | * The address width in bits on this platform. |
424b5b74a68f
add missing documentation of CX_WORDSIZE
Mike Becker <universe@uap-core.de>
parents:
1018
diff
changeset
|
108 | */ |
1018
c773da859bad
fix compilation for compilers which don't set __WORDSIZE
Mike Becker <universe@uap-core.de>
parents:
1016
diff
changeset
|
109 | #define CX_WORDSIZE 64 |
c773da859bad
fix compilation for compilers which don't set __WORDSIZE
Mike Becker <universe@uap-core.de>
parents:
1016
diff
changeset
|
110 | #elif INTPTR_MAX == INT32_MAX |
1034
424b5b74a68f
add missing documentation of CX_WORDSIZE
Mike Becker <universe@uap-core.de>
parents:
1018
diff
changeset
|
111 | /** |
424b5b74a68f
add missing documentation of CX_WORDSIZE
Mike Becker <universe@uap-core.de>
parents:
1018
diff
changeset
|
112 | * The address width in bits on this platform. |
424b5b74a68f
add missing documentation of CX_WORDSIZE
Mike Becker <universe@uap-core.de>
parents:
1018
diff
changeset
|
113 | */ |
1018
c773da859bad
fix compilation for compilers which don't set __WORDSIZE
Mike Becker <universe@uap-core.de>
parents:
1016
diff
changeset
|
114 | #define CX_WORDSIZE 32 |
c773da859bad
fix compilation for compilers which don't set __WORDSIZE
Mike Becker <universe@uap-core.de>
parents:
1016
diff
changeset
|
115 | #else |
c773da859bad
fix compilation for compilers which don't set __WORDSIZE
Mike Becker <universe@uap-core.de>
parents:
1016
diff
changeset
|
116 | #error Unknown pointer size or missing size macros! |
c773da859bad
fix compilation for compilers which don't set __WORDSIZE
Mike Becker <universe@uap-core.de>
parents:
1016
diff
changeset
|
117 | #endif |
c773da859bad
fix compilation for compilers which don't set __WORDSIZE
Mike Becker <universe@uap-core.de>
parents:
1016
diff
changeset
|
118 | |
c773da859bad
fix compilation for compilers which don't set __WORDSIZE
Mike Becker <universe@uap-core.de>
parents:
1016
diff
changeset
|
119 | // --------------------------------------------------------------------------- |
985
68754c7de906
major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents:
970
diff
changeset
|
120 | // Attribute definitions |
68754c7de906
major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents:
970
diff
changeset
|
121 | // --------------------------------------------------------------------------- |
68754c7de906
major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents:
970
diff
changeset
|
122 | |
68754c7de906
major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents:
970
diff
changeset
|
123 | #ifndef __GNUC__ |
68754c7de906
major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents:
970
diff
changeset
|
124 | /** |
68754c7de906
major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents:
970
diff
changeset
|
125 | * Removes GNU C attributes where they are not supported. |
68754c7de906
major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents:
970
diff
changeset
|
126 | */ |
68754c7de906
major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents:
970
diff
changeset
|
127 | #define __attribute__(x) |
68754c7de906
major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents:
970
diff
changeset
|
128 | #endif |
68754c7de906
major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents:
970
diff
changeset
|
129 | |
68754c7de906
major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents:
970
diff
changeset
|
130 | /** |
68754c7de906
major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents:
970
diff
changeset
|
131 | * All pointer arguments must be non-NULL. |
68754c7de906
major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents:
970
diff
changeset
|
132 | */ |
68754c7de906
major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents:
970
diff
changeset
|
133 | #define cx_attr_nonnull __attribute__((__nonnull__)) |
68754c7de906
major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents:
970
diff
changeset
|
134 | |
68754c7de906
major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents:
970
diff
changeset
|
135 | /** |
68754c7de906
major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents:
970
diff
changeset
|
136 | * The specified pointer arguments must be non-NULL. |
68754c7de906
major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents:
970
diff
changeset
|
137 | */ |
68754c7de906
major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents:
970
diff
changeset
|
138 | #define cx_attr_nonnull_arg(...) __attribute__((__nonnull__(__VA_ARGS__))) |
68754c7de906
major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents:
970
diff
changeset
|
139 | |
68754c7de906
major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents:
970
diff
changeset
|
140 | /** |
68754c7de906
major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents:
970
diff
changeset
|
141 | * The returned value is guaranteed to be non-NULL. |
68754c7de906
major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents:
970
diff
changeset
|
142 | */ |
68754c7de906
major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents:
970
diff
changeset
|
143 | #define cx_attr_returns_nonnull __attribute__((__returns_nonnull__)) |
68754c7de906
major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents:
970
diff
changeset
|
144 | |
68754c7de906
major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents:
970
diff
changeset
|
145 | /** |
68754c7de906
major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents:
970
diff
changeset
|
146 | * The attributed function always returns freshly allocated memory. |
68754c7de906
major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents:
970
diff
changeset
|
147 | */ |
68754c7de906
major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents:
970
diff
changeset
|
148 | #define cx_attr_malloc __attribute__((__malloc__)) |
68754c7de906
major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents:
970
diff
changeset
|
149 | |
68754c7de906
major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents:
970
diff
changeset
|
150 | #ifndef __clang__ |
68754c7de906
major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents:
970
diff
changeset
|
151 | /** |
68754c7de906
major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents:
970
diff
changeset
|
152 | * The pointer returned by the attributed function is supposed to be freed |
68754c7de906
major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents:
970
diff
changeset
|
153 | * by \p freefunc. |
68754c7de906
major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents:
970
diff
changeset
|
154 | * |
68754c7de906
major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents:
970
diff
changeset
|
155 | * @param freefunc the function that shall be used to free the memory |
68754c7de906
major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents:
970
diff
changeset
|
156 | * @param freefunc_arg the index of the pointer argument in \p freefunc |
68754c7de906
major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents:
970
diff
changeset
|
157 | */ |
68754c7de906
major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents:
970
diff
changeset
|
158 | #define cx_attr_dealloc(freefunc, freefunc_arg) \ |
68754c7de906
major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents:
970
diff
changeset
|
159 | __attribute__((__malloc__(freefunc, freefunc_arg))) |
68754c7de906
major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents:
970
diff
changeset
|
160 | #else |
68754c7de906
major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents:
970
diff
changeset
|
161 | /** |
68754c7de906
major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents:
970
diff
changeset
|
162 | * Not supported in clang. |
68754c7de906
major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents:
970
diff
changeset
|
163 | */ |
68754c7de906
major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents:
970
diff
changeset
|
164 | #define cx_attr_dealloc(...) |
68754c7de906
major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents:
970
diff
changeset
|
165 | #endif // __clang__ |
68754c7de906
major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents:
970
diff
changeset
|
166 | |
68754c7de906
major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents:
970
diff
changeset
|
167 | /** |
68754c7de906
major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents:
970
diff
changeset
|
168 | * Shortcut to specify #cxFree() as deallocator. |
68754c7de906
major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents:
970
diff
changeset
|
169 | */ |
68754c7de906
major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents:
970
diff
changeset
|
170 | #define cx_attr_dealloc_ucx cx_attr_dealloc(cxFree, 2) |
68754c7de906
major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents:
970
diff
changeset
|
171 | |
68754c7de906
major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents:
970
diff
changeset
|
172 | /** |
68754c7de906
major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents:
970
diff
changeset
|
173 | * Specifies the parameters from which the allocation size is calculated. |
68754c7de906
major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents:
970
diff
changeset
|
174 | */ |
68754c7de906
major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents:
970
diff
changeset
|
175 | #define cx_attr_allocsize(...) __attribute__((__alloc_size__(__VA_ARGS__))) |
68754c7de906
major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents:
970
diff
changeset
|
176 | |
68754c7de906
major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents:
970
diff
changeset
|
177 | |
68754c7de906
major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents:
970
diff
changeset
|
178 | #ifdef __clang__ |
68754c7de906
major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents:
970
diff
changeset
|
179 | /** |
68754c7de906
major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents:
970
diff
changeset
|
180 | * No support for \c null_terminated_string_arg in clang or GCC below 14. |
68754c7de906
major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents:
970
diff
changeset
|
181 | */ |
68754c7de906
major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents:
970
diff
changeset
|
182 | #define cx_attr_cstr_arg(idx) |
68754c7de906
major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents:
970
diff
changeset
|
183 | /** |
68754c7de906
major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents:
970
diff
changeset
|
184 | * No support for access attribute in clang. |
68754c7de906
major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents:
970
diff
changeset
|
185 | */ |
68754c7de906
major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents:
970
diff
changeset
|
186 | #define cx_attr_access(mode, ...) |
68754c7de906
major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents:
970
diff
changeset
|
187 | #else |
68754c7de906
major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents:
970
diff
changeset
|
188 | #if __GNUC__ < 10 |
68754c7de906
major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents:
970
diff
changeset
|
189 | /** |
68754c7de906
major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents:
970
diff
changeset
|
190 | * No support for access attribute in GCC < 10. |
68754c7de906
major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents:
970
diff
changeset
|
191 | */ |
68754c7de906
major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents:
970
diff
changeset
|
192 | #define cx_attr_access(mode, ...) |
68754c7de906
major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents:
970
diff
changeset
|
193 | #else |
68754c7de906
major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents:
970
diff
changeset
|
194 | /** |
68754c7de906
major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents:
970
diff
changeset
|
195 | * Helper macro to define access macros. |
68754c7de906
major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents:
970
diff
changeset
|
196 | */ |
68754c7de906
major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents:
970
diff
changeset
|
197 | #define cx_attr_access(mode, ...) __attribute__((__access__(mode, __VA_ARGS__))) |
68754c7de906
major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents:
970
diff
changeset
|
198 | #endif // __GNUC__ < 10 |
68754c7de906
major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents:
970
diff
changeset
|
199 | #if __GNUC__ < 14 |
68754c7de906
major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents:
970
diff
changeset
|
200 | /** |
68754c7de906
major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents:
970
diff
changeset
|
201 | * No support for \c null_terminated_string_arg in clang or GCC below 14. |
68754c7de906
major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents:
970
diff
changeset
|
202 | */ |
68754c7de906
major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents:
970
diff
changeset
|
203 | #define cx_attr_cstr_arg(idx) |
68754c7de906
major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents:
970
diff
changeset
|
204 | #else |
68754c7de906
major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents:
970
diff
changeset
|
205 | /** |
68754c7de906
major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents:
970
diff
changeset
|
206 | * The specified argument is expected to be a zero-terminated string. |
68754c7de906
major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents:
970
diff
changeset
|
207 | * |
68754c7de906
major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents:
970
diff
changeset
|
208 | * @param idx the index of the argument |
68754c7de906
major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents:
970
diff
changeset
|
209 | */ |
68754c7de906
major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents:
970
diff
changeset
|
210 | #define cx_attr_cstr_arg(idx) \ |
68754c7de906
major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents:
970
diff
changeset
|
211 | __attribute__((__null_terminated_string_arg__(idx))) |
68754c7de906
major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents:
970
diff
changeset
|
212 | #endif // __GNUC__ < 14 |
68754c7de906
major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents:
970
diff
changeset
|
213 | #endif // __clang__ |
68754c7de906
major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents:
970
diff
changeset
|
214 | |
68754c7de906
major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents:
970
diff
changeset
|
215 | |
68754c7de906
major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents:
970
diff
changeset
|
216 | /** |
68754c7de906
major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents:
970
diff
changeset
|
217 | * Specifies that the function will only read through the given pointer. |
68754c7de906
major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents:
970
diff
changeset
|
218 | * |
68754c7de906
major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents:
970
diff
changeset
|
219 | * Takes one or two arguments: the index of the pointer and (optionally) the |
68754c7de906
major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents:
970
diff
changeset
|
220 | * index of another argument specifying the maximum number of accessed bytes. |
68754c7de906
major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents:
970
diff
changeset
|
221 | */ |
68754c7de906
major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents:
970
diff
changeset
|
222 | #define cx_attr_access_r(...) cx_attr_access(__read_only__, __VA_ARGS__) |
68754c7de906
major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents:
970
diff
changeset
|
223 | |
68754c7de906
major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents:
970
diff
changeset
|
224 | /** |
68754c7de906
major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents:
970
diff
changeset
|
225 | * Specifies that the function will read and write through the given pointer. |
68754c7de906
major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents:
970
diff
changeset
|
226 | * |
68754c7de906
major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents:
970
diff
changeset
|
227 | * Takes one or two arguments: the index of the pointer and (optionally) the |
68754c7de906
major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents:
970
diff
changeset
|
228 | * index of another argument specifying the maximum number of accessed bytes. |
68754c7de906
major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents:
970
diff
changeset
|
229 | */ |
68754c7de906
major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents:
970
diff
changeset
|
230 | #define cx_attr_access_rw(...) cx_attr_access(__read_write__, __VA_ARGS__) |
68754c7de906
major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents:
970
diff
changeset
|
231 | |
68754c7de906
major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents:
970
diff
changeset
|
232 | /** |
68754c7de906
major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents:
970
diff
changeset
|
233 | * Specifies that the function will only write through the given pointer. |
68754c7de906
major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents:
970
diff
changeset
|
234 | * |
68754c7de906
major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents:
970
diff
changeset
|
235 | * Takes one or two arguments: the index of the pointer and (optionally) the |
68754c7de906
major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents:
970
diff
changeset
|
236 | * index of another argument specifying the maximum number of accessed bytes. |
68754c7de906
major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents:
970
diff
changeset
|
237 | */ |
68754c7de906
major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents:
970
diff
changeset
|
238 | #define cx_attr_access_w(...) cx_attr_access(__write_only__, __VA_ARGS__) |
68754c7de906
major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents:
970
diff
changeset
|
239 | |
68754c7de906
major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents:
970
diff
changeset
|
240 | #if __STDC_VERSION__ >= 202300L |
68754c7de906
major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents:
970
diff
changeset
|
241 | |
68754c7de906
major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents:
970
diff
changeset
|
242 | /** |
68754c7de906
major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents:
970
diff
changeset
|
243 | * Do not warn about unused variable. |
68754c7de906
major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents:
970
diff
changeset
|
244 | */ |
68754c7de906
major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents:
970
diff
changeset
|
245 | #define cx_attr_unused [[maybe_unused]] |
68754c7de906
major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents:
970
diff
changeset
|
246 | |
68754c7de906
major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents:
970
diff
changeset
|
247 | /** |
68754c7de906
major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents:
970
diff
changeset
|
248 | * Warn about discarded return value. |
68754c7de906
major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents:
970
diff
changeset
|
249 | */ |
68754c7de906
major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents:
970
diff
changeset
|
250 | #define cx_attr_nodiscard [[nodiscard]] |
68754c7de906
major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents:
970
diff
changeset
|
251 | |
68754c7de906
major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents:
970
diff
changeset
|
252 | #else // no C23 |
68754c7de906
major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents:
970
diff
changeset
|
253 | |
68754c7de906
major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents:
970
diff
changeset
|
254 | /** |
68754c7de906
major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents:
970
diff
changeset
|
255 | * Do not warn about unused variable. |
68754c7de906
major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents:
970
diff
changeset
|
256 | */ |
68754c7de906
major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents:
970
diff
changeset
|
257 | #define cx_attr_unused __attribute__((__unused__)) |
68754c7de906
major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents:
970
diff
changeset
|
258 | |
68754c7de906
major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents:
970
diff
changeset
|
259 | /** |
68754c7de906
major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents:
970
diff
changeset
|
260 | * Warn about discarded return value. |
68754c7de906
major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents:
970
diff
changeset
|
261 | */ |
68754c7de906
major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents:
970
diff
changeset
|
262 | #define cx_attr_nodiscard __attribute__((__warn_unused_result__)) |
68754c7de906
major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents:
970
diff
changeset
|
263 | |
68754c7de906
major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents:
970
diff
changeset
|
264 | #endif // __STDC_VERSION__ |
68754c7de906
major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents:
970
diff
changeset
|
265 | |
68754c7de906
major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents:
970
diff
changeset
|
266 | // --------------------------------------------------------------------------- |
68754c7de906
major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents:
970
diff
changeset
|
267 | // Useful function pointers |
68754c7de906
major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents:
970
diff
changeset
|
268 | // --------------------------------------------------------------------------- |
68754c7de906
major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents:
970
diff
changeset
|
269 | |
545
3700ac4bd9a3
#184 #170 first basic flush test
Mike Becker <universe@uap-core.de>
parents:
503
diff
changeset
|
270 | /** |
3700ac4bd9a3
#184 #170 first basic flush test
Mike Becker <universe@uap-core.de>
parents:
503
diff
changeset
|
271 | * Function pointer compatible with fwrite-like functions. |
3700ac4bd9a3
#184 #170 first basic flush test
Mike Becker <universe@uap-core.de>
parents:
503
diff
changeset
|
272 | */ |
3700ac4bd9a3
#184 #170 first basic flush test
Mike Becker <universe@uap-core.de>
parents:
503
diff
changeset
|
273 | typedef size_t (*cx_write_func)( |
890
54565fd74e74
move all const keywords to the west - fixes #426
Mike Becker <universe@uap-core.de>
parents:
766
diff
changeset
|
274 | const void *, |
545
3700ac4bd9a3
#184 #170 first basic flush test
Mike Becker <universe@uap-core.de>
parents:
503
diff
changeset
|
275 | size_t, |
3700ac4bd9a3
#184 #170 first basic flush test
Mike Becker <universe@uap-core.de>
parents:
503
diff
changeset
|
276 | size_t, |
3700ac4bd9a3
#184 #170 first basic flush test
Mike Becker <universe@uap-core.de>
parents:
503
diff
changeset
|
277 | void * |
985
68754c7de906
major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents:
970
diff
changeset
|
278 | ) cx_attr_nonnull; |
545
3700ac4bd9a3
#184 #170 first basic flush test
Mike Becker <universe@uap-core.de>
parents:
503
diff
changeset
|
279 | |
674
dc514a5d42a5
add stream copy utils - fixes #254
Mike Becker <universe@uap-core.de>
parents:
651
diff
changeset
|
280 | /** |
dc514a5d42a5
add stream copy utils - fixes #254
Mike Becker <universe@uap-core.de>
parents:
651
diff
changeset
|
281 | * Function pointer compatible with fread-like functions. |
dc514a5d42a5
add stream copy utils - fixes #254
Mike Becker <universe@uap-core.de>
parents:
651
diff
changeset
|
282 | */ |
dc514a5d42a5
add stream copy utils - fixes #254
Mike Becker <universe@uap-core.de>
parents:
651
diff
changeset
|
283 | typedef size_t (*cx_read_func)( |
dc514a5d42a5
add stream copy utils - fixes #254
Mike Becker <universe@uap-core.de>
parents:
651
diff
changeset
|
284 | void *, |
dc514a5d42a5
add stream copy utils - fixes #254
Mike Becker <universe@uap-core.de>
parents:
651
diff
changeset
|
285 | size_t, |
dc514a5d42a5
add stream copy utils - fixes #254
Mike Becker <universe@uap-core.de>
parents:
651
diff
changeset
|
286 | size_t, |
dc514a5d42a5
add stream copy utils - fixes #254
Mike Becker <universe@uap-core.de>
parents:
651
diff
changeset
|
287 | void * |
985
68754c7de906
major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents:
970
diff
changeset
|
288 | ) cx_attr_nonnull; |
68754c7de906
major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents:
970
diff
changeset
|
289 | |
68754c7de906
major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents:
970
diff
changeset
|
290 | // --------------------------------------------------------------------------- |
68754c7de906
major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents:
970
diff
changeset
|
291 | // Utility macros |
68754c7de906
major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents:
970
diff
changeset
|
292 | // --------------------------------------------------------------------------- |
674
dc514a5d42a5
add stream copy utils - fixes #254
Mike Becker <universe@uap-core.de>
parents:
651
diff
changeset
|
293 | |
945 | 294 | /** |
295 | * Determines the number of members in a static C array. | |
296 | * | |
297 | * @attention never use this to determine the size of a dynamically allocated | |
298 | * array. | |
299 | * | |
300 | * @param arr the array identifier | |
301 | * @return the number of elements | |
302 | */ | |
303 | #define cx_nmemb(arr) (sizeof(arr)/sizeof((arr)[0])) | |
651
19d1a8422f6e
fix last change of mul overflow builtin breaking non-windows compilations
Mike Becker <universe@uap-core.de>
parents:
650
diff
changeset
|
304 | |
985
68754c7de906
major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents:
970
diff
changeset
|
305 | // --------------------------------------------------------------------------- |
68754c7de906
major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents:
970
diff
changeset
|
306 | // szmul implementation |
68754c7de906
major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents:
970
diff
changeset
|
307 | // --------------------------------------------------------------------------- |
68754c7de906
major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents:
970
diff
changeset
|
308 | |
970 | 309 | #if (__GNUC__ >= 5 || defined(__clang__)) && !defined(CX_NO_SZMUL_BUILTIN) |
310 | #define CX_SZMUL_BUILTIN | |
311 | ||
312 | /** | |
313 | * Alias for \c __builtin_mul_overflow. | |
314 | * | |
315 | * Performs a multiplication of size_t values and checks for overflow. | |
316 | * | |
317 | * @param a first operand | |
318 | * @param b second operand | |
319 | * @param result a pointer to a size_t, where the result should | |
320 | * be stored | |
321 | * @return zero, if no overflow occurred and the result is correct, non-zero | |
322 | * otherwise | |
323 | */ | |
324 | #define cx_szmul(a, b, result) __builtin_mul_overflow(a, b, result) | |
325 | ||
326 | #else // no GNUC or clang bultin | |
327 | ||
328 | /** | |
329 | * Performs a multiplication of size_t values and checks for overflow. | |
330 | * | |
331 | * @param a first operand | |
332 | * @param b second operand | |
333 | * @param result a pointer to a size_t, where the result should | |
334 | * be stored | |
335 | * @return zero, if no overflow occurred and the result is correct, non-zero | |
336 | * otherwise | |
337 | */ | |
338 | #define cx_szmul(a, b, result) cx_szmul_impl(a, b, result) | |
339 | ||
340 | /** | |
341 | * Performs a multiplication of size_t values and checks for overflow. | |
342 | * | |
343 | * This is a custom implementation in case there is no compiler builtin | |
344 | * available. | |
345 | * | |
346 | * @param a first operand | |
347 | * @param b second operand | |
348 | * @param result a pointer to a size_t where the result should be stored | |
349 | * @return zero, if no overflow occurred and the result is correct, non-zero | |
350 | * otherwise | |
351 | */ | |
988
15b3ca7ee33f
make ucx C++ compatible again (and add tests for it) - fixes #486
Mike Becker <universe@uap-core.de>
parents:
985
diff
changeset
|
352 | #if __cplusplus |
15b3ca7ee33f
make ucx C++ compatible again (and add tests for it) - fixes #486
Mike Becker <universe@uap-core.de>
parents:
985
diff
changeset
|
353 | extern "C" |
15b3ca7ee33f
make ucx C++ compatible again (and add tests for it) - fixes #486
Mike Becker <universe@uap-core.de>
parents:
985
diff
changeset
|
354 | #endif |
970 | 355 | int cx_szmul_impl(size_t a, size_t b, size_t *result); |
356 | ||
357 | #endif // cx_szmul | |
358 | ||
483
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
359 | |
985
68754c7de906
major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents:
970
diff
changeset
|
360 | // --------------------------------------------------------------------------- |
68754c7de906
major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents:
970
diff
changeset
|
361 | // Fixes for MSVC incompatibilities |
68754c7de906
major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents:
970
diff
changeset
|
362 | // --------------------------------------------------------------------------- |
493
e3469b497eff
hide __attribute__ from compilers that may not support it
Mike Becker <universe@uap-core.de>
parents:
487
diff
changeset
|
363 | |
682
34120a385fc8
work around some MSC problems
Mike Becker <universe@uap-core.de>
parents:
674
diff
changeset
|
364 | #ifdef _MSC_VER |
34120a385fc8
work around some MSC problems
Mike Becker <universe@uap-core.de>
parents:
674
diff
changeset
|
365 | // fix missing ssize_t definition |
34120a385fc8
work around some MSC problems
Mike Becker <universe@uap-core.de>
parents:
674
diff
changeset
|
366 | #include <BaseTsd.h> |
34120a385fc8
work around some MSC problems
Mike Becker <universe@uap-core.de>
parents:
674
diff
changeset
|
367 | typedef SSIZE_T ssize_t; |
34120a385fc8
work around some MSC problems
Mike Becker <universe@uap-core.de>
parents:
674
diff
changeset
|
368 | |
34120a385fc8
work around some MSC problems
Mike Becker <universe@uap-core.de>
parents:
674
diff
changeset
|
369 | // fix missing _Thread_local support |
34120a385fc8
work around some MSC problems
Mike Becker <universe@uap-core.de>
parents:
674
diff
changeset
|
370 | #define _Thread_local __declspec(thread) |
985
68754c7de906
major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents:
970
diff
changeset
|
371 | #endif // _MSC_VER |
682
34120a385fc8
work around some MSC problems
Mike Becker <universe@uap-core.de>
parents:
674
diff
changeset
|
372 | |
628
1e2be40f0cb5
use //-style single line comments everywhere
Mike Becker <universe@uap-core.de>
parents:
570
diff
changeset
|
373 | #endif // UCX_COMMON_H |