1
0
Fork 0
flightgear/Stripe_u/queue.h
1998-04-09 01:58:04 +00:00

283 lines
11 KiB
C

/********************************************************************/
/* STRIPE: converting a polygonal model to triangle strips
Francine Evans, 1996.
SUNY @ Stony Brook
Advisors: Steven Skiena and Amitabh Varshney
*/
/********************************************************************/
/*---------------------------------------------------------------------*/
/* STRIPE:queue.h
-----------------------------------------------------------------------*/
#ifndef QUEUE_INCLUDED
#define QUEUE_INCLUDED
/* %%s Node */
/*****************************************************************
This structure is used to store the List linkage information of a
ListInfo structure. It contains all the necessary information for the
List functions to function properly. This structure must be the first
one defined in any block of memory to be linked with the List functions.
for an example of the used of The Node structure look in the files
ipd2dms.c and ipd2man.h
******************************************************************/
#include <stdio.h>
#define FALSE 0
#define TRUE 1
typedef struct
{
void *Next;
void *Previous;
}
Node, * PNODE;
/*****************************************************************
Next : is a pointer to the next structure in this List.
Previous : is a pointer to the previous structure in this List.
priority : this is the priority of this structure in the List. The
highest priority is 0. This field is only used by the
functions EnQue and DeQue.
******************************************************************/
/* %%e */
/* %%s ListInfo */
/*****************************************************************
This is the general means of linking application defined information into
Lists and queues. All structures must begin with the Node Structure. All
other data in the structure is user definable.
******************************************************************/
typedef struct List
{
Node ListNode; /* link to the next Listinfo Structure */
/* user definable data */
} ListInfo, *PLISTINFO;
/*****************************************************************
ListNode : this is the required node structure for the List
mainpulation functions. This must be the first
element of a user definable structure.
In order for an application to use the List routines, it must define
a structure with all the needed information. The first element in the
user definable structure must be a Node structure. The Node structure
contains all the necessary information for the List routines to do their
magic. For an example of a user defined List structure see the file
ipd2i.h. The User definable structure can be passed to any List function
that excepts a pointer to a ListInfo structure.
example:
typedef mstruct
{
Node ListNode;
int a,b,c,d,e,f,g;
}
mystruct;
the user definable portion of the above structure is represented by
the integers a,b,c,d,e,f,g. When passing this structure to a List
function a cast of (ListInfo *) must be made to satisify the "C" complier.
******************************************************************/
/* %%e */
/* %%s ListHead */
/*****************************************************************
ListHead is used as a header to a List. LHeaders[0] points to the
head of the List. LHeaders[1] points the tail of the list. When
accessing these variables use the defines LISTHEAD, LISTTAIL.
******************************************************************/
typedef struct LHead
{
PLISTINFO LHeaders[2];
int NumList;
}
ListHead, *PLISTHEAD;
/*****************************************************************
LHeaders : this is an array of two pointers to ListInfo structures.
This information is used to point to the head and tail of
a list.
NumList : this integer hold the number of structures linked into this
list.
ListHead #define:
LISTHEAD : when Peeking down a list this specifies you should
start at the Head of the list and search downward.
LISTTAIL : when Peeking down a list this specifies you should
start at the tail of the list and search foward.
******************************************************************/
#define LISTHEAD 0
#define LISTTAIL 1
/* %%e */
typedef int BOOL;
typedef void * PVOID;
#define PEEKFROMHEAD( lh, ind ) ( PeekList( (lh), LISTHEAD, (ind) ) )
#define PEEKFROMTAIL( lh, ind ) ( PeekList( (lh), LISTTAIL, (ind) ) )
#define EMPTYLIST( lh ) ( ( (lh)->LHeaders[LISTHEAD] == NULL ) )
/* General utility routines */
/* %%s QueRoutines */
BOOL InitList ( PLISTHEAD );
/*****************************************************************
InitList : Initialize a new list structure for use with the List
routines
INPUTS : LHead : a pointer to a ListHead structure.
OUTPUT : a boolean value TRUE if no errors occured FALSE
otherwise
******************************************************************/
PLISTINFO PeekList ( PLISTHEAD, int, int );
/*****************************************************************
PeekList : This funciton peeks down a list for the N'th element
from the HEAD or TAIL of the list
INPUTS : LHead : a pointer to a List head structure.
from : can either search from the HEAD or TAIL
of the list
where : how many nodes from the begining should the
List routines look.
OUTPUT : a pointer to a ListInfo structure identified by
from/where or NULL if an error occurred.
******************************************************************/
PLISTINFO RemoveList( PLISTHEAD LHead, PLISTINFO LInfo );
/*****************************************************************
RemoveList: Remove a ListInfo structure from a List.
INPUTS : LHead : a pointer to a ListHead structure.
LInfo : a pointer to the ListInfo structure to remove
from the list.
OUTPUT : a pointer to the ListInfo structure that was removed or
NULL if an error occurred.
******************************************************************/
BOOL InsertNode( PLISTHEAD LHead, int nPos, PLISTINFO LInfo );
/*****************************************************************
InsertNode: add a node to a list after a given node
INPUTS : LHead : a pointer to a ListHead structure.
nPos : the position to insert the node into
LInfo : a pointer to the new node to add to the list.
OUTPUT: a boolean value TRUE if all goes well false otherwise
*****************************************************************/
BOOL AddHead ( PLISTHEAD, PLISTINFO );
/*****************************************************************
AddHead : add a ListInfo structure to the HEAD of a list.
INPUTS : LHead : a pointer to a ListHead structure of the list
to add to.
LInfo : a pointer to the ListInfo structure to add to
the list.
OUTPUT : A boolean value TRUE if no errors occurred FALSE
otherwise.
******************************************************************/
BOOL AddTail ( PLISTHEAD, PLISTINFO );
/*****************************************************************
AddTail : Add a ListInfo structure to the TAIL of a list.
INPUTS : LHead : a pointer to a ListHead structure of the List
to add to.
LInfo : a pointer to the ListInfo structure to add to
the List.
OUTPUT : a boolean value TRUE if no errors occurred FALSE
otherwise.
******************************************************************/
PLISTINFO RemTail ( PLISTHEAD );
/*****************************************************************
RemTail : Remove a ListInfo structure from the TAIL of a List.
INPUTS : LHead : a pointer to a ListHead structure of the List
to remove from.
OUTPUT : a pointer to the ListInfo structure that was removed
or NULL if an error occurred.
******************************************************************/
PLISTINFO RemHead ( PLISTHEAD );
/*****************************************************************
RemHead : Remove a ListInfo structure from the Head of a List.
INPUTS : LHead : a pointer to a ListHead structure of the List
to remove from.
OUTPUT : a pointer to the ListInfo structure that was removed or
NULL if an error occurred.
******************************************************************/
PLISTINFO SearchList(
PLISTHEAD lpListHead,
PVOID lpSKey,
int ( * CompareCallBack) ( PVOID, PVOID ) );
/*****************************************************************
SearchList:
Try to find a specific node in the queue whose key matches with
searching key. Return the pointer to that node if found, return NULL
otherwise
Input:
lpHashTbl => a far pointer to the hash table
lpKey => a far poniter to searching key
CompareCallBack => comparision function
Output: a far pointer to the node to be found
******************************************************************/
#define NumOnList(lh) ( ((lh)->NumList) )
/*****************************************************************
NumOnList: Returns the number of Nodes linked to a ListHead
structure. This number is maintained by the List
routines.
******************************************************************/
#define GetNextNode(pli) ( ((pli)->ListNode.Next) )
/********************************************************
GetNextNode: This macro returns the Next Structure in this list.
This macro will return NULL if no more structures are
in the List.
*********************************************************/
#define GetPrevNode(pli) ( ((pli)->ListNode.Previous) )
/********************************************************
GetPrevNode: This macro returns the Previous Structure in this list.
This macro will reutrn NULL if no more structures are
in the List.
********************************************************/
/* %%e */
#endif