#ifndef __STACK_H__ #define __STACK_H__ #include "utlist.h" typedef struct _abac_stack_t abac_stack_t; typedef struct _abac_stack_element_t abac_stack_element_t; struct _abac_stack_element_t { void *ptr; abac_stack_element_t *prev, *next; }; struct _abac_stack_t { abac_stack_element_t *elts; int size; }; abac_stack_t *abac_stack_new(void); void abac_stack_push(abac_stack_t *stack, void *elt); int abac_stack_unique_push(abac_stack_t *stack, void *elt); void *abac_stack_pop(abac_stack_t *stack); int abac_stack_size(abac_stack_t *stack); void abac_stack_free(abac_stack_t *stack); #define abac_stack_foreach(STACK, CURRENT, BODY) do { \ abac_stack_element_t *_elt; \ DL_FOREACH(STACK->elts, _elt) { \ CURRENT = (typeof(CURRENT))_elt->ptr; \ BODY \ } \ } while (0) #endif /* __STACK_H__ */