|
|
BSD 4.3reno
/*
* Copyright (c) 1988, 1989, 1990 The Regents of the University of California.
* Copyright (c) 1988, 1989 by Adam de Boor
* Copyright (c) 1989 by Berkeley Softworks
* All rights reserved.
*
* This code is derived from software contributed to Berkeley by
* Adam de Boor.
*
* Redistribution and use in source and binary forms are permitted
* provided that: (1) source distributions retain this entire copyright
* notice and comment, and (2) distributions including binaries display
* the following acknowledgement: ``This product includes software
* developed by the University of California, Berkeley and its contributors''
* in the documentation or other materials provided with the distribution
* and in all advertising materials mentioning features or use of this
* software. Neither the name of the University nor the names of its
* contributors may be used to endorse or promote products derived
* from this software without specific prior written permission.
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
*/
#ifndef lint
static char sccsid[] = "@(#)list.c 5.4 (Berkeley) 6/1/90";
#endif /* not lint */
/* list.c -
*
* This file contains procedures for manipulating lists.
* Structures may be inserted into or deleted from lists, and
* they may be moved from one place in a list to another.
*
* The header file contains macros to help in determining the destination
* locations for List_Insert and List_Move. See list.h for details.
*/
#include "sprite.h"
#include "list.h"
/*
* ----------------------------------------------------------------------------
*
* List_Insert --
*
* Insert the list element pointed to by itemPtr into a List after
* destPtr. Perform a primitive test for self-looping by returning
* failure if the list element is being inserted next to itself.
*
* Results:
* None.
*
* Side effects:
* The list containing destPtr is modified to contain itemPtr.
*
* ----------------------------------------------------------------------------
*/
void
List_Insert(itemPtr, destPtr)
register List_Links *itemPtr; /* structure to insert */
register List_Links *destPtr; /* structure after which to insert it */
{
if (itemPtr == (List_Links *) NIL || destPtr == (List_Links *) NIL
|| !itemPtr || !destPtr || (itemPtr == destPtr)) {
Punt("List_Insert: inserting this item would create a loop.\n");
return;
}
itemPtr->nextPtr = destPtr->nextPtr;
itemPtr->prevPtr = destPtr;
destPtr->nextPtr->prevPtr = itemPtr;
destPtr->nextPtr = itemPtr;
}
/*
* ----------------------------------------------------------------------------
*
* List_Remove --
*
* Remove a list element from the list in which it is contained.
*
* Results:
* None.
*
* Side effects:
* The given structure is removed from its containing list.
*
* ----------------------------------------------------------------------------
*/
void
List_Remove(itemPtr)
register List_Links *itemPtr; /* list element to remove */
{
if (itemPtr == (List_Links *) NIL || itemPtr == itemPtr->nextPtr
|| !itemPtr) {
Punt("List_Remove: invalid item to remove.\n");
}
itemPtr->prevPtr->nextPtr = itemPtr->nextPtr;
itemPtr->nextPtr->prevPtr = itemPtr->prevPtr;
}
/*
* ----------------------------------------------------------------------------
*
* List_Move --
*
* Move the list element referenced by itemPtr to follow destPtr.
*
* Results:
* None.
*
* Side effects:
* List ordering is modified.
*
* ----------------------------------------------------------------------------
*/
void
List_Move(itemPtr, destPtr)
register List_Links *itemPtr; /* list element to be moved */
register List_Links *destPtr; /* element after which it is to be placed */
{
if (itemPtr == (List_Links *) NIL || destPtr == (List_Links *) NIL
|| !itemPtr || !destPtr) {
Punt("List_Move: One of the list items is NIL.\n");
}
/*
* It is conceivable that someone will try to move a list element to
* be after itself.
*/
if (itemPtr != destPtr) {
List_Remove(itemPtr);
List_Insert(itemPtr, destPtr);
}
}
/*
* ----------------------------------------------------------------------------
*
* List_Init --
*
* Initialize a header pointer to point to an empty list. The List_Links
* structure must already be allocated.
*
* Results:
* None.
*
* Side effects:
* The header's pointers are modified to point to itself.
*
* ----------------------------------------------------------------------------
*/
void
List_Init(headerPtr)
register List_Links *headerPtr; /* Pointer to a List_Links structure
to be header */
{
if (headerPtr == (List_Links *) NIL || !headerPtr) {
Punt("List_Init: invalid header pointer.\n");
}
headerPtr->nextPtr = headerPtr;
headerPtr->prevPtr = headerPtr;
}
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.