source: libabac/abac_stack.c @ 8fa2c49

mei_rt2mei_rt2_fix_1meiyap-rt1rt2
Last change on this file since 8fa2c49 was da5afdf, checked in by Mei <mei@…>, 12 years ago

1) add static contraint

(limited to integer at this time)

  • Property mode set to 100644
File size: 1.4 KB
Line 
1#include <stdlib.h>
2
3#include "abac_stack.h"
4#include "abac_util.h"
5
6abac_stack_t *abac_stack_new(void) {
7    abac_stack_t *ret = abac_xmalloc(sizeof(abac_stack_t));
8    ret->elts = NULL;
9    ret->size = 0;
10    return ret;
11}
12
13/* push only if it is not in there still */
14void abac_stack_unique_push(abac_stack_t *stack, void *elt) {
15    if(!stack) return; 
16
17    void *cur;
18    abac_stack_foreach(stack, cur,
19        if(cur == elt)
20            return;
21        );
22    abac_stack_push(stack,elt);
23}
24
25void abac_stack_push(abac_stack_t *stack, void *elt) {
26    abac_stack_element_t *new_element = abac_xmalloc(sizeof(abac_stack_element_t));
27
28    new_element->ptr = elt;
29    DL_APPEND(stack->elts, new_element);
30    ++stack->size;
31}
32
33void *abac_stack_pop(abac_stack_t *stack) {
34    abac_stack_element_t *cur;
35    void *ret;
36   
37    if(!stack) return NULL;
38
39    if(stack->size>0) {
40        cur=stack->elts;
41        ret=cur->ptr;
42        DL_DELETE(stack->elts, cur);
43        free(cur);
44        --stack->size;
45        return ret;
46    }
47    // reutrn false if we don't
48    return NULL;
49}
50
51int abac_stack_size(abac_stack_t *stack) {
52    if(stack) return stack->size;
53    return 0;
54}
55
56void abac_stack_free(abac_stack_t *stack) {
57    abac_stack_element_t *elt, *tmp;
58
59    if(!stack) return; 
60
61    // free everthing in the stack
62    DL_FOREACH_SAFE(stack->elts, elt, tmp) {
63        DL_DELETE(stack->elts, elt);
64        free(elt);
65    }
66
67    // free the list
68    free(stack);
69}
Note: See TracBrowser for help on using the repository browser.