void OptionsCont::writeSchema(std::ostream& os, bool /* addComments */) { os << "<?xml version=\"1.0\"" << SUMOSAXAttributes::ENCODING << "?>\n\n"; os << "<xsd:schema elementFormDefault=\"qualified\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\">\n\n"; os << " <xsd:include schemaLocation=\"baseTypes.xsd\"/>\n"; os << " <xsd:element name=\"configuration\" type=\"configurationType\"/>\n\n"; os << " <xsd:complexType name=\"configurationType\">\n"; os << " <xsd:all>\n"; for (std::vector<std::string>::const_iterator i = mySubTopics.begin(); i != mySubTopics.end(); ++i) { std::string subtopic = *i; if (subtopic == "Configuration") { continue; } std::replace(subtopic.begin(), subtopic.end(), ' ', '_'); std::transform(subtopic.begin(), subtopic.end(), subtopic.begin(), tolower); os << " <xsd:element name=\"" << subtopic << "\" type=\"" << subtopic << "Type\" minOccurs=\"0\"/>\n"; } os << " </xsd:all>\n"; os << " </xsd:complexType>\n\n"; for (std::vector<std::string>::const_iterator i = mySubTopics.begin(); i != mySubTopics.end(); ++i) { std::string subtopic = *i; if (subtopic == "Configuration") { continue; } std::replace(subtopic.begin(), subtopic.end(), ' ', '_'); std::transform(subtopic.begin(), subtopic.end(), subtopic.begin(), tolower); os << " <xsd:complexType name=\"" << subtopic << "Type\">\n"; os << " <xsd:all>\n"; const std::vector<std::string>& entries = mySubTopicEntries[*i]; for (std::vector<std::string>::const_iterator j = entries.begin(); j != entries.end(); ++j) { Option* o = getSecure(*j); std::string type = o->getTypeName(); std::transform(type.begin(), type.end(), type.begin(), tolower); if (type == "int[]") { type = "intArray"; } os << " <xsd:element name=\"" << *j << "\" type=\"" << type << "OptionType\" minOccurs=\"0\"/>\n"; } os << " </xsd:all>\n"; os << " </xsd:complexType>\n\n"; } os << "</xsd:schema>\n"; }
void OptionsCont::printHelp(std::ostream &os) throw() { std::vector<std::string>::const_iterator i, j; // print application description os << ' ' << std::endl; splitLines(os, myAppDescription , 0, 0); os << std::endl; // print usage BNF os << "Usage: " << myAppName << " [OPTION]*" << std::endl; os << ' ' << std::endl; // print usage examples if (myCallExamples.size()>1) { os << " Examples:" << std::endl; } else if (myCallExamples.size()!=0) { os << " Example:" << std::endl; } if (myCallExamples.size()!=0) { for (i=myCallExamples.begin(); i!=myCallExamples.end(); ++i) { os << " " << myAppName << ' ' << (*i) << std::endl; } } os << ' ' << std::endl; // print additional text if any if (myAdditionalMessage.length()>0) { os << myAdditionalMessage << std::endl << ' ' << std::endl; } // print the options // check their sizes first // we want to know how large the largest not-too-large-entry will be size_t tooLarge = 40; size_t maxSize = 0; for (i=mySubTopics.begin(); i!=mySubTopics.end(); ++i) { const std::vector<std::string> &entries = mySubTopicEntries[*i]; for (j=entries.begin(); j!=entries.end(); ++j) { Option *o = getSecure(*j); // name, two leading spaces and "--" size_t csize = (*j).length() + 2 + 4; // abbreviation length ("-X, "->4chars) if any std::vector<std::string> synonymes = getSynonymes(*j); if (find_if(synonymes.begin(), synonymes.end(), abbreviation_finder())!=synonymes.end()) { csize += 4; } // the type name if (!o->isBool()) { csize += 1 + o->getTypeName().length(); } // divider csize += 2; if (csize<tooLarge&&maxSize<csize) { maxSize = csize; } } } for (i=mySubTopics.begin(); i!=mySubTopics.end(); ++i) { os << ' ' << *i << " Options:" << std::endl; const std::vector<std::string> &entries = mySubTopicEntries[*i]; for (j=entries.begin(); j!=entries.end(); ++j) { // start length computation size_t csize = (*j).length() + 2; Option *o = getSecure(*j); os << " "; // write abbreviation if given std::vector<std::string> synonymes = getSynonymes(*j); std::vector<std::string>::iterator a = find_if(synonymes.begin(), synonymes.end(), abbreviation_finder()); if (a!=synonymes.end()) { os << '-' << (*a) << ", "; csize += 4; } // write leading '-'/"--" os << "--"; csize += 2; // write the name os << *j; // write the type if not a bool option if (!o->isBool()) { os << ' ' << o->getTypeName(); csize += 1 + o->getTypeName().length(); } csize += 2; // write the description formatting it os << " "; size_t r; for (r=maxSize; r>csize; --r) { os << ' '; } std::string desc = o->getDescription(); size_t offset = csize > tooLarge ? csize : maxSize; splitLines(os, desc, offset, maxSize); } os << std::endl; } }
void OptionsCont::writeConfiguration(std::ostream& os, bool filled, bool complete, bool addComments) const { os << "<?xml version=\"1.0\"" << SUMOSAXAttributes::ENCODING << "?>\n\n"; 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; for (std::vector<std::string>::const_iterator i = mySubTopics.begin(); i != mySubTopics.end(); ++i) { std::string subtopic = *i; if (subtopic == "Configuration" && !complete) { continue; } std::replace(subtopic.begin(), subtopic.end(), ' ', '_'); std::transform(subtopic.begin(), subtopic.end(), subtopic.begin(), tolower); const std::vector<std::string>& entries = mySubTopicEntries.find(*i)->second; bool hadOne = false; for (std::vector<std::string>::const_iterator j = entries.begin(); j != entries.end(); ++j) { Option* o = getSecure(*j); bool write = complete || (filled && !o->isDefault()); if (!write) { continue; } if (!hadOne) { os << " <" << subtopic << ">" << std::endl; } // add the comment if wished if (addComments) { os << " <!-- " << StringUtils::escapeXML(o->getDescription()) << " -->" << std::endl; } // write the option and the value (if given) os << " <" << *j << " value=\""; if (o->isSet() && (filled || o->isDefault())) { os << o->getValueString(); } if (complete) { std::vector<std::string> synonymes = getSynonymes(*j); if (!synonymes.empty()) { os << "\" synonymes=\""; for (std::vector<std::string>::const_iterator s = synonymes.begin(); s != synonymes.end(); ++s) { if (s != synonymes.begin()) { os << " "; } os << (*s); } } os << "\" type=\"" << o->getTypeName(); if (!addComments) { os << "\" help=\"" << StringUtils::escapeXML(o->getDescription()); } } os << "\"/>" << std::endl; // append an endline if a comment was printed if (addComments) { os << std::endl; } hadOne = true; } if (hadOne) { os << " </" << subtopic << ">" << std::endl << std::endl; } } os << "</configuration>" << std::endl; }