LeaHeader.c 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  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. unsigned int getSize (const char * ptr) {
  7. return (getHeader(ptr)->size >> 1);
  8. }
  9. unsigned int getPrevSize (const char * ptr) {
  10. unsigned int sz = getHeader(ptr)->prevSize;
  11. return sz >> 1;
  12. }
  13. void setSize (char * ptr, const unsigned int sz) {
  14. unsigned int size = getSize(ptr);
  15. size = ((size & 1) | (sz << 1));
  16. getHeader(ptr)->size = size;
  17. }
  18. void setPrevSize (char * ptr, const unsigned int sz) {
  19. unsigned int prevSize = getHeader(ptr)->prevSize;
  20. prevSize = (prevSize & 1) | (sz << 1);
  21. getHeader(ptr)->prevSize = prevSize;
  22. }
  23. //returns a pointer (that points) to the next block
  24. char * getNext (const char * ptr) {
  25. return (char *)(ptr + HDR_SIZE + getSize(ptr));
  26. }
  27. char * getPrev (const char * ptr) {
  28. return (char *)(ptr - HDR_SIZE - getPrevSize(ptr));
  29. }
  30. void markPrevFree (char * ptr) {
  31. getHeader(ptr)->prevSize &= (~ 1);
  32. }
  33. void markPrevInUse (char * ptr) {
  34. getHeader(ptr)->prevSize |= 1;
  35. }
  36. unsigned int isPrevFree (char * ptr) {
  37. unsigned int free = ~(getHeader(ptr)->prevSize & 1);
  38. return (free & 1) ;
  39. }
  40. void markInUse (char * ptr) {
  41. markPrevInUse(getNext(ptr));
  42. }
  43. void markFree (char * ptr) {
  44. markPrevFree(getNext(ptr));
  45. }
  46. unsigned int isFree (char * ptr) {
  47. return isPrevFree(getNext(ptr));
  48. }