[Issue 3780] getopt improvements by Igor Lesik
d-bugmail at puremagic.com
d-bugmail at puremagic.com
Tue Jun 14 20:54:06 PDT 2011
http://d.puremagic.com/issues/show_bug.cgi?id=3780
Igor Lesik <curoles at yahoo.com> changed:
What |Removed |Added
----------------------------------------------------------------------------
CC| |curoles at yahoo.com
--- Comment #2 from Igor Lesik <curoles at yahoo.com> 2011-06-14 20:49:23 PDT ---
I will see how I can work it into github, meanwhile I paste the original page
as comment here. Igor
getoptex
One way to extend Phobos library std.getopt.getopt function is make a wrapper
around it that could be feeded with usage information about every option and
let it automatically gather all usage strings into one usage/help message
block, similarly to Boost program_options library
Links:
http://en.wikipedia.org/wiki/Tuple
http://www.digitalmars.com/d/2.0/phobos/std_getopt.html
http://www.digitalmars.com/d/2.0/phobos/std_typetuple.html
Below is an example how getoptEx could be used:
import getoptex;
import std.stdio;
void main(string[] args)
{
string inputFile, outputFile;
bool helpPrinted = getoptEx(
"Test program to demonstrate getoptEx\n"~
"written by Igor Lesik on Feb 2010\n"~
"Usage: test1 { --switch }\n",
args,
std.getopt.config.caseInsensitive,
"input",
"\tinput file name,\n"~
"\tmust be html file",
&inputFile,
"output",
"\toutput file name",
&outputFile,
"author",
"\tprint name of\n"~
"\tthe author",
delegate() {writeln("Igor Lesik");}
);
if (helpPrinted)
return;
writeln("Input file name:", inputFile);
writeln("Output file name:", outputFile);
}
If you call the program with --help option, then output is:
>test1.exe --help
Test program to demonstrate getoptEx
written by Igor Lesik on Feb 2010
Usage: test1 { --switch }
--input
input file name,
must be html file
--output
output file name
--author
print name of
the author
--help
produce help message
getopEx implementation:
module getoptex;
import std.stdio;
import std.getopt;
private import std.contracts;
private import std.typetuple;
private import std.conv;
bool getoptEx(T...)(string helphdr, ref string[] args, T opts)
{
enforce(args.length,
"Invalid arguments string passed: program name missing");
string helpMsg = GetoptHelp(opts); // extract all help strings
bool helpPrinted = false; // state tells if called with "--help"
void printHelp()
{
writeln("\n", helphdr, "\n", helpMsg,
"--help", "\n\tproduce help message");
helpPrinted = true;
}
getopt(args, GetoptEx!(opts), "help", &printHelp);
return helpPrinted;
}
private template GetoptEx(TList...)
{
static if (TList.length)
{
static if (is(typeof(TList[0]) : config))
{
// it's a configuration flag, lets move on
alias TypeTuple!(TList[0],GetoptEx!(TList[1 .. $])) GetoptEx;
}
else
{
// it's an option string, eat help string
alias TypeTuple!(TList[0],TList[2],GetoptEx!(TList[3 .. $]))
GetoptEx;
}
}
else
{
alias TList GetoptEx;
}
}
private string GetoptHelp(T...)(T opts)
{
static if (opts.length)
{
static if (is(typeof(opts[0]) : config))
{
// it's a configuration flag, skip it
return GetoptHelp(opts[1 .. $]);
}
else
{
// it's an option string
string option = to!(string)(opts[0]);
string help = to!(string)(opts[1]);
return( "--"~option~"\n"~help~"\n"~GetoptHelp(opts[3 .. $]) );
}
}
else
{
return to!(string)("\n");
}
}
--
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
More information about the Digitalmars-d-bugs
mailing list