Files
OpenRA/OpenRa.FileFormats/IniFile.cs

98 lines
2.2 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 : IEnumerable<KeyValuePair<string, string>>
{
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;
}
public IEnumerator<KeyValuePair<string, string>> GetEnumerator()
{
return values.GetEnumerator();
}
System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
{
return GetEnumerator();
}
}
}