xref: /PHP-7.4/ext/xmlrpc/libxmlrpc/queue.h (revision b7a7b1a6)
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