Advertisement
Guest User

memmanage.h

a guest
Feb 24th, 2022
81
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 1.21 KB | None | 0 0
  1. #ifndef MEM_MANAGE
  2. #define MEM_MANAGE
  3.  
  4. #include <stdlib.h>
  5. #include <stdbool.h>
  6.  
  7. typedef struct {
  8.     unsigned long i;
  9.     _Bool found;
  10. } mem_result;
  11.  
  12. // Doesn't make sense to make it static because it's a header, but whatever
  13. static void **mem_add;
  14. static unsigned long qty;
  15. static unsigned long cap;
  16.  
  17. static void mem_expand()
  18. {
  19.     if (qty == cap)
  20.         mem_add = realloc(mem_add, (cap += 1024) * sizeof(void*));
  21. }
  22.  
  23. mem_result mem_find(void *ptr)
  24. {
  25.     unsigned long i = 0;
  26.  
  27.     if (!ptr) i = qty;
  28.  
  29.     for (; i < qty; ++i) {
  30.         if (ptr == mem_add[i])
  31.             break;
  32.     }
  33.  
  34.     mem_result r = {
  35.         .i = i,
  36.         .found = i != qty ? true : false
  37.     };
  38.  
  39.     return r;
  40. }
  41.  
  42. void mem_push(void *ptr)
  43. {
  44.     mem_expand();
  45.     mem_add[qty++] = ptr;
  46. }
  47.  
  48. void *mem_alloc(size_t num)
  49. {
  50.     if (!num) return NULL;
  51.  
  52.     void *ptr = calloc(num, sizeof(char));
  53.     mem_push(ptr);
  54.     return ptr;
  55. }
  56.  
  57. void *mem_realloc(void *ptr, size_t new_size)
  58. {
  59.     if (!new_size) return NULL;
  60.  
  61.     mem_result m = mem_find(ptr);
  62.  
  63.     if (m.found) {
  64.         ptr = realloc(ptr, new_size);
  65.         mem_add[m.i] = ptr;
  66.     } else
  67.         ptr = mem_alloc(new_size);
  68.  
  69.     return ptr;
  70. }
  71.    
  72. void mem_clean(void)
  73. {
  74.     for (unsigned long i = 0; i < qty; ++i)
  75.         free(mem_add[i]);
  76.     free(mem_add);
  77. }
  78.  
  79. #endif
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement