use strict;
my %option;
-while (<>)
+my %directive;
+my $scanner = `grep -i '"%[a-z]' $ARGV[0]`;
+$scanner =~ s/"\[-_\]"/-/g;
+while (<STDIN>)
{
- if (/^\s*(?:(-\w), )?(--[-\w]+)(\[?)(=[-\w]+)?\]?/)
+ 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)
- {
- $arg =~ s/^=//;
- $arg = '@var{' . lc ($arg) . '}';
- $arg = '[' . $arg . ']'
- if defined $opt;
- $option{"$long=$arg"} = $short ? "$short $arg" : '';
- }
- else
- {
- $option{"$long"} = "$short";
- }
+ my ($short, $long, $opt, $arg) = ($1, $2, $3, $4);
+ $short = '' if ! defined $short;
+ $short = '-d' if $long eq '--defines' && ! $short;
+ my $dir = '%' . substr($long, 2);
+ if (index ($scanner, "\"$dir\"") < 0)
+ {
+ if ($long eq '--force-define') { $dir = '%define'; }
+ else { $dir = ''; }
+ }
+ if ($arg)
+ {
+ # if $opt, $arg contains the closing ].
+ substr ($arg, -1) = ''
+ if $opt eq '[';
+ $arg =~ s/^=//;
+ $arg = lc ($arg);
+ my $dir_arg = $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;
+ my $long_arg = "=$arg";
+ if ($opt eq '[') {
+ $long_arg = "[$long_arg]";
+ $arg = "[$arg]";
+ }
+ # For arguments of directives: this only works if all arguments
+ # are strings and have the same syntax as on the command line.
+ if ($dir_arg eq 'name[=value]')
+ {
+ $dir_arg = '@var{name} ["@var{value}"]';
+ }
+ else
+ {
+ $dir_arg =~ s/(\w+)/\@var{"$1"}/g;
+ $dir_arg = '[' . $dir_arg . ']'
+ if $opt eq '[';
+ }
+ $long = "$long$long_arg";
+ $short = "$short $arg" if $short && $short ne '-d';
+ $dir = "$dir $dir_arg" if $dir;
+ }
+ $option{$long} = $short;
+ $directive{$long} = $dir;
}
}
+my $sep = '';
foreach my $long (sort keys %option)
{
- printf "\@item %-40s \@tab %s\n", '@option{' . $long . '}', $option{$long};
+ # Avoid trailing spaces.
+ print $sep;
+ $sep = "\n";
+ print '@item @option{', $long, "}\n\@tab";
+ print ' @option{', $option{$long}, '}' if $option{$long};
+ print "\n\@tab";
+ print ' @code{', $directive{$long}, '}' if $directive{$long};
+ print "\n";
}