72 myCopyrightNotices.push_back(
"Copyright (C) 2001-2017 DLR and contributors; http://sumo.dlr.de");
89 throw ProcessError(name +
" is an already used option name.");
104 KnownContType::iterator i1 =
myValues.find(name1);
105 KnownContType::iterator i2 =
myValues.find(name2);
107 throw ProcessError(
"Neither the option '" + name1 +
"' nor the option '" + name2 +
"' is known yet");
110 if ((*i1).second == (*i2).second) {
113 throw ProcessError(
"Both options '" + name1 +
"' and '" + name2 +
"' do exist and differ.");
144 KnownContType::const_iterator i =
myValues.find(name);
146 if (failOnNonExistant) {
147 throw ProcessError(
"Internal request for unknown option '" + name +
"'!");
152 return (*i).second->isSet();
158 KnownContType::const_iterator i =
myValues.find(name);
160 if (failOnNonExistant) {
161 throw ProcessError(
"Internal request for unknown option '" + name +
"'!");
166 (*i).second->unSet();
172 KnownContType::const_iterator i =
myValues.find(name);
176 return (*i).second->isDefault();
182 KnownContType::const_iterator k =
myValues.find(name);
184 throw ProcessError(
"No option with the name '" + name +
"' exists.");
188 std::string defaultName;
190 for (std::vector<std::string>::const_iterator j = i->second.begin(); j != i->second.end(); ++j) {
191 KnownContType::const_iterator l =
myValues.find(*j);
192 if (l !=
myValues.end() && l->second == k->second) {
197 if (defaultName !=
"") {
201 WRITE_WARNING(
"Please note that '" + name +
"' is deprecated.\n Use '" + defaultName +
"' instead.");
251 if (!o->
set(value)) {
255 WRITE_ERROR(
"While processing option '" + name +
"':\n " + e.what());
264 if (
set(name, value)) {
284 std::vector<std::string>
287 std::vector<std::string> v(0);
288 for (KnownContType::const_iterator i =
myValues.begin(); i !=
myValues.end(); i++) {
289 if ((*i).second == o && name != (*i).first) {
290 v.push_back((*i).first);
299 std::vector<std::string> done;
300 os <<
"Options set:" << std::endl;
301 for (OptionsCont::KnownContType::const_iterator i = oc.
myValues.begin();
303 std::vector<std::string>::iterator j = find(done.begin(), done.end(), (*i).first);
304 if (j == done.end()) {
305 std::vector<std::string> synonymes = oc.
getSynonymes((*i).first);
306 if (synonymes.size() != 0) {
307 os << (*i).first <<
" (";
308 for (j = synonymes.begin(); j != synonymes.end(); j++) {
309 if (j != synonymes.begin()) {
318 if ((*i).second->isSet()) {
319 os <<
": " << (*i).second->getValueString() << std::endl;
321 os <<
": <INVALID>" << std::endl;
323 done.push_back((*i).first);
324 copy(synonymes.begin(), synonymes.end(), back_inserter(done));
334 if ((*i)->isFileName() && (*i)->isSet()) {
337 while (st.hasNext()) {
338 std::string tmp = st.
next();
341 if (tmp.find_first_not_of(
"\t ") == std::string::npos) {
347 if (conv.length() != 0) {
352 if (conv != (*i)->getString()) {
353 const bool hadDefault = (*i)->isDefault();
356 (*i)->resetDefault();
375 if (files.size() == 0) {
376 WRITE_ERROR(
"The file list for '" + name +
"' is empty.");
379 for (std::vector<std::string>::const_iterator fileIt = files.begin(); fileIt != files.end(); ++fileIt) {
382 WRITE_ERROR(
"File '" + *fileIt +
"' is not accessible (" + std::strerror(errno) +
").");
400 std::vector<std::string> seenSynonymes;
401 for (KnownContType::const_iterator i =
myValues.begin(); i !=
myValues.end(); i++) {
402 if (std::find(seenSynonymes.begin(), seenSynonymes.end(), (*i).first) != seenSynonymes.end()) {
405 if ((*i).second->isSet() && !(*i).second->isDefault() && (*i).first.find(prefix) == 0) {
406 WRITE_ERROR(
"Option '" + (*i).first +
"' needs option '" + name +
"'.");
407 std::vector<std::string> synonymes =
getSynonymes((*i).first);
408 std::copy(synonymes.begin(), synonymes.end(), std::back_inserter(seenSynonymes));
419 std::ostringstream s;
420 s <<
"A value for the option '" + arg +
"' was already set.\n Possible synonymes: ";
421 for (std::vector<std::string>::iterator i = synonymes.begin(); i != synonymes.end();) {
424 if (i != synonymes.end()) {
452 (*i)->resetWritable();
466 ItemAddressContType::iterator i;
479 const std::string& subtopic,
480 const std::string& description) {
491 const std::string& fullName) {
536 int offset,
int nextOffset) {
537 while (what.length() > 0) {
538 if ((
int)what.length() > 79 - offset) {
539 std::string::size_type splitPos = what.rfind(
';', 79 - offset);
540 if (splitPos == std::string::npos) {
541 splitPos = what.rfind(
' ', 79 - offset);
545 if (splitPos != std::string::npos) {
546 os << what.substr(0, splitPos) << std::endl;
547 what = what.substr(splitPos);
548 for (
int r = 0; r < nextOffset + 1; ++r) {
567 if (missingOptions) {
570 std::cout <<
" Build features: " <<
HAVE_ENABLED << std::endl;
571 for (std::vector<std::string>::const_iterator it =
573 std::cout <<
" " << *it << std::endl;
575 std::cout <<
" License GPLv3+: GNU GPL Version 3 or later <http://gnu.org/licenses/gpl.html>\n";
576 std::cout <<
" Use --help to get the list of options." << std::endl;
583 for (std::vector<std::string>::const_iterator it =
585 std::cout <<
" " << *it << std::endl;
593 std::cout <<
" Build features: " <<
HAVE_ENABLED << std::endl;
594 for (std::vector<std::string>::const_iterator it =
596 std::cout <<
" " << *it << std::endl;
598 std::cout <<
"\n" <<
myFullName <<
" is part of SUMO.\n";
599 std::cout <<
"SUMO is free software: you can redistribute it and/or modify\n";
600 std::cout <<
"it under the terms of the GNU General Public License as published by\n";
601 std::cout <<
"the Free Software Foundation, either version 3 of the License, or\n";
602 std::cout <<
"(at your option) any later version.\n\n";
603 std::cout <<
"This program is distributed in the hope that it will be useful,\n";
604 std::cout <<
"but WITHOUT ANY WARRANTY; without even the implied warranty of\n";
605 std::cout <<
"MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n";
606 std::cout <<
"GNU General Public License for more details.\n\n";
607 std::cout <<
"You should have received a copy of the GNU General Public License\n";
608 std::cout <<
"along with this program. If not, see http://www.gnu.org/licenses/gpl.html" << std::endl;
613 std::cout << (*this);
617 if (
isSet(
"save-configuration",
false)) {
618 if (
getString(
"save-configuration") ==
"-" ||
getString(
"save-configuration") ==
"stdout") {
622 std::ofstream out(
getString(
"save-configuration").c_str());
634 if (
isSet(
"save-template",
false)) {
639 std::ofstream out(
getString(
"save-template").c_str());
650 if (
isSet(
"save-schema",
false)) {
655 std::ofstream out(
getString(
"save-schema").c_str());
671 std::vector<std::string>::const_iterator i, j;
676 os <<
"Usage: " <<
myAppName <<
" [OPTION]*" << std::endl;
688 for (j = entries.begin(); j != entries.end(); ++j) {
691 int csize = (int)j->length() + 2 + 4;
693 const std::vector<std::string> synonymes =
getSynonymes(*j);
694 for (std::vector<std::string>::const_iterator s = synonymes.begin(); s != synonymes.end(); ++s) {
706 if (csize < tooLarge && maxSize < csize) {
713 os << *i <<
" Options:" << std::endl;
715 for (j = entries.begin(); j != entries.end(); ++j) {
717 int csize = (int)j->length() + 2;
722 for (std::vector<std::string>::const_iterator s = synonymes.begin(); s != synonymes.end(); ++s) {
724 os <<
'-' << *s <<
", ";
742 for (
int r = maxSize; r > csize; --r) {
745 int offset = csize > tooLarge ? csize : maxSize;
753 os <<
"Examples:" << std::endl;
755 os <<
" " <<
myAppName <<
' ' << e->first << std::endl;
756 os <<
" " << e->second << std::endl;
760 os <<
"Report bugs at <http://sumo.dlr.de/trac/>." << std::endl;
761 os <<
"Get in contact via <sumo@dlr.de>." << std::endl;
767 const bool complete,
const bool addComments,
768 const bool maskDoubleHyphen)
const {
770 os <<
"<configuration xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:noNamespaceSchemaLocation=\"http://sumo.dlr.de/xsd/";
778 os <<
"Configuration.xsd\">" << std::endl << std::endl;
780 std::string subtopic = *i;
781 if (subtopic ==
"Configuration" && !complete) {
784 std::replace(subtopic.begin(), subtopic.end(),
' ',
'_');
785 std::transform(subtopic.begin(), subtopic.end(), subtopic.begin(), tolower);
788 for (std::vector<std::string>::const_iterator j = entries.begin(); j != entries.end(); ++j) {
790 bool write = complete || (filled && !o->
isDefault());
795 os <<
" <" << subtopic <<
">" << std::endl;
802 os <<
" <" << *j <<
" value=\"";
808 if (!synonymes.empty()) {
809 os <<
"\" synonymes=\"";
810 for (std::vector<std::string>::const_iterator s = synonymes.begin(); s != synonymes.end(); ++s) {
811 if (s != synonymes.begin()) {
822 os <<
"\"/>" << std::endl;
830 os <<
" </" << subtopic <<
">" << std::endl << std::endl;
833 os <<
"</configuration>" << std::endl;
840 os <<
"<xsd:schema elementFormDefault=\"qualified\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\">\n\n";
841 os <<
" <xsd:include schemaLocation=\"baseTypes.xsd\"/>\n";
842 os <<
" <xsd:element name=\"configuration\" type=\"configurationType\"/>\n\n";
843 os <<
" <xsd:complexType name=\"configurationType\">\n";
844 os <<
" <xsd:all>\n";
846 std::string subtopic = *i;
847 if (subtopic ==
"Configuration") {
850 std::replace(subtopic.begin(), subtopic.end(),
' ',
'_');
851 std::transform(subtopic.begin(), subtopic.end(), subtopic.begin(), tolower);
852 os <<
" <xsd:element name=\"" << subtopic <<
"\" type=\"" << subtopic <<
"Type\" minOccurs=\"0\"/>\n";
854 os <<
" </xsd:all>\n";
855 os <<
" </xsd:complexType>\n\n";
857 std::string subtopic = *i;
858 if (subtopic ==
"Configuration") {
861 std::replace(subtopic.begin(), subtopic.end(),
' ',
'_');
862 std::transform(subtopic.begin(), subtopic.end(), subtopic.begin(), tolower);
863 os <<
" <xsd:complexType name=\"" << subtopic <<
"Type\">\n";
864 os <<
" <xsd:all>\n";
866 for (std::vector<std::string>::const_iterator j = entries.begin(); j != entries.end(); ++j) {
869 std::transform(type.begin(), type.end(), type.begin(), tolower);
870 if (type ==
"int[]") {
873 os <<
" <xsd:element name=\"" << *j <<
"\" type=\"" << type <<
"OptionType\" minOccurs=\"0\"/>\n";
875 os <<
" </xsd:all>\n";
876 os <<
" </xsd:complexType>\n\n";
878 os <<
"</xsd:schema>\n";
889 strftime(buffer, 80,
"<!-- generated on %c by ", localtime(&rawtime));
896 std::vector<std::string>
901 WRITE_WARNING(
"Please note that using ';' as list separator is deprecated.\n From 1.0 onwards, only ',' will be accepted.");
905 std::vector<std::string> ret = st.
getVector();
906 for (std::vector<std::string>::iterator i = ret.begin(); i != ret.end(); ++i) {
915 const std::string& itemName) {
916 if (
isSet(optionName)) {
918 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.
double getFloat(const std::string &name) const
Returns the double-value of the named option (only for Option_Float)
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.
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 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.
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
virtual double getFloat() const
Returns the stored double value.
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.