arguments

Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen angezeigt.

Link zu dieser Vergleichsansicht

Beide Seiten der vorigen Revision Vorhergehende Überarbeitung
arguments [06.01.2006 16:03 (vor 19 Jahren)] cwachaarguments [16.11.2016 23:18 (vor 8 Jahren)] (aktuell) – Externe Bearbeitung 127.0.0.1
Zeile 1: Zeile 1:
 +===== Commandline Argument Parser =====
 +
 +=== Overview ===
 +//Arguments// is a very simple and intuitive command line arguments parser written in C++ that takes (argc, argv) as arguments and then lets you easily test for given command line options. Have a look at the example code to see how easy it is.
 +
 +This class makes handling argc, argv (as supplied by main() i.e.) very easy. After initializing you provide it with an option you would like to have and an optional default value. If the option is found inside argv it will be returned to you, if not you get the default value. Reading an option from the argument list removes it from the argument list. It works like a stack with a find-and-pop function.
 +
 +Instead of using argc, argv you can also supply a vector of strings. This comes in handy if you have a line that was splitted into tokens by [[split_line]] for example.
 +
 +
 +=== Features ===
 +  * short options
 +  * long options
 +  * flags
 +  * internal storage realised as STL vector
 +  * %%-flag --long-option-flag%%
 +  * %%-option 5 --long-option-text 5%%
 +
 +== Remarks ==
 +  * you cannot unset a flag with something like -flag 0. You will have to test for another flag i.e. -notflag.
 +  * -option=5 will not be recognized. There is no internal splitter.
 +  * every option takes exactly 1 argument.
 +
 +
 +=== Download ===
 +  * {{projects:arguments-1.2.zip}}
 +  * {{projects:arguments-1.1.zip}}
 +  * {{projects:arguments-1.0.tar.gz}}
 +
 +=== Code Example ===
 +
 +<code cpp>
 +#include "Arguments.h"
 +
 +#include <string>
 +#include <iostream>
 +
 +using namespace std;
 +
 +int main(int argc, char* argv[]) {
 +
 + // First, we need to initalize a new Arguments object
 + Arguments a(argc, argv);
 +
 + // now you just provide the options you would like to have
 + string this_binary = a.front();
 +
 + // !! remark that you can provide an option MORE THAN ONE time and you
 + // !! will get subsequent options. A found option will be removed from the
 + // !! argument list !!
 +
 + // Format: get(option to search, default value, long option to search);
 + //  long_option is optional
 + int my_int = a.get("-a", 0);
 + double my_int2 = a.get<double>("-a", 340, "--with-long-option");
 + string test = a.get<string>("-test", "not here");
 + bool show_help = a.getFlag("-h", "--help");
 +
 + // if you are interested a supplied filename you can use front()
 + //  or back() to pop the first or last element
 + string filename = a.back();
 +
 + // now we check if we have popped all options of if there are some left (i.e. the user entered an option
 + // that does not exist)
 + if( a.size() > 0 ) {
 + cout << "Unsupported option(s) given: " << a.list() << endl;
 + }
 +
 + if( show_help || a.size() > 0 || filename == "") {
 + cout << "usage: " << this_binary << " -a -h filename" << endl;
 + }
 +
 + //now do your stuff
 +
 + cout << "a=" << my_int << " other a=" << my_int2 << " test=" << test << endl;
 +
 + return 0;
 +}
 +
 +</code>
 +
 +=== Documentation ===
 +
 +Only relevant members are shown!
 +
 +<code cpp>
 +class Arguments {
 +
 +public:
 + Arguments();
 + Arguments(int argc, char* argv[]);
 + Arguments(const std::vector<std::string>&);
 + ~Arguments();
 +
 + // returns true if flag is found, false else
 + bool getFlag(const std::string& option, const std::string& long_option = "");
 + // returns type T if found or default_value (converted to type T) else
 + // Remark: does NOT work with char*. Use string instead and c_str() to get a char*
 + template<typename T> T get(const std::string& option, const T& default_value, const std::string& long_option = "");
 +
 + // return first element
 + std::string front();
 + // return last element
 + std::string back();
 + // return number of elements currently in the argument list
 + unsigned int size();
 + // return comma separated string containing all elements in the argument list
 + std::string list();
 +};
 +</code>
 +
 +
 +=== License ===
 +
 +<html>
 +
 +<!-- Creative Commons License -->
 +<a href="http://creativecommons.org/licenses/GPL/2.0/">
 +<img alt="CC-GNU GPL" border="0" src="http://creativecommons.org/images
 +/public/cc-GPL-a.png" /></a><br />
 +This software is licensed under the <a href="http://creativecommons.org/licenses/GPL/2.0/">CC-GNU GPL</a>.
 +<!-- /Creative Commons License -->
 +
 +<!--
 +
 +<rdf:RDF xmlns="http://web.resource.org/cc/"
 +    xmlns:dc="http://purl.org/dc/elements/1.1/"
 +    xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
 +<Work rdf:about="">
 +   <license rdf:resource="http://creativecommons.org/licenses/GPL/2.0/" />
 +   <dc:type rdf:resource="http://purl.org/dc/dcmitype/Software" />
 +</Work>
 +
 +<License rdf:about="http://creativecommons.org/licenses/GPL/2.0/">
 +<permits rdf:resource="http://web.resource.org/cc/Reproduction" />
 +   <permits rdf:resource="http://web.resource.org/cc/Distribution" />
 +   <requires rdf:resource="http://web.resource.org/cc/Notice" />
 +   <permits rdf:resource="http://web.resource.org/cc/DerivativeWorks" />
 +   <requires rdf:resource="http://web.resource.org/cc/ShareAlike" />
 +   <requires rdf:resource="http://web.resource.org/cc/SourceCode" />
 +</License>
 +
 +</rdf:RDF>
 +
 +-->
 +
 +</html>