2096 lines
87 KiB
C
2096 lines
87 KiB
C
/*=============================================================================
|
||
*
|
||
* Filename: BigFile.C
|
||
* Version: 1.1
|
||
* Date: 08/97
|
||
* Author: 1.0 / Vincent Lhuillier
|
||
* 1.1 / Adrian Silvescu, Laurentiu Barza, Yan Marchal
|
||
*
|
||
* Description: Definitions of functions for accessing BigFile
|
||
*
|
||
*===========================================================================*/
|
||
|
||
#include <stdio.h>
|
||
#include <stdlib.h>
|
||
#include <malloc.h>
|
||
#include <string.h>
|
||
#include <time.h>
|
||
#include <direct.h>
|
||
#include <io.h>
|
||
#include <windows.h>
|
||
|
||
#define __DeclareGlobalVariableErrMrc_h__
|
||
#include "MRC\ErrMrc.h"
|
||
#undef __DeclareGlobalVariableErrMrc_h__
|
||
#define __DeclareGlobalVariableMmgMrc_h__
|
||
#include "MRC\MmgMrc.h"
|
||
#undef __DeclareGlobalVariableMmgMrc_h__
|
||
|
||
#include "mrc.h"
|
||
|
||
#define _DEFINE_CPA_MMG_MEMORY_ALLOCATION_
|
||
#define MAX_BUFF 4096
|
||
|
||
/*=============================================================================
|
||
* GLOBALES
|
||
=============================================================================*/
|
||
#define MRC_C_ucIsData 0
|
||
#define MRC_C_ucIsPatch 1
|
||
|
||
char *MRC_ga_szReadTypeString[ 2 ]=
|
||
{
|
||
"Synchronous",
|
||
"Asynchronous"
|
||
};
|
||
|
||
/* globals for external mode */
|
||
MRC_tdstFileEntry MRC_g_stExternalFileEntry;
|
||
char MRC_g_szExternalFileName[256];
|
||
|
||
/* ever used globals */
|
||
char *MRC_g_szDataPath = (char *) NULL; /* path to root directory of data */
|
||
char *MRC_g_szPatchPath = (char *) NULL; /* path to directory where patch are stocked */
|
||
unsigned char MRC_g_ucCurrentIsDataPath = MRC_C_ucDataPathIsCurrent;
|
||
char MRC_g_szFullName[256];
|
||
|
||
|
||
/*=============================================================================
|
||
* FUNCTIONS for printing DEBUG INFO in a file
|
||
=============================================================================*/
|
||
|
||
/*-----------------------------------------------------------------------------
|
||
* Description : Auxiliary function (gets the name of a file from its complete Path)
|
||
*---------------------------------------------------------------------------*/
|
||
|
||
char* fn_sz_GetName(char* szName)
|
||
{
|
||
char* p_str;
|
||
char* retv;
|
||
char* p1_str;
|
||
#ifdef _DEFINE_CPA_MMG_MEMORY_ALLOCATION_
|
||
M_MrcAlloc (E_ucDynamic, retv , char * , 256 );
|
||
#else
|
||
retv = (char *) malloc ( 256 );
|
||
#endif
|
||
p_str = strrchr( szName, '\\' );
|
||
if ( p_str != NULL )
|
||
{
|
||
p_str = p_str + 1 ;
|
||
}
|
||
else
|
||
{
|
||
p_str = szName;
|
||
}
|
||
p1_str = strchr(p_str , '.');
|
||
strncpy( retv , p_str , (p1_str - p_str) );
|
||
retv[(p1_str - p_str)] = (char)0;
|
||
return retv;
|
||
}
|
||
|
||
|
||
/*-----------------------------------------------------------------------------
|
||
* Description : Initialise variable for debug info file
|
||
*-----------------------------------------------------------------------------
|
||
* Input : none
|
||
* Output : none
|
||
*-----------------------------------------------------------------------------
|
||
* Creation date : 05/06/96 Author : V.L.
|
||
*-----------------------------------------------------------------------------
|
||
* Modification date : Modification Author :
|
||
* Modifications :
|
||
*---------------------------------------------------------------------------*/
|
||
void MRC_fn_vOpenBigFileDebugFiles( MRC_tdstBigFile *p_stBigFile , char* szFileName )
|
||
{
|
||
char* szName;
|
||
char* sz1Name;
|
||
szName = fn_sz_GetName( szFileName );
|
||
#ifdef _DEFINE_CPA_MMG_MEMORY_ALLOCATION_
|
||
M_MrcAlloc( E_ucDynamic, sz1Name , char * , 256 );
|
||
#else
|
||
sz1Name = (char *) malloc ( 256 );
|
||
#endif
|
||
strcpy(sz1Name,szName);
|
||
if ( p_stBigFile->ucMode & MRC_C_ucDebugMode )
|
||
{
|
||
p_stBigFile->hpDebugBigFile = fopen( MRC_fn_p_szGetFullFileName ( strcat(szName,"debug.inf"), MRC_C_ucIsData), "wt");
|
||
if (p_stBigFile->hpDebugBigFile == NULL)
|
||
exit (-1);
|
||
}
|
||
|
||
if (p_stBigFile->ucMode & MRC_C_ucProfileMode )
|
||
{
|
||
p_stBigFile->hpProfileBigFile = fopen( MRC_fn_p_szGetFullFileName( strcat(sz1Name,"profile.inf"), MRC_C_ucIsData), "wt");
|
||
if (p_stBigFile->hpProfileBigFile == NULL)
|
||
exit (-2);
|
||
}
|
||
#ifdef _DEFINE_CPA_MMG_MEMORY_ALLOCATION_
|
||
M_MrcFree( E_ucDynamic , szName );
|
||
#else
|
||
free( szName );
|
||
#endif
|
||
#ifdef _DEFINE_CPA_MMG_MEMORY_ALLOCATION_
|
||
M_MrcFree( E_ucDynamic , sz1Name );
|
||
#else
|
||
free( sz1Name );
|
||
#endif
|
||
|
||
}
|
||
|
||
/*-----------------------------------------------------------------------------
|
||
* Description : Close debug info file
|
||
*-----------------------------------------------------------------------------
|
||
* Input : none
|
||
* Output : none
|
||
*-----------------------------------------------------------------------------
|
||
* Creation date : 05/06/96 Author : V.L.
|
||
*-----------------------------------------------------------------------------
|
||
* Modification date : Modification Author :
|
||
* Modifications :
|
||
*---------------------------------------------------------------------------*/
|
||
void MRC_fn_vCloseBigFileDebugFiles( MRC_tdstBigFile *p_stBigFile )
|
||
{
|
||
if (p_stBigFile->ucMode & MRC_C_ucDebugMode )
|
||
fclose( p_stBigFile->hpDebugBigFile );
|
||
|
||
if (p_stBigFile->ucMode & MRC_C_ucProfileMode )
|
||
fclose( p_stBigFile->hpProfileBigFile );
|
||
}
|
||
|
||
/*-----------------------------------------------------------------------------
|
||
* Description : print a read access info on the profil file.
|
||
* BigFile must be in C_ucProfileMode mode when calling this function
|
||
*-----------------------------------------------------------------------------
|
||
* Input : pointer on a tdstFileEntry structure
|
||
* Output : none
|
||
*-----------------------------------------------------------------------------
|
||
* Creation date : 05/06/96 Author : V.L.
|
||
*-----------------------------------------------------------------------------
|
||
* Modification date : Modification Author :
|
||
* Modifications :
|
||
*---------------------------------------------------------------------------*/
|
||
void MRC_fn_vPrintReadAccess( char *szFileName, char bAsyncRead, long lOffset, long lLength , MRC_tdstBigFile *p_stBigFile)
|
||
{
|
||
time_t lTime;
|
||
struct tm *p_stTime;
|
||
char *p_szReadType;
|
||
|
||
p_szReadType = MRC_ga_szReadTypeString[ bAsyncRead?1:0 ];
|
||
time( &lTime );
|
||
p_stTime = localtime( &lTime );
|
||
|
||
fprintf(p_stBigFile->hpProfileBigFile,"%2d:%2d:%2d (%d) %s %d %d %s\n",
|
||
p_stTime->tm_hour, p_stTime->tm_min, p_stTime->tm_sec,
|
||
lTime, szFileName, lOffset, lLength, p_szReadType );
|
||
}
|
||
|
||
/*-----------------------------------------------------------------------------
|
||
* Description : print FileEntry info in debug info file
|
||
* BigFile must be in C_ucDebugMode mode when calling this function
|
||
*-----------------------------------------------------------------------------
|
||
* Input : pointer on a tdstFileEntry structure
|
||
* Output : none
|
||
*-----------------------------------------------------------------------------
|
||
* Creation date : 05/06/96 Author : V.L.
|
||
*-----------------------------------------------------------------------------
|
||
* Modification date : Modification Author :
|
||
* Modifications :
|
||
*---------------------------------------------------------------------------*/
|
||
void MRC_fn_vPrintFileEntryInfos( MRC_tdstFileEntry *p_stFile , MRC_tdstBigFile *p_stBigFile)
|
||
{
|
||
char acName[13];
|
||
|
||
if ((p_stFile == NULL) || (p_stFile->wPlace == MRC_C_wInexistentFile) )
|
||
fprintf( p_stBigFile->hpDebugBigFile, "FileEntry : NULL\n");
|
||
else
|
||
{
|
||
strcpy (acName, p_stFile->szName);
|
||
while (strlen(acName) < 12)
|
||
strcat( acName, " ");
|
||
|
||
fprintf( p_stBigFile->hpDebugBigFile, "FileEntry : %s -> Infos (%3d) ", acName, p_stFile->lInfos); switch (p_stFile->wPlace)
|
||
{
|
||
case MRC_C_wInternalFile:
|
||
fprintf (p_stBigFile->hpDebugBigFile, "Pos (%8d,%8d)\n", p_stFile->lOffset, p_stFile->lLength );
|
||
break;
|
||
case MRC_C_wExternalFile:
|
||
fprintf (p_stBigFile->hpDebugBigFile, "Length (%8d), Externe File : %s\n", p_stFile->lLength, p_stFile->szExternFile);
|
||
break;
|
||
default:
|
||
fprintf (p_stBigFile->hpDebugBigFile, "Pos (%8d,%8d), Patch (%d)\n", p_stFile->lOffset, p_stFile->lLength, p_stFile->wPlace );
|
||
}
|
||
}
|
||
}
|
||
|
||
/*-----------------------------------------------------------------------------
|
||
* Description : print bigfile info in debug info file
|
||
* BigFile must be in C_ucDebugMode mode when calling this function
|
||
*-----------------------------------------------------------------------------
|
||
* Input : pointer on a MRC_tdstBigFile structure
|
||
* Output : none
|
||
*-----------------------------------------------------------------------------
|
||
* Creation date : 05/06/96 Author : V.L.
|
||
*-----------------------------------------------------------------------------
|
||
* Modification date : Modification Author :
|
||
* Modifications :
|
||
*---------------------------------------------------------------------------*/
|
||
void MRC_fn_vPrintBigFileInfos( MRC_tdstBigFile *p_stBigFile )
|
||
{
|
||
char acName[13];
|
||
short wIndex;
|
||
MRC_tdstDirectoryEntry *p_stDir = p_stBigFile->pa_stDir;
|
||
MRC_tdstFileEntry *p_stFile = p_stBigFile->pa_stFile;
|
||
MRC_tdstDataPatch *p_stPatch = p_stBigFile->pa_stPatch;
|
||
|
||
if ( p_stBigFile->ucMode & MRC_C_ucExternalMode )
|
||
{
|
||
fprintf( p_stBigFile->hpDebugBigFile, "/***** BigFile Infos ********/\n");
|
||
fprintf( p_stBigFile->hpDebugBigFile, "All files are external\n");
|
||
return;
|
||
}
|
||
|
||
/* printing bigfile infos */
|
||
fprintf( p_stBigFile->hpDebugBigFile, "/***** BigFile Infos ********/\n");
|
||
fprintf( p_stBigFile->hpDebugBigFile, "\tName : %s\n", p_stBigFile->szName);
|
||
fprintf( p_stBigFile->hpDebugBigFile, "\tVersion : %d\n", p_stBigFile->lVersion);
|
||
fprintf( p_stBigFile->hpDebugBigFile, "\tFirst Data : %d\n", p_stBigFile->lFirstData);
|
||
fprintf( p_stBigFile->hpDebugBigFile, "\tNumber of Dirs : %d\n", p_stBigFile->wNumberOfDirs);
|
||
fprintf( p_stBigFile->hpDebugBigFile, "\tNumber of Files : %d\n", p_stBigFile->wNumberOfFiles);
|
||
fprintf( p_stBigFile->hpDebugBigFile, "\tNumber of Patchs: %d\n", p_stBigFile->wNumberOfPatchs);
|
||
fprintf( p_stBigFile->hpDebugBigFile, "\n");
|
||
|
||
/* for each dir print info */
|
||
fprintf( p_stBigFile->hpDebugBigFile, "\t/***** Directory List *******/\n");
|
||
for (wIndex = 0; wIndex < p_stBigFile->wNumberOfDirs; wIndex ++)
|
||
{
|
||
strcpy (acName, p_stDir->szName);
|
||
while (strlen(acName) < 12)
|
||
strcat( acName, " ");
|
||
|
||
fprintf( p_stBigFile->hpDebugBigFile, "\t%3d : %s -> Subdirs (%3d,%3d) Files (%3d,%3d)\n",
|
||
wIndex,
|
||
acName,
|
||
p_stDir->wFirstSubDir,
|
||
p_stDir->wNumberOfSubDirs,
|
||
p_stDir->wFirstFile,
|
||
p_stDir->wNumberOfFiles
|
||
);
|
||
p_stDir ++;
|
||
}
|
||
fprintf( p_stBigFile->hpDebugBigFile, "\n");
|
||
|
||
/* for each file, print info */
|
||
fprintf( p_stBigFile->hpDebugBigFile, "\t/***** File List ************/\n");
|
||
for (wIndex = 0; wIndex < p_stBigFile->wNumberOfFiles; wIndex ++)
|
||
{
|
||
fprintf(p_stBigFile->hpDebugBigFile, "\t");
|
||
MRC_fn_vPrintFileEntryInfos( p_stFile , p_stBigFile );
|
||
p_stFile ++;
|
||
}
|
||
fprintf( p_stBigFile->hpDebugBigFile, "\n");
|
||
|
||
/* For each patch print infos */
|
||
fprintf( p_stBigFile->hpDebugBigFile, "\t/***** Patch List ************/\n");
|
||
for (wIndex = 0; wIndex < p_stBigFile->wNumberOfPatchs; wIndex ++)
|
||
{
|
||
fprintf( p_stBigFile->hpDebugBigFile, "Patch %2d : version(%8d),FirstData(%8d), %s\n",
|
||
wIndex, p_stPatch->lVersion, p_stPatch->lFirstData, p_stPatch->szName );
|
||
p_stPatch ++;
|
||
}
|
||
fprintf( p_stBigFile->hpDebugBigFile, "\n");
|
||
}
|
||
|
||
/*-----------------------------------------------------------------------------
|
||
* Description : print MRC_tdstFileDescription info in debug info file
|
||
* BigFile must be in C_ucDebugMode mode when calling this function
|
||
*-----------------------------------------------------------------------------
|
||
* Input : pointer on a MRC_tdstFileDescription structure
|
||
* Output : none
|
||
*-----------------------------------------------------------------------------
|
||
* Creation date : 05/06/96 Author : V.L.
|
||
*-----------------------------------------------------------------------------
|
||
* Modification date : Modification Author :
|
||
* Modifications :
|
||
*---------------------------------------------------------------------------*/
|
||
void MRC_fn_vPrintFileDescriptionInfos( MRC_tdstFileDescription *p_stFile )
|
||
{
|
||
if (p_stFile)
|
||
{
|
||
fprintf( p_stFile->p_stBigFile->hpDebugBigFile,"File : (%d %d %d), pos = %d\n",
|
||
p_stFile->eType, p_stFile->eMode, p_stFile->eState,
|
||
p_stFile->lPosition );
|
||
MRC_fn_vPrintFileEntryInfos( p_stFile->p_stFileEntry , p_stFile->p_stBigFile);
|
||
}
|
||
else
|
||
fprintf( p_stFile->p_stBigFile->hpDebugBigFile,"File : NULL\n");
|
||
}
|
||
|
||
/*=============================================================================
|
||
*
|
||
* FUNCTION TO INIT DATA & PATCH PATH
|
||
*
|
||
=============================================================================*/
|
||
|
||
/*-----------------------------------------------------------------------------
|
||
* Description : go into a path
|
||
*-----------------------------------------------------------------------------
|
||
* Input : pth name
|
||
* Output : an error value
|
||
*-----------------------------------------------------------------------------
|
||
* Creation date : 05/06/96 Author : V.L.
|
||
*-----------------------------------------------------------------------------
|
||
* Modification date : Modification Author :
|
||
* Modifications :
|
||
*---------------------------------------------------------------------------*/
|
||
long MRC_fn_lChangeDirectory( char *szPath )
|
||
{
|
||
if (
|
||
#ifdef WATCOM
|
||
chdir
|
||
#else
|
||
_chdir
|
||
#endif
|
||
( szPath ))
|
||
{
|
||
M_MrcError( E_uwMrcWarningInvalidPath );
|
||
return (E_uwMrcWarningInvalidPath);
|
||
}
|
||
return( E_uwMrcWarningNone );
|
||
}
|
||
|
||
/*-----------------------------------------------------------------------------
|
||
* Description : verify existence of a path
|
||
*-----------------------------------------------------------------------------
|
||
* Input : a pointer on path name
|
||
* Output : an error value
|
||
*-----------------------------------------------------------------------------
|
||
* Creation date : 05/06/96 Author : V.L.
|
||
*-----------------------------------------------------------------------------
|
||
* Modification date : Modification Author :
|
||
* Modifications :
|
||
*---------------------------------------------------------------------------*/
|
||
long fn_l_VerifyPath( char *szPath )
|
||
{
|
||
long lError;
|
||
char szCurrentDir[256];
|
||
|
||
#ifdef WATCOM
|
||
getcwd
|
||
#else
|
||
_getcwd
|
||
#endif
|
||
( szCurrentDir , 255);
|
||
lError = MRC_fn_lChangeDirectory( szPath );
|
||
#ifdef WATCOM
|
||
chdir
|
||
#else
|
||
_chdir
|
||
#endif
|
||
( szCurrentDir );
|
||
|
||
return ( lError );
|
||
}
|
||
|
||
/*-----------------------------------------------------------------------------
|
||
* Description : initialize data path and verify it
|
||
*-----------------------------------------------------------------------------
|
||
* Input : a pointer on path name, dataPath mode :
|
||
* C_ucDataPathIsCurrent or C_ucDataPathIsNotCurrent
|
||
* Output : an error value
|
||
*-----------------------------------------------------------------------------
|
||
* Creation date : 05/06/96 Author : V.L.
|
||
*-----------------------------------------------------------------------------
|
||
* Modification date : Modification Author :
|
||
* Modifications :
|
||
*---------------------------------------------------------------------------*/
|
||
long MRC_fn_lInitDataPath( char *szDataPath, unsigned char ucMode )
|
||
{
|
||
long lError;
|
||
|
||
if ( (lError = fn_l_VerifyPath( szDataPath ) ) == E_uwMrcWarningNone )
|
||
{
|
||
MRC_g_ucCurrentIsDataPath = ucMode;
|
||
#ifdef _DEFINE_CPA_MMG_MEMORY_ALLOCATION_
|
||
M_MrcAlloc(E_ucDynamic, MRC_g_szDataPath , char * , (strlen(szDataPath)+1) );
|
||
#else
|
||
MRC_g_szDataPath = (char *) malloc (strlen(szDataPath) + 1);
|
||
#endif
|
||
strcpy( MRC_g_szDataPath, szDataPath );
|
||
}
|
||
return ( lError );
|
||
}
|
||
|
||
/*-----------------------------------------------------------------------------
|
||
* Description : initialize Patches path and verify it
|
||
*-----------------------------------------------------------------------------
|
||
* Input : a pointer on path name
|
||
* Output : an error value
|
||
*-----------------------------------------------------------------------------
|
||
* Creation date : 05/06/96 Author : V.L.
|
||
*-----------------------------------------------------------------------------
|
||
* Modification date : Modification Author :
|
||
* Modifications :
|
||
*---------------------------------------------------------------------------*/
|
||
long MRC_fn_lInitPatchPath( char *szPatchPath )
|
||
{
|
||
long lError;
|
||
|
||
if ( (lError = fn_l_VerifyPath( szPatchPath ) ) == E_uwMrcWarningNone )
|
||
{
|
||
#ifdef _DEFINE_CPA_MMG_MEMORY_ALLOCATION_
|
||
M_MrcAlloc(E_ucDynamic, MRC_g_szPatchPath , char * , (strlen(szPatchPath) + 1));
|
||
#else
|
||
MRC_g_szPatchPath = (char *) malloc (strlen(szPatchPath) + 1);
|
||
#endif
|
||
strcpy( MRC_g_szPatchPath, szPatchPath );
|
||
}
|
||
return ( lError );
|
||
}
|
||
|
||
/*-----------------------------------------------------------------------------
|
||
* Description : change data path mode
|
||
*-----------------------------------------------------------------------------
|
||
* Input : a data path mode (C_ucDataPathIsCurrent ou C_ucDataPathIsNotCurrent)
|
||
* Output : none
|
||
*-----------------------------------------------------------------------------
|
||
* Creation date : 05/06/96 Author : V.L.
|
||
*-----------------------------------------------------------------------------
|
||
* Modification date : Modification Author :
|
||
* Modifications :
|
||
*---------------------------------------------------------------------------*/
|
||
void MRC_fn_vChangeDataPathMode( unsigned char ucMode )
|
||
{
|
||
MRC_g_ucCurrentIsDataPath = ucMode;
|
||
}
|
||
|
||
/*-----------------------------------------------------------------------------
|
||
* Description : free path
|
||
*-----------------------------------------------------------------------------
|
||
* Input : none
|
||
* Output : none
|
||
*-----------------------------------------------------------------------------
|
||
* Creation date : 05/06/96 Author : V.L.
|
||
*-----------------------------------------------------------------------------
|
||
* Modification date : Modification Author :
|
||
* Modifications :
|
||
*---------------------------------------------------------------------------*/
|
||
void MRC_fn_vFreePath( void )
|
||
{
|
||
if (MRC_g_szDataPath)
|
||
{
|
||
#ifdef _DEFINE_CPA_MMG_MEMORY_ALLOCATION_
|
||
M_MrcFreeWithoutSetMode(MRC_g_szDataPath);
|
||
#else
|
||
free(MRC_g_szDataPath);
|
||
#endif
|
||
|
||
MRC_g_szDataPath = 0;
|
||
}
|
||
if (MRC_g_szPatchPath)
|
||
{
|
||
#ifdef _DEFINE_CPA_MMG_MEMORY_ALLOCATION_
|
||
M_MrcFreeWithoutSetMode (MRC_g_szPatchPath);
|
||
#else
|
||
free (MRC_g_szPatchPath);
|
||
#endif
|
||
|
||
MRC_g_szPatchPath = 0;
|
||
}
|
||
}
|
||
|
||
/*-----------------------------------------------------------------------------
|
||
* Description : go into data path
|
||
*-----------------------------------------------------------------------------
|
||
* Input : none
|
||
* Output : an error value
|
||
*-----------------------------------------------------------------------------
|
||
* Creation date : 05/06/96 Author : V.L.
|
||
*-----------------------------------------------------------------------------
|
||
* Modification date : Modification Author :
|
||
* Modifications :
|
||
*---------------------------------------------------------------------------*/
|
||
long MRC_fn_lGotoDataDir( void )
|
||
{
|
||
return (MRC_fn_lChangeDirectory( MRC_g_szDataPath ) );
|
||
}
|
||
|
||
/*-----------------------------------------------------------------------------
|
||
* Description : go into patch path
|
||
*-----------------------------------------------------------------------------
|
||
* Input : none
|
||
* Output : an error value
|
||
*-----------------------------------------------------------------------------
|
||
* Creation date : 05/06/96 Author : V.L.
|
||
*-----------------------------------------------------------------------------
|
||
* Modification date : Modification Author :
|
||
* Modifications :
|
||
*---------------------------------------------------------------------------*/
|
||
long MRC_fn_lGotoPatchDir( void )
|
||
{
|
||
return (MRC_fn_lChangeDirectory( MRC_g_szPatchPath ) );
|
||
}
|
||
|
||
/*-----------------------------------------------------------------------------
|
||
* Description : return full name in a user-supplied buffer
|
||
*-----------------------------------------------------------------------------
|
||
* Input : pointer on name, pointer on path
|
||
* Output : pointer on full name
|
||
*-----------------------------------------------------------------------------
|
||
* Creation date : 05/06/96 Author : V.L.
|
||
*-----------------------------------------------------------------------------
|
||
* Modification date : Modification Author :
|
||
* Modifications :
|
||
*---------------------------------------------------------------------------*/
|
||
char *MRC_fn_p_szGetFullFileName( char *szFileName, unsigned char ucType )
|
||
{
|
||
char *szPath;
|
||
|
||
if (ucType == MRC_C_ucIsData )
|
||
{
|
||
if ( MRC_g_ucCurrentIsDataPath || (MRC_g_szDataPath == NULL))
|
||
return szFileName;
|
||
else
|
||
szPath = MRC_g_szDataPath;
|
||
}
|
||
else
|
||
{
|
||
if (MRC_g_szPatchPath == NULL)
|
||
return szFileName;
|
||
else
|
||
szPath = MRC_g_szPatchPath;
|
||
}
|
||
|
||
strcpy( MRC_g_szFullName, szPath);
|
||
strcat( MRC_g_szFullName, "\\");
|
||
strcat( MRC_g_szFullName, szFileName);
|
||
|
||
return (MRC_g_szFullName);
|
||
}
|
||
|
||
|
||
/*=============================================================================
|
||
*
|
||
* FUNCTION TO INIT, OPEN & CLOSE BIGFILE
|
||
*
|
||
=============================================================================*/
|
||
|
||
/*-----------------------------------------------------------------------------
|
||
* Description : Read a BigFile & setup bigfile members
|
||
*-----------------------------------------------------------------------------
|
||
* Input : a pointer on a BigFile structure and bigfile name
|
||
* Output : none
|
||
*-----------------------------------------------------------------------------
|
||
* Creation date : 05/06/96 Author : V.L.
|
||
*-----------------------------------------------------------------------------
|
||
* Modification date : Modification Author :
|
||
* Modifications :
|
||
*---------------------------------------------------------------------------*/
|
||
e_uwMrcErrNumber MRC_fn_lReadBigFile( MRC_tdstBigFile *p_stBigFile, char *szFileName, short wPlace )
|
||
{
|
||
MRC_tdstDirectoryEntry *p_stDir;
|
||
MRC_tdstFileEntry *p_stFile;
|
||
MRC_tdstShortChunk stChunk;
|
||
MRC_tdstDLst *p_stDLst;
|
||
MRC_tdstFLst *p_stFLst;
|
||
FILE *hpFile;
|
||
FILE *hpExternalFile;
|
||
char *szNameList;
|
||
char *szName;
|
||
long lValue;
|
||
short wNbDirs;
|
||
short wNbFiles;
|
||
short wIndex;
|
||
|
||
/*
|
||
* Opening File
|
||
*/
|
||
hpFile = p_stBigFile->hpBigFile = fopen( MRC_fn_p_szGetFullFileName(szFileName, MRC_C_ucIsData), "rb");
|
||
|
||
if (hpFile == NULL)
|
||
{
|
||
M_MrcError( E_uwMrcWarningBigFileNotFound );
|
||
return ( E_uwMrcWarningBigFileNotFound );
|
||
}
|
||
#ifdef _DEFINE_CPA_MMG_MEMORY_ALLOCATION_
|
||
M_MrcAlloc(E_ucDynamic, p_stBigFile->szName , char * , ( strlen(szFileName) + 1));
|
||
#else
|
||
p_stBigFile->szName = (char *) malloc ( strlen(szFileName) + 1);
|
||
#endif
|
||
strcpy(p_stBigFile->szName, szFileName);
|
||
|
||
/* Read bigfile info */
|
||
fread( &stChunk, sizeof(MRC_tdstShortChunk), 1, hpFile );
|
||
fread( &stChunk, sizeof(MRC_tdstShortChunk), 1, hpFile );
|
||
memcpy((char *)&p_stBigFile->lVersion, stChunk.acInfo, 4);
|
||
|
||
/* Read File system chunk */
|
||
fread( &stChunk, sizeof(MRC_tdstShortChunk), 1, hpFile );
|
||
|
||
/* Read Dir List */
|
||
fseek( hpFile, 4, SEEK_CUR );
|
||
fread( &lValue, 4, 1, hpFile );
|
||
|
||
wNbDirs = p_stBigFile->wNumberOfDirs = (short)(lValue / sizeof(MRC_tdstDLst));
|
||
#ifdef _DEFINE_CPA_MMG_MEMORY_ALLOCATION_
|
||
M_MrcAlloc(E_ucDynamic, p_stBigFile->pa_stDir , MRC_tdstDirectoryEntry * , (wNbDirs * sizeof(MRC_tdstDirectoryEntry))) ;
|
||
#else
|
||
p_stBigFile->pa_stDir = (MRC_tdstDirectoryEntry *) malloc (wNbDirs * sizeof(MRC_tdstDirectoryEntry) );
|
||
#endif
|
||
|
||
#ifdef _DEFINE_CPA_MMG_MEMORY_ALLOCATION_
|
||
M_MrcAlloc(E_ucDynamic, p_stDLst , MRC_tdstDLst * , (lValue));
|
||
#else
|
||
p_stDLst = (MRC_tdstDLst *) malloc (lValue);
|
||
#endif
|
||
|
||
fread( p_stDLst, lValue, 1, hpFile);
|
||
|
||
/* Read File List */
|
||
fseek( hpFile, 4, SEEK_CUR );
|
||
fread( &lValue, 4, 1, hpFile );
|
||
|
||
wNbFiles = p_stBigFile->wNumberOfFiles = (short)(lValue / sizeof(MRC_tdstFLst));
|
||
#ifdef _DEFINE_CPA_MMG_MEMORY_ALLOCATION_
|
||
M_MrcAllocWithoutSetMode(p_stBigFile->pa_stFile , MRC_tdstFileEntry * , (wNbFiles * sizeof(MRC_tdstFileEntry) ));
|
||
#else
|
||
p_stBigFile->pa_stFile = (MRC_tdstFileEntry *) malloc (wNbFiles * sizeof(MRC_tdstFileEntry) );
|
||
#endif
|
||
#ifdef _DEFINE_CPA_MMG_MEMORY_ALLOCATION_
|
||
M_MrcAllocWithoutSetMode(p_stFLst , MRC_tdstFLst * , (lValue));
|
||
#else
|
||
p_stFLst = (MRC_tdstFLst *) malloc (lValue);
|
||
#endif
|
||
|
||
fread( p_stFLst, lValue, 1, hpFile);
|
||
|
||
/* Read Name List */
|
||
fseek( hpFile, 4, SEEK_CUR );
|
||
fread( &lValue, 4, 1, hpFile );
|
||
#ifdef _DEFINE_CPA_MMG_MEMORY_ALLOCATION_
|
||
M_MrcAllocWithoutSetMode(szNameList , char * , (lValue));
|
||
#else
|
||
szNameList = (char *) malloc (lValue);
|
||
#endif
|
||
fread ( szNameList, lValue, 1, hpFile);
|
||
|
||
/* Save DLst list in bigFile Dir table */
|
||
p_stDir = p_stBigFile->pa_stDir;
|
||
for (wIndex = 0; wIndex < wNbDirs; wIndex ++)
|
||
{
|
||
szName = (char *) &szNameList[ p_stDLst[wIndex].lNameOffset ];
|
||
#ifdef _DEFINE_CPA_MMG_MEMORY_ALLOCATION_
|
||
M_MrcAllocWithoutSetMode(p_stDir->szName , char * , (strlen(szName) + 1));
|
||
#else
|
||
p_stDir->szName = (char *) malloc (strlen(szName) + 1);
|
||
#endif
|
||
strcpy( p_stDir->szName, szName);
|
||
p_stDir->wNumberOfSubDirs = (short)p_stDLst[wIndex].lNumberOfSubDirs;
|
||
p_stDir->wFirstSubDir = (short)p_stDLst[wIndex].lFirstSubDir;
|
||
p_stDir->wNumberOfFiles = (short)p_stDLst[wIndex].lNumberOfFiles;
|
||
p_stDir->wFirstFile = (short)p_stDLst[wIndex].lFirstFile;
|
||
p_stDir ++;
|
||
}
|
||
|
||
/* Save FLst list in bigFile File table */
|
||
p_stFile = p_stBigFile->pa_stFile;
|
||
for (wIndex = 0; wIndex < wNbFiles; wIndex ++)
|
||
{
|
||
szName = (char *) &szNameList[ p_stFLst[wIndex].lNameOffset ];
|
||
#ifdef _DEFINE_CPA_MMG_MEMORY_ALLOCATION_
|
||
M_MrcAllocWithoutSetMode(p_stFile->szName , char * , (strlen(szName) + 1));
|
||
#else
|
||
p_stFile->szName = (char *) malloc (strlen(szName) + 1);
|
||
#endif
|
||
strcpy( p_stFile->szName, szName);
|
||
|
||
p_stFile->lLength = p_stFLst[ wIndex ].lLength;
|
||
p_stFile->lOffset = p_stFLst[ wIndex ].lOffset;
|
||
p_stFile->lInfos = p_stFLst[ wIndex ].lInfo;
|
||
p_stFile->wPlace = wPlace;
|
||
|
||
if (p_stFile->lLength == MRC_C_wExternalFile)
|
||
{
|
||
szName = (char *) &szNameList[ p_stFile->lOffset ];
|
||
#ifdef _DEFINE_CPA_MMG_MEMORY_ALLOCATION_
|
||
M_MrcAllocWithoutSetMode(p_stFile->szExternFile , char * , ( strlen(szName) + 1));
|
||
#else
|
||
p_stFile->szExternFile = (char *) malloc ( strlen(szName) + 1);
|
||
#endif
|
||
strcpy( p_stFile->szExternFile, szName );
|
||
|
||
if ( (hpExternalFile = fopen( MRC_fn_p_szGetFullFileName(szName, MRC_C_ucIsData), "rb" )) == NULL)
|
||
p_stFile->wPlace = MRC_C_wInexistentFile ;
|
||
else
|
||
{
|
||
p_stFile->wPlace = MRC_C_wExternalFile;
|
||
p_stFile->lOffset = 0;
|
||
fseek( hpExternalFile, 0, SEEK_END );
|
||
p_stFile->lLength = ftell( hpExternalFile );
|
||
fclose (hpExternalFile);
|
||
}
|
||
}
|
||
else
|
||
p_stFile->szExternFile = NULL;
|
||
|
||
p_stFile ++;
|
||
}
|
||
|
||
/* Read chunk of File Storage */
|
||
fread( &stChunk, sizeof(MRC_tdstShortChunk), 1, hpFile );
|
||
|
||
p_stBigFile->lFirstData = ftell( hpFile );
|
||
|
||
/* free local pointer */
|
||
#ifdef _DEFINE_CPA_MMG_MEMORY_ALLOCATION_
|
||
M_MrcFreeWithoutSetMode( p_stDLst );
|
||
#else
|
||
free( p_stDLst );
|
||
#endif
|
||
|
||
|
||
#ifdef _DEFINE_CPA_MMG_MEMORY_ALLOCATION_
|
||
M_MrcFreeWithoutSetMode( szNameList );
|
||
#else
|
||
free ( szNameList );
|
||
#endif
|
||
|
||
#ifdef _DEFINE_CPA_MMG_MEMORY_ALLOCATION_
|
||
M_MrcFreeWithoutSetMode( p_stFLst );
|
||
#else
|
||
free( p_stFLst );
|
||
#endif
|
||
|
||
return(E_uwMrcWarningNone);
|
||
}
|
||
|
||
/*-----------------------------------------------------------------------------
|
||
* Description : Free memory taken by a BigFile structure
|
||
*-----------------------------------------------------------------------------
|
||
* Input : a pointer on a BigFile structure
|
||
* Output :none
|
||
*-----------------------------------------------------------------------------
|
||
* Creation date : 05/06/96 Author : V.L.
|
||
*-----------------------------------------------------------------------------
|
||
* Modification date : Modification Author :
|
||
* Modifications :
|
||
*---------------------------------------------------------------------------*/
|
||
void MRC_fn_vFreeBigFile( MRC_tdstBigFile *p_stBigFile )
|
||
{
|
||
short wIndex;
|
||
MRC_tdstDirectoryEntry *p_stDir = p_stBigFile->pa_stDir;
|
||
MRC_tdstFileEntry *p_stFile = p_stBigFile->pa_stFile;
|
||
MRC_tdstDataPatch *p_stPatch = p_stBigFile->pa_stPatch;
|
||
|
||
if (p_stBigFile->ucMode & MRC_C_ucDebugMode)
|
||
fprintf( p_stBigFile->hpDebugBigFile, "Closing bigfile %s\n", p_stBigFile->szName);
|
||
|
||
/* free patch table */
|
||
if (p_stBigFile->wNumberOfPatchs)
|
||
{
|
||
for (wIndex = 0; wIndex < p_stBigFile->wNumberOfPatchs; wIndex++, p_stPatch ++)
|
||
#ifdef _DEFINE_CPA_MMG_MEMORY_ALLOCATION_
|
||
M_MrcFree(E_ucDynamic, p_stPatch->szName);
|
||
#else
|
||
free(p_stPatch->szName);
|
||
#endif
|
||
|
||
p_stBigFile->wNumberOfPatchs = 0;
|
||
#ifdef _DEFINE_CPA_MMG_MEMORY_ALLOCATION_
|
||
M_MrcFree(E_ucDynamic, p_stBigFile->pa_stPatch);
|
||
#else
|
||
free(p_stBigFile->pa_stPatch);
|
||
#endif
|
||
|
||
|
||
}
|
||
p_stBigFile->pa_stPatch = NULL;
|
||
|
||
/* free bigfile name & close if open */
|
||
#ifdef _DEFINE_CPA_MMG_MEMORY_ALLOCATION_
|
||
M_MrcFree(E_ucDynamic, p_stBigFile->szName);
|
||
#else
|
||
free( p_stBigFile->szName);
|
||
#endif
|
||
|
||
|
||
if (p_stBigFile->hpBigFile)
|
||
fclose( p_stBigFile->hpBigFile);
|
||
p_stBigFile->hpBigFile = NULL;
|
||
|
||
/* free directory table */
|
||
if (p_stBigFile->wNumberOfDirs)
|
||
{
|
||
for (wIndex = 0; wIndex < p_stBigFile->wNumberOfDirs; wIndex ++, p_stDir ++)
|
||
#ifdef _DEFINE_CPA_MMG_MEMORY_ALLOCATION_
|
||
M_MrcFreeWithoutSetMode(p_stDir->szName);
|
||
#else
|
||
free (p_stDir->szName);
|
||
#endif
|
||
|
||
p_stBigFile->wNumberOfDirs = 0;
|
||
#ifdef _DEFINE_CPA_MMG_MEMORY_ALLOCATION_
|
||
M_MrcFreeWithoutSetMode(p_stBigFile->pa_stDir);
|
||
#else
|
||
free(p_stBigFile->pa_stDir);
|
||
#endif
|
||
|
||
}
|
||
p_stBigFile->pa_stDir = NULL;
|
||
|
||
/* free file table */
|
||
if (p_stBigFile->wNumberOfFiles)
|
||
{
|
||
for (wIndex = 0; wIndex < p_stBigFile->wNumberOfFiles; wIndex ++, p_stFile++)
|
||
#ifdef _DEFINE_CPA_MMG_MEMORY_ALLOCATION_
|
||
M_MrcFreeWithoutSetMode(p_stFile->szName);
|
||
#else
|
||
free (p_stFile->szName);
|
||
#endif
|
||
|
||
p_stBigFile->wNumberOfFiles = 0;
|
||
#ifdef _DEFINE_CPA_MMG_MEMORY_ALLOCATION_
|
||
M_MrcFreeWithoutSetMode(p_stBigFile->pa_stFile);
|
||
#else
|
||
free (p_stBigFile->pa_stFile);
|
||
#endif
|
||
|
||
}
|
||
p_stBigFile->pa_stFile = NULL;
|
||
}
|
||
|
||
|
||
/*-----------------------------------------------------------------------------
|
||
* Description : Initialise the globlal BigFile structure
|
||
*-----------------------------------------------------------------------------
|
||
* Input : name of the file to open
|
||
* Output :none
|
||
*-----------------------------------------------------------------------------
|
||
* Creation date : 05/06/96 Author : V.L.
|
||
*-----------------------------------------------------------------------------
|
||
* Modification date : Modification Author :
|
||
* Modifications :
|
||
*---------------------------------------------------------------------------*/
|
||
MRC_tdstBigFile* MRC_fn_p_stOpenBigFile( char *szFileName, unsigned char ucMode )
|
||
{
|
||
|
||
short wIndex;
|
||
MRC_tdstBigFile *p_stBigFile;
|
||
#ifdef _DEFINE_CPA_MMG_MEMORY_ALLOCATION_
|
||
M_MrcAlloc(E_ucDynamic, p_stBigFile , MRC_tdstBigFile * , (sizeof(MRC_tdstBigFile)));
|
||
#else
|
||
p_stBigFile = (MRC_tdstBigFile *) malloc (sizeof(MRC_tdstBigFile));
|
||
#endif
|
||
|
||
/* Initialise the BigFile*/
|
||
p_stBigFile->szName = NULL; /* name of big file */
|
||
p_stBigFile->hpBigFile = NULL; /* Handler of big file */
|
||
p_stBigFile->pa_stDir = NULL; /* Directory list */
|
||
p_stBigFile->pa_stFile =NULL; /* File List */
|
||
p_stBigFile->lVersion = 0;
|
||
p_stBigFile->lFirstData = 0;
|
||
p_stBigFile->wNumberOfDirs = 0; /* number of dir in dir table */
|
||
p_stBigFile->wNumberOfFiles = 0; /* number of files in file table */
|
||
p_stBigFile->wNumberOfPatchs = 0;
|
||
p_stBigFile->pa_stPatch = 0;
|
||
|
||
/* Initialise BigFile mode */
|
||
p_stBigFile->ucMode = ucMode;
|
||
//
|
||
MRC_fn_vOpenBigFileDebugFiles(p_stBigFile,szFileName);
|
||
//
|
||
/* Initialize file description table */
|
||
for (wIndex = 0; wIndex < MRC_C_NumberMaxOfFileDescription; wIndex ++)
|
||
p_stBigFile->aFileDescription[ wIndex ].eState = MRC_FS_Close;
|
||
|
||
/* Initialize File Table by opening bigfile and eventually patches */
|
||
if ( p_stBigFile->ucMode & MRC_C_ucExternalMode )
|
||
{
|
||
p_stBigFile->hpBigFile = NULL;
|
||
return ( NULL );
|
||
}
|
||
else
|
||
{
|
||
if ( p_stBigFile->ucMode & MRC_C_ucDebugMode)
|
||
fprintf( p_stBigFile->hpDebugBigFile, "Opening bigfile %s\n", szFileName);
|
||
|
||
/* ajouter lectures des patchs */
|
||
|
||
if (MRC_fn_lReadBigFile( p_stBigFile, szFileName, MRC_C_wInternalFile ) == E_uwMrcWarningNone)
|
||
{
|
||
return p_stBigFile;
|
||
}
|
||
else
|
||
{
|
||
return NULL;
|
||
}
|
||
/* changer la table des fichiers pour chaque patchs */
|
||
}
|
||
}
|
||
|
||
|
||
/*-----------------------------------------------------------------------------
|
||
* Description : Close global BigFile structure
|
||
*-----------------------------------------------------------------------------
|
||
* Input : none
|
||
* Output :none
|
||
*-----------------------------------------------------------------------------
|
||
* Creation date : 05/06/96 Author : V.L.
|
||
*-----------------------------------------------------------------------------
|
||
* Modification date : Modification Author :
|
||
* Modifications :
|
||
*---------------------------------------------------------------------------*/
|
||
void MRC_fn_vCloseBigFile ( MRC_tdstBigFile *p_stBigFile )
|
||
{
|
||
short wIndex;
|
||
|
||
/* Close file if some are still opened */
|
||
for (wIndex = 0; wIndex < MRC_C_NumberMaxOfFileDescription; wIndex ++)
|
||
if (p_stBigFile->aFileDescription[ wIndex ].eState != MRC_FS_Close)
|
||
MRC_fn_vCloseFile( &(p_stBigFile->aFileDescription[ wIndex ]) );
|
||
|
||
/* Close BigFile */
|
||
if (!(p_stBigFile->ucMode & MRC_C_ucExternalMode))
|
||
MRC_fn_vFreeBigFile( p_stBigFile );
|
||
//
|
||
MRC_fn_vCloseBigFileDebugFiles( p_stBigFile );
|
||
//
|
||
#ifdef _DEFINE_CPA_MMG_MEMORY_ALLOCATION_
|
||
M_MrcFree(E_ucDynamic, p_stBigFile );
|
||
#else
|
||
free ( p_stBigFile );
|
||
#endif
|
||
}
|
||
|
||
/*=============================================================================
|
||
*
|
||
* FUNCTION TO FIND FILE DESCRIPTIF IN BIG FILE
|
||
*
|
||
=============================================================================*/
|
||
|
||
/*-----------------------------------------------------------------------------
|
||
* Description : Function that return Directory description of a subdir of a dir
|
||
*-----------------------------------------------------------------------------
|
||
* Input : a pointer on a BigFile and
|
||
* a pointer on the current dir
|
||
* name of the subdir
|
||
* Output : pointer on the sub dir or NULL
|
||
*-----------------------------------------------------------------------------
|
||
* Creation date : 05/06/96 Author : V.L.
|
||
*-----------------------------------------------------------------------------
|
||
* Modification date : Modification Author :
|
||
* Modifications :
|
||
*---------------------------------------------------------------------------*/
|
||
MRC_tdstDirectoryEntry *MRC_fn_p_stFindSubDirectoryInDirectory( MRC_tdstBigFile *p_stBigFile, MRC_tdstDirectoryEntry *p_stCurrentDir, char *szSubDirName)
|
||
{
|
||
MRC_tdstDirectoryEntry *p_stSubDir;
|
||
short wIndex;
|
||
if (( strcmp(szSubDirName,".") == 0)||( strcmp(szSubDirName,"") == 0))
|
||
{
|
||
return p_stCurrentDir;
|
||
}
|
||
if (p_stCurrentDir->wNumberOfSubDirs == 0)
|
||
return ( (MRC_tdstDirectoryEntry *) NULL);
|
||
|
||
p_stSubDir = &p_stBigFile->pa_stDir[ p_stCurrentDir->wFirstSubDir ];
|
||
|
||
for ( wIndex = 0; wIndex < p_stCurrentDir->wNumberOfSubDirs; wIndex ++)
|
||
{
|
||
if ( !_stricmp( szSubDirName, p_stSubDir->szName) )
|
||
return p_stSubDir;
|
||
|
||
p_stSubDir ++;
|
||
}
|
||
|
||
return ( (MRC_tdstDirectoryEntry *) NULL);
|
||
}
|
||
|
||
/*-----------------------------------------------------------------------------
|
||
* Description : Function that return File description of a file in a dir
|
||
*-----------------------------------------------------------------------------
|
||
* Input : a pointer on a BigFile and
|
||
* a pointer on the current dir
|
||
* name of the File
|
||
* Output : pointer on the file if found or NULL
|
||
*-----------------------------------------------------------------------------
|
||
* Creation date : 06/06/96 Author : V.L.
|
||
*-----------------------------------------------------------------------------
|
||
* Modification date : Modification Author :
|
||
* Modifications :
|
||
*---------------------------------------------------------------------------*/
|
||
MRC_tdstFileEntry *MRC_fn_p_stFindFileInDirectory( MRC_tdstBigFile *p_stBigFile, MRC_tdstDirectoryEntry *p_stCurrentDir, char *szFileName)
|
||
{
|
||
MRC_tdstFileEntry *p_stFile;
|
||
short wIndex;
|
||
|
||
if (p_stCurrentDir->wNumberOfFiles == 0)
|
||
return ( (MRC_tdstFileEntry *) NULL);
|
||
|
||
p_stFile = &p_stBigFile->pa_stFile[ p_stCurrentDir->wFirstFile ];
|
||
|
||
for ( wIndex = 0; wIndex < p_stCurrentDir->wNumberOfFiles; wIndex ++)
|
||
{
|
||
if ( !_stricmp( szFileName, p_stFile->szName) )
|
||
return p_stFile;
|
||
|
||
p_stFile ++;
|
||
}
|
||
|
||
return ( (MRC_tdstFileEntry *) NULL);
|
||
}
|
||
|
||
/*-----------------------------------------------------------------------------
|
||
* Description : Function that return File entry of a file in a BigFile
|
||
*-----------------------------------------------------------------------------
|
||
* Input : a pointer on a BigFile
|
||
* name of the File
|
||
* Output : pointer on the FileEntry if found or NULL
|
||
*-----------------------------------------------------------------------------
|
||
* Creation date : 06/06/96 Author : V.L.
|
||
*-----------------------------------------------------------------------------
|
||
* Modification date : Modification Author :
|
||
* Modifications :
|
||
*---------------------------------------------------------------------------*/
|
||
MRC_tdstFileEntry *MRC_fn_p_stFindFileInBigFile( MRC_tdstBigFile *p_stBigFile, char *szFileName)
|
||
{
|
||
MRC_tdstDirectoryEntry *p_stSubDir;
|
||
MRC_tdstFileEntry *p_stFile;
|
||
char *p_cDirPos;
|
||
char *p_cNextDir;
|
||
char *p_cFilePos;
|
||
|
||
/*
|
||
* Find Begin of FileName
|
||
*/
|
||
p_cFilePos = &szFileName[ strlen( szFileName ) - 1 ];
|
||
|
||
while ( (p_cFilePos != szFileName) && (*p_cFilePos != '\\') )
|
||
p_cFilePos --;
|
||
|
||
if ( *p_cFilePos == '\\' )
|
||
{
|
||
*p_cFilePos = 0;
|
||
p_cFilePos ++;
|
||
p_cDirPos = szFileName;
|
||
}
|
||
else
|
||
p_cDirPos = NULL;
|
||
|
||
/*
|
||
* Go To GoodDirectory
|
||
*/
|
||
p_stSubDir = p_stBigFile->pa_stDir;
|
||
p_cNextDir = p_cDirPos;
|
||
if (p_cDirPos != NULL)
|
||
while ( *p_cDirPos != 0 )
|
||
{
|
||
/* search begin of next dir */
|
||
while ( *p_cNextDir && (*p_cNextDir != '\\') )
|
||
p_cNextDir ++;
|
||
|
||
if ( *p_cNextDir )
|
||
*p_cNextDir ++ = 0;
|
||
|
||
/* Search sub dir */
|
||
if ( (p_stSubDir = MRC_fn_p_stFindSubDirectoryInDirectory( p_stBigFile, p_stSubDir, p_cDirPos )) == NULL)
|
||
return ( (MRC_tdstFileEntry *) NULL);
|
||
|
||
p_cDirPos = p_cNextDir;
|
||
|
||
}
|
||
/* search file in its sub directory */
|
||
p_stFile = MRC_fn_p_stFindFileInDirectory (p_stBigFile, p_stSubDir, p_cFilePos);
|
||
|
||
return ( p_stFile );
|
||
}
|
||
|
||
/*=============================================================================
|
||
*
|
||
* Managing Files : opening, closing and miscellaneous functions
|
||
*
|
||
=============================================================================*/
|
||
|
||
/*-----------------------------------------------------------------------------
|
||
* Description : Search a file in EXTERNAL_FILE mode
|
||
*-----------------------------------------------------------------------------
|
||
* Input : name of the File
|
||
* Output : pointer on a stFileDescription structure or NULL if file's not found
|
||
*-----------------------------------------------------------------------------
|
||
* Creation date : 06/06/96 Author : V.L.
|
||
*-----------------------------------------------------------------------------
|
||
* Modification date : Modification Author :
|
||
* Modifications :
|
||
*---------------------------------------------------------------------------*/
|
||
MRC_tdstFileEntry *MRC_fn_p_stOpenFileInExternalMode( char *szFileName )
|
||
{
|
||
FILE *hpFile;
|
||
|
||
if ( (hpFile = fopen( MRC_fn_p_szGetFullFileName(szFileName, MRC_C_ucIsData), "rb" ) ) == NULL )
|
||
{
|
||
M_MrcError( E_uwMrcWarningFileNotFound );
|
||
exit (-1) ;
|
||
}
|
||
|
||
strcpy(MRC_g_szExternalFileName, szFileName);
|
||
fseek( hpFile, 0, SEEK_END);
|
||
|
||
MRC_g_stExternalFileEntry.szExternFile = MRC_g_szExternalFileName;
|
||
MRC_g_stExternalFileEntry.wPlace = MRC_C_wExternalFile;
|
||
MRC_g_stExternalFileEntry.lLength = ftell( hpFile );
|
||
MRC_g_stExternalFileEntry.lOffset = 0;
|
||
|
||
fclose( hpFile );
|
||
|
||
return (&MRC_g_stExternalFileEntry);
|
||
}
|
||
|
||
/*-----------------------------------------------------------------------------
|
||
* Description : search for the file in the bigfile index and return a pointer
|
||
* on a MRC_tdstFileDescription
|
||
*-----------------------------------------------------------------------------
|
||
* Input : name of the File
|
||
* Output : pointer on a stFileDescription structure or NULL if file's not found
|
||
*-----------------------------------------------------------------------------
|
||
* Creation date : 06/06/96 Author : V.L.
|
||
*-----------------------------------------------------------------------------
|
||
* Modification date : Modification Author :
|
||
* Modifications :
|
||
*---------------------------------------------------------------------------*/
|
||
CPA_EXPORT MRC_tdstFileDescription *MRC_fn_p_stOpenFile( char *szFileName, MRC_tdstBigFile *p_stBigFile )
|
||
{
|
||
short wIndex;
|
||
MRC_tdstFileDescription *p_stFileDesc = p_stBigFile->aFileDescription;
|
||
MRC_tdstFileEntry *p_stFile;
|
||
FILE *hpFile;
|
||
long lPos;
|
||
|
||
if (p_stBigFile->ucMode & MRC_C_ucExternalMode)
|
||
{
|
||
#ifdef _DEFINE_CPA_MMG_MEMORY_ALLOCATION_
|
||
M_MrcAlloc(E_ucDynamic, p_stFile , MRC_tdstFileEntry * , (sizeof(MRC_tdstFileEntry)));
|
||
#else
|
||
p_stFile = (MRC_tdstFileEntry *) malloc (sizeof(MRC_tdstFileEntry));
|
||
#endif
|
||
memcpy(p_stFile, MRC_fn_p_stOpenFileInExternalMode( szFileName ), sizeof(MRC_tdstFileEntry) );
|
||
}
|
||
else
|
||
p_stFile = MRC_fn_p_stFindFileInBigFile( p_stBigFile, szFileName );
|
||
|
||
if (p_stFile == NULL)
|
||
return NULL;
|
||
|
||
switch ( p_stFile->wPlace )
|
||
{
|
||
case MRC_C_wInexistentFile:
|
||
hpFile = (FILE *) NULL;
|
||
break;
|
||
case MRC_C_wInternalFile:
|
||
hpFile = p_stBigFile->hpBigFile;
|
||
lPos = p_stBigFile->lFirstData + p_stFile->lOffset;
|
||
break;
|
||
case MRC_C_wExternalFile:
|
||
hpFile = fopen( MRC_fn_p_szGetFullFileName(p_stFile->szExternFile, MRC_C_ucIsData), "rb");
|
||
lPos = 0;
|
||
break;
|
||
default:
|
||
if (
|
||
( p_stFile->wPlace >= 0) &&
|
||
( p_stFile->wPlace < p_stBigFile->wNumberOfPatchs)
|
||
)
|
||
{
|
||
hpFile = fopen( MRC_fn_p_szGetFullFileName(p_stBigFile->pa_stPatch[ p_stFile->wPlace ].szName, MRC_C_ucIsPatch), "rb");
|
||
lPos = p_stBigFile->pa_stPatch[ p_stFile->wPlace ].lFirstData + p_stFile->lOffset;
|
||
}
|
||
|
||
else
|
||
hpFile = (FILE *) NULL;
|
||
|
||
}
|
||
|
||
if ( hpFile == (FILE *) NULL )
|
||
return NULL;
|
||
wIndex = 0;
|
||
/* find a free description file in description file table */
|
||
while ( ( wIndex < MRC_C_NumberMaxOfFileDescription )
|
||
&& ( p_stFileDesc->eState != MRC_FS_Close )
|
||
)
|
||
{
|
||
wIndex ++;
|
||
p_stFileDesc ++;
|
||
}
|
||
|
||
if ( wIndex == MRC_C_NumberMaxOfFileDescription )
|
||
return NULL;
|
||
|
||
p_stFileDesc->p_stFileEntry = p_stFile;
|
||
p_stFileDesc->hpFile = hpFile;
|
||
p_stFileDesc->eType = MRC_FT_Binary;
|
||
p_stFileDesc->eMode = MRC_FM_Read;
|
||
p_stFileDesc->eState = MRC_FS_Ready;
|
||
p_stFileDesc->lFirst = lPos;
|
||
p_stFileDesc->lPosition = 0;
|
||
p_stFileDesc->p_stBigFile = p_stBigFile;
|
||
p_stFileDesc->bEndOfFile = 0;
|
||
return p_stFileDesc;
|
||
}
|
||
|
||
/*-----------------------------------------------------------------------------
|
||
* Description : Close a FileDescription
|
||
*-----------------------------------------------------------------------------
|
||
* Input : pointer on a file description structure
|
||
* Output : none
|
||
*-----------------------------------------------------------------------------
|
||
* Creation date : 06/06/96 Author : V.L.
|
||
*-----------------------------------------------------------------------------
|
||
* Modification date : Modification Author :
|
||
* Modifications :
|
||
*---------------------------------------------------------------------------*/
|
||
void MRC_fn_vCloseFile( MRC_tdstFileDescription *p_stFile )
|
||
{
|
||
if ( p_stFile->eState != MRC_FS_Close )
|
||
{
|
||
/* lecture assynchrone : v<>rifier quel fichier est pret */
|
||
|
||
if ( ( p_stFile->hpFile != NULL ) && (p_stFile->hpFile != p_stFile->p_stBigFile->hpBigFile ))
|
||
{
|
||
fclose( p_stFile->hpFile );
|
||
p_stFile->hpFile = (FILE *) NULL;
|
||
}
|
||
|
||
if (p_stFile->p_stBigFile->ucMode & MRC_C_ucExternalMode)
|
||
#ifdef _DEFINE_CPA_MMG_MEMORY_ALLOCATION_
|
||
M_MrcFree(E_ucDynamic, p_stFile->p_stFileEntry );
|
||
#else
|
||
free (p_stFile->p_stFileEntry );
|
||
#endif
|
||
|
||
|
||
p_stFile->eState = MRC_FS_Close;
|
||
}
|
||
}
|
||
|
||
/*-----------------------------------------------------------------------------
|
||
* Description : Function that return Length of a file
|
||
*-----------------------------------------------------------------------------
|
||
* Input : a pointer on a BigFile
|
||
* name of the File
|
||
* Output : length of a file or 0 if file is not found
|
||
*-----------------------------------------------------------------------------
|
||
* Creation date : 06/06/96 Author : V.L.
|
||
*-----------------------------------------------------------------------------
|
||
* Modification date : Modification Author :
|
||
* Modifications :
|
||
*---------------------------------------------------------------------------*/
|
||
long MRC_fn_lFileLength ( MRC_tdstFileDescription *p_stFile )
|
||
{
|
||
return ( p_stFile->p_stFileEntry->lLength );
|
||
}
|
||
|
||
/*-----------------------------------------------------------------------------
|
||
* Description : Change current position on the file
|
||
*-----------------------------------------------------------------------------
|
||
* Input : a pointer on a description file
|
||
* origine of change (SO_SET, SO_CURRENT, SO_END )
|
||
* offset of change
|
||
* Output : length of a file or 0 if file is not found
|
||
*-----------------------------------------------------------------------------
|
||
* Creation date : 06/06/96 Author : V.L.
|
||
*-----------------------------------------------------------------------------
|
||
* Modification date : Modification Author :
|
||
* Modifications :
|
||
*---------------------------------------------------------------------------*/
|
||
long MRC_fn_lSeek ( MRC_tdstFileDescription *p_stFile, long lOffset, MRC_tdeSeekOrigin eOrigin)
|
||
{
|
||
long lNewPos;
|
||
p_stFile->bEndOfFile = 0;
|
||
switch (eOrigin)
|
||
{
|
||
case MRC_SO_SET :
|
||
lNewPos = lOffset;
|
||
break;
|
||
case MRC_SO_CURRENT:
|
||
lNewPos = p_stFile->lPosition + lOffset;
|
||
break;
|
||
case MRC_SO_END :
|
||
// lNewPos = p_stFile->p_stFileEntry->lLength - 1 - lOffset;
|
||
// Modified by Viorel
|
||
lNewPos = p_stFile->p_stFileEntry->lLength + lOffset;
|
||
break;
|
||
default:
|
||
lNewPos = p_stFile->lPosition;
|
||
}
|
||
if (lNewPos < 0)
|
||
{
|
||
lNewPos = 0;
|
||
return -1;
|
||
}
|
||
// if (lNewPos > p_stFile->p_stFileEntry->lLength)
|
||
// {
|
||
// lNewPos = p_stFile->p_stFileEntry->lLength;
|
||
// return -1;
|
||
// }
|
||
p_stFile->lPosition = lNewPos;
|
||
// return (p_stFile->lPosition = lNewPos);
|
||
return 0;
|
||
}
|
||
|
||
/*-----------------------------------------------------------------------------
|
||
* Description : Function that return the position in a file
|
||
*-----------------------------------------------------------------------------
|
||
* Input : a pointer on a BigFile name of the File
|
||
* Output : position in the file
|
||
*-----------------------------------------------------------------------------
|
||
* Creation date : 08/15/97 Author : Ady
|
||
*-----------------------------------------------------------------------------
|
||
* Modification date : Modification Author :
|
||
* Modifications :
|
||
*---------------------------------------------------------------------------*/
|
||
|
||
long MRC_fn_lTell ( MRC_tdstFileDescription *p_stFile )
|
||
{
|
||
return p_stFile->lPosition ;
|
||
}
|
||
|
||
/*-----------------------------------------------------------------------------
|
||
* Description : Function that return if 0 if end of file anything else otherwise
|
||
*-----------------------------------------------------------------------------
|
||
* Input : a pointer on a BigFile name of the File
|
||
* Output : 0 if end of file anything else otherwise
|
||
*-----------------------------------------------------------------------------
|
||
* Creation date : 06/06/96 Author : Ady
|
||
*-----------------------------------------------------------------------------
|
||
* Modification date : Modification Author :
|
||
* Modifications :
|
||
*---------------------------------------------------------------------------*/
|
||
|
||
int MRC_fn_nEof ( MRC_tdstFileDescription *p_stFile )
|
||
{
|
||
return p_stFile->bEndOfFile;
|
||
}
|
||
|
||
/*=============================================================================
|
||
*
|
||
* Managing Files : synchronous && asynchronous read
|
||
*
|
||
=============================================================================*/
|
||
|
||
/*-----------------------------------------------------------------------------
|
||
* Description : Read synchronously part of file
|
||
*-----------------------------------------------------------------------------
|
||
* Input : a pointer on a FileDescription
|
||
* pointer on an user-supplied character buffer
|
||
* length of bytes to read
|
||
* Output : number of character really read
|
||
*-----------------------------------------------------------------------------
|
||
* Creation date : 06/06/96 Author : V.L.
|
||
*-----------------------------------------------------------------------------
|
||
* Modification date : Modification Author :
|
||
* Modifications :
|
||
*---------------------------------------------------------------------------*/
|
||
long MRC_fn_lSyncReadFile( MRC_tdstFileDescription *p_stFile, char *p_cBuffer, long lSize, long lCount)
|
||
{
|
||
FILE *hpFile;
|
||
long lPos,lRetv;
|
||
// int flag;
|
||
|
||
if (p_stFile == NULL || p_stFile->eState == MRC_FS_Close)
|
||
return 0;
|
||
// flag = 0;
|
||
if ( p_stFile->p_stFileEntry->lLength < p_stFile->lPosition + lSize*lCount)
|
||
{
|
||
// flag = 1;
|
||
//lCount = (p_stFile->p_stFileEntry->lLength - p_stFile->lPosition) / lSize;
|
||
lCount = lSize?((p_stFile->p_stFileEntry->lLength - p_stFile->lPosition) / lSize):0;
|
||
p_stFile->bEndOfFile = 1;
|
||
}
|
||
hpFile = p_stFile->hpFile;
|
||
lPos = p_stFile->lFirst + p_stFile->lPosition;
|
||
|
||
if (hpFile == (FILE *) NULL)
|
||
lSize = 0;
|
||
else
|
||
{
|
||
fseek( hpFile, lPos, SEEK_SET );
|
||
lRetv = fread( p_cBuffer, lSize, lCount ,hpFile);
|
||
// if (flag)
|
||
// {
|
||
p_stFile->lPosition += (lSize*lCount);
|
||
// p_stFile->bEndOfFile = 1;
|
||
// }
|
||
// else
|
||
// {
|
||
// p_stFile->lPosition = p_stFile->p_stFileEntry->lLength;
|
||
// }
|
||
if (hpFile != p_stFile->p_stBigFile->hpBigFile)
|
||
fclose( hpFile );
|
||
}
|
||
return lRetv;
|
||
}
|
||
|
||
/*-----------------------------------------------------------------------------
|
||
* Description : Thread for asynchronous read
|
||
*-----------------------------------------------------------------------------
|
||
* Input : a pointer on a MRC_tdstFileDescription
|
||
* Output : 0
|
||
*-----------------------------------------------------------------------------
|
||
* Creation date : 06/06/96 Author : V.L.
|
||
*-----------------------------------------------------------------------------
|
||
* Modification date : Modification Author :
|
||
* Modifications :
|
||
*---------------------------------------------------------------------------*/
|
||
long WINAPI MRC_fn_lAsyncThread( MRC_tdstFileDescription *p_stFile )
|
||
{
|
||
p_stFile->lAsyncSize = MRC_fn_lSyncReadFile( p_stFile, p_stFile->p_cAsyncBuffer, 1 , p_stFile->lAsyncSize);
|
||
p_stFile->eState = MRC_FS_Ready;
|
||
return (0);
|
||
}
|
||
|
||
/*-----------------------------------------------------------------------------
|
||
* Description : Asynchronous read : launch a thread that read synchrnously
|
||
*-----------------------------------------------------------------------------
|
||
* Input : a pointer on a MRC_tdstFileDescription,
|
||
* a pointer on an user-supplied buffer,
|
||
* number of bytes to read
|
||
* Output : an error value C_ErrNone, C_ErrAsyncLaunch ou C_ErrFileNotReady
|
||
*-----------------------------------------------------------------------------
|
||
* Creation date : 06/06/96 Author : V.L.
|
||
*-----------------------------------------------------------------------------
|
||
* Modification date : Modification Author :
|
||
* Modifications :
|
||
*---------------------------------------------------------------------------*/
|
||
long MRC_fn_lAsyncReadFile(MRC_tdstFileDescription *p_stFile, char *p_cBuffer, long lSize )
|
||
{
|
||
long lThreadId;
|
||
|
||
if (p_stFile->eState != MRC_FS_Ready )
|
||
{
|
||
p_stFile->lAsyncSize = 0;
|
||
M_MrcError( E_uwMrcWarningFileNotReady );
|
||
return (E_uwMrcWarningFileNotReady );
|
||
}
|
||
|
||
p_stFile->p_cAsyncBuffer = p_cBuffer;
|
||
p_stFile->lAsyncSize = lSize;
|
||
|
||
if (CreateThread (NULL, 0, (LPTHREAD_START_ROUTINE) MRC_fn_lAsyncThread, p_stFile, 0,(unsigned long *) &lThreadId))
|
||
{
|
||
p_stFile->eState = MRC_FS_NotReady;
|
||
return (E_uwMrcWarningNone);
|
||
}
|
||
M_MrcError( E_uwMrcWarningAsyncLaunch );
|
||
return (E_uwMrcWarningAsyncLaunch );
|
||
}
|
||
|
||
/*-----------------------------------------------------------------------------
|
||
* Description : return number of bytes read by the last asynchronous read
|
||
*-----------------------------------------------------------------------------
|
||
* Input : a pointer on a MRC_tdstFileDescription
|
||
* Output : number of bytes last asynchronous read really read
|
||
*-----------------------------------------------------------------------------
|
||
* Creation date : 06/06/96 Author : V.L.
|
||
*-----------------------------------------------------------------------------
|
||
* Modification date : Modification Author :
|
||
* Modifications :
|
||
*---------------------------------------------------------------------------*/
|
||
long MRC_fn_lAsyncNumberOfBytesRead( MRC_tdstFileDescription *p_stFile )
|
||
{
|
||
if (p_stFile->eState == MRC_FS_Ready)
|
||
return (p_stFile->lAsyncSize);
|
||
else
|
||
return (0);
|
||
}
|
||
|
||
/*-----------------------------------------------------------------------------
|
||
* Description : wait for the end of an asynchronous read
|
||
*-----------------------------------------------------------------------------
|
||
* Input : a pointer on a MRC_tdstFileDescription
|
||
* Output : none
|
||
*-----------------------------------------------------------------------------
|
||
* Creation date : 06/06/96 Author : V.L.
|
||
*-----------------------------------------------------------------------------
|
||
* Modification date : Modification Author :
|
||
* Modifications :
|
||
*---------------------------------------------------------------------------*/
|
||
void MRC_fn_vWaitEndOfAsyncRead( MRC_tdstFileDescription *p_stFile )
|
||
{
|
||
while (p_stFile->eState != MRC_FS_Ready);
|
||
}
|
||
|
||
/*-----------------------------------------------------------------------------
|
||
* Description : Opens a list of big files
|
||
*-----------------------------------------------------------------------------
|
||
* Input : a NULL terminated array of the BigFile Names
|
||
& mode
|
||
* Output : a NULL terminated array of BigFiles
|
||
*-----------------------------------------------------------------------------
|
||
* Creation date : 08/04/97 Author : Ady & Prince
|
||
*-----------------------------------------------------------------------------
|
||
* Modification date : Modification Author :
|
||
* Modifications :
|
||
*---------------------------------------------------------------------------*/
|
||
|
||
MRC_tdstBigFileList *MRC_fn_p_stOpenBigFileList( char **szFileNames, unsigned char ucMode )
|
||
{
|
||
MRC_tdstBigFileList* p_stBigFileList;
|
||
int i,j;
|
||
char *szFileName;
|
||
i = 0;
|
||
szFileName = szFileNames[i];
|
||
while ( szFileName != NULL )
|
||
{
|
||
i++;
|
||
szFileName = szFileNames[i];
|
||
}
|
||
i++;
|
||
#ifdef _DEFINE_CPA_MMG_MEMORY_ALLOCATION_
|
||
M_MrcAlloc(E_ucDynamic, p_stBigFileList , MRC_tdstBigFileList* , (i*sizeof(MRC_tdstBigFileList)) );
|
||
#else
|
||
p_stBigFileList = ( MRC_tdstBigFileList* ) malloc( i*sizeof( MRC_tdstBigFileList ) );
|
||
#endif
|
||
i--;
|
||
p_stBigFileList[i] = NULL;
|
||
for ( j = 0; j < i ; j++ )
|
||
{
|
||
p_stBigFileList[j] = MRC_fn_p_stOpenBigFile( szFileNames[j] , ucMode);
|
||
}
|
||
return p_stBigFileList;
|
||
}
|
||
|
||
/*-----------------------------------------------------------------------------
|
||
* Description : Close a list of big files
|
||
*-----------------------------------------------------------------------------
|
||
* Input : a NULL terminated array of BigFiles
|
||
* Output : none
|
||
*-----------------------------------------------------------------------------
|
||
* Creation date : 08/04/97 Author : Ady & Prince
|
||
*-----------------------------------------------------------------------------
|
||
* Modification date : Modification Author :
|
||
* Modifications :
|
||
*---------------------------------------------------------------------------*/
|
||
|
||
void MRC_fn_vCloseBigFileList ( MRC_tdstBigFileList *p_stBigFileList )
|
||
{
|
||
int i,j;
|
||
i = 0;
|
||
while ( p_stBigFileList[i] != NULL )
|
||
{
|
||
i++;
|
||
}
|
||
for ( j = 0; j < i ; j++ )
|
||
{
|
||
MRC_fn_vCloseBigFile( p_stBigFileList[j] );
|
||
}
|
||
#ifdef _DEFINE_CPA_MMG_MEMORY_ALLOCATION_
|
||
M_MrcFree( E_ucDynamic, p_stBigFileList );
|
||
#else
|
||
free( p_stBigFileList );
|
||
#endif
|
||
|
||
}
|
||
|
||
/*-----------------------------------------------------------------------------
|
||
* Description : Opens a file from a list of big files
|
||
*-----------------------------------------------------------------------------
|
||
* Input :
|
||
a NULL terminated array of BigFiles
|
||
* Output : a NULL terminated array of BigFiles
|
||
*-----------------------------------------------------------------------------
|
||
* Creation date : 08/04/97 Author : Ady & Prince
|
||
*-----------------------------------------------------------------------------
|
||
* Modification date : Modification Author :
|
||
* Modifications :
|
||
*---------------------------------------------------------------------------*/
|
||
|
||
MRC_tdstFileDescription *MRC_fn_p_stOpenFileInList( char *szFileName, MRC_tdstBigFileList *p_stBigFileList )
|
||
{
|
||
int i;
|
||
char tempName[256];
|
||
i = 0;
|
||
while ( p_stBigFileList[i] != NULL )
|
||
{
|
||
strcpy( tempName , szFileName );
|
||
if ( MRC_fn_p_stFindFileInBigFile( p_stBigFileList[i] , tempName ) != NULL )
|
||
{
|
||
strcpy( tempName , szFileName );
|
||
return MRC_fn_p_stOpenFile( tempName , p_stBigFileList[i] ) ;
|
||
}
|
||
i++;
|
||
}
|
||
return NULL;
|
||
}
|
||
|
||
/*-----------------------------------------------------------------------------
|
||
* Description : Function that returns 1 if the file exists 0 otherwise
|
||
*-----------------------------------------------------------------------------
|
||
* Input : a pointer on a BigFile , name of the File
|
||
* Output : 1 if file exists anything else otherwise
|
||
*-----------------------------------------------------------------------------
|
||
* Creation date : 08/15/97 Author : Ady
|
||
*-----------------------------------------------------------------------------
|
||
* Modification date : Modification Author :
|
||
* Modifications :
|
||
*---------------------------------------------------------------------------*/
|
||
|
||
int MRC_fn_nFileExists ( MRC_tdstBigFileListEx *p_stBigFileListEx , char* szFileName )
|
||
{
|
||
int flag;
|
||
MRC_tdstFileDescription *p_stFile;
|
||
flag = 0;
|
||
p_stFile = MRC_fn_p_stOpenFileInList( szFileName , p_stBigFileListEx->p_BigFileList );
|
||
if ( p_stFile != NULL )
|
||
{
|
||
flag = 1;
|
||
MRC_fn_vCloseFile( p_stFile );
|
||
}
|
||
return flag;
|
||
}
|
||
|
||
|
||
//////////////////////////////////////////////////////////////////////////////////
|
||
// //
|
||
// Extended functions for the bigfiles //
|
||
// //
|
||
//////////////////////////////////////////////////////////////////////////////////
|
||
//
|
||
//
|
||
// Extended means that if a file is not found in a bigfile
|
||
// the extended functions try to open it as an external file
|
||
//
|
||
//
|
||
////////////////////////////////////////////////////////////////////////////////
|
||
|
||
/*-----------------------------------------------------------------------------
|
||
* Description : Opens an extended list of big files
|
||
*-----------------------------------------------------------------------------
|
||
* Input : a NULL terminated array of the BigFile Names
|
||
& mode
|
||
* Output : a NULL terminated array of BigFiles
|
||
*-----------------------------------------------------------------------------
|
||
* Creation date : 08/04/97 Author : Ady
|
||
*-----------------------------------------------------------------------------
|
||
* Modification date : Modification Author :
|
||
* Modifications :
|
||
*---------------------------------------------------------------------------*/
|
||
|
||
MRC_tdstBigFileListEx *MRC_fn_p_stOpenBigFileListEx( char **szFileNames, unsigned char ucMode )
|
||
{
|
||
MRC_tdstBigFileListEx* p_stBigFileListEx;
|
||
#ifdef _DEFINE_CPA_MMG_MEMORY_ALLOCATION_
|
||
M_MrcAlloc(E_ucDynamic, p_stBigFileListEx , MRC_tdstBigFileListEx* , sizeof(MRC_tdstBigFileListEx) );
|
||
#else
|
||
p_stBigFileListEx = ( MRC_tdstBigFileListEx* ) malloc( sizeof( MRC_tdstBigFileListEx ) );
|
||
#endif
|
||
p_stBigFileListEx->p_BigFileList = MRC_fn_p_stOpenBigFileList( szFileNames, ucMode );
|
||
p_stBigFileListEx->p_stFileDesc = NULL;
|
||
return p_stBigFileListEx;
|
||
}
|
||
|
||
/*-----------------------------------------------------------------------------
|
||
* Description : Close an extended list of big files
|
||
*-----------------------------------------------------------------------------
|
||
* Input : a NULL terminated array of BigFiles
|
||
* Output : none
|
||
*-----------------------------------------------------------------------------
|
||
* Creation date : 08/04/97 Author : Ady
|
||
*-----------------------------------------------------------------------------
|
||
* Modification date : Modification Author :
|
||
* Modifications :
|
||
*---------------------------------------------------------------------------*/
|
||
|
||
void MRC_fn_vCloseBigFileListEx ( MRC_tdstBigFileListEx *p_stBigFileListEx )
|
||
{
|
||
MRC_tdstFileDescription *p_stPrev;
|
||
while ( p_stBigFileListEx->p_stFileDesc != NULL )
|
||
{
|
||
p_stPrev = p_stBigFileListEx->p_stFileDesc;
|
||
p_stBigFileListEx->p_stFileDesc = p_stBigFileListEx->p_stFileDesc->p_stNext;
|
||
MRC_fn_vCloseFileEx( p_stPrev );
|
||
#ifdef _DEFINE_CPA_MMG_MEMORY_ALLOCATION_
|
||
M_MrcFree( E_ucDynamic, p_stPrev );
|
||
#else
|
||
free( p_stPrev );
|
||
#endif
|
||
}
|
||
MRC_fn_vCloseBigFileList(p_stBigFileListEx->p_BigFileList);
|
||
#ifdef _DEFINE_CPA_MMG_MEMORY_ALLOCATION_
|
||
M_MrcFree( E_ucDynamic, p_stBigFileListEx );
|
||
#else
|
||
free( p_stBigFileListEx );
|
||
#endif
|
||
|
||
}
|
||
|
||
/*-----------------------------------------------------------------------------
|
||
* Description : Opens a file from an extended list of big files
|
||
*-----------------------------------------------------------------------------
|
||
* Input :
|
||
a NULL terminated array of BigFiles
|
||
* Output : a NULL terminated array of BigFiles
|
||
*-----------------------------------------------------------------------------
|
||
* Creation date : 08/04/97 Author : Ady
|
||
*-----------------------------------------------------------------------------
|
||
* Modification date : Modification Author :
|
||
* Modifications :
|
||
*---------------------------------------------------------------------------*/
|
||
|
||
MRC_tdstFileDescription *MRC_fn_p_stOpenFileInListEx( MRC_tdstBigFileListEx *p_stBigFileListEx , char *szFileName ,char* fmt )
|
||
{
|
||
MRC_tdstFileDescription *p_stFileDes;
|
||
//if (!(stricmp(szFileName,".\\DATA\\p01.MBM")))
|
||
//{
|
||
|
||
//Adys
|
||
// p_stFileDes = NULL;
|
||
//}
|
||
p_stFileDes = MRC_fn_p_stOpenFileInList( szFileName, p_stBigFileListEx->p_BigFileList );
|
||
if ( p_stFileDes != NULL )
|
||
{
|
||
return p_stFileDes;
|
||
}
|
||
else
|
||
{
|
||
#ifdef _DEFINE_CPA_MMG_MEMORY_ALLOCATION_
|
||
M_MrcAlloc(E_ucDynamic, p_stFileDes , MRC_tdstFileDescription* , sizeof(MRC_tdstFileDescription) );
|
||
#else
|
||
p_stFileDes = ( MRC_tdstFileDescription* ) malloc( sizeof( MRC_tdstFileDescription ) );
|
||
#endif
|
||
if ( fmt == NULL)
|
||
{
|
||
p_stFileDes->hpFile = fopen( szFileName, "rb" );
|
||
}
|
||
else
|
||
{
|
||
p_stFileDes->hpFile = fopen( szFileName, fmt );
|
||
}
|
||
if ( p_stFileDes->hpFile == NULL )
|
||
{
|
||
return NULL;
|
||
}
|
||
p_stFileDes->p_stBFLEx = p_stBigFileListEx;
|
||
p_stFileDes->p_stBigFile = NULL;
|
||
p_stFileDes->p_stPrev = NULL;
|
||
p_stFileDes->p_stNext = p_stFileDes->p_stBFLEx->p_stFileDesc;
|
||
if (p_stFileDes->p_stBFLEx->p_stFileDesc != NULL)
|
||
{
|
||
p_stFileDes->p_stBFLEx->p_stFileDesc->p_stPrev = p_stFileDes;
|
||
}
|
||
p_stFileDes->p_stBFLEx->p_stFileDesc = p_stFileDes;
|
||
|
||
return p_stFileDes;
|
||
}
|
||
}
|
||
|
||
//////////////////////////////////////////////////////////////////////////////
|
||
/*
|
||
* Extended functions for file services
|
||
*/
|
||
//////////////////////////////////////////////////////////////////////////////
|
||
|
||
|
||
/*-----------------------------------------------------------------------------
|
||
* Description : Close a FileDescription
|
||
*-----------------------------------------------------------------------------
|
||
* Input : pointer on a file description structure
|
||
* Output : none
|
||
*-----------------------------------------------------------------------------
|
||
* Creation date : 06/06/96 Author : Ady.
|
||
*-----------------------------------------------------------------------------
|
||
* Modification date : Modification Author :
|
||
* Modifications :
|
||
*---------------------------------------------------------------------------*/
|
||
|
||
void MRC_fn_vCloseFileEx( MRC_tdstFileDescription *p_stFile )
|
||
{
|
||
if ( p_stFile->p_stBigFile != NULL)
|
||
{
|
||
MRC_fn_vCloseFile( p_stFile );
|
||
}
|
||
else
|
||
{
|
||
fclose(p_stFile->hpFile);
|
||
if (p_stFile->p_stPrev == NULL)
|
||
{
|
||
p_stFile->p_stBFLEx->p_stFileDesc = p_stFile->p_stNext;
|
||
}
|
||
else
|
||
{
|
||
p_stFile->p_stPrev->p_stNext = p_stFile->p_stNext;
|
||
}
|
||
if (p_stFile->p_stNext == NULL)
|
||
{
|
||
}
|
||
else
|
||
{
|
||
p_stFile->p_stNext->p_stPrev = p_stFile->p_stPrev;
|
||
}
|
||
#ifdef _DEFINE_CPA_MMG_MEMORY_ALLOCATION_
|
||
M_MrcFree( E_ucDynamic, p_stFile );
|
||
#else
|
||
free( p_stFile );
|
||
#endif
|
||
}
|
||
}
|
||
|
||
/*-----------------------------------------------------------------------------
|
||
* Description : Read synchronously part of file (Extended)
|
||
*-----------------------------------------------------------------------------
|
||
* Input : a pointer on a FileDescription
|
||
* pointer on an user-supplied character buffer
|
||
* length of bytes to read
|
||
* Output : number of character really read
|
||
*-----------------------------------------------------------------------------
|
||
* Creation date : 06/06/96 Author : Ady & Prince
|
||
*-----------------------------------------------------------------------------
|
||
* Modification date : Modification Author :
|
||
* Modifications :
|
||
*---------------------------------------------------------------------------*/
|
||
|
||
long MRC_fn_lSyncReadFileEx( char *p_cBuffer, long lSize , long lCount , MRC_tdstFileDescription *p_stFile )
|
||
{
|
||
if ( p_stFile->p_stBigFile != NULL)
|
||
{
|
||
return MRC_fn_lSyncReadFile( p_stFile, p_cBuffer, lSize , lCount );
|
||
}
|
||
else
|
||
{
|
||
return fread( p_cBuffer, lSize , lCount ,p_stFile->hpFile );
|
||
}
|
||
}
|
||
|
||
/*-----------------------------------------------------------------------------
|
||
* Description : Function that return Length of a file ( Extended )
|
||
*-----------------------------------------------------------------------------
|
||
* Input : a pointer on a BigFile
|
||
* name of the File
|
||
* Output : length of a file or 0 if file is not found
|
||
*-----------------------------------------------------------------------------
|
||
* Creation date : 06/06/96 Author : Ady & Prince.
|
||
*-----------------------------------------------------------------------------
|
||
* Modification date : Modification Author :
|
||
* Modifications :
|
||
*---------------------------------------------------------------------------*/
|
||
|
||
|
||
long MRC_fn_lFileLengthEx( MRC_tdstFileDescription *p_stFile )
|
||
{
|
||
if ( p_stFile->p_stBigFile != NULL)
|
||
{
|
||
return MRC_fn_lFileLength( p_stFile );
|
||
}
|
||
else
|
||
{
|
||
return filelength(fileno(p_stFile->hpFile));
|
||
}
|
||
}
|
||
|
||
/*-----------------------------------------------------------------------------
|
||
* Description : Change current position on the file (Extended)
|
||
*-----------------------------------------------------------------------------
|
||
* Input : a pointer on a description file
|
||
* origine of change (SO_SET, SO_CURRENT, SO_END )
|
||
* offset of change
|
||
* Output : length of a file or 0 if file is not found
|
||
*-----------------------------------------------------------------------------
|
||
* Creation date : 06/06/96 Author : Ady & Prince
|
||
*-----------------------------------------------------------------------------
|
||
* Modification date : Modification Author :
|
||
* Modifications :
|
||
*---------------------------------------------------------------------------*/
|
||
|
||
|
||
long MRC_fn_lSeekEx( MRC_tdstFileDescription *p_stFile, long lOffset, MRC_tdeSeekOrigin eOrigin)
|
||
{
|
||
if ( p_stFile->p_stBigFile != NULL)
|
||
{
|
||
return MRC_fn_lSeek( p_stFile, lOffset, eOrigin);
|
||
}
|
||
else
|
||
{
|
||
return fseek( p_stFile->hpFile, lOffset, eOrigin);
|
||
}
|
||
}
|
||
|
||
/*-----------------------------------------------------------------------------
|
||
* Description : Function that return the position in a file
|
||
*-----------------------------------------------------------------------------
|
||
* Input : a pointer on a BigFile name of the File
|
||
* Output : position in the file
|
||
*-----------------------------------------------------------------------------
|
||
* Creation date : 08/15/97 Author : Ady
|
||
*-----------------------------------------------------------------------------
|
||
* Modification date : Modification Author :
|
||
* Modifications :
|
||
*---------------------------------------------------------------------------*/
|
||
|
||
long MRC_fn_lTellEx ( MRC_tdstFileDescription *p_stFile )
|
||
{
|
||
if ( p_stFile->p_stBigFile != NULL)
|
||
{
|
||
return MRC_fn_lTell( p_stFile );
|
||
}
|
||
else
|
||
{
|
||
return ftell( p_stFile->hpFile );
|
||
}
|
||
|
||
}
|
||
|
||
/*-----------------------------------------------------------------------------
|
||
* Description : Function that return if 0 if end of file anything else otherwise (Extended)
|
||
*-----------------------------------------------------------------------------
|
||
* Input : a pointer on a BigFile name of the File
|
||
* Output : 0 if end of file anything else otherwise
|
||
*-----------------------------------------------------------------------------
|
||
* Creation date : 08/15/97 Author : Ady
|
||
*-----------------------------------------------------------------------------
|
||
* Modification date : Modification Author :
|
||
* Modifications :
|
||
*---------------------------------------------------------------------------*/
|
||
|
||
int MRC_fn_nEofEx ( MRC_tdstFileDescription *p_stFile )
|
||
{
|
||
if ( p_stFile->p_stBigFile != NULL)
|
||
{
|
||
return MRC_fn_nEof( p_stFile );
|
||
}
|
||
else
|
||
{
|
||
return feof( p_stFile->hpFile );
|
||
}
|
||
|
||
}
|
||
|
||
/*-----------------------------------------------------------------------------
|
||
* Description : Function that returns 1 if the file exists 0 otherwise
|
||
*-----------------------------------------------------------------------------
|
||
* Input : a pointer on a BigFile , name of the File
|
||
* Output : 1 if file exists anything else otherwise
|
||
*-----------------------------------------------------------------------------
|
||
* Creation date : 08/15/97 Author : Ady
|
||
*-----------------------------------------------------------------------------
|
||
* Modification date : Modification Author :
|
||
* Modifications :
|
||
*---------------------------------------------------------------------------*/
|
||
|
||
int MRC_fn_nFileExistsEx ( MRC_tdstBigFileListEx *p_stBigFileListEx , char* szFileName )
|
||
{
|
||
int flag;
|
||
MRC_tdstFileDescription *p_stFile;
|
||
flag = 0;
|
||
p_stFile = MRC_fn_p_stOpenFileInListEx( p_stBigFileListEx, szFileName , "rb");
|
||
if ( p_stFile != NULL )
|
||
{
|
||
flag = 1;
|
||
MRC_fn_vCloseFileEx( p_stFile );
|
||
}
|
||
return flag;
|
||
}
|
||
|
||
|
||
|
||
/*-----------------------------------------------------------------------------
|
||
* Description : Extended fscanf (limited implementation right now )
|
||
* ( allows reading only one string)
|
||
*-----------------------------------------------------------------------------
|
||
* Input : the same as fscanf
|
||
* Output : the same as fscanf
|
||
*-----------------------------------------------------------------------------
|
||
* Creation date : 08/15/97 Author : Ady
|
||
*-----------------------------------------------------------------------------
|
||
* Modification date : Modification Author :
|
||
* Modifications :
|
||
*---------------------------------------------------------------------------*/
|
||
/*
|
||
int MRC_fn_nFileScanfEx ( MRC_tdstFileDescription* p_stFile , char* fmt , char* buffer)
|
||
{
|
||
char buf[MAX_BUFF];
|
||
long d,i,n;
|
||
if ( p_stFile->p_stBigFile != NULL)
|
||
{
|
||
n = MAX_BUFF;
|
||
d = MRC_fn_lSyncReadFile( p_stFile, buf, sizeof ( char ), n);
|
||
i = 0;
|
||
while ( ( i < d ) && ( buf[i] != '\n') )
|
||
{
|
||
buffer[i] = buf[i];
|
||
i++;
|
||
}
|
||
// if ( i==d )
|
||
// {
|
||
buffer[i] = '\0';
|
||
// }
|
||
// else
|
||
// {
|
||
// buffer[i] = '\n';
|
||
// buffer[i+1] = '\0';
|
||
// }
|
||
if (MRC_fn_nEofEx(p_stFile))
|
||
{
|
||
return EOF;
|
||
}
|
||
else
|
||
{
|
||
if ( i==d )
|
||
{
|
||
return 0;
|
||
}
|
||
else
|
||
{
|
||
return 1;
|
||
}
|
||
}
|
||
}
|
||
else
|
||
{
|
||
return fscanf( p_stFile->hpFile, fmt , buffer );
|
||
}
|
||
}*/
|
||
|
||
/*-----------------------------------------------------------------------------
|
||
* Description : The extended version of fgets
|
||
*-----------------------------------------------------------------------------
|
||
* Input : the same as fgets
|
||
* Output : the same as fgets
|
||
*-----------------------------------------------------------------------------
|
||
* Creation date : 08/15/97 Author : Ady
|
||
*-----------------------------------------------------------------------------
|
||
* Modification date : Modification Author :
|
||
* Modifications :
|
||
*---------------------------------------------------------------------------*/
|
||
/*
|
||
char* MRC_fn_szFileGetsEx ( char* buffer ,int n , MRC_tdstFileDescription* p_stFile )
|
||
{
|
||
char buf[MAX_BUFF];
|
||
long d,i;
|
||
if ( p_stFile->p_stBigFile != NULL)
|
||
{
|
||
d = MRC_fn_lSyncReadFile( p_stFile, buf, sizeof ( char ), n);
|
||
i = 0;
|
||
while ( ( i < d ) && ( buf[i] != '\n') )
|
||
{
|
||
buffer[i] = buf[i];
|
||
i++;
|
||
}
|
||
if ( (i==d) || MRC_fn_nEofEx(p_stFile) )
|
||
{
|
||
buffer[i] = '\0';
|
||
}
|
||
else
|
||
{
|
||
buffer[i] = '\n';
|
||
buffer[i+1] = '\0';
|
||
}
|
||
if (MRC_fn_nEofEx(p_stFile))
|
||
{
|
||
return NULL;
|
||
}
|
||
else
|
||
{
|
||
return buffer;
|
||
}
|
||
}
|
||
else
|
||
{
|
||
return fgets( buffer , n , p_stFile->hpFile );
|
||
}
|
||
}*/
|
||
|