Add internal function, mostly for memory allocation and concatenation.
This commit is contained in:
		
							parent
							
								
									e86518b716
								
							
						
					
					
						commit
						961136a41b
					
				
							
								
								
									
										131
									
								
								src/pattern.c
									
									
									
									
									
								
							
							
						
						
									
										131
									
								
								src/pattern.c
									
									
									
									
									
								
							| @ -0,0 +1,131 @@ | ||||
| #include "pattern.h" | ||||
| #include <stdlib.h> | ||||
| #include <string.h> | ||||
| 
 | ||||
| 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; | ||||
|     } | ||||
|   } | ||||
| } | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user