]> 4ch.mooo.com Git - 16.git/blobdiff - src/lib/lib_head.c
hmmm
[16.git] / src / lib / lib_head.c
index 42bbb0262f9c20f1e87ea953f16fa68169fad2c6..0053446f965d4a2accf812e15c89a37b0c75e3f6 100644 (file)
@@ -1,7 +1,10 @@
-#include "src\lib\lib_head.h"
+#include "src/lib/lib_head.h"
 \r
 /* local function */\r
-void wait(clock_t wait);\r
+void wait(clock_t wait);
+void* AllocateLargestFreeBlock(size_t* Size);
+size_t GetFreeSize(void);
+long int filesize(FILE *fp);\r
 \r
 /* Function: Wait **********************************************************\r
 *\r
@@ -17,4 +20,89 @@ void wait(clock_t wait){
 \r
        goal = wait + clock();\r
        while((goal > clock()) && !kbhit()) ;\r
-} /* 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;
+}
+
+long int
+filesize(FILE *fp)\r
+{\r
+       long int save_pos, size_of_file;\r
+\r
+       save_pos = ftell(fp);\r
+       fseek(fp, 0L, SEEK_END);\r
+       size_of_file = ftell(fp);\r
+       fseek(fp, save_pos, SEEK_SET);\r
+       return(size_of_file);\r
+}