xref: /dflybsd-src/contrib/cvs-1.12/src/stack.c (revision 86d7f5d305c6adaa56ff4582ece9859d73106103)
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