Coverage Report

Created: 2024-05-03 06:05

/builds/xfbs/passgen/src/pattern/special.c
Line
Count
Source (jump to first uncovered line)
1
#include "passgen/pattern/special.h"
2
#include "passgen/assert.h"
3
#include "passgen/util/utf8.h"
4
#include <assert.h>
5
#include <stdbool.h>
6
#include <stdlib.h>
7
8
10
#define PARAMETERS_INITIAL_SIZE 16
9
8
#define PARAMETERS_MULTIPLIER   2
10
11
void passgen_pattern_special_init(
12
    passgen_pattern_special *special,
13
135
    uint32_t kind) {
14
135
    special->parameters_len = 0;
15
135
    special->parameters_cap = 0;
16
135
    special->parameters = NULL;
17
135
18
135
    switch(kind) {
19
41
        case 'm':
20
41
            special->kind = PASSGEN_PATTERN_SPECIAL_MARKOV;
21
41
            break;
22
49
        case 'w':
23
49
            special->kind = PASSGEN_PATTERN_SPECIAL_WORDLIST;
24
49
            break;
25
45
        case 'p':
26
45
            special->kind = PASSGEN_PATTERN_SPECIAL_PRESET;
27
45
            break;
28
0
        default:
29
0
            passgen_assert(false);
30
0
            break;
31
135
    }
32
135
}
33
34
135
void passgen_pattern_special_free(passgen_pattern_special *special) {
35
135
    free(special->parameters);
36
135
}
37
38
void passgen_pattern_special_push(
39
    passgen_pattern_special *special,
40
190
    int32_t codepoint) {
41
190
    if(special->parameters_cap == 0) {
42
10
        special->parameters_cap = PARAMETERS_INITIAL_SIZE;
43
10
        special->parameters = malloc(special->parameters_cap);
44
10
    }
45
190
46
190
    // always leave enough space for a full UTF8 character (4 bytes) plus a
47
190
    // NULL.
48
190
    if((special->parameters_len + 5) >= special->parameters_cap) {
49
8
        special->parameters_cap *= PARAMETERS_MULTIPLIER;
50
8
        special->parameters =
51
8
            realloc(special->parameters, special->parameters_cap);
52
8
    }
53
190
54
190
    int bytes = passgen_utf8_encode_codepoint(
55
190
        (uint8_t *) &special->parameters[special->parameters_len],
56
190
        codepoint);
57
190
58
190
    passgen_assert(bytes > 0);
59
190
    special->parameters_len += bytes;
60
190
61
190
    assert(special->parameters_len < special->parameters_cap);
62
190
63
190
    // always NULL-terminate the string.
64
190
    special->parameters[special->parameters_len] = 0;
65
190
}