Coverage Report

Created: 2025-10-08 19:34

/work/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
732
{
23
732
    return x != 0 && (x & (~x + 1)) == x;
24
732
}
25
26
void free_uint8_t_pointer_array(const Memory *mem, uint8_t **ary, size_t n_items)
27
4.83k
{
28
4.83k
    if (ary == nullptr) {
29
4.60k
        return;
30
4.60k
    }
31
32
3.63k
    for (size_t i = 0; i < n_items; ++i) {
33
3.39k
        if (ary[i] != nullptr) {
34
3.39k
            mem_delete(mem, ary[i]);
35
3.39k
        }
36
3.39k
    }
37
38
236
    mem_delete(mem, ary);
39
236
}
40
41
uint16_t data_checksum(const uint8_t *data, uint32_t length)
42
2.11k
{
43
2.11k
    uint8_t checksum[2] = {0};
44
2.11k
    uint16_t check;
45
46
58.1k
    for (uint32_t i = 0; i < length; ++i) {
47
56.0k
        checksum[i % 2] ^= data[i];
48
56.0k
    }
49
50
2.11k
    memcpy(&check, checksum, sizeof(check));
51
2.11k
    return check;
52
2.11k
}
53
54
int create_recursive_mutex(pthread_mutex_t *mutex)
55
106
{
56
106
    pthread_mutexattr_t attr;
57
58
106
    if (pthread_mutexattr_init(&attr) != 0) {
59
0
        return -1;
60
0
    }
61
62
106
    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
106
    if (pthread_mutex_init(mutex, &attr) != 0) {
69
0
        pthread_mutexattr_destroy(&attr);
70
0
        return -1;
71
0
    }
72
73
106
    pthread_mutexattr_destroy(&attr);
74
75
106
    return 0;
76
106
}
77
78
bool memeq(const uint8_t *a, size_t a_size, const uint8_t *b, size_t b_size)
79
107k
{
80
107k
    return a_size == b_size && memcmp(a, b, a_size) == 0;
81
107k
}
82
83
uint8_t *memdup(const Memory *mem, const uint8_t *data, size_t data_size)
84
68
{
85
68
    if (data == nullptr || data_size == 0) {
86
66
        return nullptr;
87
66
    }
88
89
2
    uint8_t *copy = (uint8_t *)mem_balloc(mem, data_size);
90
91
2
    if (copy != nullptr) {
92
2
        memcpy(copy, data, data_size);
93
2
    }
94
95
2
    return copy;
96
68
}
97
98
void memzero(uint8_t *data, size_t data_size)
99
5.17M
{
100
5.17M
    if (data == nullptr || data_size == 0) {
101
112k
        return;
102
112k
    }
103
104
5.06M
    memset(data, 0, data_size);
105
5.06M
}
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
41.6k
{
113
41.6k
    return a > b ? a : b;
114
41.6k
}
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
33.9k
{
126
33.9k
    return a < b ? a : b;
127
33.9k
}
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
1
{
143
1
    return a > b ? a : b;
144
1
}
145
uint64_t max_u64(uint64_t a, uint64_t b)
146
1.99k
{
147
1.99k
    return a > b ? a : b;
148
1.99k
}
149
150
uint16_t min_u16(uint16_t a, uint16_t b)
151
2.10M
{
152
2.10M
    return a < b ? a : b;
153
2.10M
}
154
uint32_t min_u32(uint32_t a, uint32_t b)
155
2.40M
{
156
2.40M
    return a < b ? a : b;
157
2.40M
}
158
uint64_t min_u64(uint64_t a, uint64_t b)
159
77.0k
{
160
77.0k
    return a < b ? a : b;
161
77.0k
}
162
163
int cmp_uint(uint64_t a, uint64_t b)
164
1.08M
{
165
1.08M
    return (a > b ? 1 : 0) - (a < b ? 1 : 0);
166
1.08M
}
167
168
uint32_t jenkins_one_at_a_time_hash(const uint8_t *key, size_t len)
169
816
{
170
816
    uint32_t hash = 0;
171
172
26.9k
    for (uint32_t i = 0; i < len; ++i) {
173
26.1k
        hash += key[i];
174
26.1k
        hash += (uint32_t)((uint64_t)hash << 10);
175
26.1k
        hash ^= hash >> 6;
176
26.1k
    }
177
178
816
    hash += (uint32_t)((uint64_t)hash << 3);
179
816
    hash ^= hash >> 11;
180
816
    hash += (uint32_t)((uint64_t)hash << 15);
181
816
    return hash;
182
816
}