1996-07-09 08:22:35 +02:00
|
|
|
/*-------------------------------------------------------------------------
|
|
|
|
*
|
|
|
|
* dllist.c--
|
1997-09-07 07:04:48 +02:00
|
|
|
* this is a simple doubly linked list implementation
|
|
|
|
* replaces the old simplelists stuff
|
|
|
|
* the elements of the lists are void*
|
1996-07-09 08:22:35 +02:00
|
|
|
*
|
|
|
|
* Copyright (c) 1994, Regents of the University of California
|
|
|
|
*
|
|
|
|
*
|
|
|
|
* IDENTIFICATION
|
1997-09-07 07:04:48 +02:00
|
|
|
* $Header: /cvsroot/pgsql/src/backend/lib/dllist.c,v 1.6 1997/09/07 04:41:56 momjian Exp $
|
1996-07-09 08:22:35 +02:00
|
|
|
*
|
|
|
|
*-------------------------------------------------------------------------
|
|
|
|
*/
|
|
|
|
|
1996-11-06 09:27:16 +01:00
|
|
|
#include <postgres.h>
|
1996-10-31 11:26:33 +01:00
|
|
|
|
1996-11-06 09:27:16 +01:00
|
|
|
#include <lib/dllist.h>
|
1996-07-09 08:22:35 +02:00
|
|
|
|
1997-09-07 07:04:48 +02:00
|
|
|
Dllist *
|
1996-11-10 04:06:38 +01:00
|
|
|
DLNewList(void)
|
1996-07-09 08:22:35 +02:00
|
|
|
{
|
1997-09-07 07:04:48 +02:00
|
|
|
Dllist *l;
|
1996-07-09 08:22:35 +02:00
|
|
|
|
1997-09-07 07:04:48 +02:00
|
|
|
l = malloc(sizeof(Dllist));
|
|
|
|
l->dll_head = 0;
|
|
|
|
l->dll_tail = 0;
|
1996-07-09 08:22:35 +02:00
|
|
|
|
1997-09-07 07:04:48 +02:00
|
|
|
return l;
|
1996-07-09 08:22:35 +02:00
|
|
|
}
|
|
|
|
|
1997-09-07 07:04:48 +02:00
|
|
|
/* free up a list and all the nodes in it */
|
1996-07-09 08:22:35 +02:00
|
|
|
void
|
1997-09-07 07:04:48 +02:00
|
|
|
DLFreeList(Dllist * l)
|
1996-07-09 08:22:35 +02:00
|
|
|
{
|
1997-09-07 07:04:48 +02:00
|
|
|
Dlelem *curr;
|
1996-07-09 08:22:35 +02:00
|
|
|
|
1997-09-07 07:04:48 +02:00
|
|
|
while ((curr = DLRemHead(l)) != 0)
|
|
|
|
free(curr);
|
1996-07-09 08:22:35 +02:00
|
|
|
|
1997-09-07 07:04:48 +02:00
|
|
|
free(l);
|
1996-07-09 08:22:35 +02:00
|
|
|
}
|
|
|
|
|
1997-09-07 07:04:48 +02:00
|
|
|
Dlelem *
|
|
|
|
DLNewElem(void *val)
|
1996-07-09 08:22:35 +02:00
|
|
|
{
|
1997-09-07 07:04:48 +02:00
|
|
|
Dlelem *e;
|
|
|
|
|
|
|
|
e = malloc(sizeof(Dlelem));
|
|
|
|
e->dle_next = 0;
|
|
|
|
e->dle_prev = 0;
|
|
|
|
e->dle_val = val;
|
|
|
|
e->dle_list = 0;
|
|
|
|
return e;
|
1996-07-09 08:22:35 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
void
|
1997-09-07 07:04:48 +02:00
|
|
|
DLFreeElem(Dlelem * e)
|
1996-07-09 08:22:35 +02:00
|
|
|
{
|
1997-09-07 07:04:48 +02:00
|
|
|
free(e);
|
1996-07-09 08:22:35 +02:00
|
|
|
}
|
|
|
|
|
1997-09-07 07:04:48 +02:00
|
|
|
Dlelem *
|
|
|
|
DLGetHead(Dllist * l)
|
1996-07-09 08:22:35 +02:00
|
|
|
{
|
1997-09-07 07:04:48 +02:00
|
|
|
return (l ? l->dll_head : 0);
|
1996-07-09 08:22:35 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
/* get the value stored in the first element */
|
1997-08-19 23:40:56 +02:00
|
|
|
#ifdef NOT_USED
|
1997-09-07 07:04:48 +02:00
|
|
|
void *
|
|
|
|
DLGetHeadVal(Dllist * l)
|
1996-07-09 08:22:35 +02:00
|
|
|
{
|
1997-09-07 07:04:48 +02:00
|
|
|
Dlelem *e = DLGetHead(l);
|
|
|
|
|
|
|
|
return (e ? e->dle_val : 0);
|
1996-07-09 08:22:35 +02:00
|
|
|
}
|
1997-09-07 07:04:48 +02:00
|
|
|
|
1997-08-19 23:40:56 +02:00
|
|
|
#endif
|
1996-07-09 08:22:35 +02:00
|
|
|
|
1997-09-07 07:04:48 +02:00
|
|
|
Dlelem *
|
|
|
|
DLGetTail(Dllist * l)
|
1996-07-09 08:22:35 +02:00
|
|
|
{
|
1997-09-07 07:04:48 +02:00
|
|
|
return (l ? l->dll_tail : 0);
|
1996-07-09 08:22:35 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
/* get the value stored in the first element */
|
1997-08-19 23:40:56 +02:00
|
|
|
#ifdef NOT_USED
|
1997-09-07 07:04:48 +02:00
|
|
|
void *
|
|
|
|
DLGetTailVal(Dllist * l)
|
1996-07-09 08:22:35 +02:00
|
|
|
{
|
1997-09-07 07:04:48 +02:00
|
|
|
Dlelem *e = DLGetTail(l);
|
|
|
|
|
|
|
|
return (e ? e->dle_val : 0);
|
1996-07-09 08:22:35 +02:00
|
|
|
}
|
1997-09-07 07:04:48 +02:00
|
|
|
|
1997-08-19 23:40:56 +02:00
|
|
|
#endif
|
1996-07-09 08:22:35 +02:00
|
|
|
|
1997-09-07 07:04:48 +02:00
|
|
|
Dlelem *
|
|
|
|
DLGetPred(Dlelem * e) /* get predecessor */
|
1996-07-09 08:22:35 +02:00
|
|
|
{
|
1997-09-07 07:04:48 +02:00
|
|
|
return (e ? e->dle_prev : 0);
|
1996-07-09 08:22:35 +02:00
|
|
|
}
|
|
|
|
|
1997-09-07 07:04:48 +02:00
|
|
|
Dlelem *
|
|
|
|
DLGetSucc(Dlelem * e) /* get successor */
|
1996-07-09 08:22:35 +02:00
|
|
|
{
|
1997-09-07 07:04:48 +02:00
|
|
|
return (e ? e->dle_next : 0);
|
1996-07-09 08:22:35 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
void
|
1997-09-07 07:04:48 +02:00
|
|
|
DLRemove(Dlelem * e)
|
1996-07-09 08:22:35 +02:00
|
|
|
{
|
1997-09-07 07:04:48 +02:00
|
|
|
Dllist *l;
|
1996-07-09 08:22:35 +02:00
|
|
|
|
1997-09-07 07:04:48 +02:00
|
|
|
if (e->dle_prev)
|
|
|
|
e->dle_prev->dle_next = e->dle_next;
|
|
|
|
if (e->dle_next)
|
|
|
|
e->dle_next->dle_prev = e->dle_prev;
|
1996-07-09 08:22:35 +02:00
|
|
|
|
1997-09-07 07:04:48 +02:00
|
|
|
/* check to see if we're removing the head or tail */
|
|
|
|
l = e->dle_list;
|
|
|
|
if (e == l->dll_head)
|
|
|
|
DLRemHead(l);
|
|
|
|
if (e == l->dll_tail)
|
|
|
|
DLRemTail(l);
|
1996-07-09 08:22:35 +02:00
|
|
|
|
|
|
|
}
|
|
|
|
|
1997-09-07 07:04:48 +02:00
|
|
|
void
|
|
|
|
DLAddHead(Dllist * l, Dlelem * e)
|
1996-07-09 08:22:35 +02:00
|
|
|
{
|
1997-09-07 07:04:48 +02:00
|
|
|
e->dle_list = l;
|
|
|
|
|
|
|
|
if (l->dll_head)
|
|
|
|
{
|
|
|
|
l->dll_head->dle_prev = e;
|
|
|
|
e->dle_next = l->dll_head;
|
|
|
|
}
|
|
|
|
e->dle_prev = 0;
|
|
|
|
l->dll_head = e;
|
|
|
|
|
|
|
|
if (l->dll_tail == 0) /* if this is first element added */
|
|
|
|
l->dll_tail = l->dll_head;
|
1996-07-09 08:22:35 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
void
|
1997-09-07 07:04:48 +02:00
|
|
|
DLAddTail(Dllist * l, Dlelem * e)
|
1996-07-09 08:22:35 +02:00
|
|
|
{
|
1997-09-07 07:04:48 +02:00
|
|
|
e->dle_list = l;
|
|
|
|
|
|
|
|
if (l->dll_tail)
|
|
|
|
{
|
|
|
|
l->dll_tail->dle_next = e;
|
|
|
|
e->dle_prev = l->dll_tail;
|
|
|
|
}
|
|
|
|
e->dle_next = 0;
|
|
|
|
l->dll_tail = e;
|
|
|
|
|
|
|
|
if (l->dll_head == 0) /* if this is first element added */
|
|
|
|
l->dll_head = l->dll_tail;
|
1996-07-09 08:22:35 +02:00
|
|
|
}
|
|
|
|
|
1997-09-07 07:04:48 +02:00
|
|
|
Dlelem *
|
|
|
|
DLRemHead(Dllist * l)
|
1996-07-09 08:22:35 +02:00
|
|
|
{
|
1997-09-07 07:04:48 +02:00
|
|
|
/* remove and return the head */
|
|
|
|
Dlelem *result;
|
1996-07-09 08:22:35 +02:00
|
|
|
|
1997-09-07 07:04:48 +02:00
|
|
|
if (l->dll_head == 0)
|
|
|
|
return 0;
|
1996-07-09 08:22:35 +02:00
|
|
|
|
1997-09-07 07:04:48 +02:00
|
|
|
result = l->dll_head;
|
|
|
|
if (l->dll_head->dle_next)
|
|
|
|
{
|
|
|
|
l->dll_head->dle_next->dle_prev = 0;
|
|
|
|
}
|
1996-07-09 08:22:35 +02:00
|
|
|
|
1997-09-07 07:04:48 +02:00
|
|
|
l->dll_head = l->dll_head->dle_next;
|
1996-07-09 08:22:35 +02:00
|
|
|
|
1997-09-07 07:04:48 +02:00
|
|
|
result->dle_next = 0;
|
|
|
|
result->dle_list = 0;
|
1996-07-09 08:22:35 +02:00
|
|
|
|
1997-09-07 07:04:48 +02:00
|
|
|
if (result == l->dll_tail) /* if the head is also the tail */
|
|
|
|
l->dll_tail = 0;
|
|
|
|
|
|
|
|
return result;
|
1996-07-09 08:22:35 +02:00
|
|
|
}
|
|
|
|
|
1997-09-07 07:04:48 +02:00
|
|
|
Dlelem *
|
|
|
|
DLRemTail(Dllist * l)
|
1996-07-09 08:22:35 +02:00
|
|
|
{
|
1997-09-07 07:04:48 +02:00
|
|
|
/* remove and return the tail */
|
|
|
|
Dlelem *result;
|
1996-07-09 08:22:35 +02:00
|
|
|
|
1997-09-07 07:04:48 +02:00
|
|
|
if (l->dll_tail == 0)
|
|
|
|
return 0;
|
1996-07-09 08:22:35 +02:00
|
|
|
|
1997-09-07 07:04:48 +02:00
|
|
|
result = l->dll_tail;
|
|
|
|
if (l->dll_tail->dle_prev)
|
|
|
|
{
|
|
|
|
l->dll_tail->dle_prev->dle_next = 0;
|
|
|
|
}
|
|
|
|
l->dll_tail = l->dll_tail->dle_prev;
|
1996-07-09 08:22:35 +02:00
|
|
|
|
1997-09-07 07:04:48 +02:00
|
|
|
result->dle_prev = 0;
|
|
|
|
result->dle_list = 0;
|
1996-07-09 08:22:35 +02:00
|
|
|
|
1997-09-07 07:04:48 +02:00
|
|
|
if (result == l->dll_head) /* if the tail is also the head */
|
|
|
|
l->dll_head = 0;
|
1996-07-09 08:22:35 +02:00
|
|
|
|
1997-09-07 07:04:48 +02:00
|
|
|
return result;
|
1996-07-09 08:22:35 +02:00
|
|
|
}
|