Changeset 1282:3a11f2afabde in roaraudio


Ignore:
Timestamp:
02/28/09 18:20:53 (15 years ago)
Author:
phi
Branch:
default
Phase:
public
Message:

done the stack implementation

Files:
2 edited

Legend:

Unmodified
Added
Removed
  • include/libroar/stack.h

    r1280 r1282  
    4545 
    4646struct roar_stack { 
    47  int cur; 
     47 int next; 
    4848 int flags; 
    4949 
     
    5858int roar_stack_free(struct roar_stack * stack); 
    5959 
    60 int roar_stack_set_free(struct roar_stack * stack, void (*free)(void*)); 
     60int roar_stack_set_free(struct roar_stack * stack, void (*func)(void*)); 
    6161int roar_stack_set_flag(struct roar_stack * stack, int flag, int reset); 
    6262 
  • libroar/stack.c

    r1280 r1282  
    3535#include "libroar.h" 
    3636 
     37int 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 
     49struct 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 
     68int 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 
     88int 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 
     97int 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 
     109int 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 
     121int 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 
     139int 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 
    37153//ll 
Note: See TracChangeset for help on using the changeset viewer.