/* ================ XDeclParser::LexFile ================ */ bool XDeclParser::LexFile( const char *filename ) { Lexer lexer; if ( !lexer.LoadFile( filename ) ) return false; try { Parse(lexer); return true; } catch( LexerError err ) { String errStr; err.ToString( errStr ); User::Error( ERR_LEXER_FAILURE, errStr.c_str(), filename ); return false; } }
/* ================ DeclParser::MakeBinary ================ */ bool DeclParser::MakeBinary( const char *filename ) { if ( commonFS == OG_NULL ) return false; Lexer lexer; if ( !lexer.LoadFile( filename ) ) return false; File *f = commonFS->OpenWrite( Format( "$*.bin" ) << filename ); if ( !f ) return false; try { f->Write( DECL_DESCRIPTOR_STR, DECL_DESCRIPTOR_LENGTH ); Dict dict; bool getKeyValue = false; const Token *token; String key, value; String str; const char *p; while ( (token = lexer.ReadToken()) != OG_NULL ) { //! @todo maybe token should be stored as String, so we don't have to recalc len/bytelen p = token->GetString(); if ( p ) { if ( *p == '\0' ) { lexer.Error("Unexpected Empty Token"); return false; } if ( !getKeyValue ) { str = p; str.WriteToFile( f ); value = lexer.ReadString(); if ( value.IsEmpty() ) { lexer.Error("Empty name!"); return false; } value.WriteToFile( f ); lexer.ExpectToken("{"); getKeyValue = true; } else { if ( *p == '}' ) { getKeyValue = false; dict.WriteToFile( f ); dict.Clear(); } else { key = p; dict.Set( key.c_str(), lexer.ReadString() ); } } } } if ( getKeyValue ) { lexer.Error("Unexpected End Of File"); return false; } return true; } catch( FileReadWriteError &err ) { f->Close(); User::Error( ERR_FILE_WRITEFAIL, Format("Binary Decl: $*.bin" ) << err.ToString(), filename ); return false; } catch( LexerError &err ) { f->Close(); String errStr; err.ToString( errStr ); User::Error( ERR_LEXER_FAILURE, errStr.c_str(), filename ); return false; } }