void OptionsCont::reportDoubleSetting(const std::string &arg) const throw() { std::vector<std::string> synonymes = getSynonymes(arg); std::ostringstream s; s << "A value for the option '" + arg + "' was already set.\n Possible synonymes: "; for (std::vector<std::string>::iterator i=synonymes.begin(); i!=synonymes.end();) { s << (*i); i++; if (i!=synonymes.end()) { s << ", "; } } MsgHandler::getErrorInstance()->inform(s.str()); }
void OptionsCont::reportDoubleSetting(const std::string& arg) const { std::vector<std::string> synonymes = getSynonymes(arg); std::ostringstream s; s << "A value for the option '" + arg + "' was already set.\n Possible synonymes: "; for (std::vector<std::string>::iterator i = synonymes.begin(); i != synonymes.end();) { s << (*i); i++; if (i != synonymes.end()) { s << ", "; } } WRITE_ERROR(s.str()); }
bool OptionsCont::checkDependingSuboptions(const std::string& name, const std::string& prefix) const { Option* o = getSecure(name); if (o->isSet()) { return true; } bool ok = true; std::vector<std::string> seenSynonymes; for (KnownContType::const_iterator i = myValues.begin(); i != myValues.end(); i++) { if (std::find(seenSynonymes.begin(), seenSynonymes.end(), (*i).first) != seenSynonymes.end()) { continue; } if ((*i).second->isSet() && !(*i).second->isDefault() && (*i).first.find(prefix) == 0) { WRITE_ERROR("Option '" + (*i).first + "' needs option '" + name + "'."); std::vector<std::string> synonymes = getSynonymes((*i).first); std::copy(synonymes.begin(), synonymes.end(), std::back_inserter(seenSynonymes)); ok = false; } } return ok; }
void OptionsCont::printHelp(std::ostream &os) throw() { std::vector<std::string>::const_iterator i, j; // print application description os << ' ' << std::endl; splitLines(os, myAppDescription , 0, 0); os << std::endl; // print usage BNF os << "Usage: " << myAppName << " [OPTION]*" << std::endl; os << ' ' << std::endl; // print usage examples if (myCallExamples.size()>1) { os << " Examples:" << std::endl; } else if (myCallExamples.size()!=0) { os << " Example:" << std::endl; } if (myCallExamples.size()!=0) { for (i=myCallExamples.begin(); i!=myCallExamples.end(); ++i) { os << " " << myAppName << ' ' << (*i) << std::endl; } } os << ' ' << std::endl; // print additional text if any if (myAdditionalMessage.length()>0) { os << myAdditionalMessage << std::endl << ' ' << std::endl; } // print the options // check their sizes first // we want to know how large the largest not-too-large-entry will be size_t tooLarge = 40; size_t maxSize = 0; for (i=mySubTopics.begin(); i!=mySubTopics.end(); ++i) { const std::vector<std::string> &entries = mySubTopicEntries[*i]; for (j=entries.begin(); j!=entries.end(); ++j) { Option *o = getSecure(*j); // name, two leading spaces and "--" size_t csize = (*j).length() + 2 + 4; // abbreviation length ("-X, "->4chars) if any std::vector<std::string> synonymes = getSynonymes(*j); if (find_if(synonymes.begin(), synonymes.end(), abbreviation_finder())!=synonymes.end()) { csize += 4; } // the type name if (!o->isBool()) { csize += 1 + o->getTypeName().length(); } // divider csize += 2; if (csize<tooLarge&&maxSize<csize) { maxSize = csize; } } } for (i=mySubTopics.begin(); i!=mySubTopics.end(); ++i) { os << ' ' << *i << " Options:" << std::endl; const std::vector<std::string> &entries = mySubTopicEntries[*i]; for (j=entries.begin(); j!=entries.end(); ++j) { // start length computation size_t csize = (*j).length() + 2; Option *o = getSecure(*j); os << " "; // write abbreviation if given std::vector<std::string> synonymes = getSynonymes(*j); std::vector<std::string>::iterator a = find_if(synonymes.begin(), synonymes.end(), abbreviation_finder()); if (a!=synonymes.end()) { os << '-' << (*a) << ", "; csize += 4; } // write leading '-'/"--" os << "--"; csize += 2; // write the name os << *j; // write the type if not a bool option if (!o->isBool()) { os << ' ' << o->getTypeName(); csize += 1 + o->getTypeName().length(); } csize += 2; // write the description formatting it os << " "; size_t r; for (r=maxSize; r>csize; --r) { os << ' '; } std::string desc = o->getDescription(); size_t offset = csize > tooLarge ? csize : maxSize; splitLines(os, desc, offset, maxSize); } os << std::endl; } }
void OptionsCont::writeConfiguration(std::ostream& os, bool filled, bool complete, bool addComments) const { os << "<?xml version=\"1.0\"" << SUMOSAXAttributes::ENCODING << "?>\n\n"; os << "<configuration xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:noNamespaceSchemaLocation=\"http://sumo.dlr.de/xsd/" << myAppName << "Configuration.xsd\">" << std::endl << std::endl; for (std::vector<std::string>::const_iterator i = mySubTopics.begin(); i != mySubTopics.end(); ++i) { std::string subtopic = *i; if (subtopic == "Configuration" && !complete) { continue; } std::replace(subtopic.begin(), subtopic.end(), ' ', '_'); std::transform(subtopic.begin(), subtopic.end(), subtopic.begin(), tolower); const std::vector<std::string>& entries = mySubTopicEntries.find(*i)->second; bool hadOne = false; for (std::vector<std::string>::const_iterator j = entries.begin(); j != entries.end(); ++j) { Option* o = getSecure(*j); bool write = complete || (filled && !o->isDefault()); if (!write) { continue; } if (!hadOne) { os << " <" << subtopic << ">" << std::endl; } // add the comment if wished if (addComments) { os << " <!-- " << StringUtils::escapeXML(o->getDescription()) << " -->" << std::endl; } // write the option and the value (if given) os << " <" << *j << " value=\""; if (o->isSet() && (filled || o->isDefault())) { os << o->getValueString(); } if (complete) { std::vector<std::string> synonymes = getSynonymes(*j); if (!synonymes.empty()) { os << "\" synonymes=\""; for (std::vector<std::string>::const_iterator s = synonymes.begin(); s != synonymes.end(); ++s) { if (s != synonymes.begin()) { os << " "; } os << (*s); } } os << "\" type=\"" << o->getTypeName(); if (!addComments) { os << "\" help=\"" << StringUtils::escapeXML(o->getDescription()); } } os << "\"/>" << std::endl; // append an endline if a comment was printed if (addComments) { os << std::endl; } hadOne = true; } if (hadOne) { os << " </" << subtopic << ">" << std::endl << std::endl; } } os << "</configuration>" << std::endl; }