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