diff options
Diffstat (limited to 'vendor/voclient/libvotable/votStack.c')
-rw-r--r-- | vendor/voclient/libvotable/votStack.c | 157 |
1 files changed, 157 insertions, 0 deletions
diff --git a/vendor/voclient/libvotable/votStack.c b/vendor/voclient/libvotable/votStack.c new file mode 100644 index 00000000..da087139 --- /dev/null +++ b/vendor/voclient/libvotable/votStack.c @@ -0,0 +1,157 @@ +/** + * VOTSTACK.C -- (Private) Methods to manage the parser Element stack. + * + * @file votStack.c + * @author Mike Fitzpatrick and Eric Timmermann + * @date 8/03/09 + * + * @brief (Private) Methods to manage the parser Element stack. + */ + +#include <stdio.h> +#include <stdlib.h> +#include <unistd.h> +#include <strings.h> + +#include "votParseP.h" + + +/** + * vot_newStack -- Makes a new stack (private method) + * + * @brief Makes a new stack (private method) + * @fn Stack *vot_newStack (void) + * + * @return A pointer to a new Stack. + */ +Stack * +vot_newStack (void) +{ + return ( (Stack *) calloc (1, sizeof (Stack)) ); +} + + +/** + * votPop -- Return a Node from the top of the stack (private method) + * + * @brief Return a Node from the top of the stack (private method) + * @fn Element *votPop (Stack *st) + * + * @param st A pointer to a Stack + * @return A pointer to the popped Element. + */ +Element * +votPop (Stack *st) +{ + Node *old; + Element *elem; + + st->level--; + if (vot_isEmpty (st)) + return (NULL); + else { + old = st->head; + st->head = (Node *) old->next; + } + + elem = old->element; + free (old); + + return (elem); +} + + +/** + * votPush -- Push a Node to the top of the stack (private method) + * + * @brief Push a Node to the top of the stack (private method) + * @fn votPush (Stack *st, Element *elem) + * + * @param st A pointer to a Stack + * @param elem A pointer to an element to be put on the stack + * @return nothing + */ +void +votPush (Stack *st, Element *elem) +{ + Node *new = (Node *) calloc (1, sizeof (Node)); + + st->level++; + new->element = elem; + + if (vot_isEmpty (st)) { + st->head = new; + new->next = NULL; + } else { + new->next = (Node *) st->head; + st->head = new; + } +} + + +/** + * votPeek -- Peek at Element on top of the Stack (private method) + * + * @brief Peek at Element on top of the Stack (private method) + * @fn Element *votPeek (Stack *st) + * + * @param st A pointer to a Stack + * @return A pointer to the head Element, or NULL if empty + */ +Element * +votPeek (Stack *st) +{ + if (!vot_isEmpty (st)) + return (st->head->element); + else + return (NULL); +} + + +/** + * vot_isEmpty -- Checks to see if the stack is empty (private method) + * + * @brief Checks to see if the stack is empty (private method) + * @fn int vot_isEmpty (Stack *st) + * + * @param st A pointer to a Stack + * @return \a 1 if true, \a 0 if false. + */ +int +vot_isEmpty (Stack *st) { return (!st->head); } + + +/** + * vot_clearStack -- Clear the stack (private method) + * + * @brief Clear the stack (private method) + * @fn vot_clearStack (Stack *st) + * + * @param st A pointer to a Stack + * @return nothing + */ +void +vot_clearStack (Stack *st) +{ + while (!vot_isEmpty (st)) + votPop (st); +} + + +/** + * vot_printStack -- Print the name of all the stack elements (private method) + * + * @brief Print the name of all the stack elements (private method) + * @fn vot_printStack (Stack *st) + * + * @param st A pointer to a Stack + * @return nothing + */ +void +vot_printStack (Stack *st) +{ + Node *cur; + + for (cur=st->head; cur != NULL; cur = cur->next) + printf ("%s\n", vot_elemName (cur->element)); +} |