struct ConfigReader { ConfigReader( const StringView& _it ) : it( _it.after_all( SPACE_CHARS ) ){} bool Read( StringView& key, StringView& value ) { while( it.size() ) { key = it.until_any( SPACE_CHARS ); if( key.ch() == '#' ) { it = it.after( "\n" ).after_all( SPACE_CHARS ); continue; } it.skip( key.size() ); it.after_all( HSPACE_CHARS ); value = it.until( "\n" ); it.skip( value.size() ); value.trim( SPACE_CHARS ); it = it.after_all( SPACE_CHARS ); return key.size() != 0; } return false; } StringView it; }; // usage code ConfigReader cr( text ); StringView key, value; while( cr.Read( key, value ) ) { if( key == "game" ) { if( value.size() ) { g_GameLibName = value; LOG << "CONFIG: Game library: " << value; } } else if( key == "dir" ) { if( value.size() ) { g_GameDir = value; LOG << "CONFIG: Game directory: " << value; } } else if( key == "dir2" ) { if( value.size() ) { g_GameDir2 = value; LOG << "CONFIG: Game directory #2: " << value; } } else if( key == "renderer" ) { if( value.size() ) { g_RendererName = value; LOG << "CONFIG: Renderer: " << value; } } else { LOG_WARNING << "Unknown key (" << key << " = " << value << ")"; } }