block_header.c 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. #include "block_header.h"
  2. block_header_t * get_header(void *ptr);
  3. block_header_t * get_header(void *ptr) {
  4. return (block_header_t *) ((char *) ptr - HEADER_SIZE);
  5. }
  6. void * get_next(void *ptr) {
  7. return get_header(ptr)->next;
  8. }
  9. size_t get_size(void *ptr) {
  10. return get_header(ptr)->size;
  11. }
  12. void set_size(void *ptr, size_t size) {
  13. get_header(ptr)->size = size << 1;
  14. }
  15. void set_requested_size(void *ptr, size_t size) {
  16. get_header(ptr)->requested_size = size;
  17. }
  18. void set_next(void *ptr, void *next_block) {
  19. get_header(ptr)->next = next_block;
  20. }
  21. bool is_previous_free(void *ptr) {
  22. return (bool) (get_header(ptr)->previous_size & 1);
  23. }
  24. size_t get_previous_size(void *ptr) {
  25. return get_header(ptr)->previous_size >> 1;
  26. }
  27. void * get_previous(void *ptr) {
  28. return (void *) ((char *) ptr - get_previous_size(ptr));
  29. }
  30. void remove_block(void *block, void *starting_node) {
  31. void *current_node, *previous_node;
  32. for(current_node = starting_node; current_node != NULL;
  33. current_node = get_next(current_node)) {
  34. if(current_node == block) {
  35. if(current_node == starting_node) {
  36. starting_node = get_next(block);
  37. } else {
  38. set_next(previous_node, get_next(block));
  39. }
  40. break;
  41. }
  42. previous_node = current_node;
  43. }
  44. }