Line data Source code
1 : #include "passgen/pattern/segment.h" 2 : #include "passgen/container/stack.h" 3 : #include "passgen/pattern/group.h" 4 : #include "passgen/pattern/literal.h" 5 : #include "passgen/pattern/repeat.h" 6 : #include "passgen/pattern/segment_item.h" 7 : #include "passgen/pattern/set.h" 8 : 9 36458 : void passgen_pattern_segment_init(passgen_pattern_segment *segment) { 10 36458 : segment->multiplier = 1; 11 36458 : passgen_stack_init(&segment->items, sizeof(passgen_pattern_item)); 12 36458 : } 13 : 14 36458 : void passgen_pattern_segment_free(passgen_pattern_segment *segment) { 15 108295 : for(size_t i = 0; i < segment->items.len; i++) { 16 71837 : passgen_pattern_item *item = passgen_stack_get(&segment->items, i); 17 : 18 71837 : passgen_pattern_item_free(item); 19 : } 20 : 21 36458 : passgen_stack_free(&segment->items); 22 36458 : } 23 : 24 : passgen_pattern_item * 25 71990 : passgen_pattern_segment_new_item(passgen_pattern_segment *segment) { 26 71990 : passgen_pattern_item *item = passgen_stack_push(&segment->items, NULL); 27 71990 : passgen_pattern_item_init(item); 28 : 29 71990 : return item; 30 : } 31 : 32 : passgen_pattern_literal * 33 62262 : passgen_pattern_segment_new_char(passgen_pattern_segment *segment) { 34 62262 : passgen_pattern_item *item = passgen_pattern_segment_new_item(segment); 35 62262 : item->kind = PASSGEN_PATTERN_LITERAL; 36 62262 : passgen_pattern_literal_init(&item->data.literal); 37 : 38 62262 : return &item->data.literal; 39 : } 40 : 41 : passgen_pattern_set * 42 3146 : passgen_pattern_segment_new_set(passgen_pattern_segment *segment) { 43 3146 : passgen_pattern_item *item = passgen_pattern_segment_new_item(segment); 44 3146 : item->kind = PASSGEN_PATTERN_SET; 45 3146 : passgen_pattern_set_init(&item->data.set); 46 : 47 3146 : return &item->data.set; 48 : } 49 : 50 : passgen_pattern_group * 51 3172 : passgen_pattern_segment_new_group(passgen_pattern_segment *segment) { 52 3172 : passgen_pattern_item *item = passgen_pattern_segment_new_item(segment); 53 3172 : item->kind = PASSGEN_PATTERN_GROUP; 54 3172 : passgen_pattern_group_init(&item->data.group); 55 : 56 3172 : return &item->data.group; 57 : } 58 : 59 : passgen_pattern_special * 60 129 : passgen_pattern_segment_new_special(passgen_pattern_segment *segment) { 61 129 : passgen_pattern_item *item = passgen_pattern_segment_new_item(segment); 62 129 : item->kind = PASSGEN_PATTERN_SPECIAL; 63 : 64 129 : return &item->data.special; 65 : } 66 : 67 : passgen_pattern_item * 68 35 : passgen_pattern_segment_get_item(passgen_pattern_segment *segment, size_t n) { 69 35 : return passgen_stack_get(&segment->items, n); 70 : }