bring cvs_1.12.13+real.orig.tar.gz into the game, with -I ! -I CVS -kb
[alioth/cvs.git] / src / stack.c
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 }