176 lines
5.5 KiB
C
176 lines
5.5 KiB
C
#include <i86.h>
|
|
#include <dos.h>
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <fcntl.h>
|
|
|
|
#include "\projet\lib386\lib_sys\adeline.h"
|
|
#include "\projet\lib386\lib_sys\lib_sys.h"
|
|
|
|
/*══════════════════════════════════════════════════════════════════════════*
|
|
█ █ █▀▀▀█ █▄ ▄█ █▀▀▀▀ █▄ ▄█ █▀▀▀█ █▀▀▀█ █ ▄▀
|
|
██▀▀█ ██ ▄█ ██▀ █ ██▀▀ ██▀ █ ██ █ ██▀█▀ ██▀
|
|
▀▀ ▀ ▀▀▀▀ ▀▀▀▀▀ ▀▀ ▀ ▀▀▀▀▀ ▀▀ ▀ ▀▀▀▀▀ ▀▀ ▀ ▀▀
|
|
*══════════════════════════════════════════════════════════════════════════*/
|
|
/*──────────────────────────────────────────────────────────────────────────*/
|
|
|
|
ULONG Size_HQM_Memory = 0 ;
|
|
ULONG Size_HQM_Free = 0 ;
|
|
UBYTE *Ptr_HQM_Memory = 0 ;
|
|
UBYTE *Ptr_HQM_Next = 0 ;
|
|
|
|
typedef struct { ULONG Id ;
|
|
ULONG Size ;
|
|
void **Ptr ; } HQM_HEADER ;
|
|
|
|
|
|
/*══════════════════════════════════════════════════════════════════════════*/
|
|
// Init le buffer global
|
|
|
|
LONG HQM_Init_Memory( ULONG size )
|
|
{
|
|
if( !Ptr_HQM_Memory )
|
|
{
|
|
Ptr_HQM_Memory = Malloc( size + 500 ) ; // recover area
|
|
if( Ptr_HQM_Memory )
|
|
{
|
|
Size_HQM_Memory = size ;
|
|
Size_HQM_Free = size ;
|
|
Ptr_HQM_Next = Ptr_HQM_Memory ;
|
|
return TRUE ;
|
|
}
|
|
}
|
|
return FALSE ;
|
|
}
|
|
|
|
/*══════════════════════════════════════════════════════════════════════════*/
|
|
// free le buffer global
|
|
|
|
void HQM_Clear_Memory()
|
|
{
|
|
if( Ptr_HQM_Memory )
|
|
{
|
|
Free( Ptr_HQM_Memory ) ;
|
|
Size_HQM_Free = 0 ;
|
|
}
|
|
}
|
|
|
|
/*══════════════════════════════════════════════════════════════════════════*/
|
|
// alloue un bloc de memoire
|
|
|
|
LONG HQM_Alloc( ULONG size, void **ptr )
|
|
{
|
|
if( !Ptr_HQM_Memory )
|
|
{
|
|
*ptr = 0 ;
|
|
return FALSE ;
|
|
}
|
|
|
|
if( size <= (Size_HQM_Free + sizeof( HQM_HEADER )) )
|
|
{
|
|
*ptr = Ptr_HQM_Next + sizeof( HQM_HEADER ) ;
|
|
|
|
((HQM_HEADER*)Ptr_HQM_Next)->Id = 0x12345678 ;
|
|
((HQM_HEADER*)Ptr_HQM_Next)->Size = size ;
|
|
((HQM_HEADER*)Ptr_HQM_Next)->Ptr = ptr ;
|
|
|
|
Ptr_HQM_Next += size + sizeof( HQM_HEADER ) ;
|
|
Size_HQM_Free -= size + sizeof( HQM_HEADER ) ;
|
|
|
|
return TRUE ;
|
|
}
|
|
*ptr = 0 ;
|
|
return FALSE ; // pas assez de place
|
|
}
|
|
|
|
/*══════════════════════════════════════════════════════════════════════════*/
|
|
// free tous les blocs dans le buffer global
|
|
|
|
void HQM_Free_All()
|
|
{
|
|
if( Ptr_HQM_Memory )
|
|
{
|
|
Ptr_HQM_Next = Ptr_HQM_Memory ;
|
|
Size_HQM_Free = Size_HQM_Memory ;
|
|
}
|
|
}
|
|
|
|
/*══════════════════════════════════════════════════════════════════════════*/
|
|
// resize le dernier bloc de memoire
|
|
|
|
void HQM_Shrink_Last( void *ptr, ULONG newsize )
|
|
{
|
|
HQM_HEADER *ptrh ;
|
|
ULONG deltasize ;
|
|
|
|
if( !Ptr_HQM_Memory ) return ;
|
|
|
|
ptrh = (HQM_HEADER*)((UBYTE*)ptr - sizeof( HQM_HEADER )) ;
|
|
|
|
if( ptrh->Id != 0x12345678 ) return ; // erreur grave
|
|
|
|
deltasize = ptrh->Size - newsize ;
|
|
|
|
ptrh->Size -= deltasize ;
|
|
|
|
Ptr_HQM_Next -= deltasize ;
|
|
Size_HQM_Free += deltasize ;
|
|
}
|
|
|
|
/*══════════════════════════════════════════════════════════════════════════*/
|
|
// libere un bloc de memoire et bouche le trou (remap les ptrs)
|
|
|
|
void HQM_Free( void *ptr )
|
|
{
|
|
HQM_HEADER *ptrh ;
|
|
UBYTE *ptrs, *ptrd, *ptrm ;
|
|
ULONG delsize, movesize ;
|
|
|
|
if( !Ptr_HQM_Memory ) return ;
|
|
|
|
ptrs = ptrd = (UBYTE*)ptr - sizeof( HQM_HEADER ) ;
|
|
|
|
ptrh = (HQM_HEADER*)ptrd ;
|
|
if( ptrh->Id != 0x12345678 ) return ; // erreur grave
|
|
|
|
delsize = sizeof( HQM_HEADER ) + ptrh->Size ;
|
|
ptrs = ptrd + delsize ;
|
|
movesize = (ULONG)(Ptr_HQM_Next - ptrs) ;
|
|
|
|
ptrm = ptrs ;
|
|
while( ptrm < Ptr_HQM_Next )
|
|
{
|
|
ptrh = (HQM_HEADER*)ptrm ;
|
|
*(UBYTE*)(ptrh->Ptr) = *(UBYTE*)(ptrh->Ptr) - delsize ;
|
|
ptrm += ptrh->Size + sizeof( HQM_HEADER ) ;
|
|
}
|
|
|
|
memmove( ptrd, ptrs, movesize ) ;
|
|
|
|
Ptr_HQM_Next -= delsize ;
|
|
Size_HQM_Free += delsize ;
|
|
}
|
|
|
|
/*══════════════════════════════════════════════════════════════════════════*/
|
|
// test la cohérence du buffer global
|
|
|
|
LONG HQM_Check()
|
|
{
|
|
HQM_HEADER *ptrh ;
|
|
UBYTE *ptr ;
|
|
|
|
if( !Ptr_HQM_Memory ) return FALSE ;
|
|
|
|
ptr = Ptr_HQM_Memory ;
|
|
|
|
while( ptr < Ptr_HQM_Next )
|
|
{
|
|
ptrh = (HQM_HEADER*)ptr ;
|
|
|
|
if( ptrh->Id != 0x12345678 ) return FALSE ;
|
|
|
|
ptr += ptrh->Size + sizeof( HQM_HEADER ) ;
|
|
}
|
|
return TRUE ;
|
|
}
|