boot3/ProcessMgr/Queue.c
Elliot Nunn 5b0f0cc134 Bring in CubeE sources
Resource forks are included only for .rsrc files. These are DeRezzed into their data fork. 'ckid' resources, from the Projector VCS, are not included.

The Tools directory, containing mostly junk, is also excluded.
2017-12-26 10:02:57 +08:00

255 lines
4.7 KiB
C

/*
File: Queue.c
Contains: Process Mgr queueing structures
Written by: Erich Ringewald
Copyright: © 1987-1991 by Apple Computer, Inc., all rights reserved.
Change History (most recent first):
<0> 3/13/87 ELR New Today.
*/
#include <types.h>
#include <memory.h>
#include "Glue.h"
#include "Data.h"
#define IS ==
#define AND &&
#define ISNT !=
#define NULL 0L
static struct QUEUE *q;
void q_push(char *newitem)
{
if (ll_length() IS 0)
llinit(newitem);
else
lladdhead(newitem);
}
void q_pop(char **old_item)
{
lltail();
llretrieve(old_item);
lldelete();
}
LINKLIST *list;
#if justPtrs
#define moveitem(A,B) B=A
#else
#define moveitem(A,B) memcpy(B,A,list->itemlength)
#endif
/* use this macro as moveitem(from, to) */
void llsetMatch(ProcPtr numatch) /* Set matching function */
{
list->match = numatch;
}
/* set clp to desired link. return Ture if found. False otherwise */
Boolean llcheck(char *lookfor)
{
if (ll_length() IS 0)
return(false);
for (;;) {
if ((Boolean)(*list->match)(list->clp->item, lookfor))
return(true);
else
if (!llnext())
return(false);
}
}
void llsetlist(LINKLIST *new_list) /* Set this module to work with a new list */
{
list = new_list;
}
void llsetsize(int size) /* Set the storage requirements for the list */
{
list->itemlength = size;
}
#if !justPtrs
static LINKTYPE *llcrlink() /* Allocate storage for a link */
{
LINKTYPE *link;
link = (LINKTYPE *)malloc(sizeof(LINKTYPE));
link->item = malloc(list->itemlength);
return(link);
}
#endif
void llinit(char *newitem) /* Initialize the structure. */
{
#if justPtrs
list->head = list->tail = list->clp = (LINKTYPE *)newitem;
#else
list->head = list->tail = list->clp = llcrlink();
#endif
list->clp->next = list->clp->previous = NULL;
moveitem(newitem, list->clp->item);
list->listlength = 1;
}
void llhead(void) /* Set the CLP to the head of the list */
{
list->clp = list->head;
}
void lltail(void) /* Set the CLP to the head of the list */
{
list->clp = list->tail;
}
/* Set the CLP to the next link, return FALSE if at end of list,
TRUE otherwise. */
Boolean llnext(void)
{
if (list->clp->next IS NULL)
return(false);
else {
list->clp = list->clp->next;
return(true);
}
}
/*
Set the CLP to the previous link, return FALSE if at head of list,
TRUE otherwise. */
Boolean llprevious(void)
{
if (list->clp->previous IS NULL)
return(false);
else {
list->clp = list->clp->previous;
return(true);
}
}
#if justPtrs
void llretrieve(char **newitem)
{
*newitem = list->clp->item;
}
#else
void llretrieve(char **newitem) /* Retrieve the item from the CLP link. */
{
moveitem(list->clp->item, *newitem);
}
#endif
/*
Add a new link containing this item to the link following the CLP,
and reset CLP to new link. */
void lladd(char *newitem)
{
LINKTYPE *newlink;
/* Create new link. */
#if justPtrs
newlink = (LINKTYPE *)newitem;
#else
newlink = llcrlink();
#endif
moveitem(newitem, newlink->item);
list->listlength++;
/* Reset pointers. */
newlink->next = list->clp->next;
newlink->previous = list->clp;
if (list->tail IS list->clp)
list->tail = newlink;
else
list->clp->next->previous = newlink;
list->clp->next = newlink;
list->clp = newlink;
}
void lladdhead(char *newitem) /* Add a new head, reset CLP. */
{
LINKTYPE *newlink;
/* if empty, initialize list. */
if (ll_length() IS 0) {
llinit(newitem); /* calling lladdhead before initialing ll_length */
return;
}
/* create new link */
#if justPtrs
newlink = (LINKTYPE *)newitem;
#else
newlink = llcrlink();
#endif
moveitem(newitem, newlink->item);
list->listlength++;
/* Reset pointers. */
newlink->previous = NULL;
newlink->next = list->head;
list->head->previous = newlink;
list->clp = list->head = newlink;
}
void lldelete(void) /* Delete and free the CLP, reset CLP to head. */
{
LINKTYPE *before, *after;
/* Is this the only link? */
assert(list->listlength ISNT 0);
if (list->head IS list->clp AND list->tail IS list->clp) {
list->head = list->tail = NULL;
}
/* Is this the head? */
else if (list->head IS list->clp) {
list->head = list->head->next;
list->head->previous = NULL;
}
/* Is this the tail? */
else if (list->tail IS list->clp) {
list->tail = list->tail->previous;
list->tail->next = NULL;
}
/* Otherwise, it must be inside the list. */
else {
before = list->clp->previous;
after = list->clp->next;
before->next = after;
after->previous = before;
}
/* Delete CLP */
#if justPtrs
list->clp->item = NULL;
list->clp->next = NULL;
list->clp->previous = NULL;
#else
free(list->clp->item);
free(list->clp);
#endif
list->clp = list->head;
list->listlength--;
}
int ll_length(void) /* return the length of the list */
{
return(list->listlength);
}