StringSlice FlagStr::parse(const StringSlice& in, bool& out, int extra) { if (in.size() == 0 || !in.ok()) { return in.parsed(false); } StringSlice ret = in; bool temp = true; if (const FlagStr* x= FlagStr::findImpl(in.data(), in.size())) { temp = x->val; ret = in.parsed(true, x->str.size()); } if (ret.complete() || (ret.ok() && extra)) { out = temp; return ret; } return in.parsed(false); }
ScenarioList::ScenarioList() { linked_ptr<Entry> factory_scenario(new Entry); factory_scenario->identifier.assign("com.biggerplanet.ares"); factory_scenario->title.assign("Ares"); factory_scenario->download_url.assign("http://www.arescentral.com"); factory_scenario->author.assign("Bigger Planet"); factory_scenario->author_url.assign("http://www.biggerplanet.com"); u32_to_version(0x01010100, factory_scenario->version); _scenarios.push_back(factory_scenario); ScopedGlob g; const String home(utf8::decode(getenv("HOME"))); const StringSlice scenarios("Library/Application Support/Antares/Scenarios"); const StringSlice info("scenario-info/128.nlAG"); String str(format("{0}/{1}/*/{2}", home, scenarios, info)); CString c_str(str); glob(c_str.data(), 0, NULL, &g.data); size_t prefix_len = home.size() + scenarios.size() + 2; size_t suffix_len = info.size() + 1; for (int i = 0; i < g.data.gl_matchc; ++i) { const String path(utf8::decode(g.data.gl_pathv[i])); StringSlice identifier = path.slice(prefix_len, path.size() - prefix_len - suffix_len); if (identifier == factory_scenario->identifier) { continue; } MappedFile file(path); BytesSlice data(file.data()); scenarioInfoType info; read(data, info); linked_ptr<Entry> entry(new Entry); entry->identifier.assign(identifier); entry->title.assign(info.titleString); entry->download_url.assign(info.downloadURLString); entry->author.assign(info.authorNameString); entry->author_url.assign(info.authorURLString); u32_to_version(info.version, entry->version); _scenarios.push_back(entry); } }