head	1.4;
access;
symbols
	release_4_2:1.4
	aix_ok:1.4
	Version_2_1:1.4
	C_Demo_1:1.3;
locks; strict;
comment	@ * @;


1.4
date	90.09.25.16.22.57;	author kemnitz;	state Exp;
branches;
next	1.3;

1.3
date	89.09.05.17.02.42;	author mao;	state C_Demo_1;
branches;
next	1.2;

1.2
date	89.05.03.00.45.37;	author hirohama;	state Exp;
branches;
next	1.1;

1.1
date	89.05.02.17.11.18;	author hirohama;	state Exp;
branches;
next	;


desc
@@


1.4
log
@Updating from revision 1.3 to revision 1.5
@
text
@/*
 * oset.c --
 *	Fixed format ordered set definitions.
 *
 * Note:
 *	XXX This is a preliminary implementation which lacks fail-fast
 *	XXX validity checking of arguments.
 */

#include "tmp/c.h"

RcsId("$Header: RCS/oset.c,v 1.5 90/08/18 00:39:41 cimarron Exp $");

#include "utils/memutils.h"

/*
 * OrderedElemGetBase --
 *	Returns base of enclosing structure.
 */

Pointer
OrderedElemGetBase(elem)
	OrderedElem	elem;
{
	if (elem == (OrderedElem) NULL)
		return (Pointer) NULL;

	return ((Pointer)((char*)(elem) - (elem)->set->offset));
}

void
OrderedSetInit(set, offset)
	OrderedSet	set;
	Offset		offset;
{
	set->head = (OrderedElem)&set->dummy;
	set->dummy = NULL;
	set->tail = (OrderedElem)&set->head;
	set->offset = offset;
}

void
OrderedElemInit(elem, set)
	OrderedElem	elem;
	OrderedSet	set;
{
	elem->set = set;
	/* mark as unattached */
	elem->next = NULL;
	elem->prev = NULL;
}

bool
OrderedSetContains(set, elem)
	OrderedSet	set;
	OrderedElem	elem;
{
	return ((bool)(elem->set == set && (elem->next || elem->prev)));
}

Pointer
OrderedSetGetHead(set)
	register OrderedSet	set;
{
	register OrderedElem	elem;

	elem = set->head;
	if (elem->next) {
		return (OrderedElemGetBase(elem));
	}
	return (NULL);
}

Pointer
OrderedSetGetTail(set)
	register OrderedSet	set;
{
	register OrderedElem	elem;

	elem = set->tail;
	if (elem->prev) {
		return (OrderedElemGetBase(elem));
	}
	return (NULL);
}

Pointer
OrderedElemGetPredecessor(elem)
	register OrderedElem	elem;
{
	elem = elem->prev;
	if (elem->prev) {
		return (OrderedElemGetBase(elem));
	}
	return (NULL);
}

Pointer
OrderedElemGetSuccessor(elem)
	register OrderedElem	elem;
{
	elem = elem->next;
	if (elem->next) {
		return (OrderedElemGetBase(elem));
	}
	return (NULL);
}

void
OrderedElemPop(elem)
	register OrderedElem	elem;
{
	elem->next->prev = elem->prev;
	elem->prev->next = elem->next;
	/* assignments used only for error detection */
	elem->next = NULL;
	elem->prev = NULL;
}

void
OrderedElemPushInto(elem, set)
	OrderedElem	elem;
	OrderedSet	set;
{
	OrderedElemInit(elem, set);
	OrderedElemPush(elem);
}

void
OrderedElemPush(elem)
	OrderedElem	elem;
{
	OrderedElemPushHead(elem);
}

void
OrderedElemPushHead(elem)
	register OrderedElem	elem;
{
	elem->next = elem->set->head;
	elem->prev = (OrderedElem)&elem->set->head;
	elem->next->prev = elem;
	elem->prev->next = elem;
}

void
OrderedElemPushTail(elem)
	register OrderedElem	elem;
{
	elem->next = (OrderedElem)&elem->set->dummy;
	elem->prev = elem->set->tail;
	elem->next->prev = elem;
	elem->prev->next = elem;
}

void
OrderedElemPushAfter(elem, oldElem)
	register OrderedElem	elem;
	register OrderedElem	oldElem;
{
	elem->next = oldElem->next;
	elem->prev = oldElem;
	oldElem->next = elem;
	elem->next->prev = elem;
}

void
OrderedElemPushBefore(elem, oldElem)
	register OrderedElem	elem;
	register OrderedElem	oldElem;
{
	elem->next = oldElem;
	elem->prev = oldElem->prev;
	oldElem->prev = elem;
	elem->prev->next = elem;
}

Pointer
OrderedSetPop(set)
	OrderedSet	set;
{
	return (OrderedSetPopHead(set));
}

Pointer
OrderedSetPopHead(set)
	register OrderedSet	set;
{
	register OrderedElem elem = set->head;

	if (elem != NULL && elem->next) {
		OrderedElemPop(elem);
		return (OrderedElemGetBase(elem));
	}
	return (NULL);
}

Pointer
OrderedSetPopTail(set)
	register OrderedSet	set;
{
	register OrderedElem elem = set->tail;

	if (elem != NULL && elem->prev) {
		OrderedElemPop(elem);
		return (OrderedElemGetBase(elem));
	}
	return (NULL);
}
@


1.3
log
@Working version of C-only demo
@
text
@d10 1
a10 1
#include "c.h"
d12 1
a12 1
RcsId("$Header: RCS/oset.c,v 1.2 89/05/03 00:45:37 hirohama Exp $");
d14 1
a14 1
#include "oset.h"
@


1.2
log
@added OrderedElemPushInto
@
text
@d12 1
a12 1
RcsId("$Header: /usr6/postgres/hirohama/postgres/src/lib/C/RCS/oset.c,v 1.1 89/05/02 17:11:18 hirohama Exp $");
a19 1
#define OrderedElemGetBase(elem) ((Pointer)((char*)(elem) - (elem)->set->offset))
d21 10
d191 1
a191 1
	if (elem->next) {
d204 1
a204 1
	if (elem->prev) {
@


1.1
log
@Initial revision
@
text
@d4 4
d12 1
a12 1
RcsId("$Header$");
d109 9
@
