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