[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