diff options
Diffstat (limited to 'src/stack.c')
-rw-r--r-- | src/stack.c | 165 |
1 files changed, 165 insertions, 0 deletions
diff --git a/src/stack.c b/src/stack.c new file mode 100644 index 0000000..7b26ec3 --- /dev/null +++ b/src/stack.c @@ -0,0 +1,165 @@ +/* + * Copyright (C) 2004-2005 The Free Software Foundation, Inc. + * + * Portions Copyright (C) 2004-2005 Derek Price, Ximbiot <http://ximbiot.com>, + * and others. + * + * You may distribute under the terms of the GNU General Public License as + * specified in the README file that comes with the CVS source distribution. + * + * This module uses the hash.c module to implement a stack. + */ + +#include "cvs.h" +#include <assert.h> + + + +static void +do_push (List *stack, void *elem, int isstring) +{ + Node *p = getnode(); + + if (isstring) + p->key = elem; + else + p->data = elem; + + addnode(stack, p); +} + + + +void +push (List *stack, void *elem) +{ + do_push (stack, elem, 0); +} + + + +void +push_string (List *stack, char *elem) +{ + do_push (stack, elem, 1); +} + + + +static void * +do_pop (List *stack, int isstring) +{ + void *elem; + + if (isempty (stack)) return NULL; + + if (isstring) + { + elem = stack->list->prev->key; + stack->list->prev->key = NULL; + } + else + { + elem = stack->list->prev->data; + stack->list->prev->data = NULL; + } + + delnode (stack->list->prev); + return elem; +} + + + +void * +pop (List *stack) +{ + return do_pop (stack, 0); +} + + + +char * +pop_string (List *stack) +{ + return do_pop (stack, 1); +} + + + +static void +do_unshift (List *stack, void *elem, int isstring) +{ + Node *p = getnode(); + + if (isstring) + p->key = elem; + else + p->data = elem; + + addnode_at_front(stack, p); +} + + + +void +unshift (List *stack, void *elem) +{ + do_unshift (stack, elem, 0); +} + + + +void +unshift_string (List *stack, char *elem) +{ + do_unshift (stack, elem, 1); +} + + + +static void * +do_shift (List *stack, int isstring) +{ + void *elem; + + if (isempty (stack)) return NULL; + + if (isstring) + { + elem = stack->list->next->key; + stack->list->next->key = NULL; + } + else + { + elem = stack->list->next->data; + stack->list->next->data = NULL; + } + delnode (stack->list->next); + return elem; +} + + + +void * +shift (List *stack) +{ + return do_shift (stack, 0); +} + + + +char * +shift_string (List *stack) +{ + return do_shift (stack, 1); +} + + + +int +isempty (List *stack) +{ + if (stack->list == stack->list->next) + return 1; + return 0; +} |