#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; } /* push only if it is not in there still */ int abac_stack_unique_push(abac_stack_t *stack, void *elt) { if(!stack) return 0; void *cur; abac_stack_foreach(stack, cur, if(cur == elt) return 0; ); abac_stack_push(stack,elt); return 1; } 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) return NULL; 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) { if(stack) return stack->size; return 0; } void abac_stack_free(abac_stack_t *stack) { abac_stack_element_t *elt, *tmp; if(!stack) return; // free everthing in the stack DL_FOREACH_SAFE(stack->elts, elt, tmp) { DL_DELETE(stack->elts, elt); free(elt); } // free the list free(stack); }