Coverage Report

Created: 2025-04-05 10:27

/src/c-toxcore/toxcore/util.c
Line
Count
Source (jump to first uncovered line)
1
/* SPDX-License-Identifier: GPL-3.0-or-later
2
 * Copyright © 2016-2025 The TokTok team.
3
 * Copyright © 2013 Tox project.
4
 * Copyright © 2013 plutooo
5
 */
6
7
/**
8
 * Utilities.
9
 */
10
#ifndef _XOPEN_SOURCE
11
#define _XOPEN_SOURCE 600
12
#endif /* _XOPEN_SOURCE */
13
14
#include "util.h"
15
16
#include <string.h>
17
18
#include "ccompat.h"
19
#include "mem.h"
20
21
bool is_power_of_2(uint64_t x)
22
0
{
23
0
    return x != 0 && (x & (~x + 1)) == x;
24
0
}
25
26
void free_uint8_t_pointer_array(const Memory *mem, uint8_t **ary, size_t n_items)
27
4.93k
{
28
4.93k
    if (ary == nullptr) {
29
4.77k
        return;
30
4.77k
    }
31
32
2.64k
    for (size_t i = 0; i < n_items; ++i) {
33
2.49k
        if (ary[i] != nullptr) {
34
2.49k
            mem_delete(mem, ary[i]);
35
2.49k
        }
36
2.49k
    }
37
38
158
    mem_delete(mem, ary);
39
158
}
40
41
uint16_t data_checksum(const uint8_t *data, uint32_t length)
42
223
{
43
223
    uint8_t checksum[2] = {0};
44
223
    uint16_t check;
45
46
8.25k
    for (uint32_t i = 0; i < length; ++i) {
47
8.02k
        checksum[i % 2] ^= data[i];
48
8.02k
    }
49
50
223
    memcpy(&check, checksum, sizeof(check));
51
223
    return check;
52
223
}
53
54
int create_recursive_mutex(pthread_mutex_t *mutex)
55
0
{
56
0
    pthread_mutexattr_t attr;
57
58
0
    if (pthread_mutexattr_init(&attr) != 0) {
59
0
        return -1;
60
0
    }
61
62
0
    if (pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE) != 0) {
63
0
        pthread_mutexattr_destroy(&attr);
64
0
        return -1;
65
0
    }
66
67
    /* Create queue mutex */
68
0
    if (pthread_mutex_init(mutex, &attr) != 0) {
69
0
        pthread_mutexattr_destroy(&attr);
70
0
        return -1;
71
0
    }
72
73
0
    pthread_mutexattr_destroy(&attr);
74
75
0
    return 0;
76
0
}
77
78
bool memeq(const uint8_t *a, size_t a_size, const uint8_t *b, size_t b_size)
79
2.74k
{
80
2.74k
    return a_size == b_size && memcmp(a, b, a_size) == 0;
81
2.74k
}
82
83
uint8_t *memdup(const Memory *mem, const uint8_t *data, size_t data_size)
84
0
{
85
0
    if (data == nullptr || data_size == 0) {
86
0
        return nullptr;
87
0
    }
88
89
0
    uint8_t *copy = (uint8_t *)mem_balloc(mem, data_size);
90
91
0
    if (copy != nullptr) {
92
0
        memcpy(copy, data, data_size);
93
0
    }
94
95
0
    return copy;
96
0
}
97
98
void memzero(uint8_t *data, size_t data_size)
99
42.3k
{
100
42.3k
    if (data == nullptr || data_size == 0) {
101
0
        return;
102
0
    }
103
104
42.3k
    memset(data, 0, data_size);
105
42.3k
}
106
107
int16_t max_s16(int16_t a, int16_t b)
108
0
{
109
0
    return a > b ? a : b;
110
0
}
111
int32_t max_s32(int32_t a, int32_t b)
112
0
{
113
0
    return a > b ? a : b;
114
0
}
115
int64_t max_s64(int64_t a, int64_t b)
116
0
{
117
0
    return a > b ? a : b;
118
0
}
119
120
int16_t min_s16(int16_t a, int16_t b)
121
0
{
122
0
    return a < b ? a : b;
123
0
}
124
int32_t min_s32(int32_t a, int32_t b)
125
0
{
126
0
    return a < b ? a : b;
127
0
}
128
int64_t min_s64(int64_t a, int64_t b)
129
0
{
130
0
    return a < b ? a : b;
131
0
}
132
133
uint8_t max_u08(uint8_t a, uint8_t b)
134
0
{
135
0
    return a > b ? a : b;
136
0
}
137
uint16_t max_u16(uint16_t a, uint16_t b)
138
0
{
139
0
    return a > b ? a : b;
140
0
}
141
uint32_t max_u32(uint32_t a, uint32_t b)
142
0
{
143
0
    return a > b ? a : b;
144
0
}
145
uint64_t max_u64(uint64_t a, uint64_t b)
146
0
{
147
0
    return a > b ? a : b;
148
0
}
149
150
uint16_t min_u16(uint16_t a, uint16_t b)
151
1.43k
{
152
1.43k
    return a < b ? a : b;
153
1.43k
}
154
uint32_t min_u32(uint32_t a, uint32_t b)
155
58
{
156
58
    return a < b ? a : b;
157
58
}
158
uint64_t min_u64(uint64_t a, uint64_t b)
159
0
{
160
0
    return a < b ? a : b;
161
0
}
162
163
int cmp_uint(uint64_t a, uint64_t b)
164
0
{
165
0
    return (a > b ? 1 : 0) - (a < b ? 1 : 0);
166
0
}
167
168
uint32_t jenkins_one_at_a_time_hash(const uint8_t *key, size_t len)
169
106
{
170
106
    uint32_t hash = 0;
171
172
3.49k
    for (uint32_t i = 0; i < len; ++i) {
173
3.39k
        hash += key[i];
174
3.39k
        hash += (uint32_t)((uint64_t)hash << 10);
175
3.39k
        hash ^= hash >> 6;
176
3.39k
    }
177
178
106
    hash += (uint32_t)((uint64_t)hash << 3);
179
106
    hash ^= hash >> 11;
180
106
    hash += (uint32_t)((uint64_t)hash << 15);
181
106
    return hash;
182
106
}