Skip to content

Instantly share code, notes, and snippets.

@Youka
Created October 12, 2014 03:23
Show Gist options
  • Select an option

  • Save Youka/bda2bce0f37ed45ac9fe to your computer and use it in GitHub Desktop.

Select an option

Save Youka/bda2bce0f37ed45ac9fe to your computer and use it in GitHub Desktop.
Data stack
#ifndef DATA_STACK_H // Include guard
#define DATA_STACK_H
#include <stdlib.h> // size_t, NULL, malloc, free
// Stack node
typedef struct data_stack_node{
void* data; // Userdata
size_t data_len; // Userdata byte length
struct data_stack_node* prev; // Reference to previous node
}data_stack_node_t;
// Stack container
typedef struct{
data_stack_node_t* top; // Top node of the stack
size_t n; // Number of stack nodes
}data_stack_t;
// Create a new stack
inline data_stack_t data_stack_new(){
return (data_stack_t){NULL, 0};
}
// Free stack (optionally with node data)
inline void data_stack_free(data_stack_t* stack, int free_data){
data_stack_node_t* node;
while(stack->top){
stack->top = (node = stack->top)->prev;
if(free_data)
free(node->data);
free(node);
}
}
// Push data on stack
inline void data_stack_push(data_stack_t* stack, void* data, size_t data_len){
data_stack_node_t* node = malloc(sizeof(data_stack_node_t));
if(node){
node->data = data;
node->data_len = data_len;
node->prev = stack->top;
stack->top = node;
stack->n++;
}
}
// Pop data from stack
inline void data_stack_pop(data_stack_t* stack, void** data, size_t* data_len){
data_stack_node_t* node = stack->top;
if(node){
stack->top = node->prev;
stack->n--;
if(data)
*data = node->data;
if(data_len)
*data_len = node->data_len;
free(node);
}
}
// Get stack size/number of data
inline size_t data_stack_size(data_stack_t* stack){
return stack->n;
}
// Get stack data at given position
inline void data_stack_get(data_stack_t* stack, size_t i, void** data, size_t* data_len){
data_stack_node_t* node = stack->top;
i = stack->n - i;
while(--i)
node = node->prev;
*data = node->data;
*data_len = node->data_len;
}
// Set stack data at given position
inline void data_stack_set(data_stack_t* stack, size_t i, void* data, size_t data_len){
data_stack_node_t* node = stack->top;
i = stack->n - i;
while(--i)
node = node->prev;
node->data = data;
node->data_len = data_len;
}
#endif // DATA_STACK_H
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment