[Issue 3780] New: getopt improvements by Igor Lesik

d-bugmail at puremagic.com d-bugmail at puremagic.com
Sun Feb 7 18:38:21 PST 2010


http://d.puremagic.com/issues/show_bug.cgi?id=3780

           Summary: getopt improvements by Igor Lesik
           Product: D
           Version: unspecified
          Platform: Other
        OS/Version: Linux
            Status: NEW
          Severity: normal
          Priority: P2
         Component: DMD
        AssignedTo: nobody at puremagic.com
        ReportedBy: andrei at metalanguage.com


--- Comment #0 from Andrei Alexandrescu <andrei at metalanguage.com> 2010-02-07 18:38:17 PST ---
Below is a paste of the page at http://www.curoles.com/j/getoptex.html. The
code should be added to std.getopt, perhaps as an overload of the current
function. Thanks Igor! I will add your name to the authors list when I make the
change.

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");
    }
}
Page generated by Ddoc.

-- 
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