Changeset 1282:3a11f2afabde in roaraudio
- Timestamp:
- 02/28/09 18:20:53 (15 years ago)
- Branch:
- default
- Phase:
- public
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
include/libroar/stack.h
r1280 r1282 45 45 46 46 struct roar_stack { 47 int cur;47 int next; 48 48 int flags; 49 49 … … 58 58 int roar_stack_free(struct roar_stack * stack); 59 59 60 int roar_stack_set_free(struct roar_stack * stack, void (*f ree)(void*));60 int roar_stack_set_free(struct roar_stack * stack, void (*func)(void*)); 61 61 int roar_stack_set_flag(struct roar_stack * stack, int flag, int reset); 62 62 -
libroar/stack.c
r1280 r1282 35 35 #include "libroar.h" 36 36 37 int roar_stack_new(struct roar_stack * stack) { 38 if ( stack == NULL ) 39 return -1; 40 41 memset(stack, 0, sizeof(struct roar_stack)); 42 43 stack->flags = ROAR_STACK_FLAG_FREE_DATA; 44 stack->free = free; 45 46 return 0; 47 } 48 49 struct roar_stack * roar_stack_newalloc(void) { 50 struct roar_stack * stack = malloc(sizeof(struct roar_stack)); 51 52 if ( stack == NULL ) 53 return NULL; 54 55 if ( roar_stack_new(stack) == -1 ) { 56 free(stack); 57 return NULL; 58 } 59 60 if ( roar_stack_set_flag(stack, ROAR_STACK_FLAG_FREE_SELF, 0) == -1 ) { 61 free(stack); 62 return NULL; 63 } 64 65 return stack; 66 } 67 68 int roar_stack_free(struct roar_stack * stack) { 69 int i; 70 71 if ( stack == NULL ) 72 return -1; 73 74 if ( (stack->flags & ROAR_STACK_FLAG_FREE_DATA) && stack->free != NULL ) { 75 for (i = 0; i < stack->next; i++) 76 stack->free(stack->slot[i]); 77 } 78 79 if ( stack->flags & ROAR_STACK_FLAG_FREE_SELF ) { 80 free(stack); 81 } else { 82 memset(stack, 0, sizeof(struct roar_stack)); // just to be sure... 83 } 84 85 return 0; 86 } 87 88 int roar_stack_set_free(struct roar_stack * stack, void (*func)(void*)) { 89 if ( stack == NULL ) 90 return -1; 91 92 stack->free = func; 93 94 return 0; 95 } 96 97 int roar_stack_set_flag(struct roar_stack * stack, int flag, int reset) { 98 if ( stack == NULL ) 99 return -1; 100 101 stack->flags |= flag; 102 103 if ( reset ) 104 stack->flags -= flag; 105 106 return 0; 107 } 108 109 int roar_stack_push (struct roar_stack * stack, void * ptr) { 110 if ( stack == NULL ) 111 return -1; 112 113 if ( stack->next == ROAR_STACK_SIZE ) /* stack is full */ 114 return -1; 115 116 stack->slot[stack->next++] = ptr; 117 118 return 0; 119 } 120 121 int roar_stack_pop (struct roar_stack * stack, void ** ptr) { 122 if ( stack == NULL ) /* it is valid to have ptr = NULL, */ 123 return -1; /* to just pop a value without want to take it */ 124 125 if ( ptr != NULL ) /* just to be sure */ 126 *ptr = NULL; 127 128 if ( stack->next == 0 ) /* nothing in stack */ 129 return -1; 130 131 stack->next--; 132 133 if ( ptr != NULL ) 134 *ptr = stack->slot[stack->next]; 135 136 return 0; 137 } 138 139 int roar_stack_get_cur (struct roar_stack * stack, void ** ptr) { 140 if ( stack == NULL || ptr == NULL ) 141 return -1; 142 143 *ptr = NULL; /* just to be sure */ 144 145 if ( stack->next == 0 ) /* nothing in the stack */ 146 return -1; 147 148 *ptr = stack->slot[stack->next - 1]; 149 150 return 0; 151 } 152 37 153 //ll
Note: See TracChangeset
for help on using the changeset viewer.