reman3/Rayman_X/cpa/tempgrp/SCR/SCR_SvL1.c

1227 lines
42 KiB
C

/*
*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
* SCR_SvL1.c
* Functions for saving, level 1.
*
* Scripts, Beaudet Christophe
*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
*/
/*
*=================================================================================================
* Includes.
*=================================================================================================
*/
#include <memory.h>
#include "SCR.h"
/*
*=================================================================================================
* Global variables.
*=================================================================================================
*/
char gs_a_szModifyFileName[_MAX_PATH] = "SCR_Mdf.txt";
/*
*=================================================================================================
* Functions.
*=================================================================================================
*/
/*
*-------------------------------------------------------------------------------------------------
* To notify a modification to the script saver.
* _p_szSectionName : Section modify.
* _pfn_vCallback : Call back to call by the script saver.
* _p_vData : Data associated to the notification.
* _eAction : Real modification action.
*-------------------------------------------------------------------------------------------------
*/
void SCR_fn_v_SvL1_RegisterNotify
(
char *_p_szSectionName,
SCR_tdpfn_Ntfy_Callback _pfn_vCallback,
void *_p_vData,
SCR_tde_Ntfy_Action _eAction
)
SCR_BEGIN
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
SCR_tdst_Ntfy_Description *p_stNotify;
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
SCR_M_Dbg_Assert_D(_p_szSectionName != NULL);
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
/*
* Is there already a notification ?
*/
p_stNotify = SCR_fnp_st_SvL1_GetRegisterNotify(_p_szSectionName);
if(p_stNotify)
{
/* Single replacement */
if(_eAction == p_stNotify->eAction)
{
p_stNotify->pfn_vCallback = _pfn_vCallback;
p_stNotify->p_vData = _p_vData;
SCR_RETURN(;);
}
switch(_eAction)
{
/*---------------------------------------------------------------------------------------------*/
case SCR_EA_Ntfy_AddOrModifySection:
case SCR_EA_Ntfy_AddOrRebuildSection:
p_stNotify->pfn_vCallback = _pfn_vCallback;
p_stNotify->p_vData = _p_vData;
p_stNotify->eAction = _eAction;
SCR_RETURN(;);
break;
/*---------------------------------------------------------------------------------------------*/
case SCR_EA_Ntfy_AddSection:
switch(p_stNotify->eAction)
{
case SCR_EA_Ntfy_AddOrModifySection:
case SCR_EA_Ntfy_AddOrRebuildSection:
p_stNotify->pfn_vCallback = _pfn_vCallback;
p_stNotify->p_vData = _p_vData;
p_stNotify->eAction = _eAction;
SCR_RETURN(;);
case SCR_EA_Ntfy_DeleteSection:
p_stNotify->pfn_vCallback = _pfn_vCallback;
p_stNotify->p_vData = _p_vData;
p_stNotify->eAction = SCR_EA_Ntfy_RebuildSection;
SCR_RETURN(;);
case SCR_EA_Ntfy_DeleteIfExists:
p_stNotify->pfn_vCallback = _pfn_vCallback;
p_stNotify->p_vData = _p_vData;
p_stNotify->eAction = SCR_EA_Ntfy_AddOrRebuildSection;
SCR_RETURN(;);
case SCR_EA_Ntfy_RebuildSection:
case SCR_EA_Ntfy_ModifySection:
SCR_M_Dbg_Assert_D(0);
}
break;
/*---------------------------------------------------------------------------------------------*/
case SCR_EA_Ntfy_DeleteSection:
case SCR_EA_Ntfy_DeleteIfExists:
switch(p_stNotify->eAction)
{
case SCR_EA_Ntfy_AddSection:
SCR_fn_v_SvL1_DeleteRegisterNotify(_p_szSectionName, SCR_CDR_c_RdL0_Match);
SCR_RETURN(;);
case SCR_EA_Ntfy_DeleteIfExists:
p_stNotify->pfn_vCallback = _pfn_vCallback;
p_stNotify->p_vData = _p_vData;
p_stNotify->eAction = SCR_EA_Ntfy_DeleteIfExists;
SCR_RETURN(;);
case SCR_EA_Ntfy_AddOrModifySection:
case SCR_EA_Ntfy_AddOrRebuildSection:
p_stNotify->pfn_vCallback = _pfn_vCallback;
p_stNotify->p_vData = _p_vData;
p_stNotify->eAction = SCR_EA_Ntfy_DeleteIfExists;
SCR_RETURN(;);
case SCR_EA_Ntfy_ModifySection:
case SCR_EA_Ntfy_RebuildSection:
p_stNotify->pfn_vCallback = _pfn_vCallback;
p_stNotify->p_vData = _p_vData;
p_stNotify->eAction = _eAction;
SCR_RETURN(;);
}
break;
/*---------------------------------------------------------------------------------------------*/
case SCR_EA_Ntfy_ModifySection:
switch(p_stNotify->eAction)
{
case SCR_EA_Ntfy_AddOrModifySection:
case SCR_EA_Ntfy_AddOrRebuildSection:
p_stNotify->pfn_vCallback = _pfn_vCallback;
p_stNotify->p_vData = _p_vData;
p_stNotify->eAction = SCR_EA_Ntfy_AddOrModifySection;
SCR_RETURN(;);
case SCR_EA_Ntfy_AddSection:
p_stNotify->pfn_vCallback = _pfn_vCallback;
p_stNotify->p_vData = _p_vData;
SCR_RETURN(;);
case SCR_EA_Ntfy_DeleteSection:
case SCR_EA_Ntfy_DeleteIfExists:
SCR_M_Dbg_Assert_D(0);
case SCR_EA_Ntfy_RebuildSection:
p_stNotify->pfn_vCallback = _pfn_vCallback;
p_stNotify->p_vData = _p_vData;
SCR_RETURN(;);
}
break;
/*---------------------------------------------------------------------------------------------*/
case SCR_EA_Ntfy_RebuildSection:
switch(p_stNotify->eAction)
{
case SCR_EA_Ntfy_AddSection:
p_stNotify->pfn_vCallback = _pfn_vCallback;
p_stNotify->p_vData = _p_vData;
SCR_RETURN(;);
case SCR_EA_Ntfy_DeleteSection:
case SCR_EA_Ntfy_DeleteIfExists:
SCR_M_Dbg_Assert_D(0);
case SCR_EA_Ntfy_AddOrModifySection:
case SCR_EA_Ntfy_AddOrRebuildSection:
p_stNotify->pfn_vCallback = _pfn_vCallback;
p_stNotify->p_vData = _p_vData;
p_stNotify->eAction = SCR_EA_Ntfy_AddOrRebuildSection;
SCR_RETURN(;);
case SCR_EA_Ntfy_ModifySection:
p_stNotify->pfn_vCallback = _pfn_vCallback;
p_stNotify->p_vData = _p_vData;
p_stNotify->eAction = _eAction;
SCR_RETURN(;);
}
break;
}
}
/*
* We add that one.
*/
fn_v_Ntfy_Add(_p_szSectionName, _pfn_vCallback, _p_vData, _eAction);
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
SCR_CEND(;)
/*
*-------------------------------------------------------------------------------------------------
* To delete one or more registered notifications.
* _p_szSectionName : Name of section name for notify to delete.
* _cMatch : Exact string or string contains.
*-------------------------------------------------------------------------------------------------
*/
void SCR_fn_v_SvL1_DeleteRegisterNotify
(
char *_p_szSectionName,
char _cMatch
)
SCR_BEGIN
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
SCR_tdst_Ntfy_Description *p_stNotify;
unsigned int uiPos;
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
SCR_M_Dbg_Assert_D(_p_szSectionName != NULL);
SCR_M_Dbg_Assert_D
(
(_cMatch == SCR_CDR_c_RdL0_Match)
|| (_cMatch == SCR_CDR_c_RdL0_Contains)
|| (_cMatch == SCR_CDR_c_RdL0_NotContains)
);
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
/*
* We parsed all the array to search a name to correspond to the parameter
* and to the matching choice.
*/
uiPos = 0;
SCR_M_DyAr_GetNextElement(SCR_tdst_Ntfy_Description, uiPos, p_stNotify, SCR_g_st_Ntfy_Array);
while(p_stNotify)
{
switch(_cMatch)
{
/* Found name must be exactly the same */
case SCR_CDR_c_RdL0_Match:
if(!strcmpi(p_stNotify->a_szSectionName, _p_szSectionName))
fn_v_Ntfy_Delete(p_stNotify);
break;
/* Found name must have inside it the parameter */
case SCR_CDR_c_RdL0_Contains:
if(strstri(p_stNotify->a_szSectionName, _p_szSectionName))
fn_v_Ntfy_Delete(p_stNotify);
break;
/* Found name must not have inside it the parameter */
case SCR_CDR_c_RdL0_NotContains:
if(!strstri(p_stNotify->a_szSectionName, _p_szSectionName))
fn_v_Ntfy_Delete(p_stNotify);
break;
}
uiPos++;
SCR_M_DyAr_GetNextElement(SCR_tdst_Ntfy_Description, uiPos, p_stNotify, SCR_g_st_Ntfy_Array);
}
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
SCR_CEND(;)
/*
*-------------------------------------------------------------------------------------------------
* To get an already registered notification.
* _p_szSectionName : Name of section name for notify to delete.
*-------------------------------------------------------------------------------------------------
*/
SCR_tdst_Ntfy_Description *SCR_fnp_st_SvL1_GetRegisterNotify(char *_p_szSectionName)
SCR_BEGIN
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
SCR_M_Dbg_Assert_D(_p_szSectionName != NULL);
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
/*
* Search and return address.
*/
SCR_RETURN(fnp_st_Ntfy_Search(_p_szSectionName));
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
SCR_CEND(NULL)
/*===============================================================================================*/
/*
*-------------------------------------------------------------------------------------------------
* To go to the previous line.
* _p_stFile : File concerned.
*-------------------------------------------------------------------------------------------------
*/
void SCR_fn_v_SvL1_ToPrevLine(SCR_tdst_File_Description *_p_stFile)
SCR_BEGIN
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
char cChar, cCnt;
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
SCR_M_Dbg_Assert_D(_p_stFile != NULL);
SCR_M_Dbg_Assert_D(_p_stFile->d_stFirstPage != NULL);
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
cCnt = 0;
do
{
if((_p_stFile->iCurPosInPage == 0) && (_p_stFile->d_stCurPage->p_stPrev == NULL))
break;
fn_v_Page_ToPrevChar(_p_stFile);
cChar = _p_stFile->d_stCurPage->d_cBuffer[_p_stFile->iCurPosInPage];
if(cChar == '\n')
cCnt++;
} while(cCnt != 2);
if(cChar == '\n')
fn_v_Page_ToNextChar(_p_stFile);
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
SCR_CEND(;)
/*
*-------------------------------------------------------------------------------------------------
* To get the current line.
* _p_stFile : File concerned.
* _p_szDest : Destination buffer.
*-------------------------------------------------------------------------------------------------
*/
unsigned int SCR_fn_ui_SvL1_GetLine(SCR_tdst_File_Description *_p_stFile, char *_p_szDest)
SCR_BEGIN
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
int iRead;
unsigned int uiMemo, uiReturn;
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
SCR_M_Dbg_Assert_D(_p_stFile != NULL);
SCR_M_Dbg_Assert_D(_p_szDest != NULL);
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
uiMemo = SCR_g_ui_Pars_NbRead;
uiReturn = 0;
do
{
uiReturn++;
SCR_M_Pars_ReadChar(_p_stFile, iRead);
if((iRead != '\r') && (iRead != '\n') && (iRead != EOF))
*_p_szDest++ = (char) iRead;
} while((iRead != '\n') && (iRead != EOF));
*_p_szDest = '\0';
SCR_g_ui_Pars_NbRead = uiMemo;
SCR_RETURN(uiReturn);
SCR_CEND(0)
/*
*-------------------------------------------------------------------------------------------------
* To go to the next line.
* _p_stFile : File concerned.
*-------------------------------------------------------------------------------------------------
*/
void SCR_fn_v_SvL1_ToNextLine(SCR_tdst_File_Description *_p_stFile)
SCR_BEGIN
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
SCR_tdst_Cxt_Description *p_stContext;
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
SCR_M_Dbg_Assert_D(_p_stFile != NULL);
SCR_M_Dbg_Assert_D(_p_stFile->d_stFirstPage != NULL);
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
_p_stFile = _p_stFile;
p_stContext = fnp_st_Cxt_Compute(0);
fn_i_Anl_LineToContext(p_stContext);
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
SCR_CEND(;)
/*
*-------------------------------------------------------------------------------------------------
* To place current position to the next section.
* _p_stFile : File concerned.
*-------------------------------------------------------------------------------------------------
*/
void SCR_fn_v_SvL1_ToNextSection(SCR_tdst_File_Description *_p_stFile)
SCR_BEGIN
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
SCR_tdst_Cxt_Description *p_stContext;
int iRead;
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
SCR_M_Dbg_Assert_D(_p_stFile != NULL);
SCR_M_Dbg_Assert_D(_p_stFile->d_stFirstPage != NULL);
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
_p_stFile = _p_stFile;
p_stContext = fnp_st_Cxt_Compute(0);
iRead = fn_i_Anl_LineToContext(p_stContext);
while(iRead != EOF)
{
if(p_stContext->eParseType == SCR_EPT_Cxt_BeginSection)
SCR_RETURN(;);
iRead = fn_i_Anl_LineToContext(p_stContext);
}
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
SCR_CEND(;)
/*
*-------------------------------------------------------------------------------------------------
* To place current position to the end of current section.
* _p_stFile : File concerned.
*-------------------------------------------------------------------------------------------------
*/
void SCR_fn_v_SvL1_ToEndSection(SCR_tdst_File_Description *_p_stFile)
SCR_BEGIN
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
SCR_tdst_Cxt_Description *p_stContext;
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
SCR_M_Dbg_Assert_D(_p_stFile != NULL);
SCR_M_Dbg_Assert_D(_p_stFile->d_stFirstPage != NULL);
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
_p_stFile = _p_stFile;
p_stContext = fnp_st_Cxt_Compute(0);
fn_v_Anl_ContextToEndSection(p_stContext);
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
SCR_CEND(;)
/*===============================================================================================*/
/*
*-------------------------------------------------------------------------------------------------
* To delete current line.
* _p_stFile : File concerned.
*-------------------------------------------------------------------------------------------------
*/
void SCR_fn_v_SvL1_DeleteLine(SCR_tdst_File_Description *_p_stFile)
SCR_BEGIN
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
SCR_tdst_Page_Description *p_stPage;
char cChar;
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
SCR_M_Dbg_Assert_D(_p_stFile != NULL);
SCR_M_Dbg_Assert_D(_p_stFile->d_stFirstPage != NULL);
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
p_stPage = _p_stFile->d_stCurPage;
/*
* To the beginning of line.
*/
do
{
if((_p_stFile->iCurPosInPage == 0) && (_p_stFile->d_stCurPage->p_stPrev == NULL))
break;
fn_v_Page_ToPrevChar(_p_stFile);
cChar = _p_stFile->d_stCurPage->d_cBuffer[_p_stFile->iCurPosInPage];
} while(cChar != '\n');
if(cChar == '\n')
fn_v_Page_ToNextChar(_p_stFile);
/*
* Delete line.
*/
cChar = _p_stFile->d_stCurPage->d_cBuffer[_p_stFile->iCurPosInPage];
while((cChar != '\n') && (cChar != 0))
{
fn_v_Page_DeleteChar(_p_stFile);
cChar = _p_stFile->d_stCurPage->d_cBuffer[_p_stFile->iCurPosInPage];
}
if(cChar == '\n')
fn_v_Page_DeleteChar(_p_stFile);
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
SCR_CEND(;)
/*
*-------------------------------------------------------------------------------------------------
* To delete current section.
* _p_stFile : File concerned.
*-------------------------------------------------------------------------------------------------
*/
void SCR_fn_v_SvL1_DeleteSection(SCR_tdst_File_Description *_p_stFile)
SCR_BEGIN
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
SCR_tdst_Page_Description *p_stMemo, *p_stDest;
int iCount, iMemo, iDest;
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
SCR_M_Dbg_Assert_D(_p_stFile != NULL);
SCR_M_Dbg_Assert_D(_p_stFile->d_stFirstPage != NULL);
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
/*
* Save current position.
*/
p_stMemo = _p_stFile->d_stCurPage;
iMemo = _p_stFile->iCurPosInPage;
/*
* Get position of end of section.
*/
SCR_fn_v_SvL1_ToEndSection(_p_stFile);
p_stDest = _p_stFile->d_stCurPage;
iDest = _p_stFile->iCurPosInPage;
/*
* Restore previous position.
*/
_p_stFile->d_stCurPage = p_stMemo;
_p_stFile->iCurPosInPage = iMemo;
/*
* Same page ?.
*/
if(p_stMemo == p_stDest)
iCount = iDest - iMemo;
else
{
/* Count number of characters to delete */
iCount = p_stMemo->iNumOfChars - iMemo; /* First page */
while(p_stMemo->p_stNext != p_stDest)
{
p_stMemo = p_stMemo->p_stNext;
iCount += p_stMemo->iNumOfChars;
}
iCount += iDest; /* Last page */
}
/*
* Delete all characters.
*/
while(_p_stFile->iCurPosInPage + iCount > _p_stFile->d_stCurPage->iNumOfChars)
{
if(_p_stFile->iCurPosInPage == 0)
{
iCount -= (_p_stFile->d_stCurPage->iNumOfChars - _p_stFile->iCurPosInPage);
p_stMemo = _p_stFile->d_stCurPage;
_p_stFile->d_stCurPage = _p_stFile->d_stCurPage->p_stNext;
_p_stFile->iCurPosInPage = 0;
fn_v_Page_Unlink(_p_stFile, p_stMemo);
fn_v_Page_Free(p_stMemo);
}
else
{
iCount -= (_p_stFile->d_stCurPage->iNumOfChars - _p_stFile->iCurPosInPage);
_p_stFile->d_stCurPage->iNumOfChars -= (_p_stFile->d_stCurPage->iNumOfChars - _p_stFile->iCurPosInPage);
_p_stFile->d_stCurPage = _p_stFile->d_stCurPage->p_stNext;
_p_stFile->iCurPosInPage = 0;
}
}
while(iCount--)
fn_v_Page_DeleteChar(_p_stFile);
/*
* Delete section header.
*/
SCR_fn_v_SvL1_ToPrevLine(_p_stFile);
SCR_fn_v_SvL1_DeleteLine(_p_stFile);
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
SCR_CEND(;)
/*===============================================================================================*/
/*
*-------------------------------------------------------------------------------------------------
* To update one notification.
* _p_stNotify : First notification.
* _p_stOpenFile : File to update.
* _eAction : Action to notify.
* _eRealAction : Just in case of a dual action, only this one will be treat.
* _cFileCreated : The file has just been created cause it didn't exist.
* Return 1 to continue, 0 to stop.
*-------------------------------------------------------------------------------------------------
*/
char fn_c_SvL1_UpdateWithAction
(
SCR_tdst_Ntfy_Description *_p_stNotify,
SCR_tdst_File_Open *_p_stOpenFile,
SCR_tdst_Cxt_Description *_p_stContext,
SCR_tde_Ntfy_Action _eAction,
SCR_tde_Ntfy_Action _eRealAction,
char _cFileCreated
)
{
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
char *p_szLastSep, *p_szFirstSep;
char cSectionExists;
char a_szTemp[SCR_CV_ui_Cfg_MaxLenName];
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
/*
* Pre-processing for AddOr????.
* For a file, only take care of "_bFileCreated".
*/
switch(_p_stNotify->eAction)
{
/*-----------------------------------------------------------------------------------*/
case SCR_EA_Ntfy_AddOrModifySection:
/*-----------------------------------------------------------------------------------*/
if(strchr(_p_stNotify->a_szSectionName, SCR_CC_c_Cfg_NameSeparator))
cSectionExists = SCR_fn_c_RdL0_IsSectionExists(_p_stNotify->a_szSectionName);
else
{
if(_cFileCreated)
cSectionExists = 0;
else
cSectionExists = 1;
}
if(cSectionExists)
_p_stNotify->eAction = SCR_EA_Ntfy_ModifySection;
else
_p_stNotify->eAction = SCR_EA_Ntfy_AddSection;
break;
/*-----------------------------------------------------------------------------------*/
case SCR_EA_Ntfy_AddOrRebuildSection:
/*-----------------------------------------------------------------------------------*/
if(strchr(_p_stNotify->a_szSectionName, SCR_CC_c_Cfg_NameSeparator))
cSectionExists = SCR_fn_c_RdL0_IsSectionExists(_p_stNotify->a_szSectionName);
else
{
if(_cFileCreated)
cSectionExists = 0;
else
cSectionExists = 1;
}
if(cSectionExists)
_p_stNotify->eAction = SCR_EA_Ntfy_RebuildSection;
else
_p_stNotify->eAction = SCR_EA_Ntfy_AddSection;
break;
/*-----------------------------------------------------------------------------------*/
case SCR_EA_Ntfy_DeleteIfExists:
/*-----------------------------------------------------------------------------------*/
if(strchr(_p_stNotify->a_szSectionName, SCR_CC_c_Cfg_NameSeparator))
cSectionExists = SCR_fn_c_RdL0_IsSectionExists(_p_stNotify->a_szSectionName);
else
{
if(_cFileCreated)
cSectionExists = 0;
else
cSectionExists = 1;
}
if(cSectionExists)
_p_stNotify->eAction = SCR_EA_Ntfy_DeleteSection;
else
_p_stNotify->eAction = SCR_EA_Ntfy_Dummy;
break;
}
/*
* End for a dummy action or if action is not the same that real action.
*/
if
(
(_p_stNotify->eAction == SCR_EA_Ntfy_Dummy)
|| (_p_stNotify->eAction != _eRealAction)
)
{
return 1;
}
/*
* We place file to good section.
* For an SCR_EA_Ntfy_AddSection, we place file to parent section.
*/
p_szFirstSep = strchr(_p_stNotify->a_szSectionName, SCR_CC_c_Cfg_NameSeparator);
p_szLastSep = strrchr(_p_stNotify->a_szSectionName, SCR_CC_c_Cfg_NameSeparator);
if(_p_stNotify->eAction == SCR_EA_Ntfy_AddSection)
{
/* We compute parent section name */
if(p_szFirstSep == p_szLastSep)
p_szFirstSep = NULL; /* Parent section name is the file */
else
*p_szLastSep = '\0'; /* Parent section name is a section */
}
/* Really place file to good position */
if(p_szFirstSep == NULL)
fn_v_Anl_ContextToFile(_p_stContext);
else
fn_v_Anl_ContextToSection(_p_stContext, _p_stNotify->a_szSectionName);
/* Force character to be good (in case of a SCR_EA_Ntfy_AddSection) */
if(p_szLastSep)
*p_szLastSep = SCR_CC_c_Cfg_NameSeparator;
/*
* Update modification file.
*/
switch(_p_stNotify->eAction)
{
case SCR_EA_Ntfy_DeleteSection:
SCR_M_v_SvL1_UpdateModify("(D)");
break;
case SCR_EA_Ntfy_RebuildSection:
SCR_M_v_SvL1_UpdateModify("(R)");
break;
case SCR_EA_Ntfy_AddSection:
SCR_M_v_SvL1_UpdateModify("(A)");
break;
case SCR_EA_Ntfy_ModifySection:
SCR_M_v_SvL1_UpdateModify("(M)");
break;
}
SCR_M_v_SvL1_UpdateModify(_p_stNotify->a_szSectionName);
SCR_M_v_SvL1_UpdateModify("\n");
switch(_p_stNotify->eAction)
{
/*
* We delete an existing section.
* => Delete all notifications to sub sections.
* => For a file, delete it.
* => Exit.
*/
/*-----------------------------------------------------------------------------------*/
case SCR_EA_Ntfy_DeleteSection:
/*-----------------------------------------------------------------------------------*/
/*
* Delete all notifications to subsections.
*/
strcpy(a_szTemp, _p_stNotify->a_szSectionName);
strcat(a_szTemp, SCR_CC_sz_Cfg_NameSeparator);
SCR_fn_v_SvL1_DeleteRegisterNotify(a_szTemp, SCR_CDR_c_RdL0_Contains);
/*
* Call the callback.
*/
if(_p_stNotify->pfn_vCallback)
{
_p_stNotify->pfn_vCallback
(
&_p_stOpenFile->stFile,
_p_stNotify->a_szSectionName,
_p_stNotify->p_vData,
_p_stNotify->eAction
);
}
_p_stNotify->eAction = SCR_EA_Ntfy_Dummy;
/*
* For a file, delete it.
*/
if(strchr(_p_stNotify->a_szSectionName, SCR_CC_c_Cfg_NameSeparator) == NULL)
{
unlink(_p_stNotify->a_szSectionName);
return 0; /* We return 0 to stop notifications of that file */
}
/* Else delete for section too */
SCR_fn_v_SvL1_DeleteSection(&_p_stOpenFile->stFile);
break;
/*
* We rebuild an existing section.
*/
/*-----------------------------------------------------------------------------------*/
case SCR_EA_Ntfy_RebuildSection:
/*-----------------------------------------------------------------------------------*/
SCR_fn_v_SvL1_DeleteSection(&_p_stOpenFile->stFile);
/*
* We add or rebuild an existing section.
*/
/*-----------------------------------------------------------------------------------*/
case SCR_EA_Ntfy_AddSection:
/*-----------------------------------------------------------------------------------*/
case SCR_EA_Ntfy_ModifySection:
/*-----------------------------------------------------------------------------------*/
if(_p_stNotify->pfn_vCallback)
{
_p_stNotify->pfn_vCallback
(
&_p_stOpenFile->stFile,
_p_stNotify->a_szSectionName,
_p_stNotify->p_vData,
_p_stNotify->eAction
);
}
break;
}
/* This notification has already been done */
_p_stNotify->eAction = SCR_EA_Ntfy_Dummy;
/* Delete parsing infos to force update */
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);
memset(&_p_stOpenFile->stParsingInfos, 0, sizeof(SCR_tdst_Pars_Infos));
fn_v_Anl_ContextToFile(_p_stContext);
return 1;
}
/*
*-------------------------------------------------------------------------------------------------
* To update one notification.
* _p_stNotify : Notification to update.
* _eWantedAction : Really wanted action.
*-------------------------------------------------------------------------------------------------
*/
void fn_v_SvL1_UpdateOneNotify
(
SCR_tdst_Ntfy_Description *_p_stNotify,
SCR_tde_Ntfy_Action _eWantedAction
)
{
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
char *p_szSection, *p_szTemp;
SCR_tdst_File_Open *p_stOpenFile;
SCR_tdst_Cxt_Description *p_stContext;
SCR_tdx_Hash_Key xHashKey;
char a_szFileName[_MAX_PATH];
char cFileCreated;
/*ANNECY CB*/
char a_szTempName1[_MAX_PATH];
char a_szTempName[_MAX_PATH];
SCR_FILE xHandle;
char cHasRead = 0;
/*END ANNECY*/
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
SCR_M_Dbg_AssertStruct_P(SCR_tdst_Ntfy_Description, _p_stNotify);
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
/*
* Inits for file.
*/
p_szSection = strchr(_p_stNotify->a_szSectionName, SCR_CC_c_Cfg_NameSeparator);
if(p_szSection)
*p_szSection = '\0';
strcpy(a_szFileName, _p_stNotify->a_szSectionName);
if(p_szSection)
*p_szSection = SCR_CC_c_Cfg_NameSeparator;
/*
* We verify that path is here, else we create it.
*/
p_szTemp = strrchr(a_szFileName, '\\');
if(p_szTemp)
{
*p_szTemp = '\0';
SCR_fn_v_RdL0_ValidatePath(a_szFileName, p_szTemp + 1);
*p_szTemp = '\\';
}
/*ANNECY CB*/
#if 0
/*
* If file is in memory (cause it has been analysed), we delete it cause it will
* be corrupt.
*/
xHashKey = SCR_fn_x_Hash_ComputeHashKeyForString(a_szFileName);
p_stOpenFile = fnp_st_File_SearchOpen(a_szFileName, xHashKey);
if(p_stOpenFile)
fn_v_File_DeleteOpen(p_stOpenFile);
/*
* Add a new free open file.
*/
p_stOpenFile = fnp_st_File_AddOpen(a_szFileName, xHashKey);
#endif
/*END*/
/*
* We determin if file exists. If not we created it.
*/
cFileCreated = 0;
/*ANNECY CB*/
if((xHandle = SCR_M_p_x_File_OpenRead(a_szFileName)) == (SCR_FILE) 0)
/* if((p_stOpenFile->stFile.p_stHandle->xHandle = SCR_M_p_x_File_OpenRead(a_szFileName)) == (SCR_FILE) 0)*/
/*END ANNECY*/
{
/*ANNECY CB*/
if(*gsz_Version)
{
strcpy(a_szTempName, gsz_Version);
if(strchr(_p_stNotify->a_szSectionName, '\\'))
strcat(a_szTempName, strchr(_p_stNotify->a_szSectionName, '\\'));
else
{
strcat(a_szTempName, "\\");
strcat(a_szTempName, _p_stNotify->a_szSectionName);
}
p_szSection = strchr(a_szTempName, SCR_CC_c_Cfg_NameSeparator);
if(p_szSection)
*p_szSection = '\0';
strcpy(a_szTempName1, a_szTempName);
if(p_szSection)
*p_szSection = SCR_CC_c_Cfg_NameSeparator;
if((xHandle = SCR_M_p_x_File_OpenRead(a_szTempName1)) != (SCR_FILE) 0)
{
strcpy(_p_stNotify->a_szSectionName, a_szTempName);
strcpy(a_szFileName, a_szTempName1);
cHasRead = 1;
goto zap;
}
}
if(*gsz_Version1)
{
strcpy(a_szTempName, gsz_Version1);
if(strchr(_p_stNotify->a_szSectionName, '\\'))
strcat(a_szTempName, strchr(_p_stNotify->a_szSectionName, '\\'));
else
{
strcat(a_szTempName, "\\");
strcat(a_szTempName, _p_stNotify->a_szSectionName);
}
p_szSection = strchr(a_szTempName, SCR_CC_c_Cfg_NameSeparator);
if(p_szSection)
*p_szSection = '\0';
strcpy(a_szTempName1, a_szTempName);
if(p_szSection)
*p_szSection = SCR_CC_c_Cfg_NameSeparator;
if((xHandle = SCR_M_p_x_File_OpenRead(a_szTempName1)) != (SCR_FILE) 0)
{
strcpy(_p_stNotify->a_szSectionName, a_szTempName);
strcpy(a_szFileName, a_szTempName1);
cHasRead = 1;
goto zap;
}
}
/*END ANNECY*/
cFileCreated = 1;
/*ANNECY CB*/
if((cHasRead == 0) && (*gsz_Version) && (gc_NoAsk == 0))
{
char _szFileName[255];
char szText[1000];
if(strrchr(a_szFileName, '\\'))
strcpy(_szFileName, strrchr(a_szFileName, '\\') + 1);
else
strcpy(_szFileName, a_szFileName);
sprintf(szText, "Do you want to create %s file in parallel %s tree ?", _szFileName, gsz_Version);
if(MessageBox(NULL, szText, "Scripts", MB_YESNO) == IDYES)
{
strcpy(_p_stNotify->a_szSectionName, a_szTempName);
strcpy(a_szFileName, a_szTempName1);
/* We eventually create path */
p_szSection = strchr(_p_stNotify->a_szSectionName, SCR_CC_c_Cfg_NameSeparator);
if(p_szSection) *p_szSection = '\0';
strcpy(a_szFileName, _p_stNotify->a_szSectionName);
if(p_szSection) *p_szSection = SCR_CC_c_Cfg_NameSeparator;
p_szTemp = strrchr(a_szFileName, '\\');
if(p_szTemp)
{
*p_szTemp = '\0';
SCR_fn_v_RdL0_ValidatePath(a_szFileName, p_szTemp + 1);
*p_szTemp = '\\';
}
}
}
if((xHandle = SCR_M_p_x_File_OpenWrite(a_szFileName)) == (SCR_FILE) 0)
/* if((p_stOpenFile->stFile.p_stHandle->xHandle = SCR_M_p_x_File_OpenWrite(a_szFileName)) == (SCR_FILE) 0)*/
/*END ANNECY*/
{
sprintf(g_st_Err_GlobalError.a_szBufferTmp1, "File is \"%s\".", a_szFileName);
*g_st_Err_GlobalError.a_szBufferTmp2 = '\0';
SCR_M_Err_RaiseError(SCR_EI_Err_OpenFile);
}
/*
* Close the file an open it to read.
*/
/*ANNECY CB*/
#ifdef SCR_DM_OptCFiles
close(xHandle);
#else
fclose(xHandle);
#endif
/* SCR_M_File_Close(&p_stOpenFile->stFile);*/
if((xHandle = SCR_M_p_x_File_OpenRead(a_szFileName)) == (SCR_FILE) 0)
/* if((p_stOpenFile->stFile.p_stHandle->xHandle = SCR_M_p_x_File_OpenRead(a_szFileName)) == (SCR_FILE) 0)*/
/*END ANNECY*/
{
sprintf(g_st_Err_GlobalError.a_szBufferTmp1, "File is \"%s\".", a_szFileName);
*g_st_Err_GlobalError.a_szBufferTmp2 = '\0';
SCR_M_Err_RaiseError(SCR_EI_Err_OpenFile);
}
}
/*ANNECY CB*/
zap:
/*
* If file is in memory (cause it has been analysed), we delete it cause it will
* be corrupt.
*/
xHashKey = SCR_fn_x_Hash_ComputeHashKeyForString(a_szFileName);
p_stOpenFile = fnp_st_File_SearchOpen(a_szFileName, xHashKey);
if(p_stOpenFile)
fn_v_File_DeleteOpen(p_stOpenFile);
/*
* Add a new free open file.
*/
p_stOpenFile = fnp_st_File_AddOpen(a_szFileName, xHashKey);
p_stOpenFile->stFile.p_stHandle->xHandle = xHandle;
/*END ANNECY*/
/*
* We add one open context.
* We add one open file.
* We load file.
*/
p_stContext = fnp_st_Cxt_Add();
p_stContext->p_stOpenFile = p_stOpenFile;
fn_v_Page_LoadFile(&p_stOpenFile->stFile);
SCR_M_File_Close(&p_stOpenFile->stFile);
/*
* Update all notifications in a given order.
*/
if
(
fn_c_SvL1_UpdateWithAction
(
_p_stNotify,
p_stOpenFile,
p_stContext,
_p_stNotify->eAction,
_eWantedAction,
cFileCreated
)
)
{
/*
* We save the file.
* We delete the open file (that close it too).
* We delete last context.
*/
if((p_stOpenFile->stFile.p_stHandle->xHandle = SCR_M_p_x_File_OpenWrite(a_szFileName)) == (SCR_FILE) 0)
{
sprintf(g_st_Err_GlobalError.a_szBufferTmp1, "File is \"%s\".", a_szFileName);
*g_st_Err_GlobalError.a_szBufferTmp2 = '\0';
SCR_M_Err_RaiseError(SCR_EI_Err_OpenFile);
}
fn_v_Page_SaveFile(&p_stOpenFile->stFile);
}
fn_v_File_DeleteOpen(p_stContext->p_stOpenFile);
fn_v_Cxt_DeleteLast();
}
/*
*-------------------------------------------------------------------------------------------------
* To sort all notifications.
*-------------------------------------------------------------------------------------------------
*/
int fn_i_SvL1_SortNotifications(const void *_p_v1, const void *_p_v2)
{
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
SCR_tdst_Ntfy_Description *p_st1, *p_st2;
int iLen1, iLen2;
char *p_szTemp;
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
if
(
(((SCR_tdst_DyAr_Element *) _p_v1)->eState != SCR_EDAS_DyAr_Occupy)
&& (((SCR_tdst_DyAr_Element *) _p_v2)->eState != SCR_EDAS_DyAr_Occupy)
)
return 0;
if
(
(((SCR_tdst_DyAr_Element *) _p_v1)->eState == SCR_EDAS_DyAr_Occupy)
&& (((SCR_tdst_DyAr_Element *) _p_v2)->eState != SCR_EDAS_DyAr_Occupy)
)
return 1;
if
(
(((SCR_tdst_DyAr_Element *) _p_v1)->eState != SCR_EDAS_DyAr_Occupy)
&& (((SCR_tdst_DyAr_Element *) _p_v2)->eState == SCR_EDAS_DyAr_Occupy)
)
return -1;
p_st1 = (SCR_tdst_Ntfy_Description *) ((SCR_tdst_DyAr_Element *) _p_v1)->d_vElement;
p_st2 = (SCR_tdst_Ntfy_Description *) ((SCR_tdst_DyAr_Element *) _p_v2)->d_vElement;
/*
* Sorted section to subsections.
*/
iLen1 = 0;
p_szTemp = strchr(p_st1->a_szSectionName, SCR_CC_c_Cfg_NameSeparator);
while(p_szTemp)
{
iLen1++;
p_szTemp = strchr(p_szTemp + 1, SCR_CC_c_Cfg_NameSeparator);
}
iLen2 = 0;
p_szTemp = strchr(p_st2->a_szSectionName, SCR_CC_c_Cfg_NameSeparator);
while(p_szTemp)
{
iLen2++;
p_szTemp = strchr(p_szTemp + 1, SCR_CC_c_Cfg_NameSeparator);
}
return iLen1 == iLen2 ? 0 : iLen1 < iLen2 ? -1 : 1;
}
/*
*-------------------------------------------------------------------------------------------------
* To delete current section.
* _p_stFile : File concerned.
*-------------------------------------------------------------------------------------------------
*/
void SCR_fn_v_SvL1_UpdateAllNotify(void)
SCR_BEGIN
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
unsigned int uiPos;
SCR_tdst_Ntfy_Description *p_stNotify;
SCR_tde_Ntfy_Action eWantedAction, eCurrentAction;
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
/*
*---------------------------------------------------------------------------------------------
* We sort notifications.
*---------------------------------------------------------------------------------------------
*/
qsort
(
SCR_g_st_Ntfy_Array.d_stDynArray,
SCR_g_st_Ntfy_Array.uiNumValues,
sizeof(SCR_tdst_DyAr_Element),
fn_i_SvL1_SortNotifications
);
/*
* We restore index in array cause of sort.
*/
uiPos = 0;
SCR_M_DyAr_GetNextElement(SCR_tdst_Ntfy_Description, uiPos, p_stNotify, SCR_g_st_Ntfy_Array);
while(p_stNotify)
{
p_stNotify->stHeader.uiIndexInArray = uiPos;
uiPos++;
SCR_M_DyAr_GetNextElement(SCR_tdst_Ntfy_Description, uiPos, p_stNotify, SCR_g_st_Ntfy_Array);
}
/*
*---------------------------------------------------------------------------------------------
* We update notifications.
*---------------------------------------------------------------------------------------------
*/
eCurrentAction = eWantedAction = SCR_EA_Ntfy_DeleteSection;
while(eCurrentAction != SCR_EA_Ntfy_Dummy)
{
uiPos = 0;
SCR_M_DyAr_GetNextElement(SCR_tdst_Ntfy_Description, uiPos, p_stNotify, SCR_g_st_Ntfy_Array);
while(p_stNotify)
{
/* Update if not already done */
if(p_stNotify->eAction == eCurrentAction)
fn_v_SvL1_UpdateOneNotify(p_stNotify, eWantedAction);
uiPos++;
SCR_M_DyAr_GetNextElement(SCR_tdst_Ntfy_Description, uiPos, p_stNotify, SCR_g_st_Ntfy_Array);
}
/*
* Pass to next notification.
* Order is :
* - Delete
* - DeleteIfExists
* - Rebuild
* - AddOrRebuild with Rebuild
* - Modify
* - AddOrModify with Modify
* - AddOrRebuild with Add
* - AddOrModify with Add
* - Add
*/
switch(eCurrentAction)
{
case SCR_EA_Ntfy_DeleteSection:
eCurrentAction = SCR_EA_Ntfy_DeleteIfExists;
eWantedAction = SCR_EA_Ntfy_DeleteSection;
break;
case SCR_EA_Ntfy_DeleteIfExists:
eCurrentAction = eWantedAction = SCR_EA_Ntfy_RebuildSection;
break;
case SCR_EA_Ntfy_RebuildSection:
eCurrentAction = SCR_EA_Ntfy_AddOrRebuildSection;
eWantedAction = SCR_EA_Ntfy_RebuildSection;
break;
case SCR_EA_Ntfy_AddOrRebuildSection:
if(eWantedAction == SCR_EA_Ntfy_RebuildSection)
eCurrentAction = eWantedAction = SCR_EA_Ntfy_ModifySection;
else
{
eCurrentAction = SCR_EA_Ntfy_AddOrModifySection;
eWantedAction = SCR_EA_Ntfy_AddSection;
}
break;
case SCR_EA_Ntfy_ModifySection:
eCurrentAction = SCR_EA_Ntfy_AddOrModifySection;
eWantedAction = SCR_EA_Ntfy_ModifySection;
break;
case SCR_EA_Ntfy_AddOrModifySection:
if(eWantedAction == SCR_EA_Ntfy_ModifySection)
{
eCurrentAction = SCR_EA_Ntfy_AddOrRebuildSection;
eWantedAction = SCR_EA_Ntfy_AddSection;
}
else
eCurrentAction = eWantedAction = SCR_EA_Ntfy_AddSection;
break;
case SCR_EA_Ntfy_AddSection:
eCurrentAction = SCR_EA_Ntfy_Dummy;
break;
}
}
/*
* Delete all notifications.
*/
fn_v_Ntfy_CloseModule();
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
SCR_CEND(;)
/*
*-------------------------------------------------------------------------------------------------
* To set modification file list name.
* _p_szName : Name to set.
*-------------------------------------------------------------------------------------------------
*/
void SCR_fn_v_SvL1_SetModificationFileName(char *_p_szName)
SCR_BEGIN
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
SCR_M_Dbg_Assert_D(_p_szName != NULL);
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
strcpy(gs_a_szModifyFileName, _p_szName);
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
SCR_CEND(;)