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