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

465 lines
11 KiB
C

#include "SCR.h"
#include <string.h>
char g_chEndSections=0;
void fn_v_Bin_Read( SCR_tdst_File_Description *_File, int _Length, void *_Dest )
{
char *pch=(char *)_Dest;
_File->lChangeInPos+=_Length;
if( _Length <= _File->p_stHandle->iCnt )
{
memcpy( _Dest, (void *)_File->p_stHandle->p_cCurrent, _Length );
_File->p_stHandle->iCnt-=_Length;
_File->p_stHandle->p_cCurrent+=_Length;
}
else
{
memcpy( _Dest, (void *)_File->p_stHandle->p_cCurrent, _File->p_stHandle->iCnt );
pch+=_File->p_stHandle->iCnt;
_Length-=_File->p_stHandle->iCnt;
while( _Length )
{
(_File)->p_stHandle->iCnt = SCR_M_fread((_File)->p_stHandle->p_cBase, 1, SCR_CV_ui_Cfg_SizeBufferFile, _File);
if(((_File)->p_stHandle->iCnt == 0) || ((_File)->p_stHandle->iCnt == -1))
{
(_File)->p_stHandle->iCnt = 0;
*pch = EOF;
break;
}
else
{
(_File)->p_stHandle->p_cCurrent = (_File)->p_stHandle->p_cBase;
if( _Length <= _File->p_stHandle->iCnt )
{
memcpy( (void *)pch, (void *)_File->p_stHandle->p_cCurrent, _Length );
_File->p_stHandle->iCnt-=_Length;
_File->p_stHandle->p_cCurrent+=_Length;
_Length=0;
}
else
{
memcpy( (void *)pch, (void *)_File->p_stHandle->p_cCurrent, _File->p_stHandle->iCnt );
pch+=_File->p_stHandle->iCnt;
_Length-=_File->p_stHandle->iCnt;
}
}
}
}
}
void fn_v_Bin_Skip( SCR_tdst_File_Description *_File, int _Length )
{
_File->lChangeInPos+=_Length;
if( _Length <= _File->p_stHandle->iCnt )
{
_File->p_stHandle->iCnt-=_Length;
_File->p_stHandle->p_cCurrent+=_Length;
}
else
{
_Length-=_File->p_stHandle->iCnt;
while( _Length )
{
(_File)->p_stHandle->iCnt = SCR_M_fread((_File)->p_stHandle->p_cBase, 1, SCR_CV_ui_Cfg_SizeBufferFile, _File);
if(((_File)->p_stHandle->iCnt == 0) || ((_File)->p_stHandle->iCnt == -1))
{
(_File)->p_stHandle->iCnt = 0;
break;
}
else
{
(_File)->p_stHandle->p_cCurrent = (_File)->p_stHandle->p_cBase;
if( _Length <= _File->p_stHandle->iCnt )
{
_File->p_stHandle->iCnt-=_Length;
_File->p_stHandle->p_cCurrent+=_Length;
_Length=0;
}
else
{
_Length-=_File->p_stHandle->iCnt;
}
}
}
}
}
char SCR_fn_ch_Bin_GetCHAR( SCR_tdst_File_Description *_File )
{
char ch;
fn_v_Bin_Read(_File, sizeof( char ), (void*)&ch);
return ch;
}
short SCR_fn_s_Bin_GetSHORT( SCR_tdst_File_Description *_File )
{
short s;
fn_v_Bin_Read(_File, sizeof( short ), (void*)&s);
return s;
}
long SCR_fn_l_Bin_GetLONG( SCR_tdst_File_Description *_File )
{
long l;
fn_v_Bin_Read(_File, sizeof( long ), (void*)&l);
return l;
}
unsigned char SCR_fn_uch_Bin_GetUCHAR( SCR_tdst_File_Description *_File )
{
unsigned char ch;
fn_v_Bin_Read(_File, sizeof( unsigned char ), (void*)&ch);
return ch;
}
unsigned short SCR_fn_us_Bin_GetUSHORT( SCR_tdst_File_Description *_File )
{
unsigned short s;
fn_v_Bin_Read(_File, sizeof( unsigned short ), (void*)&s);
return s;
}
unsigned long SCR_fn_ul_Bin_GetULONG( SCR_tdst_File_Description *_File )
{
unsigned long l;
fn_v_Bin_Read(_File, sizeof( unsigned long ), (void*)&l);
return l;
}
float SCR_fn_f_Bin_GetFLOAT( SCR_tdst_File_Description *_File )
{
float f;
fn_v_Bin_Read(_File, sizeof( float ), (void*)&f);
return f;
}
double SCR_fn_d_Bin_GetDOUBLE( SCR_tdst_File_Description *_File )
{
double d;
fn_v_Bin_Read(_File, sizeof( double ), (void*)&d);
return d;
}
char * SCR_fn_sz_Bin_GetSTRING( SCR_tdst_File_Description *_File )
{
short s=SCR_fn_s_Bin_GetSHORT( _File );
char *sz;
SCR_M_Mem_Alloc(char, sz, s+1);
fn_v_Bin_Read( _File, s, (void *)sz );
sz[s]=0;
return sz;
}
int SCR_fn_sz_Bin_GetSTRING2Buffer( SCR_tdst_File_Description *_File, char *sz )
{
short s=SCR_fn_s_Bin_GetSHORT( _File );
fn_v_Bin_Read( _File, s, (void *)sz );
sz[s]=0;
return s;
}
void * SCR_fn_p_Bin_GetARRAY( SCR_tdst_File_Description *_File, short sIze )
{
short s=SCR_fn_s_Bin_GetSHORT( _File );
char *sz;
SCR_M_Mem_Alloc(char, sz, s*sIze);
fn_v_Bin_Read( _File, s*sIze, (void *)sz );
return (void *)sz;
}
void SCR_fn_sz_Bin_GetREFERENCE2Buffer( SCR_tdst_File_Description *_File, char* sz )
{
unsigned short usVal, usLast, usIsIndex;
int i=0;
do{
usVal=SCR_fn_us_Bin_GetUSHORT( _File );
usLast=usVal&0x4000;
usIsIndex=usVal&0x8000;
usVal&=0x3FFF;
if( usIsIndex )
{
strcpy( sz+i, _File->p_stRefs->a_szRefName[usVal] );
i+=strlen( _File->p_stRefs->a_szRefName[usVal] );
}
else
{
fn_v_Bin_Read( _File, usVal, sz+i );
i+=usVal;
}
} while ( !usLast );
sz[i]=0;
}
static char buffer[200];
char *SCR_fn_sz_Bin_GetREFERENCE( SCR_tdst_File_Description *_File )
{
unsigned short usVal, usLast, usIsIndex;
int i=0;
char *retVal;
do{
usVal=SCR_fn_us_Bin_GetUSHORT( _File );
usLast=usVal&0x4000;
usIsIndex=usVal&0x8000;
usVal&=0x3FFF;
if( usIsIndex )
{
strcpy( buffer+i, _File->p_stRefs->a_szRefName[usVal] );
i+=strlen( _File->p_stRefs->a_szRefName[usVal] );
}
else
{
fn_v_Bin_Read( _File, usVal, buffer+i );
i+=usVal;
}
} while ( !usLast );
buffer[i]=0;
SCR_M_Mem_Alloc(char, retVal, i);
strcpy( retVal, buffer );
return retVal;
}
void SCR_fn_v_Bin_BeginSection( SCR_tdst_File_Description *_p_stFile )
{
unsigned short us;
us=SCR_fn_us_Bin_GetUSHORT( _p_stFile );
if( us==0xFFFF )
{
_p_stFile->lToEndSection=SCR_fn_l_Bin_GetLONG( _p_stFile )+6;
_p_stFile->lChangeInPos=6;
}
else
{
_p_stFile->lToEndSection=(long)us+2;
_p_stFile->lChangeInPos=2;
}
}
short fn_s_Bin_SectionName( SCR_tdst_File_Description *_File, char * _p_szAction, char * _p_szId )
{
char *pch;
short s=SCR_fn_sz_Bin_GetSTRING2Buffer( _File, _p_szAction );
pch=strchr( _p_szAction, ':' );
if( pch )
{
strcpy( _p_szId, pch+1 );
*pch=0;
}
else _p_szId[0]=0;
return s+2;
}
void fn_v_Bin_Line(
SCR_tdst_File_Description *_p_stFile,
char *_p_szKeyword1,
char *_p_szKeyword2,
char *_p_szKeyword3,
char *_p_szKeyword4,
SCR_tde_Cxt_ParseType *_p_eParseType,
unsigned int *_p_uiNbRead
)
{
char sTag;
*_p_uiNbRead=0;
if( _p_stFile->lCountEndSections==-1 )
{
*_p_uiNbRead=_p_stFile->lToEndSection;
_p_stFile->lCountEndSections=0;
}
if( _p_stFile->lCountEndSections>0 )
{
*_p_eParseType=SCR_EPT_Cxt_EndSection;
*_p_uiNbRead=_p_stFile->lToEndSection;
_p_stFile->lToEndSection=0;
_p_stFile->lCountEndSections--;
return;
}
sTag=SCR_fn_ch_Bin_GetCHAR( _p_stFile ); /* get type tag */
if( sTag>0 )
{
*_p_eParseType=SCR_EPT_Cxt_Entry;
_p_szKeyword1[0]=sTag;
*_p_uiNbRead+=1;
return;
}
switch( sTag )
{
case TAG_BEGINSECTION:
/* Get section name (action + id) */
*_p_uiNbRead+=fn_s_Bin_SectionName(_p_stFile, _p_szKeyword1, _p_szKeyword2);
*_p_eParseType = SCR_EPT_Cxt_BeginSection;
break;
case TAG_EOF:
case TAG_COMMENT:
*_p_eParseType = SCR_EPT_Cxt_None;
break;
default: /* it is a directive then... */
/**_p_eParseType = SCR_EPT_Cxt_None;*/
_p_szKeyword4[0]=sTag;
*_p_eParseType = SCR_EPT_Cxt_Directive;
break;
}
*_p_uiNbRead+=1;
return;
}
long fn_l_Bin_ToEndSection( SCR_tdst_Cxt_Description *p_stContext )
{
long l,l1;
char ch;
unsigned short us=SCR_fn_us_Bin_GetUSHORT( &p_stContext->p_stOpenFile->stFile );
if( us!=0xFFFF )
{
l=us-1;
l1=us+2;
}
else
{
l=SCR_fn_l_Bin_GetLONG( &p_stContext->p_stOpenFile->stFile )-1;
l1=l+7;
}
fn_v_Bin_Skip( &p_stContext->p_stOpenFile->stFile, l );
ch=SCR_fn_ch_Bin_GetCHAR( &p_stContext->p_stOpenFile->stFile );
if( ch<=0 )
p_stContext->p_stOpenFile->stFile.lCountEndSections=-ch+1;
return l1;
}
void SCR_fn_v_Bin_EndSection( SCR_tdst_File_Description *_p_stFile )
{
char ch;
ch=SCR_fn_ch_Bin_GetCHAR( _p_stFile );
if( ch<=0 )
_p_stFile->lCountEndSections=-ch+1;
else
_p_stFile->lCountEndSections=-1;
}
SCR_tdst_Cxt_Values *SCR_fnp_st_Bin_GetREFERENCE( char *szName )
{
SCR_tdst_Cxt_Description *cxt=fnp_st_Cxt_Compute(0);
SCR_tdst_File_Description *_file=&cxt->p_stOpenFile->stFile;
long lPosition=cxt->stPosition.lAfterSeekInFile;
long lToEndSection, lChangeInPos;
SCR_tdst_Cxt_Values *p_stVal;
int _iRes;
lChangeInPos=_file->lChangeInPos;
lToEndSection=_file->lToEndSection;
if( cxt->p_stOpenFile->stParsingInfos.stPosition.lAfterSeekInFile<lPosition+lToEndSection )
{
fn_v_Bin_Skip( _file, lToEndSection-lChangeInPos-1 );
SCR_fn_v_Bin_EndSection( _file );
cxt->p_stOpenFile->stParsingInfos.stPosition.lAfterSeekInFile=lPosition+lToEndSection;
}
_file->lChangeInPos=_file->lToEndSection=0;
p_stVal = SCR_fnp_st_RdL0_AnalyseSection(szName, SCR_CDF_uw_Anl_Normal);
cxt->stPosition.lAfterSeekInFile=lPosition;
_file->lChangeInPos=lChangeInPos;
_file->lToEndSection=lToEndSection;
SCR_M_fseek(_file, lPosition+lChangeInPos, SEEK_SET, _iRes);
return p_stVal;
}
long fn_l_Bin_AnalyseDirective(SCR_tdst_Cxt_Description *_p_stContext)
{
char chDirective;
long l=0;
chDirective = _p_stContext->stBuffers.a_szBufferParams[0];
/*
* Test all directives.
*/
switch( chDirective )
{
case SCR_CD_w_Cfg_BreakPoint:
case SCR_CD_w_Cfg_UpdateLog:
case SCR_CD_w_Cfg_Comments:
case SCR_CD_w_Cfg_EndComments:
case SCR_CD_w_Cfg_NotSaveSection:
case SCR_CD_w_Cfg_EndNotSaveSection:
l+=SCR_fn_s_Bin_GetSHORT( &_p_stContext->p_stOpenFile->stFile )+2;
fn_v_Bin_Skip( &_p_stContext->p_stOpenFile->stFile, l );
break;
case SCR_CD_w_Cfg_ForceAnalyse:
{
l+=SCR_fn_s_Bin_GetSHORT( &_p_stContext->p_stOpenFile->stFile )+2;
fn_v_Bin_Skip( &_p_stContext->p_stOpenFile->stFile, l );
if(_p_stContext->p_stOpenFile->stParsingInfos.uwDynamicFlags & SCR_CDF_uw_Anl_ForceAnalyse)
{
SCR_M_Err_UpdateSyntaxError();
sprintf(g_st_Err_GlobalError.a_szBufferTmp2, "Directive is \"%s\".", SCR_CD_sz_Cfg_ForceAnalyse );
SCR_M_Err_RaiseWarning(SCR_EI_Err_UnnecessaryDirective);
}
else
_p_stContext->p_stOpenFile->stParsingInfos.uwDynamicFlags |= SCR_CDF_uw_Anl_ForceAnalyse;
}
break;
case SCR_CD_w_Cfg_EndForceAnalyse:
{
l+=SCR_fn_s_Bin_GetSHORT( &_p_stContext->p_stOpenFile->stFile )+2;
fn_v_Bin_Skip( &_p_stContext->p_stOpenFile->stFile, l );
if((_p_stContext->p_stOpenFile->stParsingInfos.uwDynamicFlags & SCR_CDF_uw_Anl_ForceAnalyse) == 0)
{
SCR_M_Err_UpdateSyntaxError();
sprintf(g_st_Err_GlobalError.a_szBufferTmp2, "Directive is \"%s\".", SCR_CD_sz_Cfg_EndForceAnalyse);
SCR_M_Err_RaiseWarning(SCR_EI_Err_UnnecessaryDirective);
}
else
_p_stContext->p_stOpenFile->stParsingInfos.uwDynamicFlags &= ~SCR_CDF_uw_Anl_ForceAnalyse;
}
break;
case SCR_CD_w_Cfg_SetCurrentFileLong:
{
short s1, s2;
l+=SCR_fn_s_Bin_GetSHORT( &_p_stContext->p_stOpenFile->stFile )+2;
s1=SCR_fn_s_Bin_GetSHORT( &_p_stContext->p_stOpenFile->stFile );
s2=SCR_fn_s_Bin_GetSHORT( &_p_stContext->p_stOpenFile->stFile );
SCR_M_RdL0_SetFileLong(0, s1, s2 );
}
break;
case SCR_CD_w_Cfg_SetCurrentFileDouble:
{
short s;
double d;
l+=SCR_fn_s_Bin_GetSHORT( &_p_stContext->p_stOpenFile->stFile )+2;
s=SCR_fn_s_Bin_GetSHORT( &_p_stContext->p_stOpenFile->stFile );
d=SCR_fn_d_Bin_GetDOUBLE( &_p_stContext->p_stOpenFile->stFile );
SCR_M_RdL0_SetFileDouble(0, s, d);
}
break;
}
return l;
}