54 #ifdef CHECK_MEMORY_LEAKS 56 #endif // CHECK_MEMORY_LEAKS 76 myCopyrightNotices.push_back(
"Copyright (C) 2001-2016 DLR and contributors; http://sumo.dlr.de");
93 throw ProcessError(name +
" is an already used option name.");
108 KnownContType::iterator i1 =
myValues.find(name1);
109 KnownContType::iterator i2 =
myValues.find(name2);
111 throw ProcessError(
"Neither the option '" + name1 +
"' nor the option '" + name2 +
"' is known yet");
114 if ((*i1).second == (*i2).second) {
117 throw ProcessError(
"Both options '" + name1 +
"' and '" + name2 +
"' do exist and differ.");
148 KnownContType::const_iterator i =
myValues.find(name);
150 if (failOnNonExistant) {
151 throw ProcessError(
"Internal request for unknown option '" + name +
"'!");
156 return (*i).second->isSet();
162 KnownContType::const_iterator i =
myValues.find(name);
164 if (failOnNonExistant) {
165 throw ProcessError(
"Internal request for unknown option '" + name +
"'!");
170 (*i).second->unSet();
176 KnownContType::const_iterator i =
myValues.find(name);
180 return (*i).second->isDefault();
186 KnownContType::const_iterator k =
myValues.find(name);
188 throw ProcessError(
"No option with the name '" + name +
"' exists.");
192 std::string defaultName;
194 for (std::vector<std::string>::const_iterator j = i->second.begin(); j != i->second.end(); ++j) {
195 KnownContType::const_iterator l =
myValues.find(*j);
196 if (l !=
myValues.end() && l->second == k->second) {
201 if (defaultName !=
"") {
205 WRITE_WARNING(
"Please note that '" + name +
"' is deprecated.\n Use '" + defaultName +
"' instead.");
255 if (!o->
set(value)) {
259 WRITE_ERROR(
"While processing option '" + name +
"':\n " + e.what());
268 if (
set(name, value)) {
288 std::vector<std::string>
291 std::vector<std::string> v(0);
292 for (KnownContType::const_iterator i =
myValues.begin(); i !=
myValues.end(); i++) {
293 if ((*i).second == o && name != (*i).first) {
294 v.push_back((*i).first);
303 std::vector<std::string> done;
304 os <<
"Options set:" << std::endl;
305 for (OptionsCont::KnownContType::const_iterator i = oc.
myValues.begin();
307 std::vector<std::string>::iterator j = find(done.begin(), done.end(), (*i).first);
308 if (j == done.end()) {
309 std::vector<std::string> synonymes = oc.
getSynonymes((*i).first);
310 if (synonymes.size() != 0) {
311 os << (*i).first <<
" (";
312 for (j = synonymes.begin(); j != synonymes.end(); j++) {
313 if (j != synonymes.begin()) {
322 if ((*i).second->isSet()) {
323 os <<
": " << (*i).second->getValueString() << std::endl;
325 os <<
": <INVALID>" << std::endl;
327 done.push_back((*i).first);
328 copy(synonymes.begin(), synonymes.end(), back_inserter(done));
338 if ((*i)->isFileName() && (*i)->isSet()) {
341 while (st.hasNext()) {
342 if (conv.length() != 0) {
345 std::string tmp = st.
next();
351 if (conv != (*i)->getString()) {
352 const bool hadDefault = (*i)->isDefault();
355 (*i)->resetDefault();
374 if (files.size() == 0) {
375 WRITE_ERROR(
"The file list for '" + name +
"' is empty.");
378 for (std::vector<std::string>::const_iterator fileIt = files.begin(); fileIt != files.end(); ++fileIt) {
381 WRITE_ERROR(
"File '" + *fileIt +
"' is not accessible (" + std::strerror(errno) +
").");
399 std::vector<std::string> seenSynonymes;
400 for (KnownContType::const_iterator i =
myValues.begin(); i !=
myValues.end(); i++) {
401 if (std::find(seenSynonymes.begin(), seenSynonymes.end(), (*i).first) != seenSynonymes.end()) {
404 if ((*i).second->isSet() && !(*i).second->isDefault() && (*i).first.find(prefix) == 0) {
405 WRITE_ERROR(
"Option '" + (*i).first +
"' needs option '" + name +
"'.");
406 std::vector<std::string> synonymes =
getSynonymes((*i).first);
407 std::copy(synonymes.begin(), synonymes.end(), std::back_inserter(seenSynonymes));
418 std::ostringstream s;
419 s <<
"A value for the option '" + arg +
"' was already set.\n Possible synonymes: ";
420 for (std::vector<std::string>::iterator i = synonymes.begin(); i != synonymes.end();) {
423 if (i != synonymes.end()) {
451 (*i)->resetWritable();
465 ItemAddressContType::iterator i;
478 const std::string& subtopic,
479 const std::string& description) {
490 const std::string& fullName) {
535 size_t offset,
size_t nextOffset) {
536 while (what.length() > 0) {
537 if (what.length() > 79 - offset) {
538 size_t splitPos = what.rfind(
';', 79 - offset);
539 if (splitPos == std::string::npos) {
540 splitPos = what.rfind(
' ', 79 - offset);
544 if (splitPos != std::string::npos) {
545 os << what.substr(0, splitPos) << std::endl;
546 what = what.substr(splitPos);
547 for (
size_t r = 0; r < nextOffset + 1; ++r) {
566 if (missingOptions) {
569 std::cout <<
" Build features: " <<
HAVE_ENABLED << std::endl;
570 for (std::vector<std::string>::const_iterator it =
572 std::cout <<
" " << *it << std::endl;
574 std::cout <<
" License GPLv3+: GNU GPL Version 3 or later <http://gnu.org/licenses/gpl.html>\n";
575 std::cout <<
" Use --help to get the list of options." << std::endl;
582 for (std::vector<std::string>::const_iterator it =
584 std::cout <<
" " << *it << std::endl;
592 std::cout <<
" Build features: " <<
HAVE_ENABLED << std::endl;
593 for (std::vector<std::string>::const_iterator it =
595 std::cout <<
" " << *it << std::endl;
597 std::cout <<
"\n" <<
myFullName <<
" is part of SUMO.\n";
598 std::cout <<
"SUMO is free software: you can redistribute it and/or modify\n";
599 std::cout <<
"it under the terms of the GNU General Public License as published by\n";
600 std::cout <<
"the Free Software Foundation, either version 3 of the License, or\n";
601 std::cout <<
"(at your option) any later version.\n\n";
602 std::cout <<
"This program is distributed in the hope that it will be useful,\n";
603 std::cout <<
"but WITHOUT ANY WARRANTY; without even the implied warranty of\n";
604 std::cout <<
"MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n";
605 std::cout <<
"GNU General Public License for more details.\n\n";
606 std::cout <<
"You should have received a copy of the GNU General Public License\n";
607 std::cout <<
"along with this program. If not, see http://www.gnu.org/licenses/gpl.html" << std::endl;
612 std::cout << (*this);
616 if (
isSet(
"save-configuration",
false)) {
617 if (
getString(
"save-configuration") ==
"-" ||
getString(
"save-configuration") ==
"stdout") {
621 std::ofstream out(
getString(
"save-configuration").c_str());
633 if (
isSet(
"save-template",
false)) {
638 std::ofstream out(
getString(
"save-template").c_str());
649 if (
isSet(
"save-schema",
false)) {
654 std::ofstream out(
getString(
"save-schema").c_str());
670 std::vector<std::string>::const_iterator i, j;
675 os <<
"Usage: " <<
myAppName <<
" [OPTION]*" << std::endl;
683 size_t tooLarge = 40;
687 for (j = entries.begin(); j != entries.end(); ++j) {
690 size_t csize = (*j).length() + 2 + 4;
693 if (find_if(synonymes.begin(), synonymes.end(),
abbreviation_finder()) != synonymes.end()) {
702 if (csize < tooLarge && maxSize < csize) {
709 os << *i <<
" Options:" << std::endl;
711 for (j = entries.begin(); j != entries.end(); ++j) {
713 size_t csize = (*j).length() + 2;
718 std::vector<std::string>::iterator a = find_if(synonymes.begin(), synonymes.end(),
abbreviation_finder());
719 if (a != synonymes.end()) {
720 os <<
'-' << (*a) <<
", ";
736 for (
size_t r = maxSize; r > csize; --r) {
739 size_t offset = csize > tooLarge ? csize : maxSize;
747 os <<
"Examples:" << std::endl;
749 os <<
" " <<
myAppName <<
' ' << e->first << std::endl;
750 os <<
" " << e->second << std::endl;
754 os <<
"Report bugs at <http://sumo.dlr.de/trac/>." << std::endl;
755 os <<
"Get in contact via <sumo@dlr.de>." << std::endl;
761 bool complete,
bool addComments)
const {
763 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;
765 std::string subtopic = *i;
766 if (subtopic ==
"Configuration" && !complete) {
769 std::replace(subtopic.begin(), subtopic.end(),
' ',
'_');
770 std::transform(subtopic.begin(), subtopic.end(), subtopic.begin(), tolower);
773 for (std::vector<std::string>::const_iterator j = entries.begin(); j != entries.end(); ++j) {
775 bool write = complete || (filled && !o->
isDefault());
780 os <<
" <" << subtopic <<
">" << std::endl;
787 os <<
" <" << *j <<
" value=\"";
793 if (!synonymes.empty()) {
794 os <<
"\" synonymes=\"";
795 for (std::vector<std::string>::const_iterator s = synonymes.begin(); s != synonymes.end(); ++s) {
796 if (s != synonymes.begin()) {
807 os <<
"\"/>" << std::endl;
815 os <<
" </" << subtopic <<
">" << std::endl << std::endl;
818 os <<
"</configuration>" << std::endl;
825 os <<
"<xsd:schema elementFormDefault=\"qualified\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\">\n\n";
826 os <<
" <xsd:include schemaLocation=\"baseTypes.xsd\"/>\n";
827 os <<
" <xsd:element name=\"configuration\" type=\"configurationType\"/>\n\n";
828 os <<
" <xsd:complexType name=\"configurationType\">\n";
829 os <<
" <xsd:all>\n";
831 std::string subtopic = *i;
832 if (subtopic ==
"Configuration") {
835 std::replace(subtopic.begin(), subtopic.end(),
' ',
'_');
836 std::transform(subtopic.begin(), subtopic.end(), subtopic.begin(), tolower);
837 os <<
" <xsd:element name=\"" << subtopic <<
"\" type=\"" << subtopic <<
"Type\" minOccurs=\"0\"/>\n";
839 os <<
" </xsd:all>\n";
840 os <<
" </xsd:complexType>\n\n";
842 std::string subtopic = *i;
843 if (subtopic ==
"Configuration") {
846 std::replace(subtopic.begin(), subtopic.end(),
' ',
'_');
847 std::transform(subtopic.begin(), subtopic.end(), subtopic.begin(), tolower);
848 os <<
" <xsd:complexType name=\"" << subtopic <<
"Type\">\n";
849 os <<
" <xsd:all>\n";
851 for (std::vector<std::string>::const_iterator j = entries.begin(); j != entries.end(); ++j) {
854 std::transform(type.begin(), type.end(), type.begin(), tolower);
855 if (type ==
"int[]") {
858 os <<
" <xsd:element name=\"" << *j <<
"\" type=\"" << type <<
"OptionType\" minOccurs=\"0\"/>\n";
860 os <<
" </xsd:all>\n";
861 os <<
" </xsd:complexType>\n\n";
863 os <<
"</xsd:schema>\n";
874 strftime(buffer, 80,
"<!-- generated on %c by ", localtime(&rawtime));
881 std::vector<std::string>
886 WRITE_WARNING(
"Please note that using ';' as list separator is deprecated.\n From 1.0 onwards, only ',' will be accepted.");
890 std::vector<std::string> ret = st.
getVector();
891 for (std::vector<std::string>::iterator i = ret.begin(); i != ret.end(); ++i) {
900 const std::string& itemName) {
901 if (
isSet(optionName)) {
903 return find(values.begin(), values.end(), itemName) != values.end();
std::string myAppName
some information on the application
void doRegister(const std::string &name, Option *v)
Adds an option under the given name.
std::vector< std::string > getStringVector(const std::string &name) const
Returns the list of string-vector-value of the named option (only for Option_String) ...
std::vector< std::string > getSynonymes(const std::string &name) const
Returns the synonymes of an option name.
std::vector< std::string > mySubTopics
lists of option subtopics and copyright notices
static std::string getConfigurationRelative(const std::string &configPath, const std::string &path)
Returns the second path as a relative path to the first file.
void resetWritable()
Resets all options to be writeable.
bool isSet() const
returns the information whether this options holds a valid value
void addCopyrightNotice(const std::string ©rightLine)
Adds a copyright notice to the help output.
bool isInStringVector(const std::string &optionName, const std::string &itemName)
Returns the named option is a list of string values containing the specified item.
static bool isReadable(std::string path)
Checks whether the given file is readable.
bool checkDependingSuboptions(const std::string &name, const std::string &prefix) const
Checks whether an option is set, which has options with a prefix depending on it. ...
virtual bool isBool() const
Returns the information whether the option is a bool option.
void addCallExample(const std::string &example, const std::string &desc)
Add a call example.
void unSet(const std::string &name, bool failOnNonExistant=true) const
Marks the option as unset.
void reportDoubleSetting(const std::string &arg) const
Reports an error that the option has already been set.
void setApplicationDescription(const std::string &appDesc)
Sets the application description.
void clearCopyrightNotices()
Removes all copyright information.
void printHelp(std::ostream &os)
Prints the help.
const IntVector & getIntVector(const std::string &name) const
Returns the list of integer-value of the named option (only for Option_IntVector) ...
bool getBool(const std::string &name) const
Returns the boolean-value of the named option (only for Option_Bool)
static std::string escapeXML(const std::string &orig)
Replaces the standard escapes by their XML entities.
bool myHaveInformedAboutDeprecatedDivider
Information whether a warning a deprecated divider.
virtual bool getBool() const
Returns the stored boolean value.
std::string convertChar(char abbr) const
Converts an abbreviation into a name.
virtual const IntVector & getIntVector() const
Returns the stored integer vector.
void setDescription(const std::string &desc)
Sets the description of what this option does.
virtual const std::string & getTypeName() const
Returns the mml-type name of this option.
static OptionsCont myOptions
The static options container used.
virtual std::string getString() const
Returns the stored string value.
SUMOReal getFloat(const std::string &name) const
Returns the SUMOReal-value of the named option (only for Option_Float)
std::map< std::string, std::string > myXMLDefaults
A map from XML root element to option.
#define WRITE_WARNING(msg)
static OptionsCont & getOptions()
Retrieves the options.
void resetDefault()
Resets the option to be on its default value.
void addSynonyme(const std::string &name1, const std::string &name2, bool isDeprecated=false)
Adds a synonyme for an options name (any order)
std::string myAppDescription
ItemAddressContType myAddresses
std::string getString(const std::string &name) const
Returns the string-value of the named option (only for Option_String)
bool setByRootElement(const std::string &name, const std::string &value)
Sets the given value for the option which can handle the given XML root.
std::map< std::string, bool > myDeprecatedSynonymes
A map from deprecated options to a bool indicating whether we warned about deprecation.
void clear()
Removes all information from the container.
void writeXMLHeader(std::ostream &os)
Writes a standard XML header, including the configuration.
bool isBool(const std::string &name) const
Returns the information whether the option is a boolean option.
std::string myAdditionalMessage
std::vector< int > IntVector
Definition of a vector of unsigned ints.
const std::string & getDescription() const
Returns the description of what this option does.
bool setDefault(const std::string &name, const std::string &value)
Sets the given value for the named option as new default value.
static bool isAbsolute(const std::string &path)
Returns the information whether the given path is absolute.
void setAdditionalHelpMessage(const std::string &add)
Sets an additional message to be printed at the begin of the help screen.
bool isUsableFileList(const std::string &name) const
Checks whether the named option is usable as a file list (with at least a single file) ...
static const std::string ENCODING
The encoding of parsed strings.
bool processMetaOptions(bool missingOptions)
Checks for help and configuration output, returns whether we should exit.
~OptionsCont()
Destructor.
bool isWriteable(const std::string &name)
Returns the information whether the named option may be set.
void addOptionSubTopic(const std::string &topic)
Adds an option subtopic.
bool isWriteable() const
Returns the information whether the option may be set a further time.
bool isDefault(const std::string &name) const
Returns the information whether the named option has still the default value.
void splitLines(std::ostream &os, std::string what, size_t offset, size_t nextOffset)
Writes the given string 'formatted'.
virtual bool set(const std::string &v)=0
Stores the given value.
void writeSchema(std::ostream &os, bool addComments)
Writes the xml schema for the configuration.
std::vector< std::string > getVector()
A class to find abbreviated option names (length=1)
A class representing a single program option.
void relocateFiles(const std::string &configuration) const
Modifies file name options according to the configuration path.
virtual bool isDefault() const
Returns the information whether the option holds the default value.
virtual int getInt() const
Returns the stored integer value.
virtual SUMOReal getFloat() const
Returns the stored SUMOReal value.
static std::string prune(const std::string &str)
Removes trailing and leading whitechars.
bool set(const std::string &name, const std::string &value)
Sets the given value for the named option.
virtual std::string getValueString() const =0
Returns the string-representation of the value.
void addXMLDefault(const std::string &name, const std::string &xmlRoot="")
Adds an XML root element to handle by default. The special root "" denotes the default handler...
std::map< std::string, std::vector< std::string > > mySubTopicEntries
A map from subtopic to option.
friend std::ostream & operator<<(std::ostream &os, const OptionsCont &oc)
Output operator.
static std::string urlDecode(const std::string &encoded)
A storage for options typed value containers)
Option * getSecure(const std::string &name) const
Returns the named option.
std::vector< std::string > myCopyrightNotices
void writeConfiguration(std::ostream &os, bool filled, bool complete, bool addComments) const
Writes the configuration.
void addDescription(const std::string &name, const std::string &subtopic, const std::string &description)
Adds a description for an option.
int getInt(const std::string &name) const
Returns the int-value of the named option (only for Option_Integer)
#define WRITE_MESSAGE(msg)
OptionsCont()
Constructor.
std::vector< std::pair< std::string, std::string > > myCallExamples
list of call examples
bool exists(const std::string &name) const
Returns the information whether the named option is known.
bool isSet(const std::string &name, bool failOnNonExistant=true) const
Returns the information whether the named option is set.
void setApplicationName(const std::string &appName, const std::string &fullName)
Sets the application name.