ucx
UAP Common Extensions
Loading...
Searching...
No Matches
utils.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
40#ifndef UCX_UTILS_H
41#define UCX_UTILS_H
42
43#include "common.h"
44
45#ifdef __cplusplus
46extern "C" {
47#endif
48
52#define cx_for_n(varname, n) for (size_t varname = 0 ; (varname) < (n) ; (varname)++)
53
57#ifdef __cplusplus
58#define cx_swap_ptr(left, right) do {auto cx_tmp_swap_var = left; left = right; right = cx_tmp_swap_var;} while(0)
59#else
60#define cx_swap_ptr(left, right) do {void *cx_tmp_swap_var = left; left = right; right = cx_tmp_swap_var;} while(0)
61#endif
62
63// cx_szmul() definition
64
65#if (__GNUC__ >= 5 || defined(__clang__)) && !defined(CX_NO_SZMUL_BUILTIN)
66#define CX_SZMUL_BUILTIN
67
80#define cx_szmul(a, b, result) __builtin_mul_overflow(a, b, result)
81
82#else // no GNUC or clang bultin
83
94#define cx_szmul(a, b, result) cx_szmul_impl(a, b, result)
95
108int cx_szmul_impl(size_t a, size_t b, size_t *result);
109
110#endif // cx_szmul
111
112
129__attribute__((__nonnull__(1, 2, 3, 4)))
131 void *src,
132 void *dest,
133 cx_read_func rfnc,
134 cx_write_func wfnc,
135 char *buf,
136 size_t bufsize,
137 size_t n
138);
139
153#define cx_stream_bcopy(src, dest, rfnc, wfnc, buf, bufsize) \
154 cx_stream_bncopy(src, dest, rfnc, wfnc, buf, bufsize, SIZE_MAX)
155
168__attribute__((__nonnull__))
170 void *src,
171 void *dest,
172 cx_read_func rfnc,
173 cx_write_func wfnc,
174 size_t n
175);
176
188#define cx_stream_copy(src, dest, rfnc, wfnc) \
189 cx_stream_ncopy(src, dest, rfnc, wfnc, SIZE_MAX)
190
191#ifdef __cplusplus
192}
193#endif
194
195#endif // UCX_UTILS_H
Common definitions and feature checks.
size_t(* cx_read_func)(void *, size_t, size_t, void *)
Function pointer compatible with fread-like functions.
Definition: common.h:113
#define __attribute__(x)
Removes GNU C attributes where they are not supported.
Definition: common.h:127
size_t(* cx_write_func)(void const *, size_t, size_t, void *)
Function pointer compatible with fwrite-like functions.
Definition: common.h:103
int cx_szmul_impl(size_t a, size_t b, size_t *result)
Performs a multiplication of size_t values and checks for overflow.
size_t cx_stream_ncopy(void *src, void *dest, cx_read_func rfnc, cx_write_func wfnc, size_t n)
Reads data from a stream and writes it to another stream.
size_t cx_stream_bncopy(void *src, void *dest, cx_read_func rfnc, cx_write_func wfnc, char *buf, size_t bufsize, size_t n)
Reads data from a stream and writes it to another stream.