From 6045cae71a438a752980a395f03717a13cc22179 Mon Sep 17 00:00:00 2001 From: peter Date: Thu, 15 Apr 2004 01:01:56 +0000 Subject: Import cvs-1.11.15 --- contrib/cvs/src/stack.c | 187 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 187 insertions(+) create mode 100644 contrib/cvs/src/stack.c (limited to 'contrib/cvs/src/stack.c') diff --git a/contrib/cvs/src/stack.c b/contrib/cvs/src/stack.c new file mode 100644 index 0000000..edba905 --- /dev/null +++ b/contrib/cvs/src/stack.c @@ -0,0 +1,187 @@ +/* + * Copyright (c) 2004, Free Software Foundation, + * Derek Price, + * & Ximbiot . + * + * 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 + + + +static void +do_push (stack, elem, isstring) + List *stack; + void *elem; + int isstring; +{ + Node *p = getnode(); + + if (isstring) + p->key = elem; + else + p->data = elem; + + addnode(stack, p); +} + + + +void +push (stack, elem) + List *stack; + void *elem; +{ + do_push (stack, elem, 0); +} + + + +void +push_string (stack, elem) + List *stack; + char *elem; +{ + do_push (stack, elem, 1); +} + + + +static void * +do_pop (stack, isstring) + 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 (stack) + List *stack; +{ + return do_pop (stack, 0); +} + + + +char * +pop_string (stack) + List *stack; +{ + return do_pop (stack, 1); +} + + + +static void +do_unshift (stack, elem, isstring) + 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 (stack, elem) + List *stack; + void *elem; +{ + do_unshift (stack, elem, 0); +} + + + +void +unshift_string (stack, elem) + List *stack; + char *elem; +{ + do_unshift (stack, elem, 1); +} + + + +static void * +do_shift (stack, isstring) + 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 (stack) + List *stack; +{ + return do_shift (stack, 0); +} + + + +char * +shift_string (stack) + List *stack; +{ + return do_shift (stack, 1); +} + + + +int +isempty (stack) + List *stack; +{ + if (stack->list == stack->list->next) + return 1; + return 0; +} -- cgit v1.1