LeaHeader.c 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. #include "LeaHeader.h"
  2. //returns a pointer to the header of the block
  3. leaHdr *getHeader(const char * ptr) {
  4. return (leaHdr *) (ptr - HDR_SIZE);
  5. }
  6. size_t getSize (void *ptr) {
  7. return (getHeader(ptr)->size >> 1);
  8. }
  9. size_t getPrevSize (void *ptr) {
  10. size_t sz = getHeader(ptr)->previous_size;
  11. return sz >> 1;
  12. }
  13. void *getNext(void *ptr) {
  14. return (void *)((char *) ptr + HDR_SIZE + getSize(ptr));
  15. }
  16. void setSize(void *ptr, size_t sz) {
  17. size_t size = getSize(ptr);
  18. size = ((size & 1) | (sz << 1));
  19. getHeader(ptr)->size = size;
  20. }
  21. void setPrevSize (void *ptr, size_t sz) {
  22. size_t previous_size = getHeader(ptr)->previous_size;
  23. previous_size = (previous_size & 1) | (sz << 1);
  24. getHeader(ptr)->previous_size = previous_size;
  25. }
  26. void markPrevFree (char * ptr) {
  27. getHeader(ptr)->previous_size &= (size_t) (~ 1);
  28. }
  29. void markPrevInUse (char * ptr) {
  30. getHeader(ptr)->previous_size |= 1;
  31. }
  32. size_t isPrevFree (char * ptr) {
  33. size_t free = ~(getHeader(ptr)->previous_size & 1);
  34. return (free & 1) ;
  35. }
  36. void markInUse (char * ptr) {
  37. markPrevInUse(getNext(ptr));
  38. }
  39. void markFree (char * ptr) {
  40. markPrevFree(getNext(ptr));
  41. }
  42. size_t isFree (char * ptr) {
  43. return isPrevFree(getNext(ptr));
  44. }
  45. void set_requested_size (void *ptr, size_t size) {
  46. getHeader(ptr)->requested_size = size;
  47. }