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
do_push(List * stack,void * elem,int isstring)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
push(List * stack,void * elem)34 push (List *stack, void *elem)
35 {
36 do_push (stack, elem, 0);
37 }
38
39
40
41 void
push_string(List * stack,char * elem)42 push_string (List *stack, char *elem)
43 {
44 do_push (stack, elem, 1);
45 }
46
47
48
49 static void *
do_pop(List * stack,int isstring)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 *
pop(List * stack)74 pop (List *stack)
75 {
76 return do_pop (stack, 0);
77 }
78
79
80
81 char *
pop_string(List * stack)82 pop_string (List *stack)
83 {
84 return do_pop (stack, 1);
85 }
86
87
88
89 static void
do_unshift(List * stack,void * elem,int isstring)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
unshift(List * stack,void * elem)105 unshift (List *stack, void *elem)
106 {
107 do_unshift (stack, elem, 0);
108 }
109
110
111
112 void
unshift_string(List * stack,char * elem)113 unshift_string (List *stack, char *elem)
114 {
115 do_unshift (stack, elem, 1);
116 }
117
118
119
120 static void *
do_shift(List * stack,int isstring)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 *
shift(List * stack)144 shift (List *stack)
145 {
146 return do_shift (stack, 0);
147 }
148
149
150
151 char *
shift_string(List * stack)152 shift_string (List *stack)
153 {
154 return do_shift (stack, 1);
155 }
156
157
158
159 int
isempty(List * stack)160 isempty (List *stack)
161 {
162 if (stack->list == stack->list->next)
163 return 1;
164 return 0;
165 }
166