BSMMAlloc.c 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. #include "BsMMAlloc.h"
  2. #include <stdlib.h>
  3. #include <string.h>
  4. typedef struct tagMMAllocHeader MMAllocHeader;
  5. struct tagMMAllocHeader
  6. {
  7. MMAllocHeader* next;
  8. MMAllocHeader* prev;
  9. };
  10. void* mmalloc_new_context()
  11. {
  12. MMAllocHeader* header = (MMAllocHeader*)malloc(sizeof(MMAllocHeader));
  13. header->next = 0;
  14. header->prev = 0;
  15. return header;
  16. }
  17. void mmalloc_free_context(void* context)
  18. {
  19. MMAllocHeader* header = (MMAllocHeader*)context;
  20. while (header->next != 0)
  21. mmfree((char*)header->next + sizeof(MMAllocHeader));
  22. free(header);
  23. }
  24. void* mmalloc(void* context, int size)
  25. {
  26. void* buffer = malloc(size + sizeof(MMAllocHeader));
  27. MMAllocHeader* header = (MMAllocHeader*)buffer;
  28. MMAllocHeader* parent = (MMAllocHeader*)context;
  29. header->next = parent->next;
  30. if (parent->next)
  31. parent->next->prev = header;
  32. header->prev = parent;
  33. parent->next = header;
  34. return (char*)buffer + sizeof(MMAllocHeader);
  35. }
  36. void mmfree(void* ptr)
  37. {
  38. void* buffer = (char*)ptr - sizeof(MMAllocHeader);
  39. MMAllocHeader* header = (MMAllocHeader*)buffer;
  40. if (header->prev)
  41. header->prev->next = header->next;
  42. if (header->next)
  43. header->next->prev = header->prev;
  44. free(buffer);
  45. }
  46. char* mmalloc_strdup(void* context, const char* input)
  47. {
  48. size_t length = strlen(input);
  49. char* output = mmalloc(context, (int)(sizeof(char) * (length + 1)));
  50. memcpy(output, input, length);
  51. output[length] = '\0';
  52. return output;
  53. }