1082 lines
35 KiB
C
1082 lines
35 KiB
C
/*
|
|
*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
|
* SCR_File.c
|
|
* Managment of files.
|
|
*
|
|
* Scripts, Beaudet Christophe
|
|
*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
|
*/
|
|
|
|
/*
|
|
*=================================================================================================
|
|
* Includes.
|
|
*=================================================================================================
|
|
*/
|
|
#include <ctype.h>
|
|
#include <memory.h>
|
|
#include <sys/types.h>
|
|
#include <sys/stat.h>
|
|
#include "SCR.h"
|
|
|
|
/*
|
|
*=================================================================================================
|
|
* Global variables.
|
|
*=================================================================================================
|
|
*/
|
|
|
|
/*
|
|
* Array of all open files.
|
|
*/
|
|
SCR_tdst_DyAr_Description SCR_g_st_File_ArrayOpen;
|
|
SCR_tda_st_Hash_Table SCR_g_a_st_File_HashTableOpen;
|
|
|
|
/*
|
|
* Array of all paths.
|
|
*/
|
|
SCR_tdst_DyAr_Description SCR_g_st_File_ArrayPaths;
|
|
|
|
/*
|
|
* Priority path.
|
|
*/
|
|
char SCR_g_a_sz_File_PriorityPath[_MAX_PATH];
|
|
|
|
int SCR_g_iParseHeader=0;
|
|
/*
|
|
*=================================================================================================
|
|
* Functions.
|
|
*=================================================================================================
|
|
*/
|
|
|
|
/*
|
|
*-------------------------------------------------------------------------------------------------
|
|
* Init.
|
|
*-------------------------------------------------------------------------------------------------
|
|
*/
|
|
void fn_v_File_InitModule(void)
|
|
{
|
|
fn_v_DyAr_InitArray(&SCR_g_st_File_ArrayOpen);
|
|
fn_v_Hash_InitTable(SCR_g_a_st_File_HashTableOpen);
|
|
fn_v_DyAr_InitArray(&SCR_g_st_File_ArrayPaths);
|
|
*SCR_g_a_sz_File_PriorityPath = '\0';
|
|
}
|
|
|
|
/*
|
|
*-------------------------------------------------------------------------------------------------
|
|
* Close.
|
|
*-------------------------------------------------------------------------------------------------
|
|
*/
|
|
void fn_v_File_CloseModule(void)
|
|
{
|
|
fn_v_File_CloseAllHandles();
|
|
SCR_M_DyAr_DeleteAllElements
|
|
(
|
|
SCR_tdst_File_Open,
|
|
&SCR_g_st_File_ArrayOpen,
|
|
fn_v_File_DeleteInsideOpen((SCR_tdst_File_Open *) _p_stElement_->d_vElement);
|
|
);
|
|
SCR_M_DyAr_DeleteAllElements
|
|
(
|
|
SCR_tdst_File_Path,
|
|
&SCR_g_st_File_ArrayPaths,
|
|
;
|
|
);
|
|
fn_v_Hash_CloseTable(SCR_g_a_st_File_HashTableOpen);
|
|
}
|
|
|
|
/*
|
|
*-------------------------------------------------------------------------------------------------
|
|
* To init a structure of a parse file. Page are all NULL.
|
|
* _p_stFile : File to init.
|
|
* _p_szFileName : Name of file.
|
|
* _p_xHandle : Handle of file.
|
|
*-------------------------------------------------------------------------------------------------
|
|
*/
|
|
void SCR_fn_v_File_InitFileDes
|
|
(
|
|
SCR_tdst_File_Description *_p_stFile,
|
|
char *_p_szFileName,
|
|
SCR_FILE xHandle
|
|
)
|
|
{
|
|
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
|
|
SCR_M_Dbg_Assert_P(_p_stFile != NULL);
|
|
SCR_M_Dbg_Assert_P(_p_szFileName != NULL);
|
|
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
|
|
fn_v_Mem_SetMode(0);
|
|
SCR_M_Mem_Alloc(SCR_tdst_File_Handle, _p_stFile->p_stHandle, 1);
|
|
_p_stFile->p_stHandle->xHandle = xHandle;
|
|
_p_stFile->p_stHandle->p_cBase = _p_stFile->p_stHandle->p_cCurrent = NULL;
|
|
_p_stFile->p_stHandle->iCnt = 0;
|
|
strcpy(_p_stFile->a_szFileName, _p_szFileName);
|
|
strcpy(_p_stFile->a_szOpenFileName, _p_szFileName);
|
|
_p_stFile->d_stFirstPage = _p_stFile->d_stLastPage = _p_stFile->d_stCurPage = NULL;
|
|
_p_stFile->iCurPosInPage = 0;
|
|
SCR_M_Mem_Alloc( SCR_tdst_Refs, _p_stFile->p_stRefs, 1 );
|
|
/*_p_stFile->p_stRefs=NULL;*/
|
|
_p_stFile->p_stRefs->a_szRefName=NULL;
|
|
_p_stFile->p_stRefs->sRefCount=0;
|
|
_p_stFile->bBinaryMode = 0;
|
|
}
|
|
|
|
/*
|
|
*-------------------------------------------------------------------------------------------------
|
|
* To close a structure of a parse file.
|
|
* _p_stFile : File to close.
|
|
*-------------------------------------------------------------------------------------------------
|
|
*/
|
|
void SCR_fn_v_File_CloseFileDes(SCR_tdst_File_Description *_p_stFile)
|
|
{
|
|
int i;
|
|
if( _p_stFile->p_stRefs )
|
|
{
|
|
if( _p_stFile->p_stRefs->a_szRefName )
|
|
{
|
|
for( i=0; i<_p_stFile->p_stRefs->sRefCount; i++ )
|
|
SCR_M_Mem_Free( _p_stFile->p_stRefs->a_szRefName[i] );
|
|
SCR_M_Mem_Free( _p_stFile->p_stRefs->a_szRefName );
|
|
_p_stFile->p_stRefs->a_szRefName=NULL;
|
|
_p_stFile->p_stRefs->sRefCount=0;
|
|
}
|
|
SCR_M_Mem_Free( _p_stFile->p_stRefs );
|
|
_p_stFile->p_stRefs=NULL;
|
|
}
|
|
if(_p_stFile->p_stHandle)
|
|
{
|
|
SCR_M_File_Close(_p_stFile);
|
|
fn_v_Mem_SetMode(0);
|
|
SCR_M_Mem_Free(_p_stFile->p_stHandle);
|
|
}
|
|
}
|
|
|
|
/*===============================================================================================*/
|
|
|
|
/*
|
|
*-------------------------------------------------------------------------------------------------
|
|
* To add one open file.
|
|
* _p_szFileName : Name of file to add. It's the user name without additional path.
|
|
* _xHashKey : Hash key of file name.
|
|
* Returns allocated structure.
|
|
*-------------------------------------------------------------------------------------------------
|
|
*/
|
|
SCR_tdst_File_Open *fnp_st_File_AddOpen(char *_p_szFileName, SCR_tdx_Hash_Key _xHashKey)
|
|
{
|
|
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
|
|
unsigned int uiPos;
|
|
SCR_tdst_File_Open *p_stFile;
|
|
unsigned int uiIndexOfHashValue;
|
|
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
|
|
SCR_M_Dbg_Assert_P(_p_szFileName != NULL);
|
|
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
|
|
|
|
/*
|
|
* Add element.
|
|
*/
|
|
SCR_M_DyAr_AddElement(SCR_tdst_File_Open, uiPos, p_stFile, SCR_g_st_File_ArrayOpen);
|
|
fnp_st_Hash_AddValue
|
|
(
|
|
_xHashKey,
|
|
SCR_g_a_st_File_HashTableOpen,
|
|
(unsigned long) p_stFile,
|
|
&uiIndexOfHashValue
|
|
);
|
|
|
|
/*
|
|
* Initialize file.
|
|
*/
|
|
SCR_fn_v_File_InitFileDes(&p_stFile->stFile, _p_szFileName, 0);
|
|
fn_v_Hash_InitTable(p_stFile->a_stHashSectionsDes);
|
|
fn_v_DyAr_InitArray(&p_stFile->stSectionsDes);
|
|
memset(&p_stFile->stParsingInfos, 0, sizeof(SCR_tdst_Pars_Infos));
|
|
memset(&p_stFile->stFileValues, 0, sizeof(SCR_tdst_Cxt_Values));
|
|
p_stFile->xHashKey = _xHashKey;
|
|
p_stFile->uiIndexOfHashValue = uiIndexOfHashValue;
|
|
p_stFile->lSeekWhenClosed = 0;
|
|
|
|
/* Return structure */
|
|
return p_stFile;
|
|
}
|
|
|
|
/*
|
|
*-------------------------------------------------------------------------------------------------
|
|
* To delete inside an open file.
|
|
* _p_stOpenFile : File to delete.
|
|
*-------------------------------------------------------------------------------------------------
|
|
*/
|
|
void fn_v_File_DeleteInsideOpen(SCR_tdst_File_Open *_p_stOpenFile)
|
|
{
|
|
SCR_M_DyAr_DeleteAllElements
|
|
(
|
|
SCR_tdst_Anl_SectionDes,
|
|
&_p_stOpenFile->stSectionsDes,
|
|
{
|
|
fn_v_Mem_SetMode(_p_stPointer_->stHeader.ucMemLevel);
|
|
SCR_M_Cxt_FreeDynBuffers(&_p_stPointer_->stBuffers);
|
|
}
|
|
);
|
|
fn_v_Hash_CloseTable(_p_stOpenFile->a_stHashSectionsDes);
|
|
fn_v_Page_DeleteAll(&_p_stOpenFile->stFile);
|
|
SCR_fn_v_File_CloseFileDes(&_p_stOpenFile->stFile);
|
|
}
|
|
|
|
/*
|
|
*-------------------------------------------------------------------------------------------------
|
|
* To delete an open file.
|
|
* _p_stFile : File to delete.
|
|
*-------------------------------------------------------------------------------------------------
|
|
*/
|
|
void fn_v_File_DeleteOpen(SCR_tdst_File_Open *_p_stFile)
|
|
{
|
|
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
|
|
SCR_M_Dbg_AssertStruct_P(SCR_tdst_File_Open, _p_stFile);
|
|
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
|
|
|
|
/*
|
|
* Close file ?
|
|
*/
|
|
SCR_M_File_Close(&_p_stFile->stFile);
|
|
|
|
/* Close file description */
|
|
SCR_fn_v_File_CloseFileDes(&_p_stFile->stFile);
|
|
|
|
/*
|
|
* Delete element in hash table.
|
|
*/
|
|
SCR_M_DyAr_DeleteElement
|
|
(
|
|
SCR_tdst_Hash_Value,
|
|
_p_stFile->uiIndexOfHashValue,
|
|
&SCR_g_a_st_File_HashTableOpen[_p_stFile->xHashKey],
|
|
;
|
|
);
|
|
|
|
/*
|
|
* Delete structure.
|
|
*/
|
|
SCR_M_DyAr_DeleteElement
|
|
(
|
|
SCR_tdst_File_Open,
|
|
_p_stFile->stHeader.uiIndexInArray,
|
|
&SCR_g_st_File_ArrayOpen,
|
|
fn_v_File_DeleteInsideOpen(_p_stFile);
|
|
);
|
|
}
|
|
|
|
/*
|
|
*-------------------------------------------------------------------------------------------------
|
|
* To search an open file.
|
|
* _p_szFileName : Name of file.
|
|
* _xHashKey : Hash key of file name.
|
|
* Returns address of allocated structure.
|
|
*-------------------------------------------------------------------------------------------------
|
|
*/
|
|
SCR_tdst_File_Open *fnp_st_File_SearchOpen(char *_p_szFileName, SCR_tdx_Hash_Key _xHashKey)
|
|
{
|
|
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
|
|
unsigned int uiPos;
|
|
SCR_tdst_Hash_Value *p_stValue = NULL;
|
|
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
|
|
SCR_M_Dbg_Assert_P(_p_szFileName != NULL);
|
|
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
|
|
|
|
/*
|
|
* Search file.
|
|
*/
|
|
SCR_M_DyAr_SearchElement
|
|
(
|
|
SCR_tdst_Hash_Value,
|
|
uiPos,
|
|
p_stValue,
|
|
SCR_g_a_st_File_HashTableOpen[_xHashKey],
|
|
(
|
|
(!strcmpi
|
|
(
|
|
((SCR_tdst_File_Open *) (p_stValue->ulValue))->stFile.a_szOpenFileName,
|
|
_p_szFileName
|
|
)
|
|
)
|
|
)
|
|
);
|
|
|
|
/* Return address of structure */
|
|
if(p_stValue)
|
|
return (SCR_tdst_File_Open *) p_stValue->ulValue;
|
|
else
|
|
return NULL;
|
|
}
|
|
|
|
/*
|
|
*-------------------------------------------------------------------------------------------------
|
|
* To search an open file. Registered path are eventually tested.
|
|
* _p_szFileName : Name of file.
|
|
* _xHashKey : Hash key of file name.
|
|
* Returns address of allocated structure.
|
|
*-------------------------------------------------------------------------------------------------
|
|
*/
|
|
SCR_tdst_File_Open *fnp_st_File_SearchOpenWithPath
|
|
(
|
|
char *_p_szFileName,
|
|
SCR_tdx_Hash_Key _xHashKey
|
|
)
|
|
{
|
|
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
|
|
unsigned int uiPos;
|
|
SCR_tdst_File_Path *p_stPath = NULL;
|
|
SCR_tdst_File_Open *p_stFile;
|
|
char a_szCompleteName[_MAX_PATH];
|
|
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
|
|
SCR_M_Dbg_Assert_P(_p_szFileName != NULL);
|
|
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
|
|
/*
|
|
* We first search with the priority path.
|
|
*/
|
|
if(*SCR_g_a_sz_File_PriorityPath != '\0')
|
|
{
|
|
strcpy(a_szCompleteName, SCR_g_a_sz_File_PriorityPath);
|
|
strcat(a_szCompleteName, _p_szFileName);
|
|
if((p_stFile = fnp_st_File_SearchOpen(a_szCompleteName, _xHashKey)) != NULL)
|
|
return p_stFile;
|
|
}
|
|
|
|
/*
|
|
* We search the file without adding a path.
|
|
*/
|
|
strcpy(a_szCompleteName, _p_szFileName);
|
|
if((p_stFile = fnp_st_File_SearchOpen(a_szCompleteName, _xHashKey)) != NULL)
|
|
return p_stFile;
|
|
|
|
/*
|
|
* We we have not found file, we search it in all registered paths.
|
|
*/
|
|
uiPos = 0;
|
|
SCR_M_DyAr_GetNextElement(SCR_tdst_File_Path, uiPos, p_stPath, SCR_g_st_File_ArrayPaths);
|
|
while(p_stPath)
|
|
{
|
|
/* Compute path + parameter file name */
|
|
strcpy(a_szCompleteName, p_stPath->a_szPathName);
|
|
strcat(a_szCompleteName, _p_szFileName);
|
|
if((p_stFile = fnp_st_File_SearchOpen(a_szCompleteName, _xHashKey)) != NULL)
|
|
break;
|
|
uiPos++;
|
|
SCR_M_DyAr_GetNextElement(SCR_tdst_File_Path, uiPos, p_stPath, SCR_g_st_File_ArrayPaths);
|
|
}
|
|
|
|
return p_stFile;
|
|
}
|
|
|
|
/*===============================================================================================*/
|
|
|
|
/*
|
|
*-------------------------------------------------------------------------------------------------
|
|
* To clear a path name.
|
|
* _p_szPathName : Name of path to clear.
|
|
* _p_szDest : Destination string.
|
|
* Returns address of new beginning of path.
|
|
*-------------------------------------------------------------------------------------------------
|
|
*/
|
|
void fn_v_File_ClearPath(char *_p_szPathName, char *_p_szDest)
|
|
{
|
|
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
|
|
int iLen;
|
|
char *p_szTemp;
|
|
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
|
|
SCR_M_Dbg_Assert_P(_p_szPathName != NULL);
|
|
SCR_M_Dbg_Assert_P(_p_szDest != NULL);
|
|
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
|
|
|
|
/*
|
|
* Swap spaces before the path.
|
|
*/
|
|
while(isspace(*_p_szPathName))
|
|
_p_szPathName++;
|
|
|
|
/* Check for an empty path */
|
|
SCR_M_Dbg_Assert_D(*_p_szPathName);
|
|
|
|
strcpy(_p_szDest, _p_szPathName);
|
|
|
|
/*
|
|
* Swap spaces at the end of the path.
|
|
*/
|
|
p_szTemp = _p_szDest + strlen(_p_szDest) - 1;
|
|
while(isspace(*p_szTemp) && (p_szTemp != _p_szDest))
|
|
{
|
|
*p_szTemp = '\0';
|
|
p_szTemp--;
|
|
}
|
|
SCR_M_Dbg_Assert_P(!isspace(*_p_szDest));
|
|
|
|
/*
|
|
* Force last character to be a '\'.
|
|
*/
|
|
iLen = strlen(_p_szDest) - 1;
|
|
if(_p_szDest[iLen] != '\\')
|
|
{
|
|
_p_szDest[iLen + 1] = '\\';
|
|
_p_szDest[iLen + 2] = '\0';
|
|
}
|
|
}
|
|
|
|
/*
|
|
*-------------------------------------------------------------------------------------------------
|
|
* To add one single path.
|
|
* _p_szPathName : Name of path to add.
|
|
* Returns address of allocated structure.
|
|
*-------------------------------------------------------------------------------------------------
|
|
*/
|
|
SCR_tdst_File_Path *fnp_st_File_AddPath(char *_p_szPathName)
|
|
{
|
|
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
|
|
unsigned int uiPos;
|
|
SCR_tdst_File_Path *p_stPath;
|
|
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
|
|
SCR_M_Dbg_Assert_P(_p_szPathName != NULL);
|
|
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
|
|
|
|
/*
|
|
* If path already here, exit.
|
|
*/
|
|
p_stPath = fnp_st_File_SearchPath(_p_szPathName);
|
|
if(p_stPath)
|
|
return p_stPath;
|
|
|
|
/*
|
|
* Add element.
|
|
*/
|
|
SCR_M_DyAr_AddElement(SCR_tdst_File_Path, uiPos, p_stPath, SCR_g_st_File_ArrayPaths);
|
|
|
|
/*
|
|
* Initialize structure.
|
|
*/
|
|
strcpy(p_stPath->a_szPathName, _p_szPathName);
|
|
|
|
/* Return structure */
|
|
return p_stPath;
|
|
}
|
|
|
|
/*
|
|
*-------------------------------------------------------------------------------------------------
|
|
* To delete a path.
|
|
* _p_stPath : Path to delete.
|
|
*-------------------------------------------------------------------------------------------------
|
|
*/
|
|
void fn_v_File_DeletePath(SCR_tdst_File_Path *_p_stPath)
|
|
{
|
|
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
|
|
SCR_M_Dbg_AssertStruct_P(SCR_tdst_File_Path, _p_stPath);
|
|
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
|
|
|
|
SCR_M_DyAr_DeleteElement
|
|
(
|
|
SCR_tdst_File_Path,
|
|
_p_stPath->stHeader.uiIndexInArray,
|
|
&SCR_g_st_File_ArrayPaths,
|
|
;
|
|
);
|
|
}
|
|
|
|
/*
|
|
*-------------------------------------------------------------------------------------------------
|
|
* To search a path.
|
|
* _p_szPathName : Name of path.
|
|
* Returns address of allocated structure.
|
|
*-------------------------------------------------------------------------------------------------
|
|
*/
|
|
SCR_tdst_File_Path *fnp_st_File_SearchPath(char *_p_szPathName)
|
|
{
|
|
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
|
|
unsigned int uiPos;
|
|
SCR_tdst_File_Path *p_stPointer = NULL;
|
|
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
|
|
SCR_M_Dbg_Assert_P(_p_szPathName != NULL);
|
|
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
|
|
|
|
SCR_M_DyAr_SearchElement
|
|
(
|
|
SCR_tdst_File_Path,
|
|
uiPos,
|
|
p_stPointer,
|
|
SCR_g_st_File_ArrayPaths,
|
|
(!strcmpi(p_stPointer->a_szPathName, _p_szPathName))
|
|
);
|
|
return p_stPointer;
|
|
}
|
|
|
|
/*===============================================================================================*/
|
|
|
|
/*
|
|
*-------------------------------------------------------------------------------------------------
|
|
* Check the validity of a file name.
|
|
* _p_szFileName : Name of file to check.
|
|
*-------------------------------------------------------------------------------------------------
|
|
*/
|
|
void fn_vCheckFileNameValidity(char *_p_szFileName)
|
|
{
|
|
while(*_p_szFileName)
|
|
{
|
|
if
|
|
(
|
|
!isalpha(*_p_szFileName)
|
|
&& !isdigit(*_p_szFileName)
|
|
&& *_p_szFileName != '\\'
|
|
&& *_p_szFileName != '/'
|
|
&& *_p_szFileName != ':'
|
|
&& *_p_szFileName != '_'
|
|
&& *_p_szFileName != '.'
|
|
&& *_p_szFileName != '-'
|
|
&& *_p_szFileName != ' '
|
|
)
|
|
{
|
|
sprintf(g_st_Err_GlobalError.a_szBufferTmp1, "File is \"%s\".", _p_szFileName);
|
|
*g_st_Err_GlobalError.a_szBufferTmp2 = '\0';
|
|
SCR_M_Err_RaiseWarning(SCR_EI_Err_BadFileName);
|
|
return;
|
|
}
|
|
_p_szFileName++;
|
|
}
|
|
}
|
|
|
|
/*
|
|
*-------------------------------------------------------------------------------------------------
|
|
* Try to open a file.
|
|
* _p_stFile : File to open.
|
|
* Returns <> 0 if ok, 0 if not open.
|
|
*-------------------------------------------------------------------------------------------------
|
|
*/
|
|
char fn_c_File_TryToOpen(SCR_tdst_File_Open *_p_stFile)
|
|
{
|
|
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
|
|
unsigned int uiPos;
|
|
char cMode;
|
|
char buffer[10];
|
|
SCR_tdst_File_Path *p_stPath = NULL;
|
|
char szFileName[255];
|
|
/*ANNECY CB*/
|
|
char cIni = 0;
|
|
char *psz_Name;
|
|
/*END ANNECY*/
|
|
|
|
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
|
|
SCR_M_Dbg_AssertStruct_P(SCR_tdst_File_Open, _p_stFile);
|
|
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
|
|
|
|
/*
|
|
* Open the file and seek to "lSeekWhenClosed" (0 the first time).
|
|
* If file can't be open, we try the registered paths.
|
|
* a_szOpenFileName must contain the sucessful name of opened file.
|
|
*/
|
|
uiPos = 0;
|
|
cMode = 0;
|
|
while(1)
|
|
{
|
|
switch(cMode)
|
|
{
|
|
case 0: /* The file with the priority path */
|
|
cMode = 1;
|
|
if(*SCR_g_a_sz_File_PriorityPath != '\0')
|
|
{
|
|
strcpy(_p_stFile->stFile.a_szOpenFileName, SCR_g_a_sz_File_PriorityPath);
|
|
strcat(_p_stFile->stFile.a_szOpenFileName, _p_stFile->stFile.a_szFileName);
|
|
}
|
|
else
|
|
continue;
|
|
break;
|
|
case 1: /* The file itself without path */
|
|
strcpy(_p_stFile->stFile.a_szOpenFileName, _p_stFile->stFile.a_szFileName);
|
|
cMode = 2;
|
|
break;
|
|
}
|
|
|
|
/* MP: BINARY test */
|
|
{
|
|
/* struct _stat _stat1, _stat2;*/
|
|
/* char *pch;*/
|
|
strcpy( szFileName, _p_stFile->stFile.a_szOpenFileName );
|
|
/* pch=strrchr( szFileName, '.' );
|
|
strcat( szFileName, ".xkz" );
|
|
if( _stat( _p_stFile->stFile.a_szOpenFileName, &_stat1 )!=-1 )
|
|
{
|
|
if( (_stat( szFileName, &_stat2 )==-1) || ( _stat1.st_mtime>=_stat2.st_mtime ))
|
|
strcpy( szFileName, _p_stFile->stFile.a_szOpenFileName );
|
|
}
|
|
else if(_stat( szFileName, &_stat2 )==-1)
|
|
strcpy( szFileName, _p_stFile->stFile.a_szOpenFileName );*/
|
|
}
|
|
|
|
|
|
|
|
/* MP: BINARY end */
|
|
|
|
/*ANNECY CB*/
|
|
psz_Name = szFileName;
|
|
if(cIni == 1)
|
|
{
|
|
char asz_TempName[_MAX_PATH];
|
|
strcpy(asz_TempName, gsz_Version);
|
|
if(strchr(psz_Name, '\\'))
|
|
strcat(asz_TempName, strchr(psz_Name, '\\'));
|
|
else
|
|
{
|
|
strcat(asz_TempName, "\\");
|
|
strcat(asz_TempName, psz_Name);
|
|
}
|
|
strcpy(szFileName, asz_TempName);
|
|
}
|
|
if(cIni == 2)
|
|
{
|
|
char asz_TempName[_MAX_PATH];
|
|
strcpy(asz_TempName, gsz_Version1);
|
|
if(strchr(psz_Name, '\\'))
|
|
strcat(asz_TempName, strchr(psz_Name, '\\'));
|
|
else
|
|
{
|
|
strcat(asz_TempName, "\\");
|
|
strcat(asz_TempName, psz_Name);
|
|
}
|
|
strcpy(szFileName, asz_TempName);
|
|
}
|
|
/*END ANNECY*/
|
|
|
|
|
|
if((_p_stFile->stFile.p_stHandle->xHandle = SCR_M_p_x_File_OpenRead(/*_p_stFile->stFile.a_szOpenFileName*/ szFileName)) != 0)
|
|
{
|
|
/*
|
|
* Check file name validity if necessary.
|
|
* Seek to last position if necessary.
|
|
*/
|
|
if(_p_stFile->lSeekWhenClosed == 0)
|
|
{
|
|
fn_vCheckFileNameValidity(_p_stFile->stFile.a_szFileName);
|
|
SCR_M_setvbuf
|
|
(
|
|
&_p_stFile->stFile,
|
|
_p_stFile->a_szBuffer,
|
|
_IOFBF,
|
|
SCR_CV_ui_Cfg_SizeBufferFile
|
|
);
|
|
/* MP: BINARY start */
|
|
fn_v_Bin_Read( &_p_stFile->stFile, 6, (void *)buffer );
|
|
_p_stFile->stFile.bBinaryMode=(strncmp( buffer, "BINARY", 6 )==0);
|
|
if( !_p_stFile->stFile.bBinaryMode )
|
|
{
|
|
SCR_M_File_Seek(&_p_stFile->stFile, 0, SEEK_SET);
|
|
if( _p_stFile->stFile.p_stRefs )
|
|
{
|
|
SCR_M_Mem_Free( _p_stFile->stFile.p_stRefs );
|
|
_p_stFile->stFile.p_stRefs=NULL;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
/* get strings*/
|
|
unsigned short usCnt, i;
|
|
|
|
if( (_p_stFile->stParsingInfos.stPosition.lAfterSeekInFile==0)||SCR_g_iParseHeader )
|
|
{ usCnt=SCR_fn_us_Bin_GetUSHORT( &_p_stFile->stFile );
|
|
_p_stFile->stFile.lChangeInPos=8;
|
|
SCR_M_Mem_Alloc( char *, _p_stFile->stFile.p_stRefs->a_szRefName, usCnt );
|
|
_p_stFile->stFile.p_stRefs->sRefCount=usCnt;
|
|
for( i=0; i<usCnt; i++ )
|
|
_p_stFile->stFile.p_stRefs->a_szRefName[i]=SCR_fn_sz_Bin_GetSTRING( &_p_stFile->stFile );
|
|
_p_stFile->stParsingInfos.stPosition.lAfterSeekInFile=_p_stFile->stFile.lChangeInPos;
|
|
}
|
|
SCR_g_iParseHeader=0;
|
|
}
|
|
/* MP: BINARY end */
|
|
|
|
|
|
}
|
|
else
|
|
SCR_M_File_Seek(&_p_stFile->stFile, _p_stFile->lSeekWhenClosed, SEEK_SET);
|
|
return 1;
|
|
}
|
|
|
|
/*
|
|
* Compute file name with the path.
|
|
*/
|
|
if(cMode == 2)
|
|
{
|
|
SCR_M_DyAr_GetNextElement(SCR_tdst_File_Path, uiPos, p_stPath, SCR_g_st_File_ArrayPaths);
|
|
if(p_stPath)
|
|
{
|
|
strcpy(_p_stFile->stFile.a_szOpenFileName, p_stPath->a_szPathName);
|
|
strcat(_p_stFile->stFile.a_szOpenFileName, _p_stFile->stFile.a_szFileName);
|
|
uiPos++;
|
|
}
|
|
else
|
|
/*ANNECY CB*/
|
|
{
|
|
if((cIni == 0) && (*gsz_Version))
|
|
{
|
|
cIni = 1;
|
|
cMode = 0;
|
|
uiPos = 0;
|
|
}
|
|
else if((cIni == 1) && (*gsz_Version1))
|
|
{
|
|
cIni = 2;
|
|
cMode = 0;
|
|
uiPos = 0;
|
|
}
|
|
else
|
|
/*END ANNECY*/
|
|
break;
|
|
/*ANNECY CB*/
|
|
}
|
|
/*END*/
|
|
}
|
|
}
|
|
|
|
/*
|
|
* File can't be open.
|
|
*/
|
|
return 0;
|
|
}
|
|
|
|
/*
|
|
*-------------------------------------------------------------------------------------------------
|
|
* Try to open a file. Error if not open.
|
|
* _p_stFile : File to open.
|
|
*-------------------------------------------------------------------------------------------------
|
|
*/
|
|
void fn_v_File_ReallyOpen(SCR_tdst_File_Open *_p_stFile)
|
|
{
|
|
do
|
|
{
|
|
if(fn_c_File_TryToOpen(_p_stFile))
|
|
return;
|
|
|
|
/* Error */
|
|
sprintf(g_st_Err_GlobalError.a_szBufferTmp1, "File is \"%s\".", _p_stFile->stFile.a_szFileName);
|
|
*g_st_Err_GlobalError.a_szBufferTmp2 = '\0';
|
|
SCR_M_Err_RaiseError(SCR_EI_Err_OpenFile);
|
|
} while(g_i_Err_GlobalReturn == IDRETRY);
|
|
}
|
|
|
|
/*
|
|
*-------------------------------------------------------------------------------------------------
|
|
* Force a file to be open. An old one can be closed.
|
|
* _p_stFile : File to open.
|
|
*-------------------------------------------------------------------------------------------------
|
|
*/
|
|
void fn_v_File_ForceOpenFile(SCR_tdst_File_Open *_p_stFile)
|
|
{
|
|
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
|
|
unsigned int uiToClose, uiNumOpen;
|
|
SCR_tdst_File_Open *p_stCloseFile = NULL;
|
|
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
|
|
SCR_M_Dbg_AssertStruct_P(SCR_tdst_File_Open, _p_stFile);
|
|
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
|
|
|
|
/*
|
|
* Already open. We exit.
|
|
*/
|
|
if(_p_stFile->stFile.p_stHandle->xHandle != (SCR_FILE) 0)
|
|
return;
|
|
|
|
/*
|
|
* Really open the file.
|
|
*/
|
|
fn_v_File_ReallyOpen(_p_stFile);
|
|
|
|
/*
|
|
* Close the oldest file if we are above SCR_C_uiMaxOpenFiles.
|
|
*/
|
|
uiToClose = 0;
|
|
uiNumOpen = 0;
|
|
SCR_M_DyAr_GetNextElement(SCR_tdst_File_Open, uiToClose, p_stCloseFile, SCR_g_st_File_ArrayOpen);
|
|
while(p_stCloseFile)
|
|
{
|
|
if(p_stCloseFile->stFile.p_stHandle->xHandle)
|
|
uiNumOpen++;
|
|
uiToClose++;
|
|
SCR_M_DyAr_GetNextElement(SCR_tdst_File_Open, uiToClose, p_stCloseFile, SCR_g_st_File_ArrayOpen);
|
|
}
|
|
|
|
if(uiNumOpen >= SCR_CV_ui_Cfg_MaxOpenFiles)
|
|
{
|
|
/* Compute oldest file to close */
|
|
uiToClose = 0;
|
|
SCR_M_DyAr_GetNextElement(SCR_tdst_File_Open, uiToClose, p_stCloseFile, SCR_g_st_File_ArrayOpen);
|
|
while
|
|
(
|
|
(
|
|
(p_stCloseFile)
|
|
&& (p_stCloseFile->stFile.p_stHandle->xHandle == (SCR_FILE) 0)
|
|
)
|
|
|| (p_stCloseFile == _p_stFile)
|
|
)
|
|
{
|
|
uiToClose++;
|
|
SCR_M_DyAr_GetNextElement(SCR_tdst_File_Open, uiToClose, p_stCloseFile, SCR_g_st_File_ArrayOpen);
|
|
}
|
|
SCR_M_Dbg_Assert_P(p_stCloseFile != NULL);
|
|
|
|
/* Remember current position of file before closing */
|
|
if((p_stCloseFile->lSeekWhenClosed = SCR_M_ftell(&p_stCloseFile->stFile)) == -1)
|
|
{
|
|
sprintf(g_st_Err_GlobalError.a_szBufferTmp1, "File is \"%s\".", _p_stFile->stFile.a_szFileName);
|
|
*g_st_Err_GlobalError.a_szBufferTmp2 = '\0';
|
|
SCR_M_Err_RaiseError(SCR_EI_Err_ReadFile);
|
|
}
|
|
|
|
/* Close the file */
|
|
SCR_M_File_Close(&p_stCloseFile->stFile);
|
|
}
|
|
}
|
|
|
|
/*
|
|
*-------------------------------------------------------------------------------------------------
|
|
* To open a file.
|
|
* _p_szFileName : User name of file.
|
|
* Returns address of allocated structure.
|
|
*-------------------------------------------------------------------------------------------------
|
|
*/
|
|
SCR_tdst_File_Open *fnp_st_File_OpenFile(char *_p_szFileName)
|
|
{
|
|
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
|
|
SCR_tdst_File_Open *p_stFile;
|
|
SCR_tdx_Hash_Key xHashKey;
|
|
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
|
|
SCR_M_Dbg_Assert_P(_p_szFileName != NULL);
|
|
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
|
|
|
|
/*
|
|
* Compute hash key for file name.
|
|
*/
|
|
xHashKey = SCR_fn_x_Hash_ComputeHashKeyForString(_p_szFileName);
|
|
|
|
/*
|
|
* We try to search the file in array of already open ones.
|
|
* If file is not present, we add it.
|
|
*/
|
|
p_stFile = fnp_st_File_SearchOpenWithPath(_p_szFileName, xHashKey);
|
|
if(p_stFile == NULL)
|
|
{
|
|
/* We add a new open file */
|
|
p_stFile = fnp_st_File_AddOpen(_p_szFileName, xHashKey);
|
|
SCR_M_Dbg_Assert_P(p_stFile != NULL);
|
|
}
|
|
|
|
/*
|
|
* We really open file if its handle is NULL.
|
|
*/
|
|
SCR_M_Dbg_Assert_P(p_stFile != NULL);
|
|
if(p_stFile->stFile.p_stHandle->xHandle == (SCR_FILE) 0)
|
|
{
|
|
fn_v_File_ForceOpenFile(p_stFile);
|
|
}
|
|
|
|
return p_stFile;
|
|
}
|
|
|
|
/*
|
|
*-------------------------------------------------------------------------------------------------
|
|
* To close all the handles of the open files
|
|
*-------------------------------------------------------------------------------------------------
|
|
*/
|
|
void fn_v_File_CloseAllHandles(void)
|
|
{
|
|
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
|
|
unsigned int uiToClose;
|
|
SCR_tdst_File_Open *p_stCloseFile = NULL;
|
|
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
|
|
uiToClose = 0;
|
|
SCR_M_DyAr_GetNextElement(SCR_tdst_File_Open, uiToClose, p_stCloseFile, SCR_g_st_File_ArrayOpen);
|
|
while(p_stCloseFile)
|
|
{
|
|
SCR_M_File_Close(&p_stCloseFile->stFile);
|
|
uiToClose++;
|
|
SCR_M_DyAr_GetNextElement(SCR_tdst_File_Open, uiToClose, p_stCloseFile, SCR_g_st_File_ArrayOpen);
|
|
}
|
|
}
|
|
|
|
/*===============================================================================================*/
|
|
|
|
/*
|
|
*-------------------------------------------------------------------------------------------------
|
|
* To transform a filename depending on previous context.
|
|
* Name = "*" : We take current file name (previous context).
|
|
* Name = "*.ext" : We take current file name with extension ".ext" (previous context).
|
|
* _p_szFileName : File name to transform.
|
|
*-------------------------------------------------------------------------------------------------
|
|
*/
|
|
void fn_v_File_TransformFileName(char *_p_szFileName)
|
|
{
|
|
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
|
|
char *p_szTemp;
|
|
SCR_tdst_Cxt_Description *p_stContext;
|
|
char a_szTmpBuf[_MAX_PATH];
|
|
char a_szPath[_MAX_PATH];
|
|
char a_szName[_MAX_FNAME];
|
|
char a_szExt[_MAX_EXT];
|
|
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
|
|
SCR_M_Dbg_Assert_P(_p_szFileName != NULL);
|
|
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
|
|
|
|
/*
|
|
* Split file name.
|
|
*/
|
|
_splitpath
|
|
(
|
|
_p_szFileName,
|
|
a_szTmpBuf,
|
|
a_szPath,
|
|
a_szName,
|
|
a_szExt
|
|
);
|
|
|
|
/*
|
|
* File name must began with '*'.
|
|
*/
|
|
if(*a_szName != '*')
|
|
return;
|
|
|
|
/*
|
|
* Get current context (to get current file). Error if it not exists.
|
|
*/
|
|
p_stContext = fnp_st_Cxt_Compute(0);
|
|
|
|
/*
|
|
* Convertion.
|
|
*/
|
|
strcpy(_p_szFileName, p_stContext->p_stOpenFile->stFile.a_szFileName);
|
|
|
|
/* Replace with previous context file name */
|
|
if(!strcmpi(a_szName, "*"))
|
|
return;
|
|
|
|
/* Replace with previous context file name, but with a new extension */
|
|
else if(a_szExt[0])
|
|
{
|
|
|
|
p_szTemp = strrchr(_p_szFileName, '.');
|
|
if(!p_szTemp)
|
|
p_szTemp = _p_szFileName + strlen(_p_szFileName);
|
|
strcpy(p_szTemp, a_szExt);
|
|
return;
|
|
}
|
|
|
|
/*
|
|
* Here, we have a name that began with '*' but that is not valid.
|
|
* We keep it without modify.
|
|
*/
|
|
}
|
|
|
|
/*
|
|
*-------------------------------------------------------------------------------------------------
|
|
* To split a reference section name.
|
|
* _p_szInputName : Input name of section.
|
|
* _p_szFileName : To receive file name alone.
|
|
* _p_szSectionName : To receive complete section name (atomic file name + section)
|
|
*-------------------------------------------------------------------------------------------------
|
|
*/
|
|
void fn_v_File_ComputeFileSectionName
|
|
(
|
|
char *_p_szInputName,
|
|
char *_p_szFileName,
|
|
char *_p_szSectionName
|
|
)
|
|
{
|
|
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
|
|
char *p_szSecond;
|
|
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
|
|
SCR_M_Dbg_Assert_P(_p_szInputName != NULL);
|
|
SCR_M_Dbg_Assert_P(_p_szFileName != NULL);
|
|
SCR_M_Dbg_Assert_P(_p_szSectionName != NULL);
|
|
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
|
|
|
|
/*
|
|
* File name
|
|
*/
|
|
|
|
strcpy(_p_szFileName, _p_szInputName);
|
|
|
|
p_szSecond = strchr(_p_szFileName, SCR_CC_c_Cfg_NameSeparator);
|
|
|
|
if(p_szSecond)
|
|
*p_szSecond = '\0';
|
|
|
|
fn_v_File_TransformFileName(_p_szFileName);
|
|
|
|
/*
|
|
* Section name
|
|
*/
|
|
*_p_szSectionName = '\0';
|
|
if(p_szSecond)
|
|
{
|
|
strcpy(_p_szSectionName, _p_szFileName);
|
|
strcat(_p_szSectionName, strchr(_p_szInputName, SCR_CC_c_Cfg_NameSeparator));
|
|
}
|
|
}
|
|
|
|
/*
|
|
**************************************************************************************************
|
|
**************************************************************************************************
|
|
**************************************************************************************************
|
|
**************************************************************************************************
|
|
*/
|
|
|
|
/*
|
|
*-------------------------------------------------------------------------------------------------
|
|
* To reduce memory size.
|
|
*-------------------------------------------------------------------------------------------------
|
|
*/
|
|
void fn_v_File_ReduceMemory(void)
|
|
{
|
|
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
|
|
unsigned int uiPos;
|
|
SCR_tdst_File_Open *p_stPointer;
|
|
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
|
|
|
|
/* Pack array of open files */
|
|
SCR_M_DyAr_PackArray(SCR_tdst_File_Open, SCR_g_st_File_ArrayOpen, ;);
|
|
|
|
/* Pack open files hash table */
|
|
SCR_M_Hash_PackArray(SCR_g_a_st_File_HashTableOpen, SCR_tdst_File_Open, SCR_g_st_File_ArrayOpen, xHashKey, uiIndexOfHashValue);
|
|
|
|
/* Pack array of sections descriptions */
|
|
for(uiPos = 0; uiPos < SCR_g_st_File_ArrayOpen.uiNumValues; uiPos++)
|
|
{
|
|
SCR_M_DyAr_GetElement(SCR_tdst_File_Open, uiPos, p_stPointer, SCR_g_st_File_ArrayOpen);
|
|
SCR_M_DyAr_SimplePackArray(SCR_tdst_Anl_SectionDescription, p_stPointer->stSectionsDes);
|
|
SCR_M_Hash_SimplePackArray(p_stPointer->a_stHashSectionsDes);
|
|
}
|
|
|
|
/* Pack array of paths */
|
|
SCR_M_DyAr_PackArray(SCR_tdst_File_Path, SCR_g_st_File_ArrayPaths, ;);
|
|
}
|
|
|
|
/*
|
|
*-------------------------------------------------------------------------------------------------
|
|
*-------------------------------------------------------------------------------------------------
|
|
*/
|
|
void fn_v_File_DeleteWithMemLevel(unsigned char _ucMin, unsigned char _ucMax)
|
|
{
|
|
SCR_M_DyAr_DeleteElementWithMemLevel
|
|
(
|
|
SCR_tdst_File_Open,
|
|
SCR_g_st_File_ArrayOpen,
|
|
{
|
|
SCR_M_File_Close(&_p_stPointer_->stFile);
|
|
SCR_fn_v_File_CloseFileDes(&_p_stPointer_->stFile);
|
|
fn_v_File_DeleteInsideOpen(_p_stPointer_);
|
|
},
|
|
_ucMin,
|
|
_ucMax
|
|
);
|
|
SCR_M_Hash_DeleteWithMemLevel
|
|
(
|
|
SCR_g_a_st_File_HashTableOpen,
|
|
_ucMin,
|
|
_ucMax
|
|
);
|
|
SCR_M_DyAr_DeleteElementWithMemLevel
|
|
(
|
|
SCR_tdst_File_Path,
|
|
SCR_g_st_File_ArrayPaths,
|
|
;,
|
|
_ucMin,
|
|
_ucMax
|
|
);
|
|
}
|