lisp-take-1/gc/linked_list/remove.c

67 lines
835 B
C

#include <assert.h>
#include <debug.h>
#include "struct.h"
#include "remove.h"
void linked_list_remove(
struct linked_list* list,
struct value* element,
size_t link_offset)
{
ENTER;
assert(list->head);
struct link* link = (void*) element + link_offset;
assert(link->in_set);
if (link->prev)
{
struct link* prev_link = (void*) link->prev + link_offset;
prev_link->next = link->next;
}
else
{
list->head = link->next;
}
if (link->next)
{
struct link* next_link = (void*) link->next + link_offset;
next_link->prev = link->prev;
}
else
{
list->tail = link->prev;
}
link->prev = link->next = NULL;
link->in_set = false;
EXIT;
}