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