magic/utils/list.c

183 lines
4.6 KiB
C

/* list.c -
*
* Routines to create and manipulate lisp style lists.
* A separate structure is used to link list elements together.
* Thus list elements do not require pointers and can be anything.
*
* *********************************************************************
* * Copyright (C) 1985, 1990 Regents of the University of California. *
* * 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 appear in all copies. The University of California *
* * makes no representations about the suitability of this *
* * software for any purpose. It is provided "as is" without *
* * express or implied warranty. Export of this software outside *
* * of the United States of America may require an export license. *
* *********************************************************************
*/
#ifndef lint
static char rcsid[] __attribute__ ((unused)) = "$Header: /usr/cvsroot/magic-8.0/utils/list.c,v 1.1.1.1 2008/02/03 20:43:50 tim Exp $";
#endif /* not lint */
#include <stdio.h>
#include "utils/magic.h"
#include "utils/utils.h"
#include "utils/malloc.h"
#include "utils/list.h"
/* ----------------------------------------------------------------------------
* ListPop --
* Returns top data item on list, deallocates top list element, and
* points list pointer to tail of list.
*
* Results:
* First data item on list.
*
* Side effects:
* Deallocates head of list, and changes pointer to tail of list.
* ----------------------------------------------------------------------------
*/
ClientData
ListPop(listPP)
List ** listPP; /* Pointer to pointer to list to pop */
{
List *head = *listPP;
ClientData result = LIST_FIRST(head);
(*listPP) = LIST_TAIL(head);
freeMagic((char *) head);
return result;
}
/* ----------------------------------------------------------------------------
* ListContainsP --
* Check if list contains given element.
*
* Results:
* TRUE if element in list.
*
* Side effects:
* None.
* ----------------------------------------------------------------------------
*/
bool
ListContainsP(element,list)
ClientData element; /* element to check for */
List *list; /* List to search */
{
for(;list!=NULL && LIST_FIRST(list)!=element; list=LIST_TAIL(list))
; /* Null body */
return list!=NULL;
}
/* ----------------------------------------------------------------------------
* ListDealloc --
* Deallocate list strucs in list.
*
* Results:
* None.
*
* Side effects:
* Storage reclaimed.
*
* NOTE: Remember to set pointers to lists to null after deallocating
* the list (if pointers are to be used again)!
* ----------------------------------------------------------------------------
*/
void
ListDealloc(list)
List *list; /* List to free */
{
for(;list!=NULL; list=LIST_TAIL(list))
freeMagic((char *) list);
return;
}
/* ----------------------------------------------------------------------------
* ListDeallocC --
* Deallocate list strucs in list AND CONTENTS of list.
*
* Results:
* None.
*
* Side effects:
* Storage reclaimed.
*
* NOTE: Remember to set pointers to lists to null after deallocating
* the list (if pointers are to be used again)!
* ----------------------------------------------------------------------------
*/
void
ListDeallocC(list)
List *list; /* List to free */
{
for(;list!=NULL; list=LIST_TAIL(list))
{
freeMagic((char *) LIST_FIRST(list));
freeMagic((char *) list);
}
return;
}
/* ----------------------------------------------------------------------------
* ListLength --
* Count number of elements in list.
*
* Results:
* Returns number of elements in list
*
* Side effects:
* None.
* ----------------------------------------------------------------------------
*/
int
ListLength(list)
List *list; /* List to search */
{
int count = 0;
for(;list!=NULL; list=LIST_TAIL(list))
count++;
return count;
}
/* ----------------------------------------------------------------------------
* ListReverse --
* Make reversed copy of list.
*
* Results:
* Pointer to reverse copy of list.
*
* Side effects:
* Allocates and builds new list.
* ----------------------------------------------------------------------------
*/
List *
ListReverse(list)
List *list; /* List to search */
{
List *revList = NULL;
for(; list!=NULL; list=LIST_TAIL(list))
LIST_ADD(LIST_FIRST(list),revList);
return revList;
}