Coverage Report

Created: 2026-10-24 08:16

/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-2026 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
355k
{
16
355k
    Tox_Events_State *state = (Tox_Events_State *)user_data;
17
355k
    assert(state != nullptr);
18
355k
    assert(state->mem != nullptr);
19
20
355k
    if (state->events != nullptr) {
21
        // Already allocated.
22
350k
        return state;
23
350k
    }
24
25
5.62k
    Tox_Events *events = (Tox_Events *)mem_alloc(state->mem, sizeof(Tox_Events));
26
27
5.62k
    if (events == nullptr) {
28
        // It's still null => allocation failed.
29
0
        state->events = nullptr;
30
0
        state->error = TOX_ERR_EVENTS_ITERATE_MALLOC;
31
0
        return state;
32
0
    }
33
34
5.62k
    *events = (Tox_Events) {
35
5.62k
        nullptr
36
5.62k
    };
37
5.62k
    state->events = events;
38
5.62k
    state->events->mem = state->mem;
39
40
5.62k
    return state;
41
5.62k
}
42
43
void tox_events_free(Tox_Events *events)
44
7.61k
{
45
7.61k
    if (events == nullptr) {
46
891
        return;
47
891
    }
48
49
363k
    for (uint32_t i = 0; i < events->events_size; ++i) {
50
357k
        tox_event_destruct(&events->events[i], events->mem);
51
357k
    }
52
53
6.72k
    mem_delete(events->mem, events->events);
54
6.72k
    mem_delete(events->mem, events);
55
6.72k
}
56
57
bool tox_events_add(Tox_Events *events, const Tox_Event *event)
58
357k
{
59
357k
    if (events->events_size == UINT32_MAX) {
60
0
        return false;
61
0
    }
62
63
357k
    if (events->events_size == events->events_capacity) {
64
22.5k
        const uint64_t new_events_capacity_64 = (uint64_t)events->events_capacity * 2 + 1;
65
66
22.5k
        if (new_events_capacity_64 > UINT32_MAX) {
67
0
            return false;
68
0
        }
69
70
22.5k
        const uint32_t new_events_capacity = (uint32_t)new_events_capacity_64;
71
22.5k
        Tox_Event *new_events = (Tox_Event *)mem_vrealloc(
72
22.5k
                                    events->mem, events->events, new_events_capacity, sizeof(Tox_Event));
73
74
22.5k
        if (new_events == nullptr) {
75
2
            return false;
76
2
        }
77
78
22.5k
        events->events = new_events;
79
22.5k
        events->events_capacity = new_events_capacity;
80
22.5k
    }
81
82
356k
    events->events[events->events_size] = *event;
83
356k
    ++events->events_size;
84
85
356k
    return true;
86
357k
}