54 #ifdef CHECK_MEMORY_LEAKS 56 #endif // CHECK_MEMORY_LEAKS 76 myCopyrightNotices.push_back(
"Copyright (C) 2001-2017 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 std::string tmp = st.
next();
345 if (tmp.find_first_not_of(
"\t ") == std::string::npos) {
351 if (conv.length() != 0) {
356 if (conv != (*i)->getString()) {
357 const bool hadDefault = (*i)->isDefault();
360 (*i)->resetDefault();
379 if (files.size() == 0) {
380 WRITE_ERROR(
"The file list for '" + name +
"' is empty.");
383 for (std::vector<std::string>::const_iterator fileIt = files.begin(); fileIt != files.end(); ++fileIt) {
386 WRITE_ERROR(
"File '" + *fileIt +
"' is not accessible (" + std::strerror(errno) +
").");
404 std::vector<std::string> seenSynonymes;
405 for (KnownContType::const_iterator i =
myValues.begin(); i !=
myValues.end(); i++) {
406 if (std::find(seenSynonymes.begin(), seenSynonymes.end(), (*i).first) != seenSynonymes.end()) {
409 if ((*i).second->isSet() && !(*i).second->isDefault() && (*i).first.find(prefix) == 0) {
410 WRITE_ERROR(
"Option '" + (*i).first +
"' needs option '" + name +
"'.");
411 std::vector<std::string> synonymes =
getSynonymes((*i).first);
412 std::copy(synonymes.begin(), synonymes.end(), std::back_inserter(seenSynonymes));
423 std::ostringstream s;
424 s <<
"A value for the option '" + arg +
"' was already set.\n Possible synonymes: ";
425 for (std::vector<std::string>::iterator i = synonymes.begin(); i != synonymes.end();) {
428 if (i != synonymes.end()) {
456 (*i)->resetWritable();
470 ItemAddressContType::iterator i;
483 const std::string& subtopic,
484 const std::string& description) {
495 const std::string& fullName) {
540 int offset,
int nextOffset) {
541 while (what.length() > 0) {
542 if ((
int)what.length() > 79 - offset) {
543 std::string::size_type splitPos = what.rfind(
';', 79 - offset);
544 if (splitPos == std::string::npos) {
545 splitPos = what.rfind(
' ', 79 - offset);
549 if (splitPos != std::string::npos) {
550 os << what.substr(0, splitPos) << std::endl;
551 what = what.substr(splitPos);
552 for (
int r = 0; r < nextOffset + 1; ++r) {
571 if (missingOptions) {
574 std::cout <<
" Build features: " <<
HAVE_ENABLED << std::endl;
575 for (std::vector<std::string>::const_iterator it =
577 std::cout <<
" " << *it << std::endl;
579 std::cout <<
" License GPLv3+: GNU GPL Version 3 or later <http://gnu.org/licenses/gpl.html>\n";
580 std::cout <<
" Use --help to get the list of options." << std::endl;
587 for (std::vector<std::string>::const_iterator it =
589 std::cout <<
" " << *it << std::endl;
597 std::cout <<
" Build features: " <<
HAVE_ENABLED << std::endl;
598 for (std::vector<std::string>::const_iterator it =
600 std::cout <<
" " << *it << std::endl;
602 std::cout <<
"\n" <<
myFullName <<
" is part of SUMO.\n";
603 std::cout <<
"SUMO is free software: you can redistribute it and/or modify\n";
604 std::cout <<
"it under the terms of the GNU General Public License as published by\n";
605 std::cout <<
"the Free Software Foundation, either version 3 of the License, or\n";
606 std::cout <<
"(at your option) any later version.\n\n";
607 std::cout <<
"This program is distributed in the hope that it will be useful,\n";
608 std::cout <<
"but WITHOUT ANY WARRANTY; without even the implied warranty of\n";
609 std::cout <<
"MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n";
610 std::cout <<
"GNU General Public License for more details.\n\n";
611 std::cout <<
"You should have received a copy of the GNU General Public License\n";
612 std::cout <<
"along with this program. If not, see http://www.gnu.org/licenses/gpl.html" << std::endl;
617 std::cout << (*this);
621 if (
isSet(
"save-configuration",
false)) {
622 if (
getString(
"save-configuration") ==
"-" ||
getString(
"save-configuration") ==
"stdout") {
626 std::ofstream out(
getString(
"save-configuration").c_str());
638 if (
isSet(
"save-template",
false)) {
643 std::ofstream out(
getString(
"save-template").c_str());
654 if (
isSet(
"save-schema",
false)) {
659 std::ofstream out(
getString(
"save-schema").c_str());
675 std::vector<std::string>::const_iterator i, j;
680 os <<
"Usage: " <<
myAppName <<
" [OPTION]*" << std::endl;
692 for (j = entries.begin(); j != entries.end(); ++j) {
695 int csize = (int)j->length() + 2 + 4;
698 if (find_if(synonymes.begin(), synonymes.end(),
abbreviation_finder()) != synonymes.end()) {
707 if (csize < tooLarge && maxSize < csize) {
714 os << *i <<
" Options:" << std::endl;
716 for (j = entries.begin(); j != entries.end(); ++j) {
718 int csize = (int)j->length() + 2;
723 std::vector<std::string>::iterator a = find_if(synonymes.begin(), synonymes.end(),
abbreviation_finder());
724 if (a != synonymes.end()) {
725 os <<
'-' << (*a) <<
", ";
741 for (
int r = maxSize; r > csize; --r) {
744 int offset = csize > tooLarge ? csize : maxSize;
752 os <<
"Examples:" << std::endl;
754 os <<
" " <<
myAppName <<
' ' << e->first << std::endl;
755 os <<
" " << e->second << std::endl;
759 os <<
"Report bugs at <http://sumo.dlr.de/trac/>." << std::endl;
760 os <<
"Get in contact via <sumo@dlr.de>." << std::endl;
766 const bool complete,
const bool addComments,
767 const bool maskDoubleHyphen)
const {
769 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;
771 std::string subtopic = *i;
772 if (subtopic ==
"Configuration" && !complete) {
775 std::replace(subtopic.begin(), subtopic.end(),
' ',
'_');
776 std::transform(subtopic.begin(), subtopic.end(), subtopic.begin(), tolower);
779 for (std::vector<std::string>::const_iterator j = entries.begin(); j != entries.end(); ++j) {
781 bool write = complete || (filled && !o->
isDefault());
786 os <<
" <" << subtopic <<
">" << std::endl;
793 os <<
" <" << *j <<
" value=\"";
799 if (!synonymes.empty()) {
800 os <<
"\" synonymes=\"";
801 for (std::vector<std::string>::const_iterator s = synonymes.begin(); s != synonymes.end(); ++s) {
802 if (s != synonymes.begin()) {
813 os <<
"\"/>" << std::endl;
821 os <<
" </" << subtopic <<
">" << std::endl << std::endl;
824 os <<
"</configuration>" << std::endl;
831 os <<
"<xsd:schema elementFormDefault=\"qualified\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\">\n\n";
832 os <<
" <xsd:include schemaLocation=\"baseTypes.xsd\"/>\n";
833 os <<
" <xsd:element name=\"configuration\" type=\"configurationType\"/>\n\n";
834 os <<
" <xsd:complexType name=\"configurationType\">\n";
835 os <<
" <xsd:all>\n";
837 std::string subtopic = *i;
838 if (subtopic ==
"Configuration") {
841 std::replace(subtopic.begin(), subtopic.end(),
' ',
'_');
842 std::transform(subtopic.begin(), subtopic.end(), subtopic.begin(), tolower);
843 os <<
" <xsd:element name=\"" << subtopic <<
"\" type=\"" << subtopic <<
"Type\" minOccurs=\"0\"/>\n";
845 os <<
" </xsd:all>\n";
846 os <<
" </xsd:complexType>\n\n";
848 std::string subtopic = *i;
849 if (subtopic ==
"Configuration") {
852 std::replace(subtopic.begin(), subtopic.end(),
' ',
'_');
853 std::transform(subtopic.begin(), subtopic.end(), subtopic.begin(), tolower);
854 os <<
" <xsd:complexType name=\"" << subtopic <<
"Type\">\n";
855 os <<
" <xsd:all>\n";
857 for (std::vector<std::string>::const_iterator j = entries.begin(); j != entries.end(); ++j) {
860 std::transform(type.begin(), type.end(), type.begin(), tolower);
861 if (type ==
"int[]") {
864 os <<
" <xsd:element name=\"" << *j <<
"\" type=\"" << type <<
"OptionType\" minOccurs=\"0\"/>\n";
866 os <<
" </xsd:all>\n";
867 os <<
" </xsd:complexType>\n\n";
869 os <<
"</xsd:schema>\n";
880 strftime(buffer, 80,
"<!-- generated on %c by ", localtime(&rawtime));
887 std::vector<std::string>
892 WRITE_WARNING(
"Please note that using ';' as list separator is deprecated.\n From 1.0 onwards, only ',' will be accepted.");
896 std::vector<std::string> ret = st.
getVector();
897 for (std::vector<std::string>::iterator i = ret.begin(); i != ret.end(); ++i) {
906 const std::string& itemName) {
907 if (
isSet(optionName)) {
909 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)
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 splitLines(std::ostream &os, std::string what, int offset, int nextOffset)
Writes the given string 'formatted'.
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 writeConfiguration(std::ostream &os, const bool filled, const bool complete, const bool addComments, const bool maskDoubleHyphen=false) const
Writes the configuration.
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 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.
virtual std::string getValueString() const =0
Returns the string-representation of the 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.
virtual bool set(const std::string &v)=0
Stores the given value.
static std::string escapeXML(const std::string &orig, const bool maskDoubleHyphen=false)
Replaces the standard escapes by their XML entities.
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.
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 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.