1 /* 2 * Date last modified: Jan 2001 3 * Modifications by Dan Libby (dan@libby.com), including: 4 * - various fixes, null checks, etc 5 * - addition of Q_Iter funcs, macros 6 */ 7 8 /* 9 * File : q.h 10 * 11 * Peter Yard 02 Jan 1993. 12 * 13 * Disclaimer: This code is released to the public domain. 14 */ 15 16 #ifndef Q__H 17 #define Q__H 18 19 #ifndef False_ 20 #define False_ 0 21 #endif 22 23 #ifndef True_ 24 #define True_ 1 25 #endif 26 27 typedef struct nodeptr datanode; 28 29 typedef struct nodeptr { 30 void *data ; 31 datanode *prev, *next ; 32 } node ; 33 34 /* For external use with Q_Iter* funcs */ 35 typedef struct nodeptr* q_iter; 36 37 typedef struct { 38 node *head, *tail, *cursor; 39 int size, sorted, item_deleted; 40 } queue; 41 42 typedef struct { 43 void *dataptr; 44 node *loc ; 45 } index_elt ; 46 47 48 int Q_Init(queue *q); 49 void Q_Destroy(queue *q); 50 int Q_IsEmpty(queue *q); 51 int Q_Size(queue *q); 52 int Q_AtHead(queue *q); 53 int Q_AtTail(queue *q); 54 int Q_PushHead(queue *q, void *d); 55 int Q_PushTail(queue *q, void *d); 56 void *Q_Head(queue *q); 57 void *Q_Tail(queue *q); 58 void *Q_PopHead(queue *q); 59 void *Q_PopTail(queue *q); 60 void *Q_Next(queue *q); 61 void *Q_Previous(queue *q); 62 void *Q_DelCur(queue *q); 63 void *Q_Get(queue *q); 64 int Q_Put(queue *q, void *data); 65 int Q_Sort(queue *q, int (*Comp)(const void *, const void *)); 66 int Q_Find(queue *q, void *data, 67 int (*Comp)(const void *, const void *)); 68 void *Q_Seek(queue *q, void *data, 69 int (*Comp)(const void *, const void *)); 70 int Q_Insert(queue *q, void *data, 71 int (*Comp)(const void *, const void *)); 72 73 /* read only funcs for iterating through queue. above funcs modify queue */ 74 q_iter Q_Iter_Head(queue *q); 75 q_iter Q_Iter_Tail(queue *q); 76 q_iter Q_Iter_Next(q_iter qi); 77 q_iter Q_Iter_Prev(q_iter qi); 78 void* Q_Iter_Get(q_iter qi); 79 int Q_Iter_Put(q_iter qi, void* data); /* not read only! here for completeness. */ 80 void* Q_Iter_Del(queue *q, q_iter iter); /* not read only! here for completeness. */ 81 82 /* Fast (macro'd) versions of above */ 83 #define Q_Iter_Head_F(q) (q ? (q_iter)((queue*)q)->head : NULL) 84 #define Q_Iter_Tail_F(q) (q ? (q_iter)((queue*)q)->tail : NULL) 85 #define Q_Iter_Next_F(qi) (qi ? (q_iter)((node*)qi)->next : NULL) 86 #define Q_Iter_Prev_F(qi) (qi ? (q_iter)((node*)qi)->prev : NULL) 87 #define Q_Iter_Get_F(qi) (qi ? ((node*)qi)->data : NULL) 88 89 #endif /* Q__H */ 90