8#include "nilorea/n_stack.h"
26 stack -> size = size ;
27 stack -> head = stack -> tail = 0 ;
28 stack -> nb_items = 0 ;
41 Free( (*stack) -> stack_array );
53 return ( stack -> nb_items == stack -> size );
63 return ( stack -> nb_items == 0 );
82 if( stack -> tail < stack -> head )
84 if( position >= stack -> tail && position <= stack -> head && position < stack -> size && stack -> stack_array[ position ] . is_set )
86 item = &stack -> stack_array[ position ];
89 else if( stack -> tail > stack -> head )
91 if( position >= stack -> head && position <= stack -> tail && position < stack -> size && stack -> stack_array[ position ] . is_set )
93 item = &stack -> stack_array[ position ];
116 size_t next_pos = ( stack -> head + 1 ) % stack -> size ;
119 if( next_pos == stack -> tail )
127 stack -> stack_array[ stack -> head ] . is_set = 1 ;
128 stack -> stack_array[ stack -> head ] . is_empty = 0 ;
130 stack -> nb_items ++ ;
149 if( stack -> head == stack -> tail )
159 next_pos = (stack -> tail + 1) % stack -> size;
162 stack -> stack_array[ stack -> tail ] . is_set = 0 ;
163 stack -> stack_array[ stack -> tail ] . is_empty = 1 ;
164 prev_pos = stack -> tail ;
166 stack -> tail = next_pos ;
168 stack -> nb_items -- ;
184 stack -> stack_array[ stack -> head ] . data . b = b;
186 stack -> head = next_pos ;
202 if( stack -> stack_array[ stack -> tail ] . v_type !=
STACK_ITEM_BOOL )
209 size_t prev_pos =
__stack_pop( stack , &pop_status );
212 (*status) = pop_status ;
215 return stack -> stack_array[ prev_pos ] . data . b ;
233 stack -> stack_array[ stack -> head ] . data . c = c;
235 stack -> head = next_pos ;
251 if( stack -> stack_array[ stack -> tail ] . v_type !=
STACK_ITEM_CHAR )
258 size_t prev_pos =
__stack_pop( stack , &pop_status );
261 (*status) = pop_status ;
264 return stack -> stack_array[ prev_pos ] . data . c ;
283 stack -> stack_array[ stack -> head ] . data . ui8 = ui8;
285 stack -> head = next_pos ;
308 size_t prev_pos =
__stack_pop( stack , &pop_status );
311 (*status) = pop_status ;
314 return stack -> stack_array[ prev_pos ] . data . ui8 ;
331 stack -> stack_array[ stack -> head ] . data . i8 = i8;
333 stack -> head = next_pos ;
349 if( stack -> stack_array[ stack -> tail ] . v_type !=
STACK_ITEM_INT8 )
356 size_t prev_pos =
__stack_pop( stack , &pop_status );
359 (*status) = pop_status ;
362 return stack -> stack_array[ prev_pos ] . data . i8 ;
379 stack -> stack_array[ stack -> head ] . data . ui32 = ui32;
381 stack -> head = next_pos ;
404 size_t prev_pos =
__stack_pop( stack , &pop_status );
407 (*status) = pop_status ;
410 return stack -> stack_array[ prev_pos ] . data . ui32 ;
427 stack -> stack_array[ stack -> head ] . data . i32 = i32;
429 stack -> head = next_pos ;
452 size_t prev_pos =
__stack_pop( stack , &pop_status );
455 (*status) = pop_status ;
458 return stack -> stack_array[ prev_pos ] . data . i32 ;
475 stack -> stack_array[ stack -> head ] . data . f = f ;
477 stack -> head = next_pos ;
500 size_t prev_pos =
__stack_pop( stack , &pop_status );
503 (*status) = pop_status ;
506 return stack -> stack_array[ prev_pos ] . data . f ;
523 stack -> stack_array[ stack -> head ] . data . d = d ;
525 stack -> head = next_pos ;
548 size_t prev_pos =
__stack_pop( stack , &pop_status );
551 (*status) = pop_status ;
554 return stack -> stack_array[ prev_pos ] . data . d ;
573 stack -> stack_array[ stack -> head ] . data . p = p ;
575 stack -> stack_array[ stack -> head ] . p_type = p_type ;
576 stack -> head = next_pos ;
593 if( stack -> stack_array[ stack -> tail ] . v_type !=
STACK_ITEM_PTR )
600 size_t prev_pos =
__stack_pop( stack , &pop_status );
603 (*status) = pop_status ;
606 return stack -> stack_array[ prev_pos ] . data . p ;
616bool stack_push_ui64(
STACK *stack , uint64_t ui64 )
624 stack -> stack_array[ stack -> head ] . data . ui64 = ui64;
626 stack -> head = next_pos ;
637uint64_t stack_pop_ui64(
STACK *stack , uint8_t *status )
649 size_t prev_pos =
__stack_pop( stack , &pop_status );
652 (*status) = pop_status ;
655 return stack -> stack_array[ prev_pos ] . data . ui64 ;
665bool stack_push_i64(
STACK *stack , int64_t i64 )
673 stack -> stack_array[ stack -> head ] . data . i64 = i64;
675 stack -> head = next_pos ;
686int64_t stack_pop_i64(
STACK *stack , uint8_t *status )
698 size_t prev_pos =
__stack_pop( stack , &pop_status );
701 (*status) = pop_status ;
704 return stack -> stack_array[ prev_pos ] . data . i64 ;
#define Malloc(__ptr, __struct, __size)
Malloc Handler to get errors and set to 0.
#define __n_assert(__ptr, __ret)
macro to assert things
#define Free(__ptr)
Free Handler to get errors.
bool stack_push_f(STACK *stack, float f)
helper to push a float
#define STACK_ITEM_UINT64
v_type value for a uint64_t
bool stack_is_empty(STACK *stack)
test if the stack is empty
double stack_pop_d(STACK *stack, uint8_t *status)
helper to pop a double
bool stack_pop_b(STACK *stack, uint8_t *status)
helper to pop a bool
bool stack_push_d(STACK *stack, double d)
helper to push a double
bool stack_push_ui8(STACK *stack, uint8_t ui8)
helper to push an uint8_t
#define STACK_ITEM_UINT32
v_type value for a uint32_t
STACK_ITEM * stack_peek(STACK *stack, size_t position)
peek in the stack with un stacking the stack item
bool stack_is_full(STACK *stack)
test if the stack is full
bool stack_push_ui32(STACK *stack, uint32_t ui32)
helper to push an uint32_t
int8_t stack_pop_i8(STACK *stack, uint8_t *status)
helper to pop a int8_t
#define STACK_ITEM_INT8
v_type value for a int8_t
char stack_pop_c(STACK *stack, uint8_t *status)
helper to pop a char
float stack_pop_f(STACK *stack, uint8_t *status)
helper to pop a float
#define STACK_ITEM_PTR
v_type value for a void *pointer
uint8_t stack_pop_ui8(STACK *stack, uint8_t *status)
helper to pop a uint8_t
bool stack_push_c(STACK *stack, char c)
helper to push a char
#define STACK_IS_EMPTY
code for an empty stack state
#define STACK_ITEM_INT64
v_type value for a int64_t
#define STACK_ITEM_INT32
v_type value for a int32_t
#define STACK_IS_FULL
code for a full stack state
#define STACK_ITEM_CHAR
v_type value for a char
#define STACK_ITEM_OK
code for a successfully retrieved item
uint32_t stack_pop_ui32(STACK *stack, uint8_t *status)
helper to pop a uint32_t
bool stack_push_b(STACK *stack, bool b)
helper to push a bool
#define STACK_ITEM_BOOL
v_type value for a bool
#define STACK_IS_UNDEFINED
code for a NULL stack state
#define STACK_ITEM_UINT8
v_type value for a uint8_t
bool stack_push_i32(STACK *stack, int32_t i32)
helper to push an int32_t
int32_t stack_pop_i32(STACK *stack, uint8_t *status)
helper to pop a int32_t
#define STACK_ITEM_WRONG_TYPE
code for a bad item type
#define STACK_ITEM_DOUBLE
v_type value for a double
bool delete_stack(STACK **stack)
delete a STACK *stack
bool stack_push_i8(STACK *stack, int8_t i8)
helper to push an int8_t
#define STACK_ITEM_FLOAT
v_type value for a float
STACK * new_stack(size_t size)
allocate a new STACK
bool stack_push_p(STACK *stack, void *p, uint16_t p_type)
helper to push a pointer
void * stack_pop_p(STACK *stack, uint8_t *status)
helper to pop a pointer
structure of a STACK item
size_t __stack_push(STACK *stack, uint8_t *status)
helper for stack_push.
size_t __stack_pop(STACK *stack, uint8_t *status)
helper for stack_pop.