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