ucx
UAP Common Extensions
Loading...
Searching...
No Matches
common.h
Go to the documentation of this file.
1/*
2 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
3 *
4 * Copyright 2021 Mike Becker, Olaf Wintermann All rights reserved.
5 *
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions are met:
8 *
9 * 1. Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer.
11 *
12 * 2. Redistributions in binary form must reproduce the above copyright
13 * notice, this list of conditions and the following disclaimer in the
14 * documentation and/or other materials provided with the distribution.
15 *
16 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
17 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
20 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
21 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
22 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
23 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
24 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
25 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
26 * POSSIBILITY OF SUCH DAMAGE.
27 */
28
79#ifndef UCX_COMMON_H
80#define UCX_COMMON_H
81
83#define UCX_VERSION_MAJOR 3
84
86#define UCX_VERSION_MINOR 1
87
89#define UCX_VERSION (((UCX_VERSION_MAJOR)<<16)|UCX_VERSION_MINOR)
90
91// ---------------------------------------------------------------------------
92// Common includes
93// ---------------------------------------------------------------------------
94
95#include <stdlib.h>
96#include <stddef.h>
97#include <stdbool.h>
98#include <stdint.h>
99#include <sys/types.h>
100
101// ---------------------------------------------------------------------------
102// Architecture Detection
103// ---------------------------------------------------------------------------
104
105#ifndef INTPTR_MAX
106#error Missing INTPTR_MAX definition
107#endif
108#if INTPTR_MAX == INT64_MAX
112#define CX_WORDSIZE 64
113#elif INTPTR_MAX == INT32_MAX
117#define CX_WORDSIZE 32
118#else
119#error Unknown pointer size or missing size macros!
120#endif
121
122// ---------------------------------------------------------------------------
123// Attribute definitions
124// ---------------------------------------------------------------------------
125
126#ifndef __GNUC__
130#define __attribute__(x)
131#endif
132
136#define cx_attr_nonnull __attribute__((__nonnull__))
137
141#define cx_attr_nonnull_arg(...) __attribute__((__nonnull__(__VA_ARGS__)))
142
146#define cx_attr_returns_nonnull __attribute__((__returns_nonnull__))
147
151#define cx_attr_malloc __attribute__((__malloc__))
152
153#if !defined(__clang__) && __GNUC__ >= 11
161#define cx_attr_dealloc(freefunc, freefunc_arg) \
162 __attribute__((__malloc__(freefunc, freefunc_arg)))
163#else
167#define cx_attr_dealloc(...)
168#endif // __clang__
169
173#define cx_attr_dealloc_ucx cx_attr_dealloc(cxFree, 2)
174
178#define cx_attr_allocsize(...) __attribute__((__alloc_size__(__VA_ARGS__)))
179
180
181#ifdef __clang__
185#define cx_attr_cstr_arg(idx)
189#define cx_attr_access(mode, ...)
190#else
191#if __GNUC__ < 10
195#define cx_attr_access(mode, ...)
196#else
200#define cx_attr_access(mode, ...) __attribute__((__access__(mode, __VA_ARGS__)))
201#endif // __GNUC__ < 10
202#if __GNUC__ < 14
206#define cx_attr_cstr_arg(idx)
207#else
213#define cx_attr_cstr_arg(idx) \
214 __attribute__((__null_terminated_string_arg__(idx)))
215#endif // __GNUC__ < 14
216#endif // __clang__
217
218
225#define cx_attr_access_r(...) cx_attr_access(__read_only__, __VA_ARGS__)
226
233#define cx_attr_access_rw(...) cx_attr_access(__read_write__, __VA_ARGS__)
234
241#define cx_attr_access_w(...) cx_attr_access(__write_only__, __VA_ARGS__)
242
243#if __STDC_VERSION__ >= 202300L
244
248#define cx_attr_unused [[maybe_unused]]
249
253#define cx_attr_nodiscard [[nodiscard]]
254
255#else // no C23
256
260#define cx_attr_unused __attribute__((__unused__))
261
265#define cx_attr_nodiscard __attribute__((__warn_unused_result__))
266
267#endif // __STDC_VERSION__
268
269
270// ---------------------------------------------------------------------------
271// MSVC specifics
272// ---------------------------------------------------------------------------
273
274#ifdef _MSC_VER
275// fix missing _Thread_local support
276#define _Thread_local __declspec(thread)
277#endif // _MSC_VER
278
279#if defined(CX_WINDLL_EXPORT)
280#define cx_attr_export __declspec(dllexport)
281#elif defined(CX_WINDLL)
282#define cx_attr_export __declspec(dllimport)
283#else
285#define cx_attr_export
286#endif // CX_WINDLL / CX_WINDLL_EXPORT
287
288// ---------------------------------------------------------------------------
289// Useful function pointers
290// ---------------------------------------------------------------------------
291
295typedef size_t (*cx_write_func)(
296 const void *,
297 size_t,
298 size_t,
299 void *
300);
301
305typedef size_t (*cx_read_func)(
306 void *,
307 size_t,
308 size_t,
309 void *
310);
311
312// ---------------------------------------------------------------------------
313// Utility macros
314// ---------------------------------------------------------------------------
315
325#define cx_nmemb(arr) (sizeof(arr)/sizeof((arr)[0]))
326
327// ---------------------------------------------------------------------------
328// szmul implementation
329// ---------------------------------------------------------------------------
330
331#if (__GNUC__ >= 5 || defined(__clang__)) && !defined(CX_NO_SZMUL_BUILTIN)
332#define CX_SZMUL_BUILTIN
333#define cx_szmul(a, b, result) __builtin_mul_overflow(a, b, result)
334#else // no GNUC or clang bultin
345#define cx_szmul(a, b, result) cx_szmul_impl(a, b, result)
346
359#if __cplusplus
360extern "C"
361#endif
362cx_attr_export int cx_szmul_impl(size_t a, size_t b, size_t *result);
363#endif // cx_szmul
364
365
366
367#endif // UCX_COMMON_H
#define cx_attr_export
Only used for building Windows DLLs.
Definition common.h:285
size_t(* cx_write_func)(const void *, size_t, size_t, void *)
Function pointer compatible with fwrite-like functions.
Definition common.h:295
size_t(* cx_read_func)(void *, size_t, size_t, void *)
Function pointer compatible with fread-like functions.
Definition common.h:305
int cx_szmul_impl(size_t a, size_t b, size_t *result)
Implementation of cx_szmul() when no compiler builtin is available.