Coverage Report

Created: 2024-05-03 06:05

/builds/xfbs/passgen/src/pattern/group.c
Line
Count
Source
1
#include "passgen/pattern/group.h"
2
3
#include "passgen/pattern/segment.h"
4
5
33.3k
void passgen_pattern_group_init(passgen_pattern_group *group) {
6
33.3k
    passgen_stack_init(&group->segments, sizeof(passgen_pattern_segment));
7
33.3k
    group->multiplier_sum = 0;
8
33.3k
}
9
10
33.3k
void passgen_pattern_group_free(passgen_pattern_group *group) {
11
69.9k
    for(size_t i = 0; i < group->segments.len; 
i++36.5k
) {
12
36.5k
        passgen_pattern_segment *segment =
13
36.5k
            passgen_stack_get(&group->segments, i);
14
36.5k
15
36.5k
        passgen_pattern_segment_free(segment);
16
36.5k
    }
17
33.3k
18
33.3k
    passgen_stack_free(&group->segments);
19
33.3k
}
20
21
362
void passgen_pattern_group_finish(passgen_pattern_group *group) {
22
362
    // iterate through the segments and find out if there are any non-empty
23
362
    // ones.
24
362
    bool empty = true;
25
760
    for(size_t i = 0; i < group->segments.len; 
i++398
) {
26
398
        passgen_pattern_segment *segment =
27
398
            passgen_stack_get(&group->segments, i);
28
398
29
398
        // make this as non-empty only if it has items and a non-zero
30
398
        // multiplier. zero multiplier segments are removed during parsing,
31
398
        // so we can assume that all segments have a positive multiplier.
32
398
        if(segment->items.len > 0) {
33
249
            empty = false;
34
249
        }
35
398
    }
36
362
37
362
    // if no non-empty segments were found, set the multiplier sum to zero to
38
362
    // indicate that this group can be removed.
39
362
    if(empty) {
40
147
        group->multiplier_sum = 0;
41
147
    }
42
362
}
43
44
passgen_pattern_segment *
45
36.5k
passgen_pattern_group_segment_append(passgen_pattern_group *group) {
46
36.5k
    group->multiplier_sum += 1;
47
36.5k
    passgen_pattern_segment *segment =
48
36.5k
        passgen_stack_push(&group->segments, NULL);
49
36.5k
    passgen_pattern_segment_init(segment);
50
36.5k
51
36.5k
    return segment;
52
36.5k
}
53
54
passgen_pattern_segment *
55
130
passgen_pattern_group_segment_get(passgen_pattern_group *group, size_t n) {
56
130
    return passgen_stack_get(&group->segments, n);
57
130
}