Coverage Report

Created: 2025-10-08 19:34

/work/toxcore/events/events_alloc.c
Line
Count
Source (jump to first uncovered line)
1
/* SPDX-License-Identifier: GPL-3.0-or-later
2
 * Copyright © 2022-2025 The TokTok team.
3
 */
4
5
#include "events_alloc.h"
6
7
#include <assert.h>
8
9
#include "../ccompat.h"
10
#include "../mem.h"
11
#include "../tox_event.h"
12
#include "../tox_events.h"
13
14
Tox_Events_State *tox_events_alloc(void *user_data)
15
461k
{
16
461k
    Tox_Events_State *state = (Tox_Events_State *)user_data;
17
461k
    assert(state != nullptr);
18
461k
    assert(state->mem != nullptr);
19
20
461k
    if (state->events != nullptr) {
21
        // Already allocated.
22
438k
        return state;
23
438k
    }
24
25
23.5k
    Tox_Events *events = (Tox_Events *)mem_alloc(state->mem, sizeof(Tox_Events));
26
27
23.5k
    if (events == nullptr) {
28
        // It's still null => allocation failed.
29
75
        state->events = nullptr;
30
75
        state->error = TOX_ERR_EVENTS_ITERATE_MALLOC;
31
75
        return state;
32
75
    }
33
34
23.4k
    *events = (Tox_Events) {
35
23.4k
        nullptr
36
23.4k
    };
37
23.4k
    state->events = events;
38
23.4k
    state->events->mem = state->mem;
39
40
23.4k
    return state;
41
23.5k
}
42
43
void tox_events_free(Tox_Events *events)
44
114k
{
45
114k
    if (events == nullptr) {
46
90.4k
        return;
47
90.4k
    }
48
49
487k
    for (uint32_t i = 0; i < events->events_size; ++i) {
50
462k
        tox_event_destruct(&events->events[i], events->mem);
51
462k
    }
52
53
24.5k
    mem_delete(events->mem, events->events);
54
24.5k
    mem_delete(events->mem, events);
55
24.5k
}
56
57
bool tox_events_add(Tox_Events *events, const Tox_Event *event)
58
462k
{
59
462k
    if (events->events_size == UINT32_MAX) {
60
0
        return false;
61
0
    }
62
63
462k
    if (events->events_size == events->events_capacity) {
64
66.7k
        const uint32_t new_events_capacity = events->events_capacity * 2 + 1;
65
66.7k
        Tox_Event *new_events = (Tox_Event *)mem_vrealloc(
66
66.7k
                                    events->mem, events->events, new_events_capacity, sizeof(Tox_Event));
67
68
66.7k
        if (new_events == nullptr) {
69
83
            return false;
70
83
        }
71
72
66.7k
        events->events = new_events;
73
66.7k
        events->events_capacity = new_events_capacity;
74
66.7k
    }
75
76
462k
    events->events[events->events_size] = *event;
77
462k
    ++events->events_size;
78
79
462k
    return true;
80
462k
}