* Remove an element from a list
* Copyright (c) 1988 by University of California Regents
* Permission to use, copy, modify, and distribute this
* software and its documentation for any purpose and without
* fee is hereby granted, provided that the above copyright
* notice appears in all copies. Neither the University of California nor
* Adam de Boor makes any representations about the suitability of this
* software for any purpose. It is provided "as is" without
* express or implied warranty.
"$Id: lstRemove.c,v 1.7 89/06/13 15:01:51 adam Exp $ SPRITE (Berkeley)";
*-----------------------------------------------------------------------
* Remove the given node from the given list.
* The list's firstPtr will be set to NilListNode if ln is the last
* node on the list. firsPtr and lastPtr will be altered if ln is
* either the first or last node, respectively, on the list.
*-----------------------------------------------------------------------
register List list
= (List
) l
;
register ListNode lNode
= (ListNode
) ln
;
* unlink it from the list
if (lNode
->nextPtr
!= NilListNode
) {
lNode
->nextPtr
->prevPtr
= lNode
->prevPtr
;
if (lNode
->prevPtr
!= NilListNode
) {
lNode
->prevPtr
->nextPtr
= lNode
->nextPtr
;
* if either the firstPtr or lastPtr of the list point to this node,
* adjust them accordingly
if (list
->firstPtr
== lNode
) {
list
->firstPtr
= lNode
->nextPtr
;
if (list
->lastPtr
== lNode
) {
list
->lastPtr
= lNode
->prevPtr
;
* Sequential access stuff. If the node we're removing is the current
* node in the list, reset the current node to the previous one. If the
* previous one was non-existent (prevPtr == NilListNode), we set the
* end to be Unknown, since it is.
if (list
->isOpen
&& (list
->curPtr
== lNode
)) {
list
->curPtr
= list
->prevPtr
;
if (list
->curPtr
== NilListNode
) {
* the only way firstPtr can still point to ln is if ln is the last
* node on the list (the list is circular, so lNode->nextptr == lNode in
* this case). The list is, therefore, empty and is marked as such
if (list
->firstPtr
== lNode
) {
list
->firstPtr
= NilListNode
;
* note that the datum is unmolested. The caller must free it as
* necessary and as expected.
if (lNode
->useCount
== 0) {
lNode
->flags
|= LN_DELETED
;