1270 lines
41 KiB
C++
1270 lines
41 KiB
C++
/*
|
|
=======================================================================================
|
|
Name : Scr_Fct.cpp
|
|
|
|
Author : vincent lhullier Date :08/09/97
|
|
|
|
Description : script function to parse a file
|
|
=======================================================================================
|
|
*/
|
|
|
|
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
|
|
#include "inidata.h"
|
|
#include "SCR_Fct.h"
|
|
#include "SpecRef.h"
|
|
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
|
|
|
|
/*
|
|
=======================================================================================
|
|
Globals
|
|
=======================================================================================
|
|
*/
|
|
|
|
|
|
SCR_tdst_Link_Table g_stSectionTypeLinkTable; /* link table for section type */
|
|
SCR_tdst_Link_Table g_stSectionLinkTable; /* link table for section */
|
|
SCR_tdst_Link_Table g_stRefLinkTable; /* link table for references */
|
|
SCR_tdst_Link_Table g_stFileLinkTable; /* Link table for files */
|
|
|
|
/*
|
|
=======================================================================================
|
|
load/save functions
|
|
=======================================================================================
|
|
*/
|
|
|
|
/*
|
|
----------------------------------------------------------------------------------------
|
|
Description : save all entry to describe all section entry
|
|
_p_stFileDes -> file
|
|
_p_stSection -> section
|
|
----------------------------------------------------------------------------------------
|
|
*/
|
|
void fn_Scr_vSaveSectionEntry( SCR_tdst_File_Description *_p_stFileDes, SCR_tdst_DyAr_Description *_p_stSectionEntryDyAr )
|
|
{
|
|
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
|
|
tdstEntry *p_stEntry;
|
|
unsigned int uiEntry;
|
|
char szParamString[21], szText[1024], *p_szText;
|
|
char cParam, cParamState;
|
|
char *a_szParam[3] = { NULL, szParamString, szText };
|
|
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
|
|
|
|
/*
|
|
* for each entry
|
|
*/
|
|
for (uiEntry = 0; uiEntry < _p_stSectionEntryDyAr->uiNumValues; uiEntry ++)
|
|
{
|
|
SCR_M_DyAr_GetElement( tdstEntry, uiEntry, p_stEntry, (*_p_stSectionEntryDyAr) );
|
|
|
|
/*
|
|
* save entry name
|
|
*/
|
|
SCR_M_SvL0_SaveEntry( _p_stFileDes, "Entry", SCR_CC_C_Cfg_NoChar );
|
|
|
|
/*
|
|
* compute first parameter : entry name
|
|
*/
|
|
a_szParam[0] = p_stEntry->szName;
|
|
/*
|
|
* compute second parameter : perameter states
|
|
*/
|
|
for (cParam = 0; cParam < p_stEntry->cNumberOfParams; cParam++)
|
|
{
|
|
cParamState = p_stEntry->a_cIsRef[cParam];
|
|
szParamString[cParam] = (cParamState == 0) ? '_' : (cParamState == 1) ? 'R' : 'S';
|
|
}
|
|
szParamString[cParam] = 0;
|
|
|
|
/*
|
|
* compute third param : entry sample
|
|
*/
|
|
strcpy( szText, p_stEntry->szSample );
|
|
p_szText = szText;
|
|
while( *p_szText != 0)
|
|
{
|
|
if (*p_szText == '"') *p_szText = 39;
|
|
p_szText++;
|
|
}
|
|
/*
|
|
* save parameters
|
|
*/
|
|
SCR_fn_v_SvL0_SaveParameters_AP( _p_stFileDes, SCR_EF_SvL0_Normal, 3, a_szParam );
|
|
}
|
|
}
|
|
|
|
|
|
/*
|
|
----------------------------------------------------------------------------------------
|
|
Description : save all section types in a script file
|
|
----------------------------------------------------------------------------------------
|
|
*/
|
|
void fn_Scr_vSaveSectionTypes( void )
|
|
{
|
|
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
|
|
SCR_FILE xFile;
|
|
SCR_tdst_File_Description stFileDes;
|
|
SCR_tdst_DyAr_Description *p_stDyAr;
|
|
SCR_tdst_Link_Value *p_stValue;
|
|
unsigned int uiSection;
|
|
char szText[256];
|
|
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
|
|
|
|
/*
|
|
* Open file and init file des
|
|
*/
|
|
xFile = SCR_M_p_x_File_OpenWrite( g_stIniData.szSectionFile );
|
|
SCR_fn_v_File_InitFileDes( &stFileDes, g_stIniData.szSectionFile, xFile );
|
|
|
|
/*
|
|
* save script header
|
|
*/
|
|
SCR_M_SvL0_SaveScriptFileHeader( &stFileDes );
|
|
|
|
/*
|
|
* save each section
|
|
*/
|
|
p_stDyAr = &g_stSectionTypeLinkTable.stLinkArray;
|
|
for (uiSection = 0; uiSection < p_stDyAr->uiNumValues; uiSection ++)
|
|
{
|
|
SCR_M_DyAr_GetElement( SCR_tdst_Link_Value, uiSection, p_stValue, g_stSectionTypeLinkTable.stLinkArray );
|
|
|
|
/*
|
|
* save section beginning
|
|
*/
|
|
sprintf( szText, "SectionType:%s", p_stValue->p_szKey );
|
|
SCR_M_SvL0_SaveBeginSection( &stFileDes, szText, SCR_CC_C_Cfg_EOL );
|
|
|
|
/*
|
|
* save all entries in section
|
|
*/
|
|
fn_Scr_vSaveSectionEntry( &stFileDes, (SCR_tdst_DyAr_Description *) p_stValue->ulValue );
|
|
|
|
/*
|
|
* save end of section
|
|
*/
|
|
SCR_M_SvL0_SaveEndSection( &stFileDes, SCR_CC_C_Cfg_EOL );
|
|
}
|
|
|
|
|
|
/*
|
|
* Close file
|
|
*/
|
|
SCR_fn_v_File_CloseFileDes( &stFileDes );
|
|
}
|
|
|
|
|
|
/*
|
|
----------------------------------------------------------------------------------------
|
|
4 Description : Callback to analyse a SectionType section
|
|
----------------------------------------------------------------------------------------
|
|
*/
|
|
SCR_tde_Anl_ReturnValue fn_Scr_eCallbackForSectionType(SCR_tdst_File_Description *_p_stFile, char *_szAction, char *_szParams[], SCR_tde_Anl_Action _eType)
|
|
{
|
|
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
|
|
SCR_tdst_Link_Value *p_stLinkValue;
|
|
SCR_tdst_DyAr_Description *p_stSectionEntryDyAr;
|
|
tdstEntry *p_stEntry;
|
|
char cParam;
|
|
unsigned int uiPos;
|
|
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
|
|
|
|
switch ( _eType )
|
|
{
|
|
case SCR_EA_Anl_BeginSection:
|
|
p_stLinkValue = SCR_fnp_st_Link_CreateOrGetLinkFromKey( &g_stSectionTypeLinkTable, _szAction );
|
|
if (p_stLinkValue->eState == SCR_ELS_Link_NotInitialized)
|
|
{
|
|
p_stSectionEntryDyAr = (SCR_tdst_DyAr_Description *) malloc (sizeof( SCR_tdst_DyAr_Description ) );
|
|
fn_v_DyAr_InitArray( p_stSectionEntryDyAr );
|
|
p_stLinkValue->eState = SCR_ELS_Link_Initialized;
|
|
p_stLinkValue->ulValue = (unsigned long) p_stSectionEntryDyAr;
|
|
p_stLinkValue->stInfos.ulLong1 = 0;
|
|
p_stLinkValue->stInfos.ulLong2 = 0;
|
|
}
|
|
else
|
|
{
|
|
p_stSectionEntryDyAr = (SCR_tdst_DyAr_Description *) p_stLinkValue->ulValue;
|
|
}
|
|
SCR_M_RdL0_SetContextLong(0,0, p_stSectionEntryDyAr);
|
|
break;
|
|
|
|
case SCR_EA_Anl_Entry:
|
|
|
|
SCR_M_RdL0_GetContextLong(0,0, SCR_tdst_DyAr_Description *, p_stSectionEntryDyAr);
|
|
p_stEntry = fn_Scr_p_stFindEntry( p_stSectionEntryDyAr, _szParams[0] );
|
|
if (p_stEntry == NULL)
|
|
{
|
|
/*
|
|
* add entry in entry array of section
|
|
*/
|
|
SCR_M_DyAr_AddElement( tdstEntry, uiPos, p_stEntry, (*p_stSectionEntryDyAr) );
|
|
/*
|
|
* set entry data member
|
|
*/
|
|
p_stEntry->szName = (char *) malloc (strlen( _szParams[0] ) + 1);
|
|
strcpy( p_stEntry->szName, _szParams[0] );
|
|
p_stEntry->szSample = (char *) malloc (strlen( _szParams[2] ) + 1);
|
|
strcpy( p_stEntry->szSample, _szParams[2] );
|
|
p_stEntry->cNumberOfParams = strlen( _szParams[1] );
|
|
p_stEntry->cNumberOfRefs = 0;
|
|
for (cParam = 0; cParam < p_stEntry->cNumberOfParams; cParam++)
|
|
{
|
|
if ( _szParams[1][ cParam ] != '_' )
|
|
{
|
|
p_stEntry->cNumberOfRefs++;
|
|
p_stEntry->a_cIsRef[ cParam ] = (_szParams[1][cParam] == 'R') ? 1 : 2;
|
|
}
|
|
else
|
|
{
|
|
p_stEntry->a_cIsRef[ cParam ] = 0;
|
|
}
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
return R_SCRIPT_NormalReturn;
|
|
}
|
|
|
|
/*
|
|
----------------------------------------------------------------------------------------
|
|
Description : load all section types from a script file
|
|
----------------------------------------------------------------------------------------
|
|
*/
|
|
void fn_Scr_vLoadSectionTypes( void )
|
|
{
|
|
/*
|
|
* Register callback for "SectionType" script section
|
|
*/
|
|
SCR_fn_v_RdL0_RegisterCallback( "SectionType", fn_Scr_eCallbackForSectionType, SCR_CRC_c_RdL0_ForSection);
|
|
|
|
/*
|
|
* analyse section type file
|
|
*/
|
|
SCR_fnp_st_RdL0_AnalyseSection( g_stIniData.szSectionFile, SCR_CDF_uw_Anl_Normal );
|
|
|
|
/*
|
|
* delete callback
|
|
*/
|
|
SCR_fn_v_RdL0_DeleteRegisterCallback( "SectionType", SCR_CRC_c_RdL0_ForSection, SCR_CDR_c_RdL0_Match );
|
|
}
|
|
|
|
|
|
/*
|
|
=======================================================================================
|
|
data functions
|
|
=======================================================================================
|
|
*/
|
|
|
|
/*
|
|
----------------------------------------------------------------------------------------
|
|
Description : load an find an entry in a section type
|
|
_p_stSection -> pointer on a section type structure
|
|
_szEntryName -> name of entry to find
|
|
Returns (tdstEntry) pointer on entry if found, otherwise NULL
|
|
----------------------------------------------------------------------------------------
|
|
*/
|
|
tdstEntry *fn_Scr_p_stFindEntry( SCR_tdst_DyAr_Description *_p_stSectionEntryDyAr, char *_szEntryName )
|
|
{
|
|
tdstEntry *p_stEntry;
|
|
unsigned int uiPos;
|
|
|
|
SCR_M_DyAr_SearchElement( tdstEntry, uiPos, p_stEntry, (*_p_stSectionEntryDyAr), strcmp( _szEntryName, p_stEntry->szName) == 0 );
|
|
|
|
return p_stEntry;
|
|
}
|
|
|
|
|
|
/*
|
|
----------------------------------------------------------------------------------------
|
|
Description : Add an entry to a section
|
|
_p_stSection -> section
|
|
_p_stContext -> context that describe entry
|
|
----------------------------------------------------------------------------------------
|
|
*/
|
|
void fn_Scr_vAddEntryToSection( SCR_tdst_DyAr_Description *_p_stSectionEntryDyAr, SCR_tdst_Cxt_Description *_p_stContext )
|
|
{
|
|
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
|
|
tdstEntry *p_stEntry;
|
|
char szSample[512], *p_szSample;
|
|
char *szParam;
|
|
size_t xLenght;
|
|
unsigned int uiPos;
|
|
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
|
|
|
|
p_stEntry = fn_Scr_p_stFindEntry( _p_stSectionEntryDyAr, _p_stContext->stBuffers.a_szBufferNameExt );
|
|
if (p_stEntry == NULL)
|
|
{
|
|
/*
|
|
* add and init entry
|
|
*/
|
|
SCR_M_DyAr_AddElement( tdstEntry, uiPos, p_stEntry, (*_p_stSectionEntryDyAr) );
|
|
memset( p_stEntry, 0, sizeof( tdstEntry) );
|
|
|
|
/*
|
|
* allocate and set name
|
|
*/
|
|
p_stEntry->szName = (char *) malloc ( strlen(_p_stContext->stBuffers.a_szBufferNameExt) + 1 );
|
|
strcpy( p_stEntry->szName, _p_stContext->stBuffers.a_szBufferNameExt );
|
|
|
|
/*
|
|
* build sample and count parameters
|
|
*/
|
|
p_szSample = szSample + sprintf( szSample, "%s", p_stEntry->szName );
|
|
|
|
if ( *_p_stContext->stBuffers.a_szBufferFormat != 0)
|
|
p_szSample += sprintf( p_szSample, "%c%s%c", SCR_CC_c_Cfg_FormatBegMark, _p_stContext->stBuffers.a_szBufferFormat, SCR_CC_c_Cfg_FormatEndMark );
|
|
|
|
if ( *(szParam = _p_stContext->stBuffers.a_szBufferParams) != 0)
|
|
{
|
|
*p_szSample++ = SCR_CC_c_Cfg_ParamBegMark;
|
|
*p_szSample++ = ' ';
|
|
while ( 1 )
|
|
{
|
|
xLenght = strlen( szParam );
|
|
|
|
/* detect a reference ? */
|
|
if ( strcspn( szParam, "^\\") < xLenght)
|
|
{
|
|
p_stEntry->cNumberOfRefs++;
|
|
p_stEntry->a_cIsRef[ p_stEntry->cNumberOfParams ] = 1;
|
|
}
|
|
|
|
p_stEntry->cNumberOfParams++;
|
|
|
|
memcpy( p_szSample, szParam, xLenght );
|
|
p_szSample += xLenght;
|
|
szParam += xLenght + 1;
|
|
|
|
if (*szParam == 0)
|
|
break;
|
|
|
|
*p_szSample++ = SCR_CC_c_Cfg_ParamSeparator;
|
|
*p_szSample++ = ' ';
|
|
}
|
|
*p_szSample++ = SCR_CC_c_Cfg_ParamEndMark;
|
|
*p_szSample = 0;
|
|
}
|
|
|
|
p_stEntry->szSample = (char *) malloc ( p_szSample - szSample + 1 );
|
|
memcpy( p_stEntry->szSample, szSample, p_szSample - szSample + 1 );
|
|
}
|
|
}
|
|
|
|
/*
|
|
----------------------------------------------------------------------------------------
|
|
Description : set to 0 all used value
|
|
----------------------------------------------------------------------------------------
|
|
*/
|
|
void fn_Scr_vResetUsedCounters( void )
|
|
{
|
|
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
|
|
SCR_tdst_DyAr_Description *p_stDyAr;
|
|
SCR_tdst_Link_Value *p_stValue;
|
|
unsigned int uiSection;
|
|
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
|
|
|
|
p_stDyAr = &g_stSectionTypeLinkTable.stLinkArray;
|
|
for (uiSection = 0; uiSection < p_stDyAr->uiNumValues; uiSection ++)
|
|
{
|
|
SCR_M_DyAr_GetElement( SCR_tdst_Link_Value, uiSection, p_stValue, g_stSectionTypeLinkTable.stLinkArray );
|
|
SCR_M_v_Link_SetAdditionalLong( p_stValue, 1, 0 );
|
|
}
|
|
}
|
|
|
|
|
|
/*
|
|
----------------------------------------------------------------------------------------
|
|
Description : compute all section has ref flag. this flag is set if a section
|
|
can have at least one entry with one ref.
|
|
----------------------------------------------------------------------------------------
|
|
*/
|
|
void fn_Scr_vComputeSectionTypeHasRef( void )
|
|
{
|
|
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
|
|
SCR_tdst_DyAr_Description *p_stDyAr;
|
|
SCR_tdst_Link_Value *p_stValue;
|
|
SCR_tdst_DyAr_Description *p_stSectionEntryDyAr;
|
|
tdstEntry *p_stEntry;
|
|
unsigned int uiSection;
|
|
unsigned int uiPos;
|
|
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
|
|
|
|
p_stDyAr = &g_stSectionTypeLinkTable.stLinkArray;
|
|
for (uiSection = 0; uiSection < p_stDyAr->uiNumValues; uiSection ++)
|
|
{
|
|
SCR_M_DyAr_GetElement( SCR_tdst_Link_Value, uiSection, p_stValue, g_stSectionTypeLinkTable.stLinkArray );
|
|
|
|
p_stSectionEntryDyAr = (SCR_tdst_DyAr_Description *) SCR_M_ul_Link_GetValue( p_stValue );
|
|
SCR_M_DyAr_SearchElement( tdstEntry, uiPos, p_stEntry, (*p_stSectionEntryDyAr), p_stEntry->cNumberOfRefs != 0 );
|
|
|
|
SCR_M_v_Link_SetAdditionalLong( p_stValue, 2, (p_stEntry == NULL) ? 0 : 1 );
|
|
|
|
}
|
|
}
|
|
|
|
|
|
/*
|
|
----------------------------------------------------------------------------------------
|
|
Description : free section type list
|
|
----------------------------------------------------------------------------------------
|
|
*/
|
|
void fn_Scr_vFreeSectionTypeList( void )
|
|
{
|
|
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
|
|
SCR_tdst_Link_Value *p_stValue;
|
|
unsigned int uiSection;
|
|
SCR_tdst_DyAr_Description *p_stSectionEntryDyAr;
|
|
tdstEntry *p_stEntry;
|
|
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
|
|
|
|
for (uiSection = 0; uiSection < g_stSectionTypeLinkTable.stLinkArray.uiNumValues; uiSection ++)
|
|
{
|
|
SCR_M_DyAr_GetElement( SCR_tdst_Link_Value, uiSection, p_stValue, g_stSectionTypeLinkTable.stLinkArray );
|
|
|
|
p_stSectionEntryDyAr = (SCR_tdst_DyAr_Description *) p_stValue->ulValue;
|
|
SCR_M_DyAr_DeleteAllElements( tdstEntry, p_stSectionEntryDyAr, p_stEntry = (tdstEntry *) _p_stElement_->d_vElement; free( p_stEntry->szName ); free( p_stEntry->szSample); );
|
|
free ( p_stSectionEntryDyAr );
|
|
}
|
|
}
|
|
|
|
/*
|
|
----------------------------------------------------------------------------------------
|
|
Description : free section type list
|
|
----------------------------------------------------------------------------------------
|
|
*/
|
|
void fn_Scr_vFreeSectionList( void )
|
|
{
|
|
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
|
|
SCR_tdst_DyAr_Description *p_stRefDyAr;
|
|
SCR_tdst_Link_Value *p_stValue;
|
|
unsigned int uiSection;
|
|
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
|
|
|
|
for (uiSection = 0; uiSection < g_stSectionLinkTable.stLinkArray.uiNumValues; uiSection ++)
|
|
{
|
|
SCR_M_DyAr_GetElement( SCR_tdst_Link_Value, uiSection, p_stValue, g_stSectionLinkTable.stLinkArray );
|
|
|
|
if ( p_stValue->ulValue )
|
|
{
|
|
p_stRefDyAr = (SCR_tdst_DyAr_Description *) p_stValue->ulValue;
|
|
SCR_M_DyAr_DeleteAllElements( tdstReference, p_stRefDyAr, ; );
|
|
free ( p_stRefDyAr );
|
|
}
|
|
}
|
|
}
|
|
|
|
/*
|
|
----------------------------------------------------------------------------------------
|
|
Description : free file list
|
|
----------------------------------------------------------------------------------------
|
|
*/
|
|
void fn_Scr_vFreeLTFile( void )
|
|
{
|
|
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
|
|
SCR_tdst_Link_Value *p_stLVFile;
|
|
unsigned int uiFile;
|
|
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
|
|
|
|
for (uiFile = 0; uiFile < g_stFileLinkTable.stLinkArray.uiNumValues; uiFile++)
|
|
{
|
|
SCR_M_DyAr_GetElement( SCR_tdst_Link_Value, uiFile, p_stLVFile, g_stFileLinkTable.stLinkArray );
|
|
|
|
if (p_stLVFile->ulValue)
|
|
{
|
|
SCR_fn_v_Link_CloseTable( (SCR_tdst_Link_Table *) p_stLVFile->ulValue );
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
/*
|
|
=======================================================================================
|
|
Parsing functions
|
|
=======================================================================================
|
|
*/
|
|
|
|
/*
|
|
*-------------------------------------------------------------------------------------------------
|
|
* To parse a line to current context.
|
|
* _p_stContext : Current context.
|
|
*-------------------------------------------------------------------------------------------------
|
|
*/
|
|
int fn_Scr_iLineToContext(SCR_tdst_Cxt_Description *_p_stContext)
|
|
{
|
|
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
|
|
int iRead;
|
|
unsigned int uiNbRead;
|
|
int iCpt;
|
|
char a_szTempBuffer[SCR_CV_ui_Cfg_MaxLenLine + 1];
|
|
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
|
|
//SCR_M_Dbg_AssertStruct_P(SCR_tdst_Cxt_Description, _p_stContext);
|
|
//SCR_M_Dbg_AssertStruct_P(SCR_tdst_File_Open, _p_stContext->p_stOpenFile);
|
|
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
|
|
|
|
/*
|
|
* Parse one line of file.
|
|
*/
|
|
_p_stContext->stBuffers.a_szBufferCompleteName[0] = 0;
|
|
_p_stContext->stPosition.uiLineInFile++;
|
|
|
|
/*
|
|
* If current parsing directive is ignore, we swap the line like a comment
|
|
* (except if it is the $EndComments directive).
|
|
*/
|
|
if(_p_stContext->p_stOpenFile->stParsingInfos.uwDynamicFlags & SCR_CDF_uw_Anl_Comments)
|
|
{
|
|
/*
|
|
* Get the current line.
|
|
*/
|
|
iCpt = 0;
|
|
SCR_g_ui_Pars_NbRead = 0;
|
|
SCR_M_Pars_GetNextNonSpaceChar(&_p_stContext->p_stOpenFile->stFile, iRead);
|
|
while((iRead != '\n') && (iRead != EOF))
|
|
{
|
|
if(!SCR_M_Pars_IsSpace(iRead))
|
|
a_szTempBuffer[iCpt++] = (char) iRead;
|
|
SCR_M_Pars_ReadChar(&_p_stContext->p_stOpenFile->stFile, iRead);
|
|
}
|
|
a_szTempBuffer[iCpt] = '\0';
|
|
uiNbRead = SCR_g_ui_Pars_NbRead;
|
|
|
|
/*
|
|
* Test for end of comment directive.
|
|
*/
|
|
if
|
|
(
|
|
(*a_szTempBuffer != SCR_CC_c_Cfg_DirectiveMark)
|
|
|| (strcmpi(a_szTempBuffer + 1, SCR_CD_sz_Cfg_EndComments))
|
|
)
|
|
{
|
|
_p_stContext->eParseType = SCR_EPT_Cxt_None;
|
|
_p_stContext->stBuffers.a_szBufferName[0] = '\0';
|
|
}
|
|
else
|
|
_p_stContext->p_stOpenFile->stParsingInfos.uwDynamicFlags &= ~SCR_CDF_uw_Anl_Comments;
|
|
}
|
|
else
|
|
{
|
|
iRead = (char) fn_i_Pars_Line
|
|
(
|
|
&_p_stContext->p_stOpenFile->stFile,
|
|
_p_stContext->stBuffers.a_szBufferName,
|
|
_p_stContext->stBuffers.a_szBufferNameExt,
|
|
_p_stContext->stBuffers.a_szBufferFormat,
|
|
_p_stContext->stBuffers.a_szBufferParams,
|
|
&_p_stContext->eParseType,
|
|
&uiNbRead
|
|
);
|
|
}
|
|
|
|
/*
|
|
* Update seek after reading.
|
|
*/
|
|
_p_stContext->stPosition.lAfterSeekInFile += uiNbRead;
|
|
|
|
/* Return last character read */
|
|
return iRead;
|
|
}
|
|
|
|
|
|
/*
|
|
*-------------------------------------------------------------------------------------------------
|
|
* parse a file to get the section type
|
|
* _p_szFileName : file name
|
|
*-------------------------------------------------------------------------------------------------
|
|
*/
|
|
void fn_Scr_vParseFileToBuildListOfSectionTypes(char *_p_szFileName)
|
|
{
|
|
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
|
|
SCR_tdst_Cxt_Description *p_stContext;
|
|
int iRead;
|
|
int cIndent = -1;
|
|
SCR_tdst_DyAr_Description *a_p_stSectionEntryDyAr[ 16 ];
|
|
SCR_tdst_Link_Value *p_stLinkValue;
|
|
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
|
|
SCR_M_Dbg_Assert_D(_p_szFileName != NULL);
|
|
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
|
|
|
|
/*
|
|
* One more context.
|
|
*/
|
|
p_stContext = fnp_st_Cxt_Add();
|
|
|
|
/*
|
|
* Open the file.
|
|
*/
|
|
p_stContext->p_stOpenFile = fnp_st_File_OpenFile(_p_szFileName);
|
|
|
|
/*
|
|
* Place file to its SCR_BEGINing.
|
|
* Parse to the end.
|
|
*/
|
|
fn_v_Anl_ContextToFile(p_stContext);
|
|
do
|
|
{
|
|
iRead = fn_Scr_iLineToContext( p_stContext );
|
|
|
|
if ( p_stContext->eParseType == SCR_EPT_Cxt_BeginSection )
|
|
{
|
|
cIndent++;
|
|
p_stLinkValue = SCR_fnp_st_Link_CreateOrGetLinkFromKey( &g_stSectionTypeLinkTable, p_stContext->stBuffers.a_szBufferName );
|
|
if (p_stLinkValue->eState == SCR_ELS_Link_NotInitialized)
|
|
{
|
|
a_p_stSectionEntryDyAr[ cIndent ] = ( SCR_tdst_DyAr_Description *) malloc (sizeof( SCR_tdst_DyAr_Description ) );
|
|
fn_v_DyAr_InitArray( a_p_stSectionEntryDyAr[ cIndent ] );
|
|
p_stLinkValue->eState = SCR_ELS_Link_Initialized;
|
|
p_stLinkValue->ulValue = (unsigned long) a_p_stSectionEntryDyAr[ cIndent ];
|
|
p_stLinkValue->stInfos.ulLong1 = 1;
|
|
p_stLinkValue->stInfos.ulLong2 = 0;
|
|
}
|
|
else
|
|
{
|
|
a_p_stSectionEntryDyAr[ cIndent ] = ( SCR_tdst_DyAr_Description *) p_stLinkValue->ulValue;
|
|
p_stLinkValue->stInfos.ulLong1++;
|
|
}
|
|
}
|
|
else if ( p_stContext->eParseType == SCR_EPT_Cxt_EndSection )
|
|
{
|
|
cIndent--;
|
|
}
|
|
else if ( p_stContext->eParseType == SCR_EPT_Cxt_Entry )
|
|
{
|
|
if (cIndent >= 0)
|
|
fn_Scr_vAddEntryToSection( a_p_stSectionEntryDyAr[ cIndent ], p_stContext );
|
|
}
|
|
|
|
} while(iRead != EOF);
|
|
|
|
SCR_fn_v_RdL0_DeleteOpenFile( _p_szFileName, SCR_CDR_c_RdL0_Match );
|
|
|
|
/*
|
|
* Delete context. It's finish...
|
|
*/
|
|
fn_v_Cxt_DeleteLast();
|
|
}
|
|
|
|
|
|
/*
|
|
*-------------------------------------------------------------------------------------------------
|
|
* parse a file to get all sections and references
|
|
* _p_szFileName : file name
|
|
*-------------------------------------------------------------------------------------------------
|
|
*/
|
|
void fn_Scr_vParseFileToBuildListOfSectionsAndRefs(char *_p_szFileName)
|
|
{
|
|
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
|
|
SCR_tdst_Cxt_Description *p_stContext;
|
|
int iRead;
|
|
int cIndent = -1;
|
|
char *a_szSectionName[ 16 ];
|
|
char szSectionName[ SCR_CV_ui_Cfg_MaxLenName ];
|
|
SCR_tdst_Link_Value *a_p_stSection[ 16 ];
|
|
SCR_tdst_Link_Value *p_stSectionType;
|
|
SCR_tdst_Link_Value *p_stRefValue;
|
|
SCR_tdst_DyAr_Description *p_stSectionEntryDyAr;
|
|
tdstEntry *p_stEntry;
|
|
SCR_tdst_DyAr_Description *p_stDyAr;
|
|
unsigned int uiPos;
|
|
tdstReference *p_stRef;
|
|
char cRef, cIndex;
|
|
char *szParam;
|
|
char *szRefFileName;
|
|
char szRefName[ SCR_CV_ui_Cfg_MaxLenName ], *p_szRefName, *p_szEndRefFileName;
|
|
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
|
|
// SCR_M_Dbg_Assert_D(_p_szFileName != NULL);
|
|
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
|
|
|
|
/*
|
|
* One more context.
|
|
*/
|
|
p_stContext = fnp_st_Cxt_Add();
|
|
|
|
/*
|
|
* Open the file.
|
|
*/
|
|
p_stContext->p_stOpenFile = fnp_st_File_OpenFile(_p_szFileName);
|
|
|
|
cIndent = -1;
|
|
|
|
szRefFileName = _p_szFileName + g_stIniData.lRootForSectionLength;
|
|
p_szEndRefFileName = szRefFileName + strlen( szRefFileName );
|
|
strcpy( szSectionName, szRefFileName );
|
|
a_szSectionName[ 0 ] = szSectionName + ( p_szEndRefFileName - szRefFileName );
|
|
|
|
/*
|
|
* Place file to its SCR_BEGINing.
|
|
* Parse to the end.
|
|
*/
|
|
fn_v_Anl_ContextToFile(p_stContext);
|
|
do
|
|
{
|
|
iRead = fn_Scr_iLineToContext( p_stContext );
|
|
|
|
if ( p_stContext->eParseType == SCR_EPT_Cxt_BeginSection )
|
|
{
|
|
cIndent++;
|
|
/*
|
|
* get section type
|
|
*/
|
|
p_stSectionType = SCR_fnp_st_Link_SearchKey( &g_stSectionTypeLinkTable, p_stContext->stBuffers.a_szBufferName );
|
|
|
|
/*
|
|
* build full section name
|
|
*/
|
|
*a_szSectionName[ cIndent ] = SCR_CC_c_Cfg_NameSeparator;
|
|
strcpy( a_szSectionName[ cIndent ] + 1, p_stContext->stBuffers.a_szBufferName );
|
|
a_szSectionName[ cIndent + 1 ] = a_szSectionName[ cIndent ] + strlen( a_szSectionName[ cIndent ] );
|
|
if ( *p_stContext->stBuffers.a_szBufferNameExt)
|
|
{
|
|
*a_szSectionName[cIndent + 1]++ = SCR_CC_c_Cfg_SectionIdMark;
|
|
strcpy (a_szSectionName[cIndent + 1], p_stContext->stBuffers.a_szBufferNameExt );
|
|
a_szSectionName[ cIndent + 1 ] += strlen( a_szSectionName[ cIndent + 1 ] );
|
|
}
|
|
|
|
/*
|
|
* get or create section link value
|
|
*/
|
|
a_p_stSection[ cIndent ] = SCR_fnp_st_Link_CreateOrGetLinkFromKey( &g_stSectionLinkTable, szSectionName );
|
|
if (a_p_stSection[ cIndent ]->eState == SCR_ELS_Link_NotInitialized)
|
|
{
|
|
a_p_stSection[ cIndent ]->eState = SCR_ELS_Link_Initialized;
|
|
a_p_stSection[ cIndent ]->stInfos.ulLong1 = p_stContext->stPosition.uiLineInFile;
|
|
a_p_stSection[ cIndent ]->stInfos.ulLong2 = 0;
|
|
|
|
if (p_stSectionType->stInfos.ulLong2)
|
|
{
|
|
a_p_stSection[ cIndent ]->stInfos.ulLong3 = (unsigned long) p_stSectionType;
|
|
p_stDyAr = (SCR_tdst_DyAr_Description *) malloc( sizeof(SCR_tdst_DyAr_Description) );
|
|
fn_v_DyAr_InitArray( p_stDyAr );
|
|
a_p_stSection[ cIndent ]->ulValue = (unsigned long) p_stDyAr;
|
|
}
|
|
else
|
|
a_p_stSection[ cIndent ]->ulValue = 0;
|
|
}
|
|
}
|
|
else if ( p_stContext->eParseType == SCR_EPT_Cxt_EndSection )
|
|
{
|
|
*a_szSectionName[ cIndent ] = 0;
|
|
cIndent--;
|
|
}
|
|
else if ( p_stContext->eParseType == SCR_EPT_Cxt_Entry )
|
|
{
|
|
if ( (cIndent >= 0) && (a_p_stSection[ cIndent ]->ulValue ) )
|
|
{
|
|
p_stSectionType = (SCR_tdst_Link_Value *) a_p_stSection[ cIndent ]->stInfos.ulLong3;
|
|
p_stSectionEntryDyAr = (SCR_tdst_DyAr_Description *) p_stSectionType->ulValue;
|
|
if ( (p_stEntry = fn_Scr_p_stFindEntry( p_stSectionEntryDyAr, p_stContext->stBuffers.a_szBufferNameExt )) != NULL)
|
|
{
|
|
p_stDyAr = (SCR_tdst_DyAr_Description *) a_p_stSection[ cIndent ]->ulValue;
|
|
cRef = p_stEntry->cNumberOfRefs;
|
|
cIndex = 0;
|
|
szParam = p_stContext->stBuffers.a_szBufferParams;
|
|
while (cRef)
|
|
{
|
|
if ( p_stEntry->a_cIsRef[ cIndex ] )
|
|
{
|
|
cRef--;
|
|
|
|
if ( p_stEntry->a_cIsRef[cIndex] == 1)
|
|
{
|
|
if (*szParam == '*')
|
|
{
|
|
p_szRefName = szRefFileName;
|
|
strcpy( p_szEndRefFileName, szParam + 1);
|
|
}
|
|
else
|
|
{
|
|
p_szRefName = szParam;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
p_szRefName = strcpy( szRefName, szParam );
|
|
fn_SpRef_vTransformSpecialRef( p_stSectionType->p_szKey, p_stEntry->szName, cIndex, szRefName );
|
|
}
|
|
|
|
p_stRefValue = SCR_fnp_st_Link_CreateOrGetLinkFromKey( &g_stRefLinkTable, p_szRefName );
|
|
if (p_stRefValue->eState == SCR_ELS_Link_NotInitialized)
|
|
{
|
|
p_stRefValue->eState = SCR_ELS_Link_Initialized;
|
|
p_stRefValue->stInfos.ulLong1 = 1;
|
|
}
|
|
else
|
|
{
|
|
p_stRefValue->stInfos.ulLong1++;
|
|
}
|
|
SCR_M_DyAr_AddElement( tdstReference, uiPos, p_stRef, (*p_stDyAr) );
|
|
p_stRef->uiLine = p_stContext->stPosition.uiLineInFile;
|
|
p_stRef->p_stRef = p_stRefValue;
|
|
}
|
|
cIndex ++;
|
|
szParam += strlen( szParam ) + 1;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
} while(iRead != EOF);
|
|
|
|
SCR_fn_v_RdL0_DeleteOpenFile( _p_szFileName, SCR_CDR_c_RdL0_Match );
|
|
|
|
/*
|
|
* Delete context. It's finish...
|
|
*/
|
|
fn_v_Cxt_DeleteLast();
|
|
}
|
|
|
|
/*
|
|
*-------------------------------------------------------------------------------------------------
|
|
* parse a file to get all sections and references
|
|
* _p_szFileName : file name
|
|
*-------------------------------------------------------------------------------------------------
|
|
*/
|
|
void fn_Scr_vNewParseFileToBuildListOfSectionsAndRefs( char *_szFileName, SCR_tdst_Link_Value *_p_stLVFile )
|
|
{
|
|
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
|
|
SCR_tdst_Link_Table *p_stLTSection;
|
|
SCR_tdst_Cxt_Description *p_stContext;
|
|
int iRead;
|
|
int cIndent = -1;
|
|
char *a_szSectionName[ 16 ];
|
|
char szSectionName[ SCR_CV_ui_Cfg_MaxLenName ];
|
|
SCR_tdst_Link_Value *a_p_stSection[ 16 ];
|
|
SCR_tdst_Link_Value *p_stSectionType;
|
|
SCR_tdst_Link_Value *p_stRefValue;
|
|
SCR_tdst_DyAr_Description *p_stSectionEntryDyAr;
|
|
tdstEntry *p_stEntry;
|
|
SCR_tdst_DyAr_Description *p_stDyAr;
|
|
unsigned int uiPos;
|
|
tdstReference *p_stRef;
|
|
char cRef, cIndex;
|
|
char *szParam;
|
|
char *szRefFileName;
|
|
char szRefName[ SCR_CV_ui_Cfg_MaxLenName ], *p_szRefName, *p_szEndRefFileName;
|
|
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
|
|
// SCR_M_Dbg_Assert_D(_p_szFileName != NULL);
|
|
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
|
|
|
|
/*
|
|
* One more context.
|
|
*/
|
|
p_stContext = fnp_st_Cxt_Add();
|
|
|
|
/*
|
|
* Open the file.
|
|
*/
|
|
p_stContext->p_stOpenFile = fnp_st_File_OpenFile(_szFileName);
|
|
|
|
cIndent = -1;
|
|
|
|
szRefFileName = _szFileName + g_stIniData.lRootForSectionLength;
|
|
p_szEndRefFileName = szRefFileName + strlen( szRefFileName );
|
|
//strcpy( szSectionName, szRefFileName );
|
|
a_szSectionName[ 0 ] = szSectionName;// + ( p_szEndRefFileName - szRefFileName );
|
|
|
|
p_stLTSection = (SCR_tdst_Link_Table *) _p_stLVFile->ulValue;
|
|
/*
|
|
* Place file to its SCR_BEGINing.
|
|
* Parse to the end.
|
|
*/
|
|
fn_v_Anl_ContextToFile(p_stContext);
|
|
do
|
|
{
|
|
iRead = fn_Scr_iLineToContext( p_stContext );
|
|
|
|
if ( p_stContext->eParseType == SCR_EPT_Cxt_BeginSection )
|
|
{
|
|
if (p_stLTSection == NULL)
|
|
{
|
|
p_stLTSection = (SCR_tdst_Link_Table *) malloc (sizeof( SCR_tdst_Link_Table) );
|
|
SCR_fn_v_Link_InitTable( p_stLTSection );
|
|
_p_stLVFile->ulValue = (unsigned long) p_stLTSection;
|
|
}
|
|
|
|
cIndent++;
|
|
/*
|
|
* get section type
|
|
*/
|
|
p_stSectionType = SCR_fnp_st_Link_SearchKey( &g_stSectionTypeLinkTable, p_stContext->stBuffers.a_szBufferName );
|
|
|
|
/*
|
|
* build full section name
|
|
*/
|
|
if (cIndent)
|
|
{
|
|
*a_szSectionName[ cIndent ] = SCR_CC_c_Cfg_NameSeparator;
|
|
strcpy( a_szSectionName[ cIndent ] + 1, p_stContext->stBuffers.a_szBufferName );
|
|
}
|
|
else
|
|
{
|
|
strcpy( a_szSectionName[ 0 ], p_stContext->stBuffers.a_szBufferName );
|
|
}
|
|
a_szSectionName[ cIndent + 1 ] = a_szSectionName[ cIndent ] + strlen( a_szSectionName[ cIndent ] );
|
|
if ( *p_stContext->stBuffers.a_szBufferNameExt)
|
|
{
|
|
*a_szSectionName[cIndent + 1]++ = SCR_CC_c_Cfg_SectionIdMark;
|
|
strcpy (a_szSectionName[cIndent + 1], p_stContext->stBuffers.a_szBufferNameExt );
|
|
a_szSectionName[ cIndent + 1 ] += strlen( a_szSectionName[ cIndent + 1 ] );
|
|
}
|
|
|
|
/*
|
|
* get or create section link value
|
|
*/
|
|
//a_p_stSection[ cIndent ] = SCR_fnp_st_Link_CreateOrGetLinkFromKey( &g_stSectionLinkTable, szSectionName );
|
|
a_p_stSection[ cIndent ] = SCR_fnp_st_Link_CreateOrGetLinkFromKey( p_stLTSection, szSectionName );
|
|
if (a_p_stSection[ cIndent ]->eState == SCR_ELS_Link_NotInitialized)
|
|
{
|
|
a_p_stSection[ cIndent ]->eState = SCR_ELS_Link_Initialized;
|
|
a_p_stSection[ cIndent ]->stInfos.ulLong1 = p_stContext->stPosition.uiLineInFile;
|
|
a_p_stSection[ cIndent ]->stInfos.ulLong2 = 0;
|
|
|
|
if (p_stSectionType->stInfos.ulLong2)
|
|
{
|
|
a_p_stSection[ cIndent ]->stInfos.ulLong3 = (unsigned long) p_stSectionType;
|
|
p_stDyAr = (SCR_tdst_DyAr_Description *) malloc( sizeof(SCR_tdst_DyAr_Description) );
|
|
fn_v_DyAr_InitArray( p_stDyAr );
|
|
a_p_stSection[ cIndent ]->ulValue = (unsigned long) p_stDyAr;
|
|
}
|
|
else
|
|
a_p_stSection[ cIndent ]->ulValue = 0;
|
|
}
|
|
}
|
|
else if ( p_stContext->eParseType == SCR_EPT_Cxt_EndSection )
|
|
{
|
|
*a_szSectionName[ cIndent ] = 0;
|
|
cIndent--;
|
|
}
|
|
else if ( p_stContext->eParseType == SCR_EPT_Cxt_Entry )
|
|
{
|
|
if ( (cIndent >=0) && (a_p_stSection[ cIndent ]->ulValue ) )
|
|
{
|
|
p_stSectionType = (SCR_tdst_Link_Value *) a_p_stSection[ cIndent ]->stInfos.ulLong3;
|
|
p_stSectionEntryDyAr = (SCR_tdst_DyAr_Description *) p_stSectionType->ulValue;
|
|
if ( (p_stEntry = fn_Scr_p_stFindEntry( p_stSectionEntryDyAr, p_stContext->stBuffers.a_szBufferNameExt )) != NULL)
|
|
{
|
|
p_stDyAr = (SCR_tdst_DyAr_Description *) a_p_stSection[ cIndent ]->ulValue;
|
|
cRef = p_stEntry->cNumberOfRefs;
|
|
cIndex = 0;
|
|
szParam = p_stContext->stBuffers.a_szBufferParams;
|
|
while (cRef)
|
|
{
|
|
if ( p_stEntry->a_cIsRef[ cIndex ] )
|
|
{
|
|
cRef--;
|
|
|
|
if ( p_stEntry->a_cIsRef[cIndex] == 1)
|
|
{
|
|
if (*szParam == '*')
|
|
{
|
|
p_szRefName = szRefFileName;
|
|
strcpy( p_szEndRefFileName, szParam + 1);
|
|
}
|
|
else
|
|
{
|
|
p_szRefName = szParam;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
p_szRefName = strcpy( szRefName, szParam );
|
|
fn_SpRef_vTransformSpecialRef( p_stSectionType->p_szKey, p_stEntry->szName, cIndex, szRefName );
|
|
}
|
|
|
|
p_stRefValue = SCR_fnp_st_Link_CreateOrGetLinkFromKey( &g_stRefLinkTable, p_szRefName );
|
|
if (p_stRefValue->eState == SCR_ELS_Link_NotInitialized)
|
|
{
|
|
p_stRefValue->eState = SCR_ELS_Link_Initialized;
|
|
p_stRefValue->stInfos.ulLong1 = 1;
|
|
}
|
|
else
|
|
{
|
|
p_stRefValue->stInfos.ulLong1++;
|
|
}
|
|
SCR_M_DyAr_AddElement( tdstReference, uiPos, p_stRef, (*p_stDyAr) );
|
|
p_stRef->uiLine = p_stContext->stPosition.uiLineInFile;
|
|
p_stRef->p_stRef = p_stRefValue;
|
|
}
|
|
cIndex ++;
|
|
szParam += strlen( szParam ) + 1;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
} while(iRead != EOF);
|
|
|
|
SCR_fn_v_RdL0_DeleteOpenFile( _szFileName, SCR_CDR_c_RdL0_Match );
|
|
|
|
/*
|
|
* Delete context. It's finish...
|
|
*/
|
|
fn_v_Cxt_DeleteLast();
|
|
}
|
|
|
|
|
|
/*
|
|
*-------------------------------------------------------------------------------------------------
|
|
* init a stat structure
|
|
* _p_szFileName : file name
|
|
*-------------------------------------------------------------------------------------------------
|
|
*/
|
|
void fn_Scr_vInitStat( tdstScriptStat *_stStat )
|
|
{
|
|
memset( _stStat, 0, sizeof( tdstScriptStat ) );
|
|
|
|
_stStat->ulSectionNameMinLength = 0xFFFFFF;
|
|
_stStat->ulEntryMinLength = 0xFFFFFF;;
|
|
}
|
|
|
|
/*
|
|
*-------------------------------------------------------------------------------------------------
|
|
* parse a file to get stats on scripts
|
|
* _p_szFileName : file name
|
|
*-------------------------------------------------------------------------------------------------
|
|
*/
|
|
void fn_Scr_vParseFileForStat(char *_p_szFileName, tdstScriptStat *_stStat )
|
|
{
|
|
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
|
|
SCR_tdst_Cxt_Description *p_stContext;
|
|
unsigned long ulLength;
|
|
int iRead;
|
|
char *szParam;
|
|
char cParam;
|
|
unsigned long ulNumberOfSections = 0;
|
|
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
|
|
SCR_M_Dbg_Assert_D(_p_szFileName != NULL);
|
|
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
|
|
|
|
/*
|
|
* One more context.
|
|
*/
|
|
p_stContext = fnp_st_Cxt_Add();
|
|
|
|
/*
|
|
* Open the file.
|
|
*/
|
|
p_stContext->p_stOpenFile = fnp_st_File_OpenFile(_p_szFileName);
|
|
|
|
_stStat->ulNbFiles++;
|
|
|
|
/*
|
|
* Place file to its SCR_BEGINing.
|
|
* Parse to the end.
|
|
*/
|
|
fn_v_Anl_ContextToFile(p_stContext);
|
|
do
|
|
{
|
|
iRead = fn_Scr_iLineToContext( p_stContext );
|
|
|
|
if ( p_stContext->eParseType == SCR_EPT_Cxt_BeginSection )
|
|
{
|
|
_stStat->ulNbBeginSectionLines++;
|
|
ulNumberOfSections++;
|
|
|
|
ulLength = strlen( p_stContext->stBuffers.a_szBufferName );
|
|
if (ulLength > _stStat->ulSectionNameMaxLength)
|
|
{
|
|
_stStat->ulSectionNameMaxLength = ulLength;
|
|
strcpy( _stStat->szSectionNameMax, p_stContext->stBuffers.a_szBufferName );
|
|
}
|
|
if (ulLength < _stStat->ulSectionNameMinLength)
|
|
{
|
|
_stStat->ulSectionNameMinLength = ulLength;
|
|
strcpy( _stStat->szSectionNameMin, p_stContext->stBuffers.a_szBufferName );
|
|
}
|
|
|
|
ulLength = strlen( p_stContext->stBuffers.a_szBufferNameExt );
|
|
_stStat->fSectionExtAverageLength = (_stStat->fSectionExtAverageLength * (_stStat->ulNbBeginSectionLines - 1) + ulLength) / _stStat->ulNbBeginSectionLines;
|
|
if (ulLength > _stStat->ulSectionExtMaxLength)
|
|
{
|
|
_stStat->ulSectionExtMaxLength = ulLength;
|
|
strcpy( _stStat->szSectionExtMax, p_stContext->stBuffers.a_szBufferNameExt );
|
|
}
|
|
|
|
ulLength = strlen( p_stContext->stBuffers.a_szBufferFormat );
|
|
if (ulLength > _stStat->ulFormatMaxLength)
|
|
_stStat->ulFormatMaxLength = ulLength;
|
|
|
|
szParam = p_stContext->stBuffers.a_szBufferParams;
|
|
cParam = 0;
|
|
ulLength = 0;
|
|
while (szParam[ulLength] != 0)
|
|
{
|
|
cParam++;
|
|
ulLength += strlen( &szParam[ulLength] ) + 1;
|
|
}
|
|
ulLength ++;
|
|
if (cParam > _stStat->cMaxParams)
|
|
_stStat->cMaxParams = cParam;
|
|
if (ulLength > _stStat->ulParamsMaxLength)
|
|
_stStat->ulParamsMaxLength = ulLength;
|
|
}
|
|
else if ( p_stContext->eParseType == SCR_EPT_Cxt_EndSection )
|
|
{
|
|
_stStat->ulNbEndSectionLines++;
|
|
}
|
|
else if ( p_stContext->eParseType == SCR_EPT_Cxt_Directive )
|
|
{
|
|
_stStat->ulNbDirectiveLines++;
|
|
}
|
|
else if ( p_stContext->eParseType == SCR_EPT_Cxt_Entry )
|
|
{
|
|
_stStat->ulNbEntryLines++;
|
|
|
|
ulLength = strlen( p_stContext->stBuffers.a_szBufferNameExt );
|
|
if (ulLength > _stStat->ulEntryMaxLength)
|
|
{
|
|
_stStat->ulEntryMaxLength = ulLength;
|
|
strcpy( _stStat->szEntryMax, p_stContext->stBuffers.a_szBufferNameExt );
|
|
}
|
|
if (ulLength < _stStat->ulEntryMinLength)
|
|
{
|
|
_stStat->ulEntryMinLength = ulLength;
|
|
strcpy( _stStat->szEntryMin, p_stContext->stBuffers.a_szBufferNameExt );
|
|
}
|
|
|
|
ulLength = strlen( p_stContext->stBuffers.a_szBufferFormat );
|
|
if (ulLength > _stStat->ulFormatMaxLength)
|
|
_stStat->ulFormatMaxLength = ulLength;
|
|
|
|
szParam = p_stContext->stBuffers.a_szBufferParams;
|
|
cParam = 0;
|
|
ulLength = 0;
|
|
while (szParam[ulLength] != 0)
|
|
{
|
|
cParam++;
|
|
ulLength += strlen( &szParam[ulLength] ) + 1;
|
|
}
|
|
ulLength ++;
|
|
if (cParam > _stStat->cMaxParams)
|
|
_stStat->cMaxParams = cParam;
|
|
if (ulLength > _stStat->ulParamsMaxLength)
|
|
_stStat->ulParamsMaxLength = ulLength;
|
|
}
|
|
} while(iRead != EOF);
|
|
|
|
if (ulNumberOfSections > _stStat->ulNbMaxSectionInAFile)
|
|
{
|
|
_stStat->ulNbMaxSectionInAFile = ulNumberOfSections;
|
|
strcpy( _stStat->szFileWithMaxSection, _p_szFileName );
|
|
}
|
|
|
|
_stStat->ulNbLines += p_stContext->stPosition.uiLineInFile;
|
|
_stStat->ulNbChars += p_stContext->stPosition.lAfterSeekInFile;
|
|
|
|
ulLength = p_stContext->stPosition.lAfterSeekInFile;
|
|
if (ulLength > _stStat->ulMaxSize)
|
|
{
|
|
_stStat->ulMaxSize = ulLength;
|
|
strcpy( _stStat->szBiggestFile, _p_szFileName );
|
|
}
|
|
|
|
SCR_fn_v_RdL0_DeleteOpenFile( _p_szFileName, SCR_CDR_c_RdL0_Match );
|
|
|
|
/*
|
|
* Delete context. It's finish...
|
|
*/
|
|
fn_v_Cxt_DeleteLast();
|
|
}
|
|
|
|
/*
|
|
*-------------------------------------------------------------------------------------------------
|
|
* parse a file to get stats on mod files
|
|
* _p_szFileName : file name
|
|
*-------------------------------------------------------------------------------------------------
|
|
*/
|
|
void fn_Scr_vInitModStat( tdstModStat *_pst_Stat )
|
|
{
|
|
memset( _pst_Stat, 0, sizeof( tdstModStat ) );
|
|
_pst_Stat->ulMinPoints = 0xFFFFFF;
|
|
_pst_Stat->ulMinEdges = 0xFFFFFF;
|
|
_pst_Stat->ulMinElement = 0xFFFFFF;
|
|
}
|
|
|
|
/*
|
|
*-------------------------------------------------------------------------------------------------
|
|
* parse a file to get stats on mod files
|
|
* _p_szFileName : file name
|
|
*-------------------------------------------------------------------------------------------------
|
|
*/
|
|
void fn_Scr_vParseFileToCountModData( char *_sz_FileName, tdstModStat *_pst_Stat )
|
|
{
|
|
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
|
|
SCR_tdst_Cxt_Description *p_stContext;
|
|
unsigned long ulLength;
|
|
int iRead;
|
|
char *szParam;
|
|
char cParam;
|
|
unsigned long ulNumberOfSections = 0;
|
|
unsigned long ulValue;
|
|
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
|
|
SCR_M_Dbg_Assert_D(_sz_FileName != NULL);
|
|
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
|
|
|
|
/*
|
|
* One more context.
|
|
*/
|
|
p_stContext = fnp_st_Cxt_Add();
|
|
|
|
/*
|
|
* Open the file.
|
|
*/
|
|
p_stContext->p_stOpenFile = fnp_st_File_OpenFile(_sz_FileName);
|
|
|
|
/*
|
|
* Place file to its SCR_BEGINing.
|
|
* Parse to the end.
|
|
*/
|
|
fn_v_Anl_ContextToFile(p_stContext);
|
|
do
|
|
{
|
|
iRead = fn_Scr_iLineToContext( p_stContext );
|
|
|
|
if ( p_stContext->eParseType == SCR_EPT_Cxt_BeginSection )
|
|
{
|
|
if ( stricmp( p_stContext->stBuffers.a_szBufferName, "Geometric" ) == 0)
|
|
{
|
|
_pst_Stat->ulNumber++;
|
|
|
|
szParam = p_stContext->stBuffers.a_szBufferParams;
|
|
if (szParam)
|
|
{
|
|
ulValue = (unsigned long) atoi( szParam );
|
|
if (_pst_Stat->ulMaxPoints < ulValue )
|
|
_pst_Stat->ulMaxPoints = ulValue;
|
|
if (_pst_Stat->ulMinPoints > ulValue )
|
|
_pst_Stat->ulMinPoints = ulValue;
|
|
}
|
|
|
|
szParam += strlen( szParam ) + 1;
|
|
if (szParam)
|
|
{
|
|
ulValue = atoi( szParam );
|
|
if (_pst_Stat->ulMaxEdges < ulValue )
|
|
_pst_Stat->ulMaxEdges = ulValue;
|
|
if (_pst_Stat->ulMinEdges > ulValue )
|
|
_pst_Stat->ulMinEdges = ulValue;
|
|
}
|
|
|
|
szParam += strlen( szParam ) + 1;
|
|
if (szParam)
|
|
{
|
|
ulValue = atoi( szParam );
|
|
if (_pst_Stat->ulMaxElement < ulValue )
|
|
_pst_Stat->ulMaxElement = ulValue;
|
|
if (_pst_Stat->ulMinElement > ulValue )
|
|
_pst_Stat->ulMinElement = ulValue;
|
|
}
|
|
}
|
|
}
|
|
|
|
} while(iRead != EOF);
|
|
|
|
SCR_fn_v_RdL0_DeleteOpenFile( _sz_FileName, SCR_CDR_c_RdL0_Match );
|
|
|
|
/*
|
|
* Delete context. It's finish...
|
|
*/
|
|
fn_v_Cxt_DeleteLast();
|
|
}
|
|
|
|
|