X-Git-Url: http://4ch.mooo.com/gitweb/?a=blobdiff_plain;f=src%2Flib%2Flib_head.c;h=e9004d5e508d27a7a120a122f0e44a9132dff239;hb=02dd99850b12a31480e011885a8299a0e24f7dd8;hp=42bbb0262f9c20f1e87ea953f16fa68169fad2c6;hpb=6a9fa99fc6a9a0a1d9041a87cac1eb99ab18e3e1;p=16.git diff --git a/src/lib/lib_head.c b/src/lib/lib_head.c index 42bbb026..e9004d5e 100644 --- a/src/lib/lib_head.c +++ b/src/lib/lib_head.c @@ -1,7 +1,9 @@ -#include "src\lib\lib_head.h" +#include "src/lib/lib_head.h" /* local function */ -void wait(clock_t wait); +void wait(clock_t wait); +void* AllocateLargestFreeBlock(size_t* Size); +size_t GetFreeSize(void); /* Function: Wait ********************************************************** * @@ -17,4 +19,77 @@ void wait(clock_t wait){ goal = wait + clock(); while((goal > clock()) && !kbhit()) ; -} /* End of wait */ \ No newline at end of file +} /* End of wait */ + +void* AllocateLargestFreeBlock(size_t* Size) +{ + size_t s0, s1; + void* p; + + s0 = ~(size_t)0 ^ (~(size_t)0 >> 1); + + while (s0 && (p = malloc(s0)) == NULL) + s0 >>= 1; + + if (p) + free(p); + + s1 = s0 >> 1; + + while (s1) + { + if ((p = malloc(s0 + s1)) != NULL) + { + s0 += s1; + free(p); + } + s1 >>= 1; + } + + while (s0 && (p = malloc(s0)) == NULL) + s0 ^= s0 & -s0; + + *Size = s0; + return p; +} + +size_t GetFreeSize(void) +{ + size_t total = 0; + void* pFirst = NULL; + void* pLast = NULL; + + for (;;) + { + size_t largest; + void* p = AllocateLargestFreeBlock(&largest); + + if (largest < sizeof(void*)) + { + if (p != NULL) + free(p); + break; + } + + *(void**)p = NULL; + + total += largest; + + if (pFirst == NULL) + pFirst = p; + + if (pLast != NULL) + *(void**)pLast = p; + + pLast = p; + } + + while (pFirst != NULL) + { + void* p = *(void**)pFirst; + free(pFirst); + pFirst = p; + } + + return total; +}