#! /usr/bin/env perl

use warnings;
use 5.005;
use strict;

my %option;
while (<>)
{
    if (/^\s*             # Initial spaces.
        (?:(-\w),\s+)?    # $1: $short: Possible short option.
        (--[-\w]+)        # $2: $long:  Long option.
        (\[?)             # $3: $opt:   '[' iff the argument is optional.
        (?:=(\S+))?       # $4: $arg:   Possible argument name.
        \s                # Spaces.
        /x)
    {
	my ($short, $long, $opt, $arg) = ($1, $2, $3, $4);
	$short = defined $short ? '@option{' . $short . '}' : '';
	if ($arg)
	{
            # if $opt, $arg contains the closing ].
            substr ($arg, -1) = ''
                if $opt eq '[';
	    $arg =~ s/^=//;
            $arg = lc ($arg);
            # If the argument is compite (e.g., for --define[=NAME[=VALUE]]),
            # put each word in @var, to build @var{name}[=@var{value}], not
            # @var{name[=value]}].
	    $arg =~ s/(\w+)/\@var{$1}/g;
	    $arg = '[' . $arg . ']'
		if $opt eq '[';
	    $option{"$long=$arg"} = $short ? "$short $arg" : '';
	}
	else
	{
	    $option{"$long"} = "$short";
	}
    }
}

foreach my $long (sort keys %option)
{
    # Avoid trailing spaces.
    printf ("\@item %-40s \@tab%s\n",
            '@option{' . $long . '}',
            $option{$long} ? " $option{$long}" : "");
}
