using System; using System.Collections.Generic; using System.Text; using System.IO; using System.Text.RegularExpressions; namespace OpenRa.FileFormats { public class IniFile { Dictionary sections = new Dictionary(); 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> { string name; Dictionary values = new Dictionary(); public IniSection( string name ) { this.name = name; } public void Add( string key, string value ) { values[key] = value; //values.Add( key, value ); } public string GetValue( string key, string defaultValue ) { string s; return values.TryGetValue( key, out s ) ? s : defaultValue; } public IEnumerator> GetEnumerator() { return values.GetEnumerator(); } System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() { return GetEnumerator(); } } }