Coverage Report

Created: 2024-01-26 01:52

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