home *** CD-ROM | disk | FTP | other *** search
- /*----------------------------------------------*/
- /* QUEUE.C */
- /* Modul zum Turbo C Maustreiber */
- /* (C) 1988 R.Ziegaus & TOOLBOX */
- /*----------------------------------------------*/
-
- /*
- Im Modul Queue ist eine typenunabhängige Schlange
- verwirklicht worden, d. h. daß die Schlange nicht
- auf irgendeinen Datentyp beschränkt ist, sondern
- beliebig ist. Außerdem ist es möglich, mehrere
- Schlangen gleichzeitig zu bearbeiten. Eine
- Anwendung findet sich in EVENTS.C
- */
-
-
- #include <alloc.h>
- #include <mem.h>
- #include "queue.h"
-
- #define MALLOC(x) ((x *) malloc(sizeof(x)))
-
-
- static Node *InitNode(void *val, Node *Next,
- int Size)
-
- /*
- InitNode allocates memory for a new stack entry
- and initializes it with the values of the parameters
- */
-
- {
- Node *new;
- void *temp;
-
- /* Allocate space for new entry */
- new = (Node *) malloc(sizeof(Node));
- /* Allocate space for new Item */
- temp = (void *) malloc(Size);
- /* Copy Item */
- memcpy(temp, val, Size);
- /* init values */
- if (new != NULL && temp != NULL )
- {
- new->Item = temp;
- new->Next = Next;
- }
- /* Return address of new entry */
- return(new);
- }
-
-
- QueueHead *InitQueue(int Size)
-
- /* InitQueue sets up a new QueueHead */
-
- {
- QueueHead *new;
-
- /* Allocate memory for QueueHead head */
- new = MALLOC(QueueHead);
- /* Memory allocation ok ? */
- if (new != NULL)
- {
- /* Init QueueHead head */
- new->Len = 0;
- new->Head = NULL;
- new->Tail = NULL;
- /* Size of QueueHead items */
- new->Size = Size;
- }
- /* Return address of QueueHead */
- return(new);
- }
-
-
- int AppendToQueue(void *data, QueueHead *Queue)
-
- /* AppendToQueue appends a new Item to the queue */
-
- {
- Node *new;
-
- /* Create new node */
- new = InitNode(data, NULL, Queue->Size);
- if (new != NULL)
- {
- if (Queue->Len)
- /* replace Head Item with the new entry */
- Queue->Tail->Next = new;
- else
- Queue->Head = new;
- Queue->Tail = new;
- /* increase QueueHead length */
- Queue->Len++;
- return(TRUE);
- }
- else
- return(FALSE);
- }
-
-
- void *GetQueueHead(QueueHead *Queue)
-
- /* GetQueueHead proves the first element (the head)
- of the queue */
-
- {
- Node *temp;
- void *data;
- int Size;
-
- Size = Queue->Size;
- if (Queue->Len > 0)/* if the queue is not empty */
- {
- temp = Queue->Head; /* get Head of queue */
- data = (void *) malloc(Size);
- movmem(temp->Item, data, Size);
- Queue->Head = temp->Next;
- Queue->Len--; /* adjust queue length */
- if (Queue->Len == 0)
- Queue->Tail = NULL;
- /* release space of the Item */
- free((void *) temp->Item);
- /* release space for one entry */
- free((void *) temp);
- return(data);
- }
- else
- return(NULL);
- }
-
-
- int QueueLength (QueueHead *Queue)
-
- {
- return(Queue->Len);
- }
-
-
- int EmptyQueue (QueueHead *Queue)
-
- {
- return(Queue->Len == 0);
- }
-
-
- void KillQueue (QueueHead *Queue)
-
- /* KillQueue deletes head of QueueHead */
-
- {
- free(Queue);
- }