]> 4ch.mooo.com Git - 16.git/blob - src/lib/lib_head.c
huge memory model fucks up everything! wwww
[16.git] / src / lib / lib_head.c
1 #include "src/lib/lib_head.h"
2 \r
3 /* local function */\r
4 void wait(clock_t wait);
5 void* AllocateLargestFreeBlock(size_t* Size);
6 size_t GetFreeSize(void);
7 long int filesize(FILE *fp);\r
8 \r
9 /* Function: Wait **********************************************************\r
10 *\r
11 *     Parameters:    wait - time in microseconds\r
12 *\r
13 *     Description:    pauses for a specified number of microseconds.\r
14 *\r
15 */\r
16 void wait(clock_t wait){\r
17         clock_t goal;\r
18 \r
19         if(!wait) return;\r
20 \r
21         goal = wait + clock();\r
22         while((goal > clock()) && !kbhit()) ;\r
23 } /* End of wait */
24
25 void* AllocateLargestFreeBlock(size_t* Size)
26 {
27   size_t s0, s1;
28   void* p;
29
30   s0 = ~(size_t)0 ^ (~(size_t)0 >> 1);
31
32   while (s0 && (p = malloc(s0)) == NULL)
33     s0 >>= 1;
34
35   if (p)
36     free(p);
37
38   s1 = s0 >> 1;
39
40   while (s1)
41   {
42     if ((p = malloc(s0 + s1)) != NULL)
43     {
44       s0 += s1;
45       free(p);
46     }
47     s1 >>= 1;
48   }
49
50   while (s0 && (p = malloc(s0)) == NULL)
51     s0 ^= s0 & -s0;
52
53   *Size = s0;
54   return p;
55 }
56
57 size_t GetFreeSize(void)
58 {
59   size_t total = 0;
60   void* pFirst = NULL;
61   void* pLast = NULL;
62
63   for (;;)
64   {
65     size_t largest;
66     void* p = AllocateLargestFreeBlock(&largest);
67
68     if (largest < sizeof(void*))
69     {
70       if (p != NULL)
71         free(p);
72       break;
73     }
74
75     *(void**)p = NULL;
76
77     total += largest;
78
79     if (pFirst == NULL)
80       pFirst = p;
81
82     if (pLast != NULL)
83       *(void**)pLast = p;
84
85     pLast = p;
86   }
87
88   while (pFirst != NULL)
89   {
90     void* p = *(void**)pFirst;
91     free(pFirst);
92     pFirst = p;
93   }
94
95   return total;
96 }
97
98 long int
99 filesize(FILE *fp)\r
100 {\r
101         long int save_pos, size_of_file;\r
102 \r
103         save_pos = ftell(fp);\r
104         fseek(fp, 0L, SEEK_END);\r
105         size_of_file = ftell(fp);\r
106         fseek(fp, save_pos, SEEK_SET);\r
107         return(size_of_file);\r
108 }