#include "cat_stack.h"
typedef struct _stackInner {
size_t capacity;
size_t length;
void* data[];
} CatStackInner;
#define CAT_STACK_GET_INNER(stack) (CatStackInner *) ((stack) + sizeof(CatStack))
void* catStackPeek(CatStack* stack) {
CatStackInner *s = CAT_STACK_GET_INNER(stack);
if (s->length == 0) {
return NULL;
}
return s->data[s->length - 1];
}
int catStackSize(CatStack* stack) {
CatStackInner *s = CAT_STACK_GET_INNER(stack);
return (int) s->length;
}
int catStackCapacity(CatStack* stack) {
CatStackInner *s = CAT_STACK_GET_INNER(stack);
return (int) s->capacity;
}
int catStackPush(CatStack* stack, void* item) {
CatStackInner *s = CAT_STACK_GET_INNER(stack);
if (s->length < s->capacity) {
s->data[s->length++] = item;
return CAT_STACK_PUSH_SUCCESS;
} else {
return 1;
}
}
void* catStackPop(CatStack* stack) {
CatStackInner *s = CAT_STACK_GET_INNER(stack);
if (s->length < 1) {
return NULL;
}
return s->data[--s->length];
}
CatStack* newCatStack(int capacity) {
int base = sizeof(CatStack) + sizeof(CatStackInner);
CatStack *stack = malloc(base + capacity * sizeof(void *));
CatStackInner *s = CAT_STACK_GET_INNER(stack);
s->capacity = (size_t) capacity;
s->length = 0;
stack->peek = catStackPeek;
stack->size = catStackSize;
stack->capacity = catStackCapacity;
stack->push = catStackPush;
stack->pop = catStackPop;
return stack;
}
void deleteCatStack(CatStack *stack) {
free(stack);
}