Created
October 12, 2014 03:23
-
-
Save Youka/bda2bce0f37ed45ac9fe to your computer and use it in GitHub Desktop.
Data stack
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| #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