From 961136a41be89594c5a86b56af116c9c5af470a7 Mon Sep 17 00:00:00 2001 From: Danila Fedorin Date: Thu, 19 Jan 2017 23:32:09 -0800 Subject: [PATCH] Add internal function, mostly for memory allocation and concatenation. --- src/pattern.c | 131 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 131 insertions(+) diff --git a/src/pattern.c b/src/pattern.c index e69de29..dee0403 100644 --- a/src/pattern.c +++ b/src/pattern.c @@ -0,0 +1,131 @@ +#include "pattern.h" +#include +#include + +void _pattern_node_clear(pattern_node* to_clear){ + to_clear->type = PNODE_CLEAR; + to_clear->id = -1; + memset(&(to_clear->data_u), 0, sizeof(to_clear->data_u)); +} + +liblex_result _pattern_node_create_clear(pattern_node** into){ + liblex_result result = LIBLEX_SUCCESS; + *into = malloc(sizeof(**into)); + if(*into){ + _pattern_node_clear(*into); + } else { + result = LIBLEX_MALLOC; + } + return result; +} + +liblex_result _pattern_node_create_value(pattern_node** into, int id, char value, pattern_node* next){ + liblex_result result = _pattern_node_create_clear(into); + if(result == LIBLEX_SUCCESS){ + (*into)->id = id; + (*into)->data_u.value_s.value = value; + (*into)->data_u.value_s.next = next; + } + return result; +} + +liblex_result _pattern_node_create_range(pattern_node** into, int id, char from, char to, pattern_node* next){ + liblex_result result = _pattern_node_create_clear(into); + if(result == LIBLEX_SUCCESS){ + (*into)->id = id; + (*into)->data_u.range_s.from = from; + (*into)->data_u.range_s.to = to; + (*into)->data_u.range_s.next = next; + } + return result; +} + +liblex_result _pattern_node_create_any(pattern_node** into, int id, pattern_node* next){ + liblex_result result = _pattern_node_create_clear(into); + if(result == LIBLEX_SUCCESS){ + (*into)->id = id; + (*into)->data_u.any_s.next = next; + } + return result; +} + +liblex_result _pattern_node_create_connect(pattern_node** into, int id, pattern_node* next){ + liblex_result result = _pattern_node_create_clear(into); + if(result == LIBLEX_SUCCESS){ + (*into)->id = id; + (*into)->data_u.connect_s.next = next; + } + return result; +} + +liblex_result _pattern_node_create_fork(pattern_node** into, int id, pattern_node* left, pattern_node* right){ + liblex_result result = _pattern_node_create_clear(into); + if(result == LIBLEX_SUCCESS){ + (*into)->id = id; + (*into)->data_u.fork_s.left = left; + (*into)->data_u.fork_s.right = right; + } + return result; +} + +liblex_result _pattern_node_create_end(pattern_node** into, int id, int pattern_id){ + liblex_result result = _pattern_node_create_clear(into); + if(result == LIBLEX_SUCCESS){ + (*into)->id = id; + (*into)->data_u.end_s.pattern_id = pattern_id; + } + return result; +} + +liblex_result _pattern_chain_create(pattern_chain** into, pattern_node* from, pattern_node* to){ + liblex_result result = LIBLEX_SUCCESS; + *into = malloc(sizeof(**into)); + if(*into){ + (*into)->head = from; + (*into)->tail = to; + } else { + result = LIBLEX_SUCCESS; + } + return result; +} + +pattern_node** _pattern_node_get_next(pattern_node* node) { + pattern_node** next_node = NULL; + if(node->type == PNODE_ANY){ + next_node = &(node->data_u.any_s.next); + } else if(node->type == PNODE_RANGE){ + next_node = &(node->data_u.range_s.next); + } else if(node->type == PNODE_VALUE) { + next_node = &(node->data_u.value_s.next); + } else if(node->type == PNODE_CONNECT){ + next_node = &(node->data_u.connect_s.next); + } + return next_node; +} + +void _pattern_node_append_node(pattern_node* append_to, pattern_node* to_append){ + if(append_to && to_append){ + pattern_node** next_node = _pattern_node_get_next(append_to); + if(next_node){ + *next_node = to_append; + } + } +} + +void _pattern_chain_append_node(pattern_chain* append_to, pattern_node* to_append){ + if(append_to && to_append){ + pattern_node** next_node = (append_to->head) ? &append_to->head : _pattern_node_get_next(append_to->tail); + if(next_node) { + *next_node = append_to->tail = to_append; + } + } +} + +void _pattern_chain_append_chain(pattern_chain* append_to, pattern_chain* to_append){ + if(append_to && to_append){ + _pattern_chain_append_node(append_to, to_append->head); + if(to_append->tail) { + append_to->tail = to_append->tail; + } + } +}