#include #include "abac_stack.h" #include "abac_util.h" abac_stack_t *abac_stack_new(void) { abac_stack_t *ret = abac_xmalloc(sizeof(abac_stack_t)); ret->elts = NULL; ret->size = 0; return ret; } void abac_stack_push(abac_stack_t *stack, void *elt) { abac_stack_element_t *new_element = abac_xmalloc(sizeof(abac_stack_element_t)); new_element->ptr = elt; DL_APPEND(stack->elts, new_element); ++stack->size; } void *abac_stack_pop(abac_stack_t *stack) { abac_stack_element_t *cur; void *ret; if(stack->size>0) { cur=stack->elts; ret=cur->ptr; DL_DELETE(stack->elts, cur); free(cur); --stack->size; return ret; } // reutrn false if we don't return NULL; } int abac_stack_size(abac_stack_t *stack) { return stack->size; } void abac_stack_free(abac_stack_t *stack) { abac_stack_element_t *elt, *tmp; // free everthing in the stack DL_FOREACH_SAFE(stack->elts, elt, tmp) { DL_DELETE(stack->elts, elt); free(elt); } // free the list free(stack); }