diff options
author | Arnold D. Robbins <arnold@skeeve.com> | 2012-11-25 21:54:48 +0200 |
---|---|---|
committer | Arnold D. Robbins <arnold@skeeve.com> | 2012-11-25 21:54:48 +0200 |
commit | 9a9ff61bbd952c1263b55f82a269da5b09289a6b (patch) | |
tree | 4bc31b31d0bec6d27f77e55f1a88f50534fa6ed4 /extension/stack.c | |
parent | dbabe5a569ad82a9faeb2f121e387ec6399f9dcb (diff) | |
parent | 7af1da783175273a26609911c3a95975ed0f5c13 (diff) | |
download | egawk-9a9ff61bbd952c1263b55f82a269da5b09289a6b.tar.gz egawk-9a9ff61bbd952c1263b55f82a269da5b09289a6b.tar.bz2 egawk-9a9ff61bbd952c1263b55f82a269da5b09289a6b.zip |
Merge branch 'master' into array-iface
Diffstat (limited to 'extension/stack.c')
-rw-r--r-- | extension/stack.c | 90 |
1 files changed, 90 insertions, 0 deletions
diff --git a/extension/stack.c b/extension/stack.c new file mode 100644 index 00000000..ec994c61 --- /dev/null +++ b/extension/stack.c @@ -0,0 +1,90 @@ +/* + * stack.c -- Implementation for stack functions for use by extensions. + */ + +/* + * Copyright (C) 2012 the Free Software Foundation, Inc. + * + * This file is part of GAWK, the GNU implementation of the + * AWK Programming Language. + * + * GAWK is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * GAWK is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#include <stdlib.h> + +#include "stack.h" + +#define INITIAL_STACK 20 + +static size_t size; +static void **stack; +static int index = -1; + +/* stack_empty --- return true if stack is empty */ + +int +stack_empty() +{ + return index < 0; +} + +/* stack_top --- return top object on the stack */ + +void * +stack_top() +{ + if (stack_empty() || stack == NULL) + return NULL; + + return stack[index]; +} + +/* stack_pop --- pop top object and return it */ + +void * +stack_pop() +{ + if (stack_empty() || stack == NULL) + return NULL; + + return stack[index--]; +} + +/* stack_push --- push an object onto the stack */ + +int stack_push(void *object) +{ + void **new_stack; + size_t new_size = 2 * size; + + if (stack == NULL) { + stack = (void **) malloc(INITIAL_STACK * sizeof(void *)); + if (stack == NULL) + return 0; + size = INITIAL_STACK; + } else if (index + 1 >= size) { + if (new_size < size) + return 0; + new_stack = realloc(stack, new_size * sizeof(void *)); + if (new_stack == NULL) + return 0; + size = new_size; + stack = new_stack; + } + + stack[++index] = object; + return 1; +} |