#include "block_header.h" /** * \brief Get the address of the block header of a memory block. * * \param ptr The data part of the memory block. */ static block_header_t * get_header(void *ptr); static block_header_t * get_header(void *ptr) { return (block_header_t *) ((char *) ptr - HEADER_SIZE); } void * get_next(void *ptr) { return get_header(ptr)->next; } size_t get_size(void *ptr) { return get_header(ptr)->size >> 1; } size_t get_size_availability(void *ptr) { return get_header(ptr)->size; } void set_size(void *ptr, size_t size) { get_header(ptr)->size = size << 1; } void set_requested_size(void *ptr, size_t size) { get_header(ptr)->requested_size = size; } void set_next(void *ptr, void *next_block) { get_header(ptr)->next = next_block; } bool is_previous_free(void *ptr) { return (bool) (get_header(ptr)->previous_size & 1); } void set_previous_size(void *ptr, size_t previous_size) { get_header(ptr)->previous_size = previous_size; } size_t get_previous_size(void *ptr) { return get_header(ptr)->previous_size >> 1; } void * get_previous(void *ptr) { return (void *) ((char *) ptr - get_previous_size(ptr)); } void remove_block(void *block, void *starting_node) { void *current_node, *previous_node; // Traverse a list starting from the starting node until block is found. for(current_node = starting_node; current_node != NULL; current_node = get_next(current_node)) { if(current_node == block) { if(current_node == starting_node) { starting_node = get_next(block); } else { set_next(previous_node, get_next(block)); } break; } previous_node = current_node; } }