mirror of
https://github.com/elliotnunn/mac-rom.git
synced 2024-12-22 08:30:05 +00:00
4325cdcc78
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.
255 lines
4.7 KiB
C
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);
|
|
}
|