|
if(pos < list->size)
{
int i = 0;
struct slist_node * p = list->head;
struct slist_node * prev = list->head;
for(; i < pos; i++)
{
prev = p;
p = p->next;
}
if(p == list->head)
{
/* replace at head */
node->next = list->head->next;
list->head = node;
}
else
{
prev->next = node;
node->next = p->next;
}
if(node->next == 0) list->tail = node;
if(list->free_node) list->free_node(p);
else free(p);
}
return list;
}
static struct slist_node * _find_by_key(struct single_list *list, void * key)
{
if(list->key_hit_test)
{
struct slist_node * p = list->head;
while(p)
{
if(list->key_hit_test(p, key) == 0) return p;
p = p->next;
}
}
return 0;
}
static struct slist_node *_first_of(struct single_list* list)
{
return list->head;
}
static struct slist_node *_last_of(struct single_list* list)
{
return list->tail;
}
static struct slist_node *_node_at(struct single_list * list, int pos)
{
if(pos < list->size)
{
int i = 0;
struct slist_node * p = list->head;
for(; i < pos; i++)
{
p = p->next;
}
return p;
}
return 0;
}
static struct slist_node * _take_at(struct single_list * list, int pos)
{
if(pos < list->size)
{
int i = 0;
struct slist_node * p = list->head;
struct slist_node * prev = p;
for(; i < pos ; i++)
{
prev = p;
p = p->next;
}
if(p == list->head)
{
list->head = p->next;
if(list->head == 0) list->tail = 0;
}
else if(p == list->tail)
{
list->tail = prev;
prev->next = 0;
}
else
{
prev->next = p->next;
}
list->size--;
p->next = 0;
return p;
}
return 0;
}
static struct slist_node * _take_by_key(struct single_list * list, void *key)
{
if(list->key_hit_test)
{
struct slist_node * p = list->head;
struct slist_node * prev = p;
while(p)
{
if(list->key_hit_test(p, key) == 0) break;
prev = p;
p = p->next;
}
if(p)
{
if(p == list->head)
{
list->head = p->next;
if(list->head == 0) list->tail = 0;
}
else if(p == list->tail)
{
list->tail = prev;
prev->next = 0;
}
else
{
prev->next = p->next;
}
list->size--;
p->next = 0;
return p;
}
}
return 0;
}
static struct single_list *_remove_node(struct single_list * list, struct slist_node * node)
{
struct slist_node * p = list->head;
struct slist_node * prev = p;
while(p)
{
if(p == node) break;
prev = p;
p = p->next;
}
if(p)
{
if(p == list->head)
{
list->head = list->head->next;
if(list->head == 0) list->tail = 0;
}
else if(p == list->tail)
{
prev->next = 0;
list->tail = prev;
}
else
{
prev->next = p->next;
}
if(list->free_node) list->free_node(p);
else free(p);
list->size--;
}
return list;
}
static struct single_list *_remove_at(struct single_list *list, int pos)
{
if(pos < list->size)
{
int i = 0;
struct slist_node * p = list->head;
struct slist_node * prev = p;
for(; i < pos ; i++)
{
prev = p;
p = p->next;
}
if(p == list->head)
{
list->head = p->next;
if(list->head == 0) list->tail = 0;
}
else if(p == list->tail)
{
list->tail = prev;
prev->next = 0;
}
else
{
prev->next = p->next;
}
if(list->free_node) list->free_node(p);
else free(p);
list->size--;
}
return list;
}
static struct single_list *_remove_by_key(struct single_list *list, void *key)
{
if(list->key_hit_test)
{
struct slist_node * p = list->head;
struct slist_node * prev = p;
while(p)
{
if(list->key_hit_test(p, key) == 0) break;
prev = p;
p = p->next;
}
if(p)
{
if(p == list->head)
{
list->head = list->head->next;
if(list->head == 0) list->tail = 0;
}
else if(p == list->tail)
{
prev->next = 0;
list->tail = prev;
}
else
{
prev->next = p->next;
}
if(list->free_node) list->free_node(p);
else free(p);
list->size--;
} |