716 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
		
		
			
		
	
	
			716 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| 
								 | 
							
								/******************************************************************
							 | 
						||
| 
								 | 
							
								**
							 | 
						||
| 
								 | 
							
								** QUEUE.C:
							 | 
						||
| 
								 | 
							
								**
							 | 
						||
| 
								 | 
							
								**    ADT Queue Implementation
							 | 
						||
| 
								 | 
							
								**
							 | 
						||
| 
								 | 
							
								** This file is part of Apt Abstrct Data Types (ADT)
							 | 
						||
| 
								 | 
							
								** Copyright (c) 1991 -- Apt Technologies
							 | 
						||
| 
								 | 
							
								** All rights reserved
							 | 
						||
| 
								 | 
							
								**
							 | 
						||
| 
								 | 
							
								******************************************************************/
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/* ---------- C Headers */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								//#include "cheaders.h"
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/* ---------- Headers */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#include "apt.h"
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#include "allocate.h"
							 | 
						||
| 
								 | 
							
								#include "pqueue.h"
							 | 
						||
| 
								 | 
							
								#include <stdio.h>
							 | 
						||
| 
								 | 
							
								#include <stdlib.h>
							 | 
						||
| 
								 | 
							
								#include <string.h>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/* ---------- Private Function Prototypes */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#ifdef __ANSI_C__
							 | 
						||
| 
								 | 
							
								PRIVATE void QueueDisposeItem(QueueItem, DisposeFunction);
							 | 
						||
| 
								 | 
							
								PRIVATE QueueItem QueueGetItem(Queue);
							 | 
						||
| 
								 | 
							
								PRIVATE QueueItem QueueNewItem(void*, int);
							 | 
						||
| 
								 | 
							
								PRIVATE void QueuePutItem(Queue, QueueItem);
							 | 
						||
| 
								 | 
							
								PRIVATE QueueItem QueueRemoveItem(Queue, QueueItem);
							 | 
						||
| 
								 | 
							
								PRIVATE int QueueCompareEqual(void *, void *);
							 | 
						||
| 
								 | 
							
								#else
							 | 
						||
| 
								 | 
							
								PRIVATE void QueueDisposeItem();
							 | 
						||
| 
								 | 
							
								PRIVATE QueueItem QueueGetItem();
							 | 
						||
| 
								 | 
							
								PRIVATE QueueItem QueueNewItem();
							 | 
						||
| 
								 | 
							
								PRIVATE void QueuePutItem();
							 | 
						||
| 
								 | 
							
								PRIVATE QueueItem QueueRemoveItem();
							 | 
						||
| 
								 | 
							
								PRIVATE int QueueCompareEqual();
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/* ---------- Functions */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/*
							 | 
						||
| 
								 | 
							
								**
							 | 
						||
| 
								 | 
							
								** QueueApply
							 | 
						||
| 
								 | 
							
								**
							 | 
						||
| 
								 | 
							
								*/
							 | 
						||
| 
								 | 
							
								PUBLIC
							 | 
						||
| 
								 | 
							
								#ifdef __ANSI_C__
							 | 
						||
| 
								 | 
							
								void QueueApply(Queue q, ApplyFunction f)
							 | 
						||
| 
								 | 
							
								#else
							 | 
						||
| 
								 | 
							
								void QueueApply(q,f)
							 | 
						||
| 
								 | 
							
								Queue q;
							 | 
						||
| 
								 | 
							
								ApplyFunction f;
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								  QueueItem item;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  for (item = q->head; item != NULL; item = item->next) {
							 | 
						||
| 
								 | 
							
								    (*f)(item->element);
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/*
							 | 
						||
| 
								 | 
							
								**
							 | 
						||
| 
								 | 
							
								** QueueApply1
							 | 
						||
| 
								 | 
							
								**
							 | 
						||
| 
								 | 
							
								*/
							 | 
						||
| 
								 | 
							
								PUBLIC
							 | 
						||
| 
								 | 
							
								#ifdef __ANSI_C__
							 | 
						||
| 
								 | 
							
								void QueueApply1(Queue q, void *p1, ApplyFunction1 f)
							 | 
						||
| 
								 | 
							
								#else
							 | 
						||
| 
								 | 
							
								void QueueApply1(q,p1,f)
							 | 
						||
| 
								 | 
							
								Queue q;
							 | 
						||
| 
								 | 
							
								void *p1;
							 | 
						||
| 
								 | 
							
								ApplyFunction1 f;
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								  QueueItem item;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  for (item = q->head; item != NULL; item = item->next) {
							 | 
						||
| 
								 | 
							
								    (*f)(item->element,p1);
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/*
							 | 
						||
| 
								 | 
							
								**
							 | 
						||
| 
								 | 
							
								** QueueApply2
							 | 
						||
| 
								 | 
							
								**
							 | 
						||
| 
								 | 
							
								*/
							 | 
						||
| 
								 | 
							
								PUBLIC
							 | 
						||
| 
								 | 
							
								#ifdef __ANSI_C__
							 | 
						||
| 
								 | 
							
								void QueueApply2(Queue q, void *p1, void *p2, ApplyFunction2 f)
							 | 
						||
| 
								 | 
							
								#else
							 | 
						||
| 
								 | 
							
								void QueueApply2(q,p1,p2,f)
							 | 
						||
| 
								 | 
							
								Queue q;
							 | 
						||
| 
								 | 
							
								void *p1;
							 | 
						||
| 
								 | 
							
								void *p2;
							 | 
						||
| 
								 | 
							
								ApplyFunction2 f;
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								  QueueItem item;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  for (item = q->head; item != NULL; item = item->next) {
							 | 
						||
| 
								 | 
							
								    (*f)(item->element,p1,p2);
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/*
							 | 
						||
| 
								 | 
							
								**
							 | 
						||
| 
								 | 
							
								** QueueApply3
							 | 
						||
| 
								 | 
							
								**
							 | 
						||
| 
								 | 
							
								*/
							 | 
						||
| 
								 | 
							
								PUBLIC
							 | 
						||
| 
								 | 
							
								#ifdef __ANSI_C__
							 | 
						||
| 
								 | 
							
								void QueueApply3(Queue q, void *p1, void* p2, void *p3, ApplyFunction3 f)
							 | 
						||
| 
								 | 
							
								#else
							 | 
						||
| 
								 | 
							
								void QueueApply3(q,p1,p2,p3,f)
							 | 
						||
| 
								 | 
							
								Queue q;
							 | 
						||
| 
								 | 
							
								void *p1;
							 | 
						||
| 
								 | 
							
								void *p2;
							 | 
						||
| 
								 | 
							
								void *p3;
							 | 
						||
| 
								 | 
							
								ApplyFunction3 f;
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								  QueueItem item;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  for (item = q->head; item != NULL; item = item->next) {
							 | 
						||
| 
								 | 
							
								    (*f)(item->element,p1,p2,p3);
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/*
							 | 
						||
| 
								 | 
							
								**
							 | 
						||
| 
								 | 
							
								** QueueCAR
							 | 
						||
| 
								 | 
							
								**
							 | 
						||
| 
								 | 
							
								*/
							 | 
						||
| 
								 | 
							
								PUBLIC
							 | 
						||
| 
								 | 
							
								#ifdef __ANSI_C__
							 | 
						||
| 
								 | 
							
								void *QueueCAR(Queue q)
							 | 
						||
| 
								 | 
							
								#else
							 | 
						||
| 
								 | 
							
								void *QueueCAR(q)
							 | 
						||
| 
								 | 
							
								Queue q;
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								  if (q != NULL && q->head != NULL)
							 | 
						||
| 
								 | 
							
								    return QueueItemElement(q->head);
							 | 
						||
| 
								 | 
							
								  return NULL;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/*
							 | 
						||
| 
								 | 
							
								**
							 | 
						||
| 
								 | 
							
								** QueueCDR
							 | 
						||
| 
								 | 
							
								**
							 | 
						||
| 
								 | 
							
								*/
							 | 
						||
| 
								 | 
							
								PUBLIC
							 | 
						||
| 
								 | 
							
								#ifdef __ANSI_C__
							 | 
						||
| 
								 | 
							
								Queue QueueCDR(Queue q)
							 | 
						||
| 
								 | 
							
								#else
							 | 
						||
| 
								 | 
							
								Queue QueueCDR(q)
							 | 
						||
| 
								 | 
							
								Queue q;
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								  if (q != NULL && q->head != NULL) {
							 | 
						||
| 
								 | 
							
								    Queue new = QueueNew();
							 | 
						||
| 
								 | 
							
								    new->head = q->head->next;
							 | 
						||
| 
								 | 
							
								    new->tail = new->head != NULL ? q->tail : NULL;
							 | 
						||
| 
								 | 
							
								    new->size = q->size-1;
							 | 
						||
| 
								 | 
							
								    return new;
							 | 
						||
| 
								 | 
							
								  } else
							 | 
						||
| 
								 | 
							
								    return NULL;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/*
							 | 
						||
| 
								 | 
							
								**
							 | 
						||
| 
								 | 
							
								** QueueDispose
							 | 
						||
| 
								 | 
							
								**
							 | 
						||
| 
								 | 
							
								*/
							 | 
						||
| 
								 | 
							
								PUBLIC 
							 | 
						||
| 
								 | 
							
								#ifdef __ANSI_C__
							 | 
						||
| 
								 | 
							
								void QueueDispose(Queue q, DisposeFunction f)
							 | 
						||
| 
								 | 
							
								#else
							 | 
						||
| 
								 | 
							
								void QueueDispose(q,f)
							 | 
						||
| 
								 | 
							
								Queue q;
							 | 
						||
| 
								 | 
							
								DisposeFunction f;
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								  QueueItem item;
							 | 
						||
| 
								 | 
							
								  QueueItem next = NULL;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  for (item = q->head; item != NULL; item = next) {
							 | 
						||
| 
								 | 
							
								    next = item->next;
							 | 
						||
| 
								 | 
							
								    QueueDisposeItem(item,f);
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								  free(q);
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/*
							 | 
						||
| 
								 | 
							
								**
							 | 
						||
| 
								 | 
							
								** QueueDisposeItem
							 | 
						||
| 
								 | 
							
								**
							 | 
						||
| 
								 | 
							
								*/
							 | 
						||
| 
								 | 
							
								PRIVATE
							 | 
						||
| 
								 | 
							
								#ifdef __ANSI_C__
							 | 
						||
| 
								 | 
							
								void QueueDisposeItem(QueueItem item, DisposeFunction f)
							 | 
						||
| 
								 | 
							
								#else
							 | 
						||
| 
								 | 
							
								void QueueDisposeItem(item,f)
							 | 
						||
| 
								 | 
							
								QueueItem item;
							 | 
						||
| 
								 | 
							
								DisposeFunction f;
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								  if (f) (*f)(item->element);
							 | 
						||
| 
								 | 
							
								  free(item);
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/*
							 | 
						||
| 
								 | 
							
								**
							 | 
						||
| 
								 | 
							
								** QueueFind
							 | 
						||
| 
								 | 
							
								**
							 | 
						||
| 
								 | 
							
								*/
							 | 
						||
| 
								 | 
							
								PUBLIC
							 | 
						||
| 
								 | 
							
								#ifdef __ANSI_C__
							 | 
						||
| 
								 | 
							
								void *QueueFind(Queue q, void *element, ComparisonFunction f)
							 | 
						||
| 
								 | 
							
								#else
							 | 
						||
| 
								 | 
							
								void *QueueFind(q,element,f)
							 | 
						||
| 
								 | 
							
								Queue q;
							 | 
						||
| 
								 | 
							
								void *element;
							 | 
						||
| 
								 | 
							
								ComparisonFunction f;
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								  QueueItem item;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  for (item = q->head; item != NULL; item = item->next) {
							 | 
						||
| 
								 | 
							
								    if ((*f)(element,item->element) == 0) break;
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								  return (item != NULL ? item->element : NULL);
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/*
							 | 
						||
| 
								 | 
							
								**
							 | 
						||
| 
								 | 
							
								** QueueFindAndRemove
							 | 
						||
| 
								 | 
							
								**
							 | 
						||
| 
								 | 
							
								*/
							 | 
						||
| 
								 | 
							
								PUBLIC
							 | 
						||
| 
								 | 
							
								#ifdef __ANSI_C__
							 | 
						||
| 
								 | 
							
								void *QueueFindAndRemove(Queue q, void *element,
							 | 
						||
| 
								 | 
							
								                             ComparisonFunction f)
							 | 
						||
| 
								 | 
							
								#else
							 | 
						||
| 
								 | 
							
								void *QueueFindAndRemove(q, element, f)
							 | 
						||
| 
								 | 
							
								Queue q;
							 | 
						||
| 
								 | 
							
								void *element;
							 | 
						||
| 
								 | 
							
								ComparisonFunction f;
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								  QueueItem item;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  for (item = q->head; item != NULL; item = item->next) {
							 | 
						||
| 
								 | 
							
								    if ((*f)(element,item->element) == 0) break;
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								  item = QueueRemoveItem(q,item);
							 | 
						||
| 
								 | 
							
								  return (item != NULL ? item->element : NULL);
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								/*
							 | 
						||
| 
								 | 
							
								**
							 | 
						||
| 
								 | 
							
								** QueueFindAndRemoveType
							 | 
						||
| 
								 | 
							
								**
							 | 
						||
| 
								 | 
							
								*/
							 | 
						||
| 
								 | 
							
								PUBLIC
							 | 
						||
| 
								 | 
							
								#ifdef __ANSI_C__
							 | 
						||
| 
								 | 
							
								void *QueueFindAndRemoveType(Queue q, void *element,
							 | 
						||
| 
								 | 
							
								                             ComparisonFunction f, int type)
							 | 
						||
| 
								 | 
							
								#else
							 | 
						||
| 
								 | 
							
								void *QueueFindAndRemoveType(q, element, f, type)
							 | 
						||
| 
								 | 
							
								Queue q;
							 | 
						||
| 
								 | 
							
								void *element;
							 | 
						||
| 
								 | 
							
								ComparisonFunction f;
							 | 
						||
| 
								 | 
							
								int type;
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								  QueueItem item;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  for (item = q->head; item != NULL; item = item->next) {
							 | 
						||
| 
								 | 
							
								    if ((*f)(element,item->element) == 0 && item->type == type) break;
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								  item = QueueRemoveItem(q,item);
							 | 
						||
| 
								 | 
							
								  return (item != NULL ? item->element : NULL);
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/*
							 | 
						||
| 
								 | 
							
								**
							 | 
						||
| 
								 | 
							
								** QueueFindType
							 | 
						||
| 
								 | 
							
								**
							 | 
						||
| 
								 | 
							
								*/
							 | 
						||
| 
								 | 
							
								PUBLIC
							 | 
						||
| 
								 | 
							
								#ifdef __ANSI_C__
							 | 
						||
| 
								 | 
							
								void *QueueFindType(Queue q, int type)
							 | 
						||
| 
								 | 
							
								#else
							 | 
						||
| 
								 | 
							
								void *QueueFindType(q,type)
							 | 
						||
| 
								 | 
							
								Queue q;
							 | 
						||
| 
								 | 
							
								int type;
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								  QueueItem item;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  for (item = q->head; item != NULL; item = item->next) {
							 | 
						||
| 
								 | 
							
								    if (item->type == type) break;
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								  return (item != NULL ? item->element : NULL);
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/*
							 | 
						||
| 
								 | 
							
								**
							 | 
						||
| 
								 | 
							
								** QueueFindTypeAndRemove
							 | 
						||
| 
								 | 
							
								**
							 | 
						||
| 
								 | 
							
								*/
							 | 
						||
| 
								 | 
							
								PUBLIC
							 | 
						||
| 
								 | 
							
								#ifdef __ANSI_C__
							 | 
						||
| 
								 | 
							
								void *QueueFindTypeAndRemove(Queue q, int type)
							 | 
						||
| 
								 | 
							
								#else
							 | 
						||
| 
								 | 
							
								void *QueueFindTypeAndRemove(q,type)
							 | 
						||
| 
								 | 
							
								Queue q;
							 | 
						||
| 
								 | 
							
								int type;
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								  QueueItem item;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  for (item = q->head; item != NULL; item = item->next) {
							 | 
						||
| 
								 | 
							
								    if (item->type == type) break;
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								  return (QueueRemoveItem(q,item));
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/*
							 | 
						||
| 
								 | 
							
								**
							 | 
						||
| 
								 | 
							
								** QueueGet
							 | 
						||
| 
								 | 
							
								**
							 | 
						||
| 
								 | 
							
								*/
							 | 
						||
| 
								 | 
							
								PUBLIC
							 | 
						||
| 
								 | 
							
								#ifdef __ANSI_C__
							 | 
						||
| 
								 | 
							
								void *QueueGet(Queue q)
							 | 
						||
| 
								 | 
							
								#else
							 | 
						||
| 
								 | 
							
								void *QueueGet(q)
							 | 
						||
| 
								 | 
							
								Queue q;
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								  void *element;
							 | 
						||
| 
								 | 
							
								  QueueItem item;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  item = QueueGetItem(q);
							 | 
						||
| 
								 | 
							
								  if (item) {
							 | 
						||
| 
								 | 
							
								    element = item->element;
							 | 
						||
| 
								 | 
							
								    QueueDisposeItem(item,NULL);
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								  else element = NULL;
							 | 
						||
| 
								 | 
							
								  return (element);
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/*
							 | 
						||
| 
								 | 
							
								**
							 | 
						||
| 
								 | 
							
								** QueueGetItem
							 | 
						||
| 
								 | 
							
								**
							 | 
						||
| 
								 | 
							
								*/
							 | 
						||
| 
								 | 
							
								PRIVATE
							 | 
						||
| 
								 | 
							
								#ifdef __ANSI_C__
							 | 
						||
| 
								 | 
							
								QueueItem QueueGetItem(Queue q)
							 | 
						||
| 
								 | 
							
								#else
							 | 
						||
| 
								 | 
							
								QueueItem QueueGetItem(q)
							 | 
						||
| 
								 | 
							
								Queue q;
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								  QueueItem item;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  if (q->head) {
							 | 
						||
| 
								 | 
							
								    item = q->head;
							 | 
						||
| 
								 | 
							
								    q->head = q->head->next;
							 | 
						||
| 
								 | 
							
								    q->size--;
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								  else item = NULL;
							 | 
						||
| 
								 | 
							
								  return (item);
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/*
							 | 
						||
| 
								 | 
							
								**
							 | 
						||
| 
								 | 
							
								** QueueHead
							 | 
						||
| 
								 | 
							
								**
							 | 
						||
| 
								 | 
							
								*/
							 | 
						||
| 
								 | 
							
								PUBLIC
							 | 
						||
| 
								 | 
							
								#ifdef __ANSI_C__
							 | 
						||
| 
								 | 
							
								QueueItem QueueHead(Queue q)
							 | 
						||
| 
								 | 
							
								#else
							 | 
						||
| 
								 | 
							
								QueueItem QueueHead(q)
							 | 
						||
| 
								 | 
							
								Queue q;
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								  return q != NULL ? q->head : NULL;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/*
							 | 
						||
| 
								 | 
							
								**
							 | 
						||
| 
								 | 
							
								** QueueItemElement
							 | 
						||
| 
								 | 
							
								**
							 | 
						||
| 
								 | 
							
								*/
							 | 
						||
| 
								 | 
							
								PUBLIC
							 | 
						||
| 
								 | 
							
								#ifdef __ANSI_C__
							 | 
						||
| 
								 | 
							
								void *QueueItemElement(QueueItem item)
							 | 
						||
| 
								 | 
							
								#else
							 | 
						||
| 
								 | 
							
								void *QueueItemElement(item)
							 | 
						||
| 
								 | 
							
								QueueItem item;
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								  return (item->element);
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/*
							 | 
						||
| 
								 | 
							
								**
							 | 
						||
| 
								 | 
							
								** QueueItemType
							 | 
						||
| 
								 | 
							
								**
							 | 
						||
| 
								 | 
							
								*/
							 | 
						||
| 
								 | 
							
								PUBLIC
							 | 
						||
| 
								 | 
							
								#ifdef __ANSI_C__
							 | 
						||
| 
								 | 
							
								int QueueItemType(QueueItem item)
							 | 
						||
| 
								 | 
							
								#else
							 | 
						||
| 
								 | 
							
								int QueueItemType(item)
							 | 
						||
| 
								 | 
							
								QueueItem item;
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								  return (item->type);
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/*
							 | 
						||
| 
								 | 
							
								**
							 | 
						||
| 
								 | 
							
								** QueueLook
							 | 
						||
| 
								 | 
							
								**
							 | 
						||
| 
								 | 
							
								*/
							 | 
						||
| 
								 | 
							
								PUBLIC
							 | 
						||
| 
								 | 
							
								#ifdef __ANSI_C__
							 | 
						||
| 
								 | 
							
								void *QueueLook(Queue q)
							 | 
						||
| 
								 | 
							
								#else
							 | 
						||
| 
								 | 
							
								void *QueueLook(q)
							 | 
						||
| 
								 | 
							
								Queue q;
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								  QueueItem item;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  item = q->head;
							 | 
						||
| 
								 | 
							
								  return (item != NULL ? item->element : NULL);
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/*
							 | 
						||
| 
								 | 
							
								**
							 | 
						||
| 
								 | 
							
								** QueueNew
							 | 
						||
| 
								 | 
							
								**
							 | 
						||
| 
								 | 
							
								*/
							 | 
						||
| 
								 | 
							
								PUBLIC
							 | 
						||
| 
								 | 
							
								#ifdef __ANSI_C__
							 | 
						||
| 
								 | 
							
								Queue QueueNew(void)
							 | 
						||
| 
								 | 
							
								#else
							 | 
						||
| 
								 | 
							
								Queue QueueNew()
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								  Queue q;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  q = ((Queue)Allocate(sizeof(_Queue)));
							 | 
						||
| 
								 | 
							
								  if (q) {
							 | 
						||
| 
								 | 
							
								    q->head = q->tail = NULL;
							 | 
						||
| 
								 | 
							
								    q->size = 0;
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								  return (q);
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/*
							 | 
						||
| 
								 | 
							
								**
							 | 
						||
| 
								 | 
							
								** QueueNewItem
							 | 
						||
| 
								 | 
							
								**
							 | 
						||
| 
								 | 
							
								*/
							 | 
						||
| 
								 | 
							
								PRIVATE
							 | 
						||
| 
								 | 
							
								#ifdef __ANSI_C__
							 | 
						||
| 
								 | 
							
								QueueItem QueueNewItem(void *element, int type)
							 | 
						||
| 
								 | 
							
								#else
							 | 
						||
| 
								 | 
							
								QueueItem QueueNewItem(element,type)
							 | 
						||
| 
								 | 
							
								void *element;
							 | 
						||
| 
								 | 
							
								int type;
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								  QueueItem item;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  item = ((QueueItem)Allocate(sizeof(_QueueItem)));
							 | 
						||
| 
								 | 
							
								  if (item) {
							 | 
						||
| 
								 | 
							
								    item->element = element;
							 | 
						||
| 
								 | 
							
								    item->type = type;
							 | 
						||
| 
								 | 
							
								    item->next = NULL;
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								  return (item);
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/*
							 | 
						||
| 
								 | 
							
								**
							 | 
						||
| 
								 | 
							
								** QueueNext
							 | 
						||
| 
								 | 
							
								**
							 | 
						||
| 
								 | 
							
								*/
							 | 
						||
| 
								 | 
							
								PUBLIC
							 | 
						||
| 
								 | 
							
								#ifdef __ANSI_C__
							 | 
						||
| 
								 | 
							
								QueueItem QueueNext(QueueItem item)
							 | 
						||
| 
								 | 
							
								#else
							 | 
						||
| 
								 | 
							
								QueueItem QueueNext(item)
							 | 
						||
| 
								 | 
							
								QueueItem item;
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								  return item != NULL ? item->next : NULL;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/*
							 | 
						||
| 
								 | 
							
								**
							 | 
						||
| 
								 | 
							
								** QueuePut
							 | 
						||
| 
								 | 
							
								**
							 | 
						||
| 
								 | 
							
								*/
							 | 
						||
| 
								 | 
							
								PUBLIC
							 | 
						||
| 
								 | 
							
								#ifdef __ANSI_C__
							 | 
						||
| 
								 | 
							
								void QueuePut(Queue q, void *element, int type)
							 | 
						||
| 
								 | 
							
								#else
							 | 
						||
| 
								 | 
							
								void QueuePut(q,element,type)
							 | 
						||
| 
								 | 
							
								Queue q;
							 | 
						||
| 
								 | 
							
								void *element;
							 | 
						||
| 
								 | 
							
								int type;
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								  QueueItem item;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  item = QueueNewItem(element,type);
							 | 
						||
| 
								 | 
							
								  QueuePutItem(q,item);
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/*
							 | 
						||
| 
								 | 
							
								**
							 | 
						||
| 
								 | 
							
								** QueuePutItem
							 | 
						||
| 
								 | 
							
								**
							 | 
						||
| 
								 | 
							
								*/
							 | 
						||
| 
								 | 
							
								PRIVATE
							 | 
						||
| 
								 | 
							
								#ifdef __ANSI_C__
							 | 
						||
| 
								 | 
							
								void QueuePutItem(Queue q, QueueItem item)
							 | 
						||
| 
								 | 
							
								#else
							 | 
						||
| 
								 | 
							
								void QueuePutItem(q,item)
							 | 
						||
| 
								 | 
							
								Queue q;
							 | 
						||
| 
								 | 
							
								QueueItem item;
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								  if (q->head == NULL) {
							 | 
						||
| 
								 | 
							
								    q->head = q->tail = item;
							 | 
						||
| 
								 | 
							
								  } else {
							 | 
						||
| 
								 | 
							
								    q->tail->next = item;
							 | 
						||
| 
								 | 
							
								    q->tail = q->tail->next;
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								  q->size++;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/*
							 | 
						||
| 
								 | 
							
								**
							 | 
						||
| 
								 | 
							
								** QueuePutOnPriority
							 | 
						||
| 
								 | 
							
								**
							 | 
						||
| 
								 | 
							
								*/
							 | 
						||
| 
								 | 
							
								PUBLIC
							 | 
						||
| 
								 | 
							
								#ifdef __ANSI_C__
							 | 
						||
| 
								 | 
							
								void QueuePutOnPriority(Queue q, void *element, int type,
							 | 
						||
| 
								 | 
							
								                        ComparisonFunction f)
							 | 
						||
| 
								 | 
							
								#else
							 | 
						||
| 
								 | 
							
								void QueuePutOnPriority(q,element,type,f)
							 | 
						||
| 
								 | 
							
								Queue q;
							 | 
						||
| 
								 | 
							
								void *element;
							 | 
						||
| 
								 | 
							
								int type;
							 | 
						||
| 
								 | 
							
								ComparisonFunction f;
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								  QueueItem item;
							 | 
						||
| 
								 | 
							
								  item = QueueNewItem(element,type);
							 | 
						||
| 
								 | 
							
								  //fprintf(stderr,"searching for location using %p.\n",f);
							 | 
						||
| 
								 | 
							
								  if (f == NULL){ 
							 | 
						||
| 
								 | 
							
								    //fprintf(stderr,"comparing function is null %f \n",f);
							 | 
						||
| 
								 | 
							
								    exit(1);
							 | 
						||
| 
								 | 
							
								    QueuePutItem(q,item);
							 | 
						||
| 
								 | 
							
								      
							 | 
						||
| 
								 | 
							
								  }else {
							 | 
						||
| 
								 | 
							
								    if (q->head == NULL) QueuePutItem(q,item);
							 | 
						||
| 
								 | 
							
								    else {
							 | 
						||
| 
								 | 
							
								      QueueItem p, lastp = NULL;
							 | 
						||
| 
								 | 
							
								      for (p = q->head; p != NULL; p = p->next) {
							 | 
						||
| 
								 | 
							
									int cval =(*f)(element,p->element);
							 | 
						||
| 
								 | 
							
								        if (cval<0){ 
							 | 
						||
| 
								 | 
							
									  // 	  fprintf(stderr,"%i <=> %i == %i\n",*((int *) element),*((int *)(p->element)), 
							 | 
						||
| 
								 | 
							
									  // 		  cval); 
							 | 
						||
| 
								 | 
							
									  break;
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								        lastp = p;
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								      if (p == q->head) {
							 | 
						||
| 
								 | 
							
								        item->next = q->head;
							 | 
						||
| 
								 | 
							
								        q->head = item;
							 | 
						||
| 
								 | 
							
								      } else if (p == NULL) {
							 | 
						||
| 
								 | 
							
								        q->tail->next = item;
							 | 
						||
| 
								 | 
							
								        q->tail = q->tail->next;
							 | 
						||
| 
								 | 
							
								      } else {
							 | 
						||
| 
								 | 
							
								        item->next = p;
							 | 
						||
| 
								 | 
							
								        lastp->next = item;
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								      q->size++;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/*
							 | 
						||
| 
								 | 
							
								**
							 | 
						||
| 
								 | 
							
								** QueueRemoveItem
							 | 
						||
| 
								 | 
							
								**
							 | 
						||
| 
								 | 
							
								*/
							 | 
						||
| 
								 | 
							
								PRIVATE
							 | 
						||
| 
								 | 
							
								#ifdef __ANSI_C__
							 | 
						||
| 
								 | 
							
								QueueItem QueueRemoveItem(Queue q, QueueItem item)
							 | 
						||
| 
								 | 
							
								#else
							 | 
						||
| 
								 | 
							
								QueueItem QueueRemoveItem(q,item)
							 | 
						||
| 
								 | 
							
								Queue q;
							 | 
						||
| 
								 | 
							
								QueueItem item;
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								  QueueItem this, prev = NULL;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  if (q == NULL) return (NULL);
							 | 
						||
| 
								 | 
							
								  if (item == NULL) return (NULL);
							 | 
						||
| 
								 | 
							
								  this = q->head;
							 | 
						||
| 
								 | 
							
								  while (this && this != item) {
							 | 
						||
| 
								 | 
							
								    prev = this; this = this->next;
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								  if (this == NULL) return (NULL);
							 | 
						||
| 
								 | 
							
								  if (this == q->head) q->head = item->next;
							 | 
						||
| 
								 | 
							
								  if (this == q->tail) q->tail = prev;
							 | 
						||
| 
								 | 
							
								  if (prev) prev->next = this->next;
							 | 
						||
| 
								 | 
							
								  q->size--;
							 | 
						||
| 
								 | 
							
								  return (item);
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/*
							 | 
						||
| 
								 | 
							
								**
							 | 
						||
| 
								 | 
							
								** QueueSeek
							 | 
						||
| 
								 | 
							
								**
							 | 
						||
| 
								 | 
							
								*/
							 | 
						||
| 
								 | 
							
								PUBLIC
							 | 
						||
| 
								 | 
							
								#ifdef __ANSI_C__
							 | 
						||
| 
								 | 
							
								QueueItem QueueSeek(Queue q, int position)
							 | 
						||
| 
								 | 
							
								#else
							 | 
						||
| 
								 | 
							
								QueueItem QueueSeek(q,position)
							 | 
						||
| 
								 | 
							
								Queue q;
							 | 
						||
| 
								 | 
							
								int position;
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								  QueueItem item;
							 | 
						||
| 
								 | 
							
								#if 0
							 | 
						||
| 
								 | 
							
								  /* Allow single-level negative addressing of queue items */
							 | 
						||
| 
								 | 
							
								  if (position <= 0)
							 | 
						||
| 
								 | 
							
								    position += QueueSize(q);
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								  /* Seeks which fail will result in NULL, not error conditions */
							 | 
						||
| 
								 | 
							
								  if (position <= 0 || position > QueueSize(q))
							 | 
						||
| 
								 | 
							
								    return NULL;
							 | 
						||
| 
								 | 
							
								  item = QueueHead(q);
							 | 
						||
| 
								 | 
							
								  while (--position > 0)
							 | 
						||
| 
								 | 
							
								    item = QueueNext(item);
							 | 
						||
| 
								 | 
							
								  return item;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/*
							 | 
						||
| 
								 | 
							
								**
							 | 
						||
| 
								 | 
							
								** QueueSize
							 | 
						||
| 
								 | 
							
								**
							 | 
						||
| 
								 | 
							
								*/
							 | 
						||
| 
								 | 
							
								PUBLIC
							 | 
						||
| 
								 | 
							
								#ifdef __ANSI_C__
							 | 
						||
| 
								 | 
							
								int QueueSize(Queue q)
							 | 
						||
| 
								 | 
							
								#else
							 | 
						||
| 
								 | 
							
								int QueueSize(q)
							 | 
						||
| 
								 | 
							
								Queue q;
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								  return q != NULL ? q->size : 0;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/*
							 | 
						||
| 
								 | 
							
								**
							 | 
						||
| 
								 | 
							
								** QueueTail
							 | 
						||
| 
								 | 
							
								**
							 | 
						||
| 
								 | 
							
								*/
							 | 
						||
| 
								 | 
							
								PUBLIC
							 | 
						||
| 
								 | 
							
								#ifdef __ANSI_C__
							 | 
						||
| 
								 | 
							
								QueueItem QueueTail(Queue q)
							 | 
						||
| 
								 | 
							
								#else
							 | 
						||
| 
								 | 
							
								QueueItem QueueTail(q)
							 | 
						||
| 
								 | 
							
								Queue q;
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								  return q != NULL ? q->tail : NULL;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								PRIVATE
							 | 
						||
| 
								 | 
							
								#ifdef __ANSI_C__
							 | 
						||
| 
								 | 
							
								int QueueCompareEqual(void *x, void *y)
							 | 
						||
| 
								 | 
							
								#else
							 | 
						||
| 
								 | 
							
								int QueueCompareEqual(x,y)
							 | 
						||
| 
								 | 
							
								void *x, *y;
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								  return 0;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 |