/** Copyright(c) Maynard Electronics, Inc. 1984-89 Name: queues.h Date Updated: $./FDT$ $./FTM$ Description: Contains the fabulous queues routines ( actually these are linked lists ) written by the Gods of DD. $Log: M:/LOGFILES/QUEUES.H_V $ * * Rev 1.5 24 Nov 1993 14:51:58 BARRY * Unicode fixes * * Rev 1.4 07 Sep 1993 12:35:32 JOHNES * Added prototype for TopOfStack_with_0_values. * * * Rev 1.3 09 Jun 1993 08:15:08 Stefan * Add back in a typedef for STACK_ELEM that was removed in the previous fix. * * * Rev 1.2 08 Jun 1993 13:58:50 MIKEP * Enable C++ compile. * * Rev 1.1 17 Jul 1991 11:21:38 STEVEN * changed FAR references to use env var FAR_Q_POINTERS * * Rev 1.0 09 May 1991 13:32:32 HUNTER * Initial revision. **/ /* $end$ include list */ #ifndef QUEUES #define QUEUES #ifdef FAR_Q_POINTERS #define Q_PTR_SIZE far #endif #ifndef Q_PTR_SIZE #define Q_PTR_SIZE #endif /** This structure is for a single queue element. All structures that you wish to enqueue must have this structure contained in it. */ typedef struct Q_ELEM Q_PTR_SIZE *Q_ELEM_PTR ; typedef struct Q_ELEM { Q_ELEM_PTR q_prev ; /* previous queue element */ Q_ELEM_PTR q_next ; /* next element */ INT32 q_priority ; /* priority of queue */ INT16 q_element ; /* element number */ VOID Q_PTR_SIZE * q_ptr ; /* a ptr to something */ } Q_ELEM; /** This is the header of a queue. There needs to be one of these allocated for every queue you wish to use. */ typedef struct Q_HEADER Q_PTR_SIZE *Q_HEADER_PTR; typedef struct Q_HEADER { Q_ELEM_PTR q_head ; /* head element of the queue */ Q_ELEM_PTR q_tail ; /* tail element of the queue */ INT16 q_count ; /* count of elements */ BOOLEAN q_active ; /* Is this queue active */ INT16 q_magic ; /* for q_element number */ } Q_HEADER ; #define BEFORE 0 #define AFTER 1 /** Here are some useful macros for the queues */ /* Returns the head element of the queue */ #define QueueHead( queue ) ( (queue)->q_head ) /* Returns the tail element of the queue */ #define QueueTail( queue ) ( (queue)->q_tail ) /* Returns the number of elements in the queue */ #define QueueCount( queue ) ( (queue)->q_count ) /* Returns the queue element number for an element */ #define QueueElemNo( element ) ( (element)->q_element ) /* Returns the next queue element in the chain */ #define QueueNext( element ) ( (element)->q_next ) /* Returns the previous queue element in the chain */ #define QueuePrev( element ) ( (element)->q_prev ) /* Returns the queue ptr field */ #define QueuePtr( element ) ( (element)->q_ptr ) #define GetQueueElemPriority( elem_ptr ) ( (elem_ptr)->q_priority ) #define SetQueueElemPriority( elem_ptr, value ) ( ( (elem_ptr)->q_priority ) = (value) ) #define GetQueueElemPtr( elem_ptr ) ( (elem_ptr)->q_ptr ) #define SetQueueElemPtr( elem_ptr, value ) ( ( (elem_ptr)->q_ptr ) = (value) ) /* Function Prototypes for the Queue Functions */ VOID InitQueue( Q_HEADER_PTR ) ; VOID InitQElem( Q_ELEM_PTR ) ; Q_ELEM_PTR EnQueueElem( Q_HEADER_PTR queue, Q_ELEM_PTR element, BOOLEAN wpriority ) ; Q_ELEM_PTR DeQueueElem( Q_HEADER_PTR queue ) ; Q_ELEM_PTR InsertElem( Q_HEADER_PTR queue, Q_ELEM_PTR cur_elem, Q_ELEM_PTR ins_elem , UINT16 boa ) ; BOOLEAN RemoveQueueElem( Q_HEADER_PTR queue, Q_ELEM_PTR element ) ; VOID RemoveElem( Q_HEADER_PTR queue, Q_ELEM_PTR element ) ; Q_ELEM_PTR FindQueueElem( Q_HEADER_PTR queue, Q_ELEM_PTR element ) ; VOID PushElem( Q_HEADER_PTR queue, Q_ELEM_PTR element ) ; Q_ELEM_PTR PopElem( Q_HEADER_PTR queue ) ; VOID SortQueue( Q_HEADER_PTR , INT16 ( * )( Q_ELEM_PTR, Q_ELEM_PTR ) ) ; Q_ELEM_PTR SearchQueue( Q_HEADER_PTR, BOOLEAN ( * )( VOID_PTR, VOID_PTR ), VOID_PTR, BOOLEAN ); VOID MoveQueue( Q_HEADER_PTR from_queue, Q_HEADER_PTR to_queue ) ; Q_HEADER_PTR SplitQueue( Q_HEADER_PTR old_Q, Q_ELEM_PTR split, Q_HEADER_PTR new_Q ) ; /* Stacks ? */ /* Define Stack Definitions */ typedef struct STACK_ELEM Q_PTR_SIZE *STACK_ELEM_PTR; typedef struct STACK_ELEM { Q_ELEM link ; UINT32 item ; } STACK_ELEM ; typedef Q_HEADER STACK_HDR; typedef Q_HEADER_PTR STACK_HDR_PTR; VOID InitStack( STACK_HDR_PTR ) ; UINT16 Push( STACK_HDR_PTR, UINT32 ) ; UINT32 Pop( STACK_HDR_PTR ) ; UINT32 TopOfStack( STACK_HDR_PTR ) ; UINT16 TopOfStack_with_0_values( STACK_HDR_PTR stk_ptr , UINT32_PTR stk_elem ) ; #endif