cleanup the Read*() methods in SvIdlParser

to be consistent about when they move to the next token

Change-Id: I8f5b1eab497fb4a7cb2a2267e815668c3d363de7
This commit is contained in:
Noel Grandin
2016-02-17 09:01:27 +02:00
parent cd3bb3047d
commit b94272a55e
4 changed files with 114 additions and 75 deletions

View File

@@ -181,28 +181,38 @@ public:
SvToken& GetToken() const { return *(*pCurToken).get(); } SvToken& GetToken() const { return *(*pCurToken).get(); }
bool ReadIf( char cChar ) bool ReadIf( char cChar )
{ {
if( (*pCurToken)->IsChar() if( GetToken().IsChar() && cChar == GetToken().GetChar() )
&& cChar == (*pCurToken)->GetChar() ) {
{ GetToken_Next();
GetToken_Next(); return true;
return true; }
} else
else return false;
return false; }
}
bool ReadIf( SvStringHashEntry* pEntry )
{
if( GetToken().Is( pEntry ) )
{
GetToken_Next();
return true;
}
else
return false;
}
bool ReadIfDelimiter() bool ReadIfDelimiter()
{ {
if( (*pCurToken)->IsChar() if( GetToken().IsChar()
&& (';' == (*pCurToken)->GetChar() && (';' == GetToken().GetChar()
|| ',' == (*pCurToken)->GetChar()) ) || ',' == GetToken().GetChar()) )
{ {
GetToken_Next(); GetToken_Next();
return true; return true;
} }
return false; return false;
} }
sal_uInt32 Tell() const { return pCurToken-aTokList.begin(); } sal_uInt32 Tell() const { return pCurToken-aTokList.begin(); }

View File

@@ -52,11 +52,14 @@ public:
void ReadEnumValue( SvMetaTypeEnum& rEnum ); void ReadEnumValue( SvMetaTypeEnum& rEnum );
SvMetaClass* ReadKnownClass(); SvMetaClass* ReadKnownClass();
SvMetaType* ReadKnownType(); SvMetaType* ReadKnownType();
void ReadChar(char cChar); void Read(char cChar);
bool ReadIf(char cChar);
void ReadDelimiter(); void ReadDelimiter();
bool ReadIfDelimiter();
OString ReadIdentifier(); OString ReadIdentifier();
OString ReadString(); OString ReadString();
void ReadToken(SvStringHashEntry*); void Read(SvStringHashEntry*);
bool ReadIf(SvStringHashEntry*);
}; };
#endif // INCLUDED_IDL_INC_PARSER_HXX #endif // INCLUDED_IDL_INC_PARSER_HXX

View File

@@ -37,18 +37,15 @@ void SvIdlParser::ReadSvIdl( bool bImported, const OUString & rPath )
if( rTok.IsEof() ) if( rTok.IsEof() )
return; return;
if( rTok.Is( SvHash_module() ) ) Read( SvHash_module() );
{ tools::SvRef<SvMetaModule> aModule = new SvMetaModule( bImported );
tools::SvRef<SvMetaModule> aModule = new SvMetaModule( bImported ); ReadModuleHeader(*aModule);
ReadModuleHeader(*aModule); rBase.GetModuleList().push_back( aModule );
rBase.GetModuleList().push_back( aModule );
}
} }
} }
void SvIdlParser::ReadModuleHeader(SvMetaModule& rModule) void SvIdlParser::ReadModuleHeader(SvMetaModule& rModule)
{ {
rInStm.GetToken_Next();
OString aName = ReadIdentifier(); OString aName = ReadIdentifier();
rBase.Push( &rModule ); // onto the context stack rBase.Push( &rModule ); // onto the context stack
rModule.SetName( aName ); rModule.SetName( aName );
@@ -58,7 +55,7 @@ void SvIdlParser::ReadModuleHeader(SvMetaModule& rModule)
void SvIdlParser::ReadModuleBody(SvMetaModule& rModule) void SvIdlParser::ReadModuleBody(SvMetaModule& rModule)
{ {
if( rInStm.ReadIf( '[' ) ) if( ReadIf( '[' ) )
{ {
while( true ) while( true )
{ {
@@ -69,12 +66,12 @@ void SvIdlParser::ReadModuleBody(SvMetaModule& rModule)
{ {
throw SvParseException( rInStm, "cannot read file: " + aSlotIdFile ); throw SvParseException( rInStm, "cannot read file: " + aSlotIdFile );
} }
rInStm.ReadIfDelimiter(); ReadIfDelimiter();
} }
ReadChar( ']' ); Read( ']' );
} }
if( !rInStm.ReadIf( '{' ) ) if( !ReadIf( '{' ) )
return; return;
sal_uInt32 nBeginPos = 0; sal_uInt32 nBeginPos = 0;
@@ -82,34 +79,34 @@ void SvIdlParser::ReadModuleBody(SvMetaModule& rModule)
{ {
nBeginPos = rInStm.Tell(); nBeginPos = rInStm.Tell();
ReadModuleElement( rModule ); ReadModuleElement( rModule );
rInStm.ReadIfDelimiter(); ReadIfDelimiter();
} }
ReadChar( '}' ); Read( '}' );
} }
void SvIdlParser::ReadModuleElement( SvMetaModule& rModule ) void SvIdlParser::ReadModuleElement( SvMetaModule& rModule )
{ {
if( rInStm.GetToken().Is( SvHash_interface() ) ) if( ReadIf( SvHash_interface() ) )
{ {
ReadInterfaceOrShell(rModule, MetaTypeType::Interface); ReadInterfaceOrShell(rModule, MetaTypeType::Interface);
} }
else if( rInStm.GetToken().Is( SvHash_shell() ) ) else if( ReadIf( SvHash_shell() ) )
{ {
ReadInterfaceOrShell(rModule, MetaTypeType::Shell); ReadInterfaceOrShell(rModule, MetaTypeType::Shell);
} }
else if( rInStm.GetToken().Is( SvHash_enum() ) ) else if( ReadIf( SvHash_enum() ) )
{ {
ReadEnum(); ReadEnum();
} }
else if( rInStm.GetToken().Is( SvHash_item() ) ) else if( ReadIf( SvHash_item() ) )
{ {
ReadItem(); ReadItem();
} }
else if( rInStm.GetToken().Is( SvHash_struct() ) ) else if( ReadIf( SvHash_struct() ) )
{ {
ReadStruct(); ReadStruct();
} }
else if( rInStm.GetToken().Is( SvHash_include() ) ) else if( ReadIf( SvHash_include() ) )
{ {
ReadInclude(rModule); ReadInclude(rModule);
} }
@@ -132,7 +129,6 @@ void SvIdlParser::ReadInclude( SvMetaModule& rModule )
{ {
sal_uInt32 nTokPos = rInStm.Tell(); sal_uInt32 nTokPos = rInStm.Tell();
bool bOk = false; bool bOk = false;
rInStm.GetToken_Next();
OUString aFullName(OStringToOUString(ReadString(), RTL_TEXTENCODING_ASCII_US)); OUString aFullName(OStringToOUString(ReadString(), RTL_TEXTENCODING_ASCII_US));
rBase.StartNewFile( aFullName ); rBase.StartNewFile( aFullName );
osl::FileBase::RC searchError = osl::File::searchFileURL(aFullName, rBase.GetPath(), aFullName); osl::FileBase::RC searchError = osl::File::searchFileURL(aFullName, rBase.GetPath(), aFullName);
@@ -182,12 +178,10 @@ void SvIdlParser::ReadInclude( SvMetaModule& rModule )
void SvIdlParser::ReadStruct() void SvIdlParser::ReadStruct()
{ {
ReadToken( SvHash_struct() );
rInStm.GetToken_Next();
tools::SvRef<SvMetaType> xStruct(new SvMetaType() ); tools::SvRef<SvMetaType> xStruct(new SvMetaType() );
xStruct->SetType( MetaTypeType::Struct ); xStruct->SetType( MetaTypeType::Struct );
xStruct->SetName( ReadIdentifier() ); xStruct->SetName( ReadIdentifier() );
ReadChar( '{' ); Read( '{' );
sal_uInt32 nBeginPos = 0; // can not happen with Tell sal_uInt32 nBeginPos = 0; // can not happen with Tell
while( nBeginPos != rInStm.Tell() ) while( nBeginPos != rInStm.Tell() )
{ {
@@ -201,19 +195,19 @@ void SvIdlParser::ReadStruct()
throw SvParseException( rInStm, "no value for identifier <" + xAttr->aSlotId.getString() + "> " ); throw SvParseException( rInStm, "no value for identifier <" + xAttr->aSlotId.getString() + "> " );
xAttr->aSlotId.SetValue(n); xAttr->aSlotId.SetValue(n);
xStruct->GetAttrList().push_back( xAttr ); xStruct->GetAttrList().push_back( xAttr );
rInStm.ReadIfDelimiter(); if( !ReadIfDelimiter() )
if ( rInStm.GetToken().IsChar() && rInStm.GetToken().GetChar() == '}') break;
if( rInStm.GetToken().IsChar() && rInStm.GetToken().GetChar() == '}')
break; break;
} }
ReadChar( '}' ); Read( '}' );
ReadDelimiter();
// announce globally // announce globally
rBase.GetTypeList().push_back( xStruct ); rBase.GetTypeList().push_back( xStruct );
} }
void SvIdlParser::ReadItem() void SvIdlParser::ReadItem()
{ {
ReadToken( SvHash_item() );
rInStm.GetToken_Next();
tools::SvRef<SvMetaType> xItem(new SvMetaType() ); tools::SvRef<SvMetaType> xItem(new SvMetaType() );
xItem->SetItem(true); xItem->SetItem(true);
xItem->SetRef( ReadKnownType() ); xItem->SetRef( ReadKnownType() );
@@ -224,19 +218,18 @@ void SvIdlParser::ReadItem()
void SvIdlParser::ReadEnum() void SvIdlParser::ReadEnum()
{ {
rInStm.GetToken_Next();
tools::SvRef<SvMetaTypeEnum> xEnum( new SvMetaTypeEnum() ); tools::SvRef<SvMetaTypeEnum> xEnum( new SvMetaTypeEnum() );
xEnum->SetType( MetaTypeType::Enum ); xEnum->SetType( MetaTypeType::Enum );
xEnum->SetName( ReadIdentifier() ); xEnum->SetName( ReadIdentifier() );
ReadChar('{'); Read('{');
while( true ) while( true )
{ {
ReadEnumValue( *xEnum ); ReadEnumValue( *xEnum );
if( !rInStm.ReadIfDelimiter() ) if( !ReadIfDelimiter() )
break; break;
} }
ReadChar( '}' ); Read( '}' );
// announce globally // announce globally
rBase.GetTypeList().push_back( xEnum ); rBase.GetTypeList().push_back( xEnum );
} }
@@ -274,26 +267,24 @@ void SvIdlParser::ReadInterfaceOrShell( SvMetaModule& rModule, MetaTypeType aMet
{ {
tools::SvRef<SvMetaClass> aClass( new SvMetaClass() ); tools::SvRef<SvMetaClass> aClass( new SvMetaClass() );
rInStm.GetToken_Next();
aClass->SetType( aMetaTypeType ); aClass->SetType( aMetaTypeType );
aClass->SetName( ReadIdentifier() ); aClass->SetName( ReadIdentifier() );
if( rInStm.ReadIf( ':' ) ) if( ReadIf( ':' ) )
{ {
aClass->aSuperClass = ReadKnownClass(); aClass->aSuperClass = ReadKnownClass();
} }
if( rInStm.ReadIf( '{' ) ) if( ReadIf( '{' ) )
{ {
sal_uInt32 nBeginPos = 0; // can not happen with Tell sal_uInt32 nBeginPos = 0; // can not happen with Tell
while( nBeginPos != rInStm.Tell() ) while( nBeginPos != rInStm.Tell() )
{ {
nBeginPos = rInStm.Tell(); nBeginPos = rInStm.Tell();
ReadInterfaceOrShellEntry(*aClass); ReadInterfaceOrShellEntry(*aClass);
rInStm.ReadIfDelimiter(); ReadIfDelimiter();
} }
ReadChar( '}' ); Read( '}' );
} }
rModule.aClassList.push_back( aClass ); rModule.aClassList.push_back( aClass );
// announce globally // announce globally
@@ -362,16 +353,16 @@ bool SvIdlParser::ReadInterfaceOrShellSlot(SvMetaSlot& rSlot)
throw SvParseException( rInStm, "attribute " + pAttr->GetName() + " is method or variable but not a slot" ); throw SvParseException( rInStm, "attribute " + pAttr->GetName() + " is method or variable but not a slot" );
rSlot.SetRef( pKnownSlot ); rSlot.SetRef( pKnownSlot );
rSlot.SetName( pKnownSlot->GetName() ); rSlot.SetName( pKnownSlot->GetName() );
if( rInStm.ReadIf( '[' ) ) if( ReadIf( '[' ) )
{ {
sal_uInt32 nBeginPos = 0; // can not happen with Tell sal_uInt32 nBeginPos = 0; // can not happen with Tell
while( nBeginPos != rInStm.Tell() ) while( nBeginPos != rInStm.Tell() )
{ {
nBeginPos = rInStm.Tell(); nBeginPos = rInStm.Tell();
rSlot.ReadAttributesSvIdl( rBase, rInStm ); rSlot.ReadAttributesSvIdl( rBase, rInStm );
rInStm.ReadIfDelimiter(); ReadIfDelimiter();
} }
bOk = rInStm.ReadIf( ']' ); bOk = ReadIf( ']' );
} }
} }
else else
@@ -408,7 +399,7 @@ bool SvIdlParser::ReadInterfaceOrShellMethodOrAttribute( SvMetaAttribute& rAttr
rAttr.aSlotId.SetValue(n); rAttr.aSlotId.SetValue(n);
bOk = true; bOk = true;
if( rInStm.ReadIf( '(' ) ) if( ReadIf( '(' ) )
{ {
// read method arguments // read method arguments
tools::SvRef<SvMetaType> xT(new SvMetaType() ); tools::SvRef<SvMetaType> xT(new SvMetaType() );
@@ -424,14 +415,14 @@ bool SvIdlParser::ReadInterfaceOrShellMethodOrAttribute( SvMetaAttribute& rAttr
if( xAttr->Test( rInStm ) ) if( xAttr->Test( rInStm ) )
rAttr.aType->GetAttrList().push_back( xAttr ); rAttr.aType->GetAttrList().push_back( xAttr );
} }
rInStm.ReadIfDelimiter(); ReadIfDelimiter();
} }
ReadChar( ')' ); Read( ')' );
rAttr.aType->SetType( MetaTypeType::Method ); rAttr.aType->SetType( MetaTypeType::Method );
} }
if( bOk && rInStm.ReadIf( '[' ) ) if( bOk && ReadIf( '[' ) )
{ {
ReadChar( ']' ); Read( ']' );
} }
if( !bOk ) if( !bOk )
@@ -463,36 +454,71 @@ SvMetaType * SvIdlParser::ReadKnownType()
void SvIdlParser::ReadDelimiter() void SvIdlParser::ReadDelimiter()
{ {
if( !rInStm.ReadIfDelimiter() ) if( !ReadIfDelimiter() )
throw SvParseException(rInStm, "expected delimiter"); throw SvParseException(rInStm, "expected delimiter");
} }
bool SvIdlParser::ReadIfDelimiter()
{
if( rInStm.GetToken().IsChar()
&& (';' == rInStm.GetToken().GetChar()
|| ',' == rInStm.GetToken().GetChar()) )
{
rInStm.GetToken_Next();
return true;
}
return false;
}
OString SvIdlParser::ReadIdentifier() OString SvIdlParser::ReadIdentifier()
{ {
SvToken& rTok = rInStm.GetToken_Next(); SvToken& rTok = rInStm.GetToken();
if( !rTok.IsIdentifier() ) if( !rTok.IsIdentifier() )
throw SvParseException("expected identifier", rTok); throw SvParseException("expected identifier", rTok);
rInStm.GetToken_Next();
return rTok.GetString(); return rTok.GetString();
} }
OString SvIdlParser::ReadString() OString SvIdlParser::ReadString()
{ {
SvToken& rTok = rInStm.GetToken_Next(); SvToken& rTok = rInStm.GetToken();
if( !rTok.IsString() ) if( !rTok.IsString() )
throw SvParseException("expected string", rTok); throw SvParseException("expected string", rTok);
rInStm.GetToken_Next();
return rTok.GetString(); return rTok.GetString();
} }
void SvIdlParser::ReadChar(char cChar) void SvIdlParser::Read(char cChar)
{ {
if( !rInStm.ReadIf( cChar ) ) if( !(rInStm.GetToken().IsChar() && rInStm.GetToken().GetChar() == cChar ) )
throw SvParseException(rInStm, "expected char '" + OString(cChar) + "'"); throw SvParseException(rInStm, "expected char '" + OString(cChar) + "'");
rInStm.GetToken_Next();
} }
void SvIdlParser::ReadToken(SvStringHashEntry* entry) bool SvIdlParser::ReadIf(char cChar)
{
if( rInStm.GetToken().IsChar() && rInStm.GetToken().GetChar() == cChar )
{
rInStm.GetToken_Next();
return true;
}
return false;
}
void SvIdlParser::Read(SvStringHashEntry* entry)
{ {
if( !rInStm.GetToken().Is(entry) ) if( !rInStm.GetToken().Is(entry) )
throw SvParseException("expected " + entry->GetName(), rInStm.GetToken()); throw SvParseException("expected " + entry->GetName(), rInStm.GetToken());
rInStm.GetToken_Next();
} }
bool SvIdlParser::ReadIf(SvStringHashEntry* entry)
{
if( rInStm.GetToken().Is(entry) )
{
rInStm.GetToken_Next();
return true;
}
return false;
}
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

View File

@@ -314,7 +314,7 @@ item SvxLine SvxLineItem;
struct SvxLRSpace struct SvxLRSpace
{ {
INT32 LeftMargin MID_L_MARGIN; // % or direct INT32 LeftMargin MID_L_MARGIN; // % or direct
INT32 TextLeftMargin MID_TXT_LMARGIN INT32 TextLeftMargin MID_TXT_LMARGIN;
INT32 RightMargin MID_R_MARGIN; // % or direct INT32 RightMargin MID_R_MARGIN; // % or direct
INT16 LeftRelMargin MID_L_REL_MARGIN; INT16 LeftRelMargin MID_L_REL_MARGIN;
INT16 RightRelMargin MID_R_REL_MARGIN; INT16 RightRelMargin MID_R_REL_MARGIN;