HuntnGather – Rev 46
?pathlinks?
///////////////////////////////////////////////////////////////////////////
// Copyright (C) 2021 Wizardry and Steamworks - License: MIT //
///////////////////////////////////////////////////////////////////////////
// //
// stack //
// //
// An implementation of a stack. //
// Implemented functions: //
// - push //
// - pop //
// - is empty //
// - count //
// - size //
// - print //
// //
///////////////////////////////////////////////////////////////////////////
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <dirent.h>
#include <sys/types.h>
#include <sys/stat.h>
#include "stack.h"
/*
* Creates a new stack with a given size.
*/
stack* stackCreate(unsigned int size) {
stack *s;
s = malloc(sizeof(*s));
if ((s->store = malloc(size * sizeof(*s->store))) == NULL) {
free(s);
s = NULL;
return NULL;
}
s->size = size;
s->top = 0;
return s;
}
/*
* Clears a stack and returns a pointer to a new empty stack.
*/
stack* stackClear(stack *s) {
if (s != NULL) {
free(s);
s = NULL;
}
return stackCreate(1);
}
/*
* Pushes an element onto the stack.
*/
void stackPush(stack *s, void *e, unsigned int size) {
if (s->top > s->size - 1) {
s->store = realloc(s->store, ++s->size * sizeof(*s->store));
}
s->store[s->top] = malloc(1 * sizeof(*s->store[s->top]));
s->store[s->top]->data = malloc(size * sizeof(*s->store[s->top]->data));
s->store[s->top]->size = size;
memcpy(s->store[s->top]->data, e, size);
++s->top;
}
/*
* Pops an element off the stack or returns NULL in case the
* stack is empty.
*/
void *stackPop(stack *s) {
void *e;
if (stackIsEmpty(s)) {
return NULL;
}
--s->top;
e = malloc(s->store[s->top]->size);
memcpy(e, s->store[s->top]->data, s->store[s->top]->size);
free(s->store[s->top]->data);
free(s->store[s->top]);
s->store[s->top] = NULL;
return e;
}
/*
* Delete a stack.
*/
void stackDestroy(stack *s) {
stackElement *e;
while(!stackIsEmpty(s)) {
e = stackPop(s);
free(e->data);
free(e);
e = NULL;
}
free(s);
s = NULL;
}