/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 | } |