2012-05-21 23:51:32 +00:00
using System ;
using System.Collections.Generic ;
using System.IO ;
using System.Text ;
using CodeImp.DoomBuilder.ZDoom ;
using CodeImp.DoomBuilder.GZBuilder.Data ;
using CodeImp.DoomBuilder.GZBuilder.GZDoom ;
namespace CodeImp.DoomBuilder.GZBuilder.GZDoom {
2012-07-12 22:34:12 +00:00
internal class ModeldefParser : ZDTextParser {
2012-05-21 23:51:32 +00:00
private Dictionary < string , ModeldefEntry > modelDefEntries ; //classname, entry
2012-07-12 22:34:12 +00:00
internal Dictionary < string , ModeldefEntry > ModelDefEntries { get { return modelDefEntries ; } }
2012-05-21 23:51:32 +00:00
2012-06-01 10:17:47 +00:00
private List < string > classNames ;
2012-07-12 22:34:12 +00:00
internal string Source { get { return sourcename ; } }
2012-05-21 23:51:32 +00:00
2012-07-12 22:34:12 +00:00
internal ModeldefParser ( ) {
2012-06-01 10:17:47 +00:00
modelDefEntries = new Dictionary < string , ModeldefEntry > ( ) ;
classNames = new List < string > ( ) ;
}
2012-05-21 23:51:32 +00:00
//should be called after all decorate actors are parsed
public override bool Parse ( Stream stream , string sourcefilename ) {
base . Parse ( stream , sourcefilename ) ;
modelDefEntries = new Dictionary < string , ModeldefEntry > ( ) ;
// Continue until at the end of the stream
while ( SkipWhitespace ( true ) ) {
string token = ReadToken ( ) ;
2012-05-22 22:56:42 +00:00
2012-05-21 23:51:32 +00:00
if ( token ! = null ) {
2012-06-01 10:17:47 +00:00
token = StripTokenQuotes ( token ) . ToLowerInvariant ( ) ;
2012-05-21 23:51:32 +00:00
if ( token = = "model" ) { //model structure start
//find classname
SkipWhitespace ( true ) ;
string className = StripTokenQuotes ( ReadToken ( ) ) . ToLowerInvariant ( ) ;
if ( ! string . IsNullOrEmpty ( className ) ) {
2012-06-01 19:53:14 +00:00
if ( classNames . IndexOf ( className ) ! = - 1 )
2012-05-21 23:51:32 +00:00
continue ; //already got this class; continue to next one
//now find opening brace
SkipWhitespace ( true ) ;
token = ReadToken ( ) ;
if ( token ! = "{" ) {
GZBuilder . GZGeneral . LogAndTraceWarning ( "Unexpected token found in " + sourcefilename + " at line " + GetCurrentLineNumber ( ) + ": expected '{', but got " + token ) ;
continue ; //something wrong with modeldef declaration, continue to next one
}
ModeldefStructure mds = new ModeldefStructure ( ) ;
ModeldefEntry mde = mds . Parse ( this ) ;
if ( mde ! = null ) {
mde . ClassName = className ;
2012-06-01 10:17:47 +00:00
modelDefEntries . Add ( className , mde ) ;
classNames . Add ( mde . ClassName ) ;
2012-05-21 23:51:32 +00:00
}
}
} else {
// Unknown structure!
string token2 ;
do {
if ( ! SkipWhitespace ( true ) ) break ;
token2 = ReadToken ( ) ;
if ( token2 = = null ) break ;
}
while ( token2 ! = "{" ) ;
int scopelevel = 1 ;
do {
if ( ! SkipWhitespace ( true ) ) break ;
token2 = ReadToken ( ) ;
if ( token2 = = null ) break ;
if ( token2 = = "{" ) scopelevel + + ;
if ( token2 = = "}" ) scopelevel - - ;
}
while ( scopelevel > 0 ) ;
}
}
}
if ( modelDefEntries . Count > 0 )
return true ;
return false ;
}
}
}