LCOV - code coverage report
Current view: top level - src/pattern - group.c (source / functions) Hit Total Coverage
Test: passgen-test.info Lines: 26 26 100.0 %
Date: 2024-04-26 06:05:40 Functions: 5 5 100.0 %

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

Generated by: LCOV version 1.14