Implement CLOCK_MONOTONIC using getnanouptime(), which in DragonFly is
[dragonfly.git] / contrib / cvs-1.12.9 / src / stack.c
1 /*
2  * Copyright (c) 2004, Free Software Foundation,
3  *                     Derek Price,
4  *                     & Ximbiot <http://ximbiot.com>.
5  * 
6  * You may distribute under the terms of the GNU General Public License as
7  * specified in the README file that comes with the CVS source distribution.
8  *
9  * This module uses the hash.c module to implement a stack.
10  */
11
12 #include "cvs.h"
13 #include <assert.h>
14
15
16
17 static void
18 do_push (List *stack, void *elem, int isstring)
19 {
20     Node *p = getnode();
21
22     if (isstring)
23         p->key = elem;
24     else
25         p->data = elem;
26
27     addnode(stack, p);
28 }
29
30
31
32 void
33 push (List *stack, void *elem)
34 {
35     do_push (stack, elem, 0);
36 }
37
38
39
40 void
41 push_string (List *stack, char *elem)
42 {
43     do_push (stack, elem, 1);
44 }
45
46
47
48 static void *
49 do_pop (List *stack, int isstring)
50 {
51     void *elem;
52
53     if (isempty (stack)) return NULL;
54
55     if (isstring)
56     {
57         elem = stack->list->prev->key;
58         stack->list->prev->key = NULL;
59     }
60     else
61     {
62         elem = stack->list->prev->data;
63         stack->list->prev->data = NULL;
64     }
65
66     delnode (stack->list->prev);
67     return elem;
68 }
69
70
71
72 void *
73 pop (List *stack)
74 {
75     return do_pop (stack, 0);
76 }
77
78
79
80 char *
81 pop_string (List *stack)
82 {
83     return do_pop (stack, 1);
84 }
85
86
87
88 static void
89 do_unshift (List *stack, void *elem, int isstring)
90 {
91     Node *p = getnode();
92
93     if (isstring)
94         p->key = elem;
95     else
96         p->data = elem;
97
98     addnode_at_front(stack, p);
99 }
100
101
102
103 void
104 unshift (List *stack, void *elem)
105 {
106     do_unshift (stack, elem, 0);
107 }
108
109
110
111 void
112 unshift_string (List *stack, char *elem)
113 {
114     do_unshift (stack, elem, 1);
115 }
116
117
118
119 static void *
120 do_shift (List *stack, int isstring)
121 {
122     void *elem;
123
124     if (isempty (stack)) return NULL;
125
126     if (isstring)
127     {
128         elem = stack->list->next->key;
129         stack->list->next->key = NULL;
130     }
131     else
132     {
133         elem = stack->list->next->data;
134         stack->list->next->data = NULL;
135     }
136     delnode (stack->list->next);
137     return elem;
138 }
139
140
141
142 void *
143 shift (List *stack)
144 {
145     return do_shift (stack, 0);
146 }
147
148
149
150 char *
151 shift_string (List *stack)
152 {
153     return do_shift (stack, 1);
154 }
155
156
157
158 int
159 isempty (List *stack)
160 {
161     if (stack->list == stack->list->next)
162         return 1;
163     return 0;
164 }