Files
OpenRA/OpenRa.FileFormats/IniFile.cs
bob 1438053505 - bugfix in Format80
- fixed heisenburg-endianness in map loader
    - THERES A BUG in the mix loading; I need another 4 bytes padding to load temperat.mix and snow.mix (not interior.mix, though)
    - ShpViewer can now load and view map files
    - Copy TEMPERAT, SNOW, INFERIOR (sic) mixes into $(SolutionDir) for this to work
    - Left-click to reload tile-ID file, middle-click scrolls
    - the tile-id file has some collisions between tile-sets, be careful about ordering if you change anything


git-svn-id: svn://svn.ijw.co.nz/svn/OpenRa@1081 993157c7-ee19-0410-b2c4-bb4e9862e678
2007-06-26 21:25:20 +00:00

88 lines
1.9 KiB
C#

using System;
using System.Collections.Generic;
using System.Text;
using System.IO;
using System.Text.RegularExpressions;
namespace OpenRa.FileFormats
{
public class IniFile
{
Dictionary<string, IniSection> sections = new Dictionary<string, IniSection>();
IniSection currentSection;
public IniFile( Stream s )
{
StreamReader reader = new StreamReader( s );
while( !reader.EndOfStream )
{
string line = reader.ReadLine();
if( !ProcessEntry( line ) )
ProcessSection( line );
}
}
Regex sectionPattern = new Regex( @"\[([^]]*)\]" );
Regex entryPattern = new Regex( @"([^=]+)=([^;]*)" );
bool ProcessSection( string line )
{
Match m = sectionPattern.Match( line );
if( m == null || !m.Success )
return false;
string sectionName = m.Groups[ 1 ].Value;
currentSection = new IniSection( sectionName );
sections.Add( sectionName, currentSection );
return true;
}
bool ProcessEntry( string line )
{
Match m = entryPattern.Match( line );
if( m == null || !m.Success )
return false;
if( currentSection == null )
throw new InvalidOperationException( "No current INI section" );
string keyName = m.Groups[ 1 ].Value;
string keyValue = m.Groups[ 2 ].Value;
currentSection.Add( keyName, keyValue );
return true;
}
public IniSection GetSection( string s )
{
IniSection section;
sections.TryGetValue( s, out section );
return section;
}
}
public class IniSection
{
string name;
Dictionary<string, string> values = new Dictionary<string, string>();
public IniSection( string name )
{
this.name = name;
}
public void Add( string key, string value )
{
values.Add( key, value );
}
public string GetValue( string key, string defaultValue )
{
string s;
return values.TryGetValue( key, out s ) ? s : defaultValue;
}
}
}