Files

73 lines
1.9 KiB
C

#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include "\projet\lib386\lib_sys\adeline.h"
#include "\projet\lib386\lib_sys\lib_sys.h"
#define RECOVER_AREA 500
/*──────────────────────────────────────────────────────────────────────────*/
typedef struct { ULONG SizeFile ;
ULONG CompressedSizeFile ;
WORD CompressMethod ; /* 0 stored */
/* 1 LZS */
} T_HEADER ;
void Expand( void *ptrsourcecomp, void *ptrblocdest, ULONG sizefile ) ;
/*──────────────────────────────────────────────────────────────────────────*/
LONG HQRM_Load( UBYTE *name, UWORD index, void **ptrptr )
{
LONG handle ;
UWORD nbbloc ;
ULONG buffer ;
ULONG seekindex ;
// UBYTE *ptrbloc ;
UBYTE *ptrdecomp ;
T_HEADER header ;
handle = OpenRead( name ) ;
if( !handle ) return FALSE ;
Read( handle, &buffer, 4L ) ;
nbbloc = (UWORD)(buffer / 4L) ;
if( index >= nbbloc ) return FALSE ;
Seek( handle, index * 4L, SEEK_START ) ;
Read( handle, &seekindex, 4L ) ;
Seek( handle, seekindex, SEEK_START ) ;
Read( handle, &header, sizeof( header ) ) ;
if( !HQM_Alloc( header.SizeFile, ptrptr ) ) // il y a deja 500 de plus
{
return FALSE ;
}
switch( header.CompressMethod )
{
case 0: /* Stored */
Read( handle, *ptrptr, header.SizeFile ) ;
break ;
case 1: /* LZS */
ptrdecomp = (UBYTE*)(*ptrptr) + header.SizeFile - header.CompressedSizeFile + RECOVER_AREA ;
Read( handle, ptrdecomp, header.CompressedSizeFile ) ;
Expand( ptrdecomp, *ptrptr, header.SizeFile ) ;
break ;
default:
HQM_Free( *ptrptr ) ;
return FALSE ; /* UnKnown version */
}
Close( handle ) ;
return header.SizeFile ;
}