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 int offset,
int nextOffset) {
536 while (what.length() > 0) {
537 if ((
int)what.length() > 79 - offset) {
538 std::string::size_type 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 (
int 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;
687 for (j = entries.begin(); j != entries.end(); ++j) {
690 int csize = (int)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 int csize = (int)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 (
int r = maxSize; r > csize; --r) {
739 int 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.
virtual const IntVector & getIntVector() const
Returns the stored integer vector.
std::vector< std::string > mySubTopics
lists of option subtopics and copyright notices
void reportDoubleSetting(const std::string &arg) const
Reports an error that the option has already been set.
static std::string getConfigurationRelative(const std::string &configPath, const std::string &path)
Returns the second path as a relative path to the first file.
int getInt(const std::string &name) const
Returns the int-value of the named option (only for Option_Integer)
void resetWritable()
Resets all options to be writeable.
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.
virtual std::string getString() const
Returns the stored string value.
void addCallExample(const std::string &example, const std::string &desc)
Add a call example.
void setApplicationDescription(const std::string &appDesc)
Sets the application description.
void clearCopyrightNotices()
Removes all copyright information.
void printHelp(std::ostream &os)
Prints the help.
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.
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.
static OptionsCont myOptions
The static options container used.
virtual SUMOReal getFloat() const
Returns the stored SUMOReal value.
bool isWriteable() const
Returns the information whether the option may be set a further time.
bool getBool(const std::string &name) const
Returns the boolean-value of the named option (only for Option_Bool)
bool isDefault(const std::string &name) const
Returns the information whether the named option has still the default value.
std::map< std::string, std::string > myXMLDefaults
A map from XML root element to option.
virtual int getInt() const
Returns the stored integer value.
#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
bool isSet(const std::string &name, bool failOnNonExistant=true) const
Returns the information whether the named option is set.
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.
std::string myAdditionalMessage
std::vector< int > IntVector
Definition of a vector of ints.
bool isUsableFileList(const std::string &name) const
Checks whether the named option is usable as a file list (with at least a single file) ...
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.
static const std::string ENCODING
The encoding of parsed strings.
Option * getSecure(const std::string &name) const
Returns the named option.
std::string getString(const std::string &name) const
Returns the string-value of the named option (only for Option_String)
bool processMetaOptions(bool missingOptions)
Checks for help and configuration output, returns whether we should exit.
bool exists(const std::string &name) const
Returns the information whether the named option is known.
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) ...
bool isBool(const std::string &name) const
Returns the information whether the option is a boolean option.
~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.
virtual bool set(const std::string &v)=0
Stores the given value.
void relocateFiles(const std::string &configuration) const
Modifies file name options according to the configuration path.
virtual bool isBool() const
Returns the information whether the option is a bool option.
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.
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 getBool() const
Returns the stored boolean value.
std::vector< std::string > getSynonymes(const std::string &name) const
Returns the synonymes of an option name.
static std::string prune(const std::string &str)
Removes trailing and leading whitechars.
virtual bool isDefault() const
Returns the information whether the option holds the default value.
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...
const std::string & getDescription() const
Returns the description of what this option does.
const IntVector & getIntVector(const std::string &name) const
Returns the list of integer-value of the named option (only for Option_IntVector) ...
void unSet(const std::string &name, bool failOnNonExistant=true) const
Marks the option as unset.
std::map< std::string, std::vector< std::string > > mySubTopicEntries
A map from subtopic to option.
bool isSet() const
returns the information whether this options holds a valid value
friend std::ostream & operator<<(std::ostream &os, const OptionsCont &oc)
Output operator.
virtual const std::string & getTypeName() const
Returns the mml-type name of this option.
static std::string urlDecode(const std::string &encoded)
A storage for options typed value containers)
void writeConfiguration(std::ostream &os, bool filled, bool complete, bool addComments) const
Writes the configuration.
std::vector< std::string > myCopyrightNotices
std::string convertChar(char abbr) const
Converts an abbreviation into a name.
void addDescription(const std::string &name, const std::string &subtopic, const std::string &description)
Adds a description for an option.
#define WRITE_MESSAGE(msg)
OptionsCont()
Constructor.
std::vector< std::pair< std::string, std::string > > myCallExamples
list of call examples
SUMOReal getFloat(const std::string &name) const
Returns the SUMOReal-value of the named option (only for Option_Float)
void setApplicationName(const std::string &appName, const std::string &fullName)
Sets the application name.