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;
694 if (find_if(synonymes.begin(), synonymes.end(),
abbreviation_finder()) != synonymes.end()) {
703 if (csize < tooLarge && maxSize < csize) {
710 os << *i <<
" Options:" << std::endl;
712 for (j = entries.begin(); j != entries.end(); ++j) {
714 int csize = (int)j->length() + 2;
719 std::vector<std::string>::iterator a = find_if(synonymes.begin(), synonymes.end(),
abbreviation_finder());
720 if (a != synonymes.end()) {
721 os <<
'-' << (*a) <<
", ";
737 for (
int r = maxSize; r > csize; --r) {
740 int offset = csize > tooLarge ? csize : maxSize;
748 os <<
"Examples:" << std::endl;
750 os <<
" " <<
myAppName <<
' ' << e->first << std::endl;
751 os <<
" " << e->second << std::endl;
755 os <<
"Report bugs at <http://sumo.dlr.de/trac/>." << std::endl;
756 os <<
"Get in contact via <sumo@dlr.de>." << std::endl;
762 const bool complete,
const bool addComments,
763 const bool maskDoubleHyphen)
const {
765 os <<
"<configuration xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:noNamespaceSchemaLocation=\"http://sumo.dlr.de/xsd/";
773 os <<
"Configuration.xsd\">" << std::endl << std::endl;
775 std::string subtopic = *i;
776 if (subtopic ==
"Configuration" && !complete) {
779 std::replace(subtopic.begin(), subtopic.end(),
' ',
'_');
780 std::transform(subtopic.begin(), subtopic.end(), subtopic.begin(), tolower);
783 for (std::vector<std::string>::const_iterator j = entries.begin(); j != entries.end(); ++j) {
785 bool write = complete || (filled && !o->
isDefault());
790 os <<
" <" << subtopic <<
">" << std::endl;
797 os <<
" <" << *j <<
" value=\"";
803 if (!synonymes.empty()) {
804 os <<
"\" synonymes=\"";
805 for (std::vector<std::string>::const_iterator s = synonymes.begin(); s != synonymes.end(); ++s) {
806 if (s != synonymes.begin()) {
817 os <<
"\"/>" << std::endl;
825 os <<
" </" << subtopic <<
">" << std::endl << std::endl;
828 os <<
"</configuration>" << std::endl;
835 os <<
"<xsd:schema elementFormDefault=\"qualified\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\">\n\n";
836 os <<
" <xsd:include schemaLocation=\"baseTypes.xsd\"/>\n";
837 os <<
" <xsd:element name=\"configuration\" type=\"configurationType\"/>\n\n";
838 os <<
" <xsd:complexType name=\"configurationType\">\n";
839 os <<
" <xsd:all>\n";
841 std::string subtopic = *i;
842 if (subtopic ==
"Configuration") {
845 std::replace(subtopic.begin(), subtopic.end(),
' ',
'_');
846 std::transform(subtopic.begin(), subtopic.end(), subtopic.begin(), tolower);
847 os <<
" <xsd:element name=\"" << subtopic <<
"\" type=\"" << subtopic <<
"Type\" minOccurs=\"0\"/>\n";
849 os <<
" </xsd:all>\n";
850 os <<
" </xsd:complexType>\n\n";
852 std::string subtopic = *i;
853 if (subtopic ==
"Configuration") {
856 std::replace(subtopic.begin(), subtopic.end(),
' ',
'_');
857 std::transform(subtopic.begin(), subtopic.end(), subtopic.begin(), tolower);
858 os <<
" <xsd:complexType name=\"" << subtopic <<
"Type\">\n";
859 os <<
" <xsd:all>\n";
861 for (std::vector<std::string>::const_iterator j = entries.begin(); j != entries.end(); ++j) {
864 std::transform(type.begin(), type.end(), type.begin(), tolower);
865 if (type ==
"int[]") {
868 os <<
" <xsd:element name=\"" << *j <<
"\" type=\"" << type <<
"OptionType\" minOccurs=\"0\"/>\n";
870 os <<
" </xsd:all>\n";
871 os <<
" </xsd:complexType>\n\n";
873 os <<
"</xsd:schema>\n";
884 strftime(buffer, 80,
"<!-- generated on %c by ", localtime(&rawtime));
891 std::vector<std::string>
896 WRITE_WARNING(
"Please note that using ';' as list separator is deprecated.\n From 1.0 onwards, only ',' will be accepted.");
900 std::vector<std::string> ret = st.
getVector();
901 for (std::vector<std::string>::iterator i = ret.begin(); i != ret.end(); ++i) {
910 const std::string& itemName) {
911 if (
isSet(optionName)) {
913 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 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.
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.