120 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
		
		
			
		
	
	
			120 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
|  | /*
 | ||
|  | Copyright (C) 2015-2019 The University of Notre Dame | ||
|  | This software is distributed under the GNU General Public License. | ||
|  | See the file LICENSE for details. | ||
|  | */ | ||
|  | 
 | ||
|  | #include "list.h"
 | ||
|  | 
 | ||
|  | void list_push_head(struct list *list, struct list_node *node) | ||
|  | { | ||
|  | 	node->next = list->head; | ||
|  | 	node->prev = 0; | ||
|  | 	node->priority = 0; | ||
|  | 	if(list->head) | ||
|  | 		list->head->prev = node; | ||
|  | 	list->head = node; | ||
|  | 	if(!list->tail) | ||
|  | 		list->tail = node; | ||
|  | 	node->list = list; | ||
|  | 	list->size++; | ||
|  | } | ||
|  | 
 | ||
|  | void list_push_tail(struct list *list, struct list_node *node) | ||
|  | { | ||
|  | 	node->prev = list->tail; | ||
|  | 	node->next = 0; | ||
|  | 	node->priority = 0; | ||
|  | 	if(list->tail) | ||
|  | 		list->tail->next = node; | ||
|  | 	list->tail = node; | ||
|  | 	if(!list->head) | ||
|  | 		list->head = node; | ||
|  | 	node->list = list; | ||
|  | 	list->size++; | ||
|  | } | ||
|  | 
 | ||
|  | void list_push_priority(struct list *list, struct list_node *node, int pri) | ||
|  | { | ||
|  | 	struct list_node *n; | ||
|  | 	int i = 0; | ||
|  | 	if(!list->head) { | ||
|  | 		list_push_head(list, node); | ||
|  | 		return; | ||
|  | 	} | ||
|  | 	for(n = list->head; n; n = n->next) { | ||
|  | 		if(pri > n->priority || i > 5000) { | ||
|  | 			node->next = n; | ||
|  | 			node->prev = n->prev; | ||
|  | 			node->priority = pri; | ||
|  | 			if(n->prev) { | ||
|  | 				n->prev->next = node; | ||
|  | 			} else { | ||
|  | 				list->head = node; | ||
|  | 			} | ||
|  | 			n->prev = node; | ||
|  | 			node->list = list; | ||
|  | 			list->size++; | ||
|  | 			return; | ||
|  | 		} | ||
|  | 		i++; | ||
|  | 	} | ||
|  | 	list_push_tail(list, node); | ||
|  | } | ||
|  | 
 | ||
|  | struct list_node *list_pop_head(struct list *list) | ||
|  | { | ||
|  | 	struct list_node *result = list->head; | ||
|  | 	if(list->head) { | ||
|  | 		list->head = list->head->next; | ||
|  | 		if(list->head) | ||
|  | 			list->head->prev = 0; | ||
|  | 		if(!list->head) | ||
|  | 			list->tail = 0; | ||
|  | 		result->next = result->prev = 0; | ||
|  | 		result->list = 0; | ||
|  | 		list->size--; | ||
|  | 	} | ||
|  | 	return result; | ||
|  | } | ||
|  | 
 | ||
|  | struct list_node *list_pop_tail(struct list *list) | ||
|  | { | ||
|  | 	struct list_node *result = list->tail; | ||
|  | 	if(list->tail) { | ||
|  | 		list->tail = list->tail->prev; | ||
|  | 		if(list->tail) | ||
|  | 			list->tail->next = 0; | ||
|  | 		if(!list->tail) | ||
|  | 			list->head = 0; | ||
|  | 		result->next = result->prev = 0; | ||
|  | 		result->list = 0; | ||
|  | 		list->size--; | ||
|  | 	} | ||
|  | 	return result; | ||
|  | } | ||
|  | 
 | ||
|  | void list_remove(struct list_node *node) | ||
|  | { | ||
|  | 	if(!node->list) | ||
|  | 		return; | ||
|  | 	if(node->list->head == node) { | ||
|  | 		list_pop_head(node->list); | ||
|  | 		return; | ||
|  | 	} | ||
|  | 	if(node->list->tail == node) { | ||
|  | 		list_pop_tail(node->list); | ||
|  | 		return; | ||
|  | 	} | ||
|  | 	node->next->prev = node->prev; | ||
|  | 	node->prev->next = node->next; | ||
|  | 	node->next = node->prev = 0; | ||
|  | 	node->list = 0; | ||
|  | 	node->list->size--; | ||
|  | } | ||
|  | 
 | ||
|  | int list_size( struct list *list ) | ||
|  | { | ||
|  | 	return list->size; | ||
|  | } |