4 // Fraunhofer Institute for Open Communication Systems (FOKUS)
6 // The contents of this file are subject to the Fraunhofer FOKUS Public License
7 // Version 1.0 (the "License"); you may not use this file except in compliance
8 // with the License. You may obtain a copy of the License at
9 // http://senf.berlios.de/license.html
11 // The Fraunhofer FOKUS Public License Version 1.0 is based on,
12 // but modifies the Mozilla Public License Version 1.1.
13 // See the full license text for the amendments.
15 // Software distributed under the License is distributed on an "AS IS" basis,
16 // WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
17 // for the specific language governing rights and limitations under the License.
19 // The Original Code is Fraunhofer FOKUS code.
21 // The Initial Developer of the Original Code is Fraunhofer-Gesellschaft e.V.
22 // (registered association), Hansastraße 27 c, 80686 Munich, Germany.
23 // All Rights Reserved.
26 // Stefan Bund <g0dil@berlios.de>
29 \brief OverloadedCommand non-inline non-template implementation */
31 #include "OverloadedCommand.hh"
32 //#include "OverloadedCommand.ih"
36 //#include "OverloadedCommand.mpp"
38 //-/////////////////////////////////////////////////////////////////////////////////////////////////
40 //-/////////////////////////////////////////////////////////////////////////////////////////////////
41 // senf::console::OverloadedCommandNode
43 prefix_ senf::console::OverloadedCommandNode &
44 senf::console::OverloadedCommandNode::insertOverload(DirectoryNode & dir,
45 std::string const & name,
46 CommandOverload::ptr overload)
48 OverloadedCommandNode & node (
50 ? dynamic_cast<OverloadedCommandNode &>(dir(name))
51 : dir.add(name, OverloadedCommandNode::create()));
56 //-/////////////////////////////////////////////////////////////////////////////////////////////////
57 // So soll die doku aussehen:
60 // 1- foo arg1:int arg2:double
70 // Generic documentation foo blalsdljfl laj flkajslkjs fdlkj oiwlksdj ;llkaj
71 // sdflkja sldkfjslkdfj sdlkfj lskjdf lskjdf lksj dflkj lsdkfj lskdjf lskjkd
72 // Generic documentation foo blalsdljfl laj flkajslkjs fdlkj oiwlksdj ;llkaj
73 // sdflkja sldkfjslkdfj sdlkfj lskjdf lskjdf lksj dflkj lsdkfj lskdjf lskjkd
74 // Generic documentation foo blalsdljfl laj flkajslkjs fdlkj oiwlksdj ;llkaj
75 // sdflkja sldkfjslkdfj sdlkfj lskjdf lskjdf lksj dflkj lsdkfj lskdjf lskjkd
78 // Variant 1 doc la;ksjf lkj sdlkfj lkjekj sdflkj ekljsdlkfj wlej
79 // slkj dkj sldkfj lwekljsdf skldjf lskjdf l jsd
82 // Variant 2 doc lskdfj lwkej lksjdflksjf
85 // Variant 3 doc slkjflw ekj lskdfj lskdjf laksdj flksj elkj aldskjf lwkejlksdj
86 // ldkfaj wlekj slkdfj lskdjf lwkejlkasdjf
88 prefix_ void senf::console::OverloadedCommandNode::v_help(std::ostream & os)
91 typedef std::vector<ArgumentDoc> ArgumentDocs;
92 ArgumentDocs argumentDocs;
93 bool haveDocumentedArg (false);
97 Overloads::const_iterator i (overloads_.begin());
98 Overloads::const_iterator const i_end (overloads_.end());
100 for (; i != i_end; ++i, ++index) {
102 if (overloads_.size() > 1) os << index << "- ";
104 for (unsigned j (0); j < (*i)->numArguments(); ++j) {
106 (*i)->argumentDoc(j, arg);
109 if (! arg.defaultValue.empty())
111 if (! arg.name.empty()) os << arg.name;
112 if (! arg.type.empty()) os << ':' << arg.type;
113 if (arg.name.empty() && arg.type.empty()) os << "...";
114 if (! arg.defaultValue.empty())
117 if (! arg.name.empty() || ! arg.defaultValue.empty()) {
118 ArgumentDocs::iterator k (argumentDocs.begin());
119 ArgumentDocs::iterator const k_end (argumentDocs.end());
120 for (; k != k_end; ++k)
121 if (k->name == arg.name && k->defaultValue == arg.defaultValue) {
122 if (! arg.doc.empty() && k->doc.empty()) {
124 haveDocumentedArg = true;
129 argumentDocs.push_back(arg);
130 if (! arg.doc.empty())
131 haveDocumentedArg = true;
139 if (haveDocumentedArg) {
140 os << "\n" "With:\n";
141 ArgumentDocs::const_iterator i (argumentDocs.begin());
142 ArgumentDocs::const_iterator const i_end (argumentDocs.end());
143 for (; i != i_end; ++i) {
144 if (! i->doc.empty() || ! i->defaultValue.empty()) {
147 << std::string(i->name.length()<8 ? 8-i->name.length() : 0, ' ')
151 if (! i->defaultValue.empty())
152 os << " default: " << i->defaultValue << '\n';
158 os << "\n" << doc_ << "\n";
161 Overloads::const_iterator i (overloads_.begin());
162 Overloads::const_iterator const i_end (overloads_.end());
164 for (; i != i_end; ++i, ++index) {
165 std::string overloadDoc ((*i)->doc());
166 if (! overloadDoc.empty()) {
168 if (overloads_.size() > 1)
169 os << "Variant " << index << ":\n";
170 os << overloadDoc << "\n";
176 prefix_ std::string senf::console::OverloadedCommandNode::v_shorthelp()
179 if (!shortdoc_.empty())
182 return doc_.substr(0,doc_.find('\n'));
183 Overloads::const_iterator i (overloads_.begin());
184 Overloads::const_iterator const i_end (overloads_.end());
185 for (; i != i_end; ++i) {
186 std::string overloadDoc ((*i)->doc());
187 if (! overloadDoc.empty())
188 return overloadDoc.substr(0,overloadDoc.find('\n'));
193 prefix_ void senf::console::OverloadedCommandNode::v_execute(boost::any & rv,
195 ParseCommandInfo const & command)
198 Overloads::const_iterator i (overloads_.begin());
199 Overloads::const_iterator const i_end (overloads_.end());
200 SyntaxErrorException err;
201 for (; i != i_end; ++i) {
203 (**i)(rv, os, command);
206 catch (SyntaxErrorException & ex) {
213 //-/////////////////////////////////////////////////////////////////////////////////////////////////
214 // senf::console::SimpleCommandOverload
216 prefix_ unsigned senf::console::SimpleCommandOverload::v_numArguments()
222 prefix_ void senf::console::SimpleCommandOverload::v_argumentDoc(unsigned index, ArgumentDoc & doc)
226 prefix_ std::string senf::console::SimpleCommandOverload::v_doc()
232 prefix_ void senf::console::SimpleCommandOverload::v_execute(boost::any & rv,
234 ParseCommandInfo const & command)
240 //-/////////////////////////////////////////////////////////////////////////////////////////////////
242 //#include "OverloadedCommand.mpp"
248 // comment-column: 40
249 // c-file-style: "senf"
250 // indent-tabs-mode: nil
251 // ispell-local-dictionary: "american"
252 // compile-command: "scons -u test"