/* Project 16 Source Code~\r
- * Copyright (C) 2012-2016 sparky4 & pngwen & andrius4669 & joncampbell123 & yakui-lover\r
+ * Copyright (C) 2012-2017 sparky4 & pngwen & andrius4669 & joncampbell123 & yakui-lover\r
*\r
* This file is part of Project 16.\r
*\r
*/\r
\r
#include "src/lib/16_hc.h"\r
+#include <malloc.h>\r
\r
+//from ftp://213.85.246.177/pub/FreeBSD/ports/archivers/arj/work/arj-3.10.22/environ.c\r
+#if 0\r
+//#ifdef __WATCOMC__\r
+long HC_Newfarcoreleft()\r
+{\r
+ void __huge *hp; static long rc=736L; long s_rc;\r
+\r
+ s_rc=rc; rc+=2L;\r
+ do\r
+ hp=halloc(rc-=2L, 1024);\r
+ while(hp==NULL&&rc>0L);\r
+ if(hp!=NULL)\r
+ hfree(hp);\r
+ if(rc<s_rc)\r
+ return(rc*1024L);\r
+ do\r
+ {\r
+ hp=halloc(rc+=16L, 1024);\r
+ if(hp!=NULL)\r
+ hfree(hp);\r
+ } while(hp!=NULL);\r
+ return((rc-16L)*1024L);\r
+}\r
+#endif\r
+\r
+//from: https://stackoverflow.com/questions/14386856/c-check-available-ram\r
+void\r
#ifdef __BORLANDC__\r
-void * LargestFreeBlock(size_t* Size)\r
+ *\r
#endif\r
#ifdef __WATCOMC__\r
-void __near* LargestFreeBlock(size_t* Size)\r
+ __near*\r
#endif\r
+HC_LargestFreeBlock(size_t* Size)\r
{\r
size_t s0, s1;\r
#ifdef __BORLANDC__\r
return p;\r
}\r
\r
-size_t _coreleft(void)\r
+//from: https://stackoverflow.com/questions/14386856/c-check-available-ram\r
+size_t HC_coreleft(void)\r
{\r
size_t total = 0;\r
void __near* pFirst = NULL;\r
for(;;)\r
{\r
size_t largest;\r
- void __near* p = (void __near *)LargestFreeBlock(&largest);\r
+ void __near* p = (void __near *)HC_LargestFreeBlock(&largest);\r
if (largest < sizeof(void __near*))\r
{\r
if (p != NULL)\r
return total;\r
}\r
\r
-void far* LargestFarFreeBlock(size_t* Size)\r
+//far version of above\r
+void far* HC_LargestFarFreeBlock(unsigned long* Size)\r
{\r
- size_t s0, s1;\r
+ unsigned long s0, s1;\r
void far* p;\r
\r
- s0 = ~(size_t)0 ^ (~(size_t)0 >> 1);\r
+ s0 = ~(unsigned long)0 ^ (~(unsigned long)0 >> 1);\r
while (s0 && (p = _fmalloc(s0)) == NULL)\r
s0 >>= 1;\r
\r
return p;\r
}\r
\r
-size_t _farcoreleft(void)\r
+//far version of above\r
+unsigned long HC_farcoreleft(void)\r
{\r
- size_t total = 0;\r
+ unsigned long total = 0UL;\r
void far* pFirst = NULL;\r
void far* pLast = NULL;\r
for(;;)\r
{\r
- size_t largest;\r
- void far* p = LargestFarFreeBlock(&largest);\r
+ unsigned long largest;\r
+ void far* p = HC_LargestFarFreeBlock(&largest);\r
if (largest < sizeof(void far*))\r
{\r
if (p != NULL)\r
}\r
\r
#ifdef __WATCOMC__\r
-void huge* LargestHugeFreeBlock(size_t* Size)\r
+/*void huge* LargestHugeFreeBlock(size_t* Size)\r
{\r
size_t s0, s1;\r
void huge* p;\r
return total;\r
}\r
\r
-/*void __based(__self)* LargestBasedFreeBlock(size_t* Size)\r
+void __based(__self)* LargestBasedFreeBlock(size_t* Size)\r
{\r
__segment segu;\r
size_t s0, s1;\r
void __based(segu)* pFirst = NULL;\r
void __based(segu)* pLast = NULL;\r
// allocate based heap\r
- segu = _bheapseg( 1024 );\r
+ segu = _bHC_heapseg( 1024 );\r
if( segu == _NULLSEG ) {\r
printf( "Unable to allocate based heap\n" );\r
return 0;\r
- //exit( 1 );\r
+\r
}\r
else\r
\r
}\r
return total;\r
}*/\r
-\r
-size_t GetFreeSize(void)\r
+#if 0\r
+size_t HC_GetFreeSize(void)\r
{\r
struct _heapinfo h_info;\r
int heap_status;\r
if((h_info._useflag == _USEDENTRY ? "USED" : "FREE")=="USED") h_used += h_info._size;\r
h_total += h_info._size;\r
}\r
- heapstat0(heap_status);\r
+ HCL_heapstat0(heap_status);\r
return h_free;\r
}\r
+#endif\r
\r
-size_t GetFarFreeSize(void)\r
+unsigned long HC_GetFarFreeSize(void)\r
{\r
struct _heapinfo fh_info;\r
int heap_status;\r
- size_t fh_free=0, fh_total=0, fh_used=0;\r
+ unsigned long fh_free=0, fh_total=0, fh_used=0;\r
\r
fh_info._pentry = NULL;\r
for(;;) {\r
if((fh_info._useflag == _USEDENTRY ? "USED" : "FREE")=="USED") fh_used += fh_info._size;\r
fh_total += fh_info._size;\r
}\r
- heapstat0(heap_status);\r
+ HCL_heapstat0(heap_status);\r
return fh_free;\r
}\r
\r
-size_t GetNearFreeSize(void)\r
+size_t HC_GetNearFreeSize(void)\r
{\r
struct _heapinfo nh_info;\r
int heap_status;\r
if((nh_info._useflag == _USEDENTRY ? "USED" : "FREE")=="USED") nh_used += nh_info._size;\r
nh_total += nh_info._size;\r
}\r
- heapstat0(heap_status);\r
+ HCL_heapstat0(heap_status);\r
return nh_free;\r
}\r
\r
-void heapdump(global_game_variables_t *gvar)\r
+void HC_heapdump(global_game_variables_t *gvar)\r
{\r
- struct _heapinfo fh_info, nh_info, h_info;\r
+ struct _heapinfo fh_info, nh_info;//, h_info;\r
int heap_status;\r
- size_t h_free, nh_free, fh_free, h_total, nh_total, fh_total, h_used, nh_used, fh_used;\r
- byte scratch[1024],str[16];\r
+ size_t nh_free, fh_free, nh_total, fh_total, nh_used, fh_used;//, h_free, h_total, h_used;\r
+ byte scratch[1024],str[16];\r
\r
HC_OpenDebug(gvar);\r
\r
+#if 0\r
strcpy(scratch,"\n == default ==\n\n");\r
write(gvar->handle.heaphandle,scratch,strlen(scratch));\r
h_info._pentry = NULL;\r
for(;;) {\r
heap_status = _heapwalk( &h_info );\r
if( heap_status != _HEAPOK ) break;\r
- strcpy(scratch," "); strcat(scratch,(h_info._useflag == _USEDENTRY ? "USED" : "FREE")); strcat(scratch," block at "); ultoa((dword)h_info._pentry,str,16); strcat(scratch,str); strcat(scratch," of size "); ultoa(h_info._size,str,10); strcat(scratch,str); strcat(scratch,"\n");\r
+ strcpy(scratch," "); strcat(scratch,(h_info._useflag == _USEDENTRY ? "USED" : "FREE")); strcat(scratch," block at ");\r
+ sprintf(str, "%Fp", h_info._pentry); //ultoa((dword)h_info._pentry,str,16);\r
+ strcat(scratch,str); strcat(scratch," of size "); ultoa(h_info._size,str,10); strcat(scratch,str); strcat(scratch,"\n");\r
if((h_info._useflag == _USEDENTRY ? "USED" : "FREE")=="FREE") h_free += h_info._size;\r
if((h_info._useflag == _USEDENTRY ? "USED" : "FREE")=="USED") h_used += h_info._size;\r
h_total += h_info._size;\r
write(gvar->handle.heaphandle,scratch,strlen(scratch));\r
}\r
- heapstat(gvar, heap_status, &scratch);\r
+ HCL_heapstat(gvar, heap_status, &scratch);\r
+#endif\r
\r
//near\r
strcpy(scratch,"\n == near ==\n\n");\r
for(;;) {\r
heap_status = _nheapwalk( &nh_info );\r
if( heap_status != _HEAPOK ) break;\r
- strcpy(scratch," "); strcat(scratch,(h_info._useflag == _USEDENTRY ? "USED" : "FREE")); strcat(scratch," block at "); ultoa((dword)nh_info._pentry,str,16); strcat(scratch,str); strcat(scratch," of size "); ultoa(nh_info._size,str,10); strcat(scratch,str); strcat(scratch,"\n");\r
+ strcpy(scratch," "); strcat(scratch,(nh_info._useflag == _USEDENTRY ? "USED" : "FREE")); strcat(scratch," block at ");\r
+ sprintf(str, "%Fp", nh_info._pentry); //ultoa((dword)nh_info._pentry,str,16);\r
+ strcat(scratch,str); strcat(scratch," of size "); ultoa(nh_info._size,str,10); strcat(scratch,str); strcat(scratch,"\n");\r
/* printf( " %s block at %Fp of size %4.4X\n",\r
(nh_info._useflag == _USEDENTRY ? "USED" : "FREE"),\r
nh_info._pentry, nh_info._size );*/\r
nh_total += nh_info._size;\r
write(gvar->handle.heaphandle,scratch,strlen(scratch));\r
}\r
- heapstat(gvar, heap_status, &scratch);\r
+ HCL_heapstat(gvar, heap_status, &scratch);\r
\r
//far\r
strcpy(scratch,"\n == far ==\n\n");\r
for(;;) {\r
heap_status = _fheapwalk( &fh_info );\r
if( heap_status != _HEAPOK ) break;\r
- strcpy(scratch," "); strcat(scratch,(h_info._useflag == _USEDENTRY ? "USED" : "FREE")); strcat(scratch," block at "); ultoa((dword)fh_info._pentry,str,16); strcat(scratch,str); strcat(scratch," of size "); ultoa(fh_info._size,str,10); strcat(scratch,str); strcat(scratch,"\n");\r
+ strcpy(scratch," "); strcat(scratch,(fh_info._useflag == _USEDENTRY ? "USED" : "FREE")); strcat(scratch," block at ");\r
+ sprintf(str, "%Fp", fh_info._pentry); //ultoa((dword)fh_info._pentry,str,16);\r
+ strcat(scratch,str); strcat(scratch," of size "); ultoa(fh_info._size,str,10); strcat(scratch,str); strcat(scratch,"\n");\r
/*printf( " %s block at %Fp of size %4.4X\n",\r
(fh_info._useflag == _USEDENTRY ? "USED" : "FREE"),\r
fh_info._pentry, fh_info._size );*/\r
fh_total += fh_info._size;\r
write(gvar->handle.heaphandle,scratch,strlen(scratch));\r
}\r
- heapstat(gvar, heap_status, &scratch);\r
+ HCL_heapstat(gvar, heap_status, &scratch);\r
\r
strcpy(scratch,"\n");\r
strcat(scratch,kittengets(2,0,"Memory Type Total Used Free\n"));\r
strcat(scratch,"---------------- -------- -------- --------\n");\r
- printmeminfoline(&scratch, "Default", h_total, h_used, h_free);\r
+// printmeminfoline(&scratch, "Default", h_total, h_used, h_free);\r
printmeminfoline(&scratch, "Near", nh_total, nh_used, nh_free);\r
printmeminfoline(&scratch, "Far", fh_total, fh_used, fh_free);\r
strcat(scratch,"---------------- -------- -------- --------\n");\r
- strcat(scratch,"coreleft = "); ultoa((dword)_coreleft(),str,10); strcat(scratch,str); strcat(scratch,"\n");\r
- strcat(scratch,"farcoreleft = "); ultoa((dword)_farcoreleft(),str,10); strcat(scratch,str); strcat(scratch,"\n");\r
- strcat(scratch,"GetFreeSize = "); ultoa((dword)GetFreeSize(),str,10); strcat(scratch,str); strcat(scratch,"\n");\r
- strcat(scratch,"GetNearFreeSize = "); ultoa((dword)GetNearFreeSize(),str,10); strcat(scratch,str); strcat(scratch,"\n");\r
- strcat(scratch,"GetFarFreeSize = "); ultoa((dword)GetFarFreeSize(),str,10); strcat(scratch,str); strcat(scratch,"\n");\r
- strcat(scratch,"memavl = "); ultoa((dword)_memavl(),str,10); strcat(scratch,str); strcat(scratch,"\n");\r
- strcat(scratch,"stackavail = "); ultoa((dword)stackavail(),str,10); strcat(scratch,str); strcat(scratch,"\n");\r
+ strcat(scratch,"HC_coreleft = "); ultoa((dword)HC_coreleft(),str,10); strcat(scratch,str); strcat(scratch,"\n");\r
+ strcat(scratch,"HC_farcoreleft = "); ultoa((dword)HC_farcoreleft(),str,10); strcat(scratch,str); strcat(scratch,"\n");\r
+// strcat(scratch,"HC_Newfarcoreleft = "); ultoa((dword)HC_Newfarcoreleft(),str,10); strcat(scratch,str); strcat(scratch,"\n");\r
+// strcat(scratch,"HC_GetFreeSize = "); ultoa((dword)HC_GetFreeSize(),str,10); strcat(scratch,str); strcat(scratch,"\n");\r
+ strcat(scratch,"HC_GetNearFreeSize = "); ultoa((dword)HC_GetNearFreeSize(),str,10); strcat(scratch,str); strcat(scratch,"\n");\r
+ strcat(scratch,"HC_GetFarFreeSize = "); ultoa((dword)HC_GetFarFreeSize(),str,10); strcat(scratch,str); strcat(scratch,"\n");\r
+ strcat(scratch,"coreleft = "); ultoa((dword)coreleft(),str,10); strcat(scratch,str); strcat(scratch,"\n");\r
+ strcat(scratch,"farcoreleft = "); ultoa((dword)farcoreleft(),str,10); strcat(scratch,str); strcat(scratch,"\n");\r
+ strcat(scratch,"stackavail = "); ultoa((dword)stackavail(),str,10); strcat(scratch,str); strcat(scratch,"\n");\r
write(gvar->handle.heaphandle,scratch,strlen(scratch));\r
HC_CloseDebug(gvar);\r
}\r
\r
-void heapstat(global_game_variables_t *gvar, int heap_status, byte *str)\r
+void HCL_heapstat(global_game_variables_t *gvar, int heap_status, byte *str)\r
{\r
switch( heap_status ) {\r
case _HEAPEND:\r
write(gvar->handle.heaphandle,(str),strlen((str)));\r
}\r
\r
-void heapstat0(int heap_status)\r
+void HCL_heapstat0(int heap_status)\r
{\r
switch( heap_status ) {\r
case _HEAPEND:\r
printf("ERROR - bad node in heap\n");\r
}\r
}\r
+\r
+unsigned long farcoreleft()\r
+{\r
+//---- _fheapgrow();\r
+ return HC_farcoreleft();\r
+//stack overflows return HC_GetFarFreeSize();\r
+}\r
+\r
+unsigned long coreleft()\r
+{\r
+ _nheapgrow();\r
+ return _memavl();\r
+// return HC_GetNearFreeSize();\r
+}\r
#endif\r
+\r
/*\r
============================\r
=\r
{\r
#ifdef __BORLANDC__\r
unlink("heap.16b");\r
- gvar->handle.heaphandle = open("heap.16b", O_CREAT | O_WRONLY | O_TEXT);\r
+ gvar->handle.heaphandle = open(gvar->handle.heapdumpfilename, O_CREAT | O_WRONLY | O_TEXT);\r
#endif\r
#ifdef __WATCOMC__\r
unlink("heap.16w");\r
- gvar->handle.heaphandle = open("heap.16w", O_CREAT | O_WRONLY | O_TEXT);\r
+ gvar->handle.heaphandle = open(gvar->handle.heapdumpfilename, O_CREAT | O_WRONLY | O_TEXT);\r
#endif\r
}\r
\r
void HC_CloseDebug(global_game_variables_t *gvar)\r
{\r
close(gvar->handle.heaphandle);\r
+\r
+#ifdef __BORLANDC__\r
+ strcpy(gvar->handle.heapdumpfilename, "heap.16b");\r
+#endif\r
+#ifdef __WATCOMC__\r
+ strcpy(gvar->handle.heapdumpfilename, "heap.16w");\r
+#endif\r
}\r