]> 4ch.mooo.com Git - 16.git/blobdiff - src/lib/16_hc.c
updated the copyleft wwww i am not deAD! i just been 2 busy last 6 monthes
[16.git] / src / lib / 16_hc.c
index 13dd3f0e5addcc9080dd48417d188bd1e086f695..271f4c1a059d94fa835b78e460a1eea5073542b3 100755 (executable)
@@ -1,5 +1,5 @@
 /* Project 16 Source Code~\r
- * Copyright (C) 2012-2016 sparky4 & pngwen & andrius4669 & joncampbell123 & yakui-lover\r
+ * Copyright (C) 2012-2018 sparky4 & pngwen & andrius4669 & joncampbell123 & yakui-lover\r
  *\r
  * This file is part of Project 16.\r
  *\r
  *\r
  */\r
 /*\r
-       heap test stuff\r
+       heap check\r
 */\r
 \r
 #include "src/lib/16_hc.h"\r
+#include <malloc.h>\r
 \r
-#ifdef __BORLANDC__\r
-void * LargestFreeBlock(size_t* Size)\r
-#endif\r
-#ifdef __WATCOMC__\r
-void __near* LargestFreeBlock(size_t* Size)\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 NPTR* HC_LargestFreeBlock(size_t* Size)\r
 {\r
        size_t s0, s1;\r
-#ifdef __BORLANDC__\r
-       void * p;\r
-#endif\r
-#ifdef __WATCOMC__\r
-       void __near* p;\r
-#endif\r
+       void NPTR* p;\r
 \r
        s0 = ~(size_t)0 ^ (~(size_t)0 >> 1);\r
-#ifdef __BORLANDC__\r
-       while (s0 && (p = malloc(s0)) == NULL)\r
-#endif\r
-#ifdef __WATCOMC__\r
        while (s0 && (p = _nmalloc(s0)) == NULL)\r
-#endif\r
                s0 >>= 1;\r
 \r
        if (p)\r
-#ifdef __BORLANDC__\r
-               free(p);\r
-#endif\r
-#ifdef __WATCOMC__\r
                _nfree(p);\r
-#endif\r
 \r
        s1 = s0 >> 1;\r
        while (s1)\r
        {\r
-#ifdef __BORLANDC__\r
-               if ((p = malloc(s0 + s1)) != NULL)\r
-#endif\r
-#ifdef __WATCOMC__\r
                if ((p = _nmalloc(s0 + s1)) != NULL)\r
-#endif\r
                {\r
                        s0 += s1;\r
-#ifdef __BORLANDC__\r
-                       free(p);\r
-#endif\r
-#ifdef __WATCOMC__\r
                        _nfree(p);\r
-#endif\r
                }\r
        s1 >>= 1;\r
        }\r
-#ifdef __BORLANDC__\r
-       while (s0 && (p = malloc(s0)) == NULL)\r
-#endif\r
-#ifdef __WATCOMC__\r
        while (s0 && (p = _nmalloc(s0)) == NULL)\r
-#endif\r
                s0 ^= s0 & -s0;\r
 \r
        *Size = s0;\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
@@ -97,16 +90,11 @@ size_t _coreleft(void)
        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
-#ifdef __BORLANDC__\r
-                       free(p);\r
-#endif\r
-#ifdef __WATCOMC__\r
                        _nfree(p);\r
-#endif\r
                        break;\r
                }\r
                *(void __near* __near*)p = NULL;\r
@@ -122,23 +110,19 @@ size_t _coreleft(void)
        while (pFirst != NULL)\r
        {\r
                void __near* p = *(void __near* __near*)pFirst;\r
-#ifdef __BORLANDC__\r
-               free(pFirst);\r
-#endif\r
-#ifdef __WATCOMC__\r
                _nfree(pFirst);\r
-#endif\r
                pFirst = p;\r
        }\r
        return total;\r
 }\r
 \r
-void far* LargestFarFreeBlock(size_t* Size)\r
+//far version of above\r
+void __far* HC_LargestFarFreeBlock(dword* Size)\r
 {\r
-       size_t s0, s1;\r
-       void far* p;\r
+       dword s0, s1;\r
+       void __far* p;\r
 \r
-       s0 = ~(size_t)0 ^ (~(size_t)0 >> 1);\r
+       s0 = ~(dword)0 ^ (~(dword)0 >> 1);\r
        while (s0 && (p = _fmalloc(s0)) == NULL)\r
                s0 >>= 1;\r
 \r
@@ -162,42 +146,45 @@ void far* LargestFarFreeBlock(size_t* Size)
        return p;\r
 }\r
 \r
-size_t _farcoreleft(void)\r
+//far version of above\r
+dword HC_farcoreleft(void)\r
 {\r
-       size_t total = 0;\r
-       void far* pFirst = NULL;\r
-       void far* pLast = NULL;\r
+       dword 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
-               if (largest < sizeof(void far*))\r
+               dword largest;\r
+               void __far* p = HC_LargestFarFreeBlock(&largest);\r
+               if (largest < sizeof(void __far*))\r
                {\r
                        if (p != NULL)\r
                        _ffree(p);\r
                        break;\r
                }\r
-               *(void far* far*)p = NULL;\r
+               *(void __far* __far*)p = NULL;\r
                total += largest;\r
                if (pFirst == NULL)\r
                        pFirst = p;\r
 \r
                if (pLast != NULL)\r
-                       *(void far* far*)pLast = p;\r
+                       *(void __far* __far*)pLast = p;\r
                pLast = p;\r
        }\r
 \r
        while (pFirst != NULL)\r
        {\r
-               void far* p = *(void far* far*)pFirst;\r
+               void __far* p = *(void __far* __far*)pFirst;\r
                _ffree(pFirst);\r
                pFirst = p;\r
        }\r
+\r
+       //if(total>16) total+=16;       total &= 0xfffffff0UL;\r
        return total;\r
 }\r
 \r
-#ifdef __WATCOMC__\r
-void huge* LargestHugeFreeBlock(size_t* Size)\r
+//==#ifdef __WATCOMC__\r
+/*void huge* LargestHugeFreeBlock(size_t* Size)\r
 {\r
        size_t s0, s1;\r
        void huge* p;\r
@@ -260,7 +247,7 @@ size_t _hugecoreleft(void)
        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
@@ -297,11 +284,11 @@ size_t _basedcoreleft(void)
        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
@@ -309,32 +296,32 @@ size_t _basedcoreleft(void)
        {\r
                size_t largest;\r
                void __based(segu)* p = LargestBasedFreeBlock(&largest);\r
-               if (largest < sizeof(void far*))\r
+               if (largest < sizeof(void __far*))\r
                {\r
                        if (p != NULL)\r
                        _ffree(p);\r
                        break;\r
                }\r
-               *(void far* far*)p = NULL;\r
+               *(void __far* __far*)p = NULL;\r
                total += largest;\r
                if (pFirst == NULL)\r
                        pFirst = p;\r
 \r
                if (pLast != NULL)\r
-                       *(void far* far*)pLast = p;\r
+                       *(void __far* __far*)pLast = p;\r
                pLast = p;\r
        }\r
 \r
        while (pFirst != NULL)\r
        {\r
-               void far* p = *(void far* far*)pFirst;\r
+               void __far* p = *(void __far* __far*)pFirst;\r
                _ffree(pFirst);\r
                pFirst = p;\r
        }\r
        return total;\r
-}*/\r
+}\r
 \r
-size_t GetFreeSize(void)\r
+size_t HC_GetFreeSize(void)\r
 {\r
        struct _heapinfo h_info;\r
        int heap_status;\r
@@ -348,15 +335,37 @@ size_t GetFreeSize(void)
                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_heapstat(heap_status);\r
        return h_free;\r
 }\r
+*/\r
+\r
+void HCL_HeapWalking (struct _heapinfo *h_info, hc_use_t *hu, unsigned nearfarswitch)\r
+{\r
+       hu->h_free=0; hu->h_total=0; hu->h_used=0;\r
+\r
+       h_info->_pentry = NULL;\r
+       for(;;) {\r
+               if(nearfarswitch==0) hu->heap_status = _nheapwalk( h_info );\r
+               else if(nearfarswitch==1) hu->heap_status = _fheapwalk( h_info );\r
+               if( hu->heap_status != _HEAPOK ) break;\r
+               if((h_info->_useflag == _USEDENTRY ? "USED" : "FREE")=="FREE") hu->h_free += h_info->_size;\r
+               if((h_info->_useflag == _USEDENTRY ? "USED" : "FREE")=="USED") hu->h_used += h_info->_size;\r
+               hu->h_total += h_info->_size;\r
+       }\r
+       HCL_heapstat(hu->heap_status);\r
+}\r
 \r
-size_t GetFarFreeSize(void)\r
+dword HC_GetFarFreeSize(void)\r
 {\r
+       struct _heapinfo h_info;\r
+       hc_use_t hu;\r
+       HCL_HeapWalking (&h_info, &hu, 1);\r
+       return hu.h_free;\r
+#if 0\r
        struct _heapinfo fh_info;\r
        int heap_status;\r
-       size_t fh_free=0, fh_total=0, fh_used=0;\r
+       dword fh_free=0, fh_total=0, fh_used=0;\r
 \r
        fh_info._pentry = NULL;\r
        for(;;) {\r
@@ -366,12 +375,18 @@ size_t GetFarFreeSize(void)
                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_heapstat(heap_status);\r
        return fh_free;\r
+#endif\r
 }\r
 \r
-size_t GetNearFreeSize(void)\r
+size_t HC_GetNearFreeSize(void)\r
 {\r
+       struct _heapinfo h_info;\r
+       hc_use_t hu;\r
+       HCL_HeapWalking (&h_info, &hu, 0);\r
+       return hu.h_free;\r
+#if 0\r
        struct _heapinfo nh_info;\r
        int heap_status;\r
        size_t nh_free=0, nh_total=0, nh_used=0;\r
@@ -384,19 +399,21 @@ size_t GetNearFreeSize(void)
                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_heapstat(heap_status);\r
        return nh_free;\r
+#endif\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
@@ -404,13 +421,16 @@ void heapdump(global_game_variables_t *gvar)
        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_heapstatLogWrite(gvar, heap_status, scratch);\r
+#endif\r
 \r
        //near\r
        strcpy(scratch,"\n      == near ==\n\n");\r
@@ -420,7 +440,9 @@ void heapdump(global_game_variables_t *gvar)
        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
@@ -429,7 +451,7 @@ nh_info._pentry, nh_info._size );*/
                nh_total += nh_info._size;\r
                write(gvar->handle.heaphandle,scratch,strlen(scratch));\r
        }\r
-       heapstat(gvar, heap_status, &scratch);\r
+       HCL_heapstatLogWrite(gvar, heap_status, scratch);\r
 \r
        //far\r
        strcpy(scratch,"\n      == far ==\n\n");\r
@@ -439,7 +461,9 @@ nh_info._pentry, nh_info._size );*/
        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
@@ -448,27 +472,31 @@ fh_info._pentry, fh_info._size );*/
                fh_total += fh_info._size;\r
                write(gvar->handle.heaphandle,scratch,strlen(scratch));\r
        }\r
-       heapstat(gvar, heap_status, &scratch);\r
+       HCL_heapstatLogWrite(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, "Near", nh_total, nh_used, nh_free);\r
-       printmeminfoline(&scratch, "Far", fh_total, fh_used, fh_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
+#if defined(__LARGE__) || defined(__COMPACT__) || defined(__HUGE__)\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
+#endif\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
+//00   strcat(scratch,"HC_GetNearFreeSize = ");        ultoa((dword)HC_GetNearFreeSize(),str,10);      strcat(scratch,str);    strcat(scratch,"\n");\r
+//00   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_heapstatLogWrite(global_game_variables_t *gvar, int heap_status, byte *str)\r
 {\r
        switch( heap_status ) {\r
                case _HEAPEND:\r
@@ -481,16 +509,18 @@ void heapstat(global_game_variables_t *gvar, int heap_status, byte *str)
                case _HEAPBADBEGIN:\r
                        strcpy((str),"ERROR - heap is damaged\n");\r
                break;\r
+#ifdef __WATCOMC__\r
                case _HEAPBADPTR:\r
                        strcpy((str),"ERROR - bad pointer to heap\n");\r
                break;\r
+#endif\r
                case _HEAPBADNODE:\r
                        strcpy((str),"ERROR - bad node in heap\n");\r
        }\r
        write(gvar->handle.heaphandle,(str),strlen((str)));\r
 }\r
 \r
-void heapstat0(int heap_status)\r
+void HCL_heapstat(int heap_status)\r
 {\r
        switch( heap_status ) {\r
                case _HEAPEND:\r
@@ -502,14 +532,44 @@ void heapstat0(int heap_status)
                case _HEAPBADBEGIN:\r
                        printf("ERROR - heap is damaged\n");\r
                break;\r
+#ifdef __WATCOMC__\r
                case _HEAPBADPTR:\r
                        printf("ERROR - bad pointer to heap\n");\r
                break;\r
+#endif\r
                case _HEAPBADNODE:\r
                        printf("ERROR - bad node in heap\n");\r
        }\r
 }\r
+\r
+//++\r
+#ifdef __WATCOMC__\r
+dword farcoreleft()\r
+{\r
+//---- _fheapgrow();\r
+// #ifdef __BORLANDC__\r
+//     return 0x90000UL-16UL;\r
+// #endif\r
+\r
+#if !defined(__LARGE__) && !defined(__COMPACT__) && !defined(__HUGE__)\r
+//----\r
+       return 0x90000UL+16UL;\r
+//---- return 589824UL+16UL;\r
+#else\r
+//++++\r
+       return HC_farcoreleft();\r
+//stack overflows      return HC_GetFarFreeSize();\r
 #endif\r
+}\r
+\r
+dword coreleft()\r
+{\r
+       _nheapgrow();\r
+       return _memavl();\r
+//     return HC_GetNearFreeSize();\r
+}\r
+#endif\r
+\r
 /*\r
 ============================\r
 =\r
@@ -523,15 +583,22 @@ void HC_OpenDebug(global_game_variables_t *gvar)
 {\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