void Config::LoadConfiguration(const URL& path) { NEX_THREAD_LOCK_GUARD_MUTEX(contentLock); FileSystem& fileSys = FileSystem::Instance(); InputStreamPtr inputStream = fileSys.OpenRead(path); if (inputStream) { const void* readOnlyBuffer = 0; size_t size = inputStream->AcquireBuffer(readOnlyBuffer); StreamLexer input(static_cast<const char*>(readOnlyBuffer), size); // read String section; NameValueMap* current = §ions[""]; input.SkipWhite(); while (!input.IsEndOfStream()) { switch (input.Forward()) { case '[': { input.SkipWhite(); section = input.ReadWord("] \n\t\r"); current = §ions[section]; if (NEX_IS_DEBUG_MODE()) { input.SkipWhite(); if (input.Current() != ']') { Warn( "expected ']', in line: " + Convert::ToString(input.Line()) + " in config: " + path.GetRelativePath()); } } input.SkipLine(); } break; default: { input.Backward(); String name = input.ReadWord("= \n\t\r"); input.SkipWhite(); if (input.Forward() == '=') { const String& value = input.ReadStringLiteral(); (*current)[name] = value; } else { Warn( "illegal expression in line: " + Convert::ToString(input.Line()) + " in config: " + path.GetRelativePath()); input.SkipLine(); } } break; } input.SkipWhite(); } inputStream->ReleaseBuffer(readOnlyBuffer); } }