49 lines
1.2 KiB
C
49 lines
1.2 KiB
C
#include <string.h>
|
|
#include <stdlib.h>
|
|
|
|
#if defined(__APPLE__) || defined(__WIN32__)
|
|
/* Linux + Kos define this, OSX does not, so just use malloc there */
|
|
static inline void* memalign(size_t alignment, size_t size) {
|
|
return malloc(size);
|
|
}
|
|
#else
|
|
#include <malloc.h>
|
|
#endif
|
|
|
|
#include "stack.h"
|
|
|
|
void init_stack(Stack* stack, unsigned int element_size, unsigned int capacity) {
|
|
stack->size = 0;
|
|
stack->capacity = capacity;
|
|
stack->element_size = element_size;
|
|
stack->data = (unsigned char*) memalign(0x20, element_size * capacity);
|
|
}
|
|
|
|
void* stack_top(Stack* stack) {
|
|
return &stack->data[(stack->size - 1) * stack->element_size];
|
|
}
|
|
|
|
void* stack_replace(Stack* stack, const void* element) {
|
|
memcpy(stack->data + ((stack->size - 1) * stack->element_size), element, stack->element_size);
|
|
return stack_top(stack);
|
|
}
|
|
|
|
void* stack_push(Stack* stack, const void* element) {
|
|
if(stack->size + 1 == stack->capacity) {
|
|
return NULL;
|
|
}
|
|
|
|
memcpy(stack->data + (stack->size * stack->element_size), element, stack->element_size);
|
|
stack->size++;
|
|
|
|
return stack_top(stack);
|
|
}
|
|
|
|
void stack_pop(Stack* stack) {
|
|
if(stack->size == 0) {
|
|
return;
|
|
}
|
|
|
|
stack->size--;
|
|
}
|