Ying Wang | 0543663 | 2013-04-05 16:01:00 -0700 | [diff] [blame] | 1 | #! /usr/bin/env perl |
| 2 | |
| 3 | use warnings; |
| 4 | use 5.005; |
| 5 | use strict; |
| 6 | |
| 7 | my %option; |
| 8 | my %directive; |
| 9 | my $scanner = `grep -i '"%[a-z]' $ARGV[0]`; |
| 10 | $scanner =~ s/"\[-_\]"/-/g; |
| 11 | while (<STDIN>) |
| 12 | { |
| 13 | if (/^\s* # Initial spaces. |
| 14 | (?:(-\w),\s+)? # $1: $short: Possible short option. |
| 15 | (--[-\w]+) # $2: $long: Long option. |
| 16 | (\[?) # $3: $opt: '[' iff the argument is optional. |
| 17 | (?:=(\S+))? # $4: $arg: Possible argument name. |
| 18 | \s # Spaces. |
| 19 | /x) |
| 20 | { |
| 21 | my ($short, $long, $opt, $arg) = ($1, $2, $3, $4); |
| 22 | $short = '' if ! defined $short; |
| 23 | $short = '-d' if $long eq '--defines' && ! $short; |
| 24 | my $dir = '%' . substr($long, 2); |
| 25 | if (index ($scanner, "\"$dir\"") < 0) |
| 26 | { |
| 27 | if ($long eq '--force-define') { $dir = '%define'; } |
| 28 | else { $dir = ''; } |
| 29 | } |
| 30 | if ($arg) |
| 31 | { |
| 32 | # if $opt, $arg contains the closing ]. |
| 33 | substr ($arg, -1) = '' |
| 34 | if $opt eq '['; |
| 35 | $arg =~ s/^=//; |
| 36 | $arg = lc ($arg); |
| 37 | my $dir_arg = $arg; |
| 38 | # If the argument is compite (e.g., for --define[=NAME[=VALUE]]), |
| 39 | # put each word in @var, to build @var{name}[=@var{value}], not |
| 40 | # @var{name[=value]}]. |
| 41 | $arg =~ s/(\w+)/\@var{$1}/g; |
| 42 | my $long_arg = "=$arg"; |
| 43 | if ($opt eq '[') { |
| 44 | $long_arg = "[$long_arg]"; |
| 45 | $arg = "[$arg]"; |
| 46 | } |
| 47 | # For arguments of directives: this only works if all arguments |
| 48 | # are strings and have the same syntax as on the command line. |
| 49 | if ($dir_arg eq 'name[=value]') |
| 50 | { |
| 51 | $dir_arg = '@var{name} ["@var{value}"]'; |
| 52 | } |
| 53 | else |
| 54 | { |
| 55 | $dir_arg =~ s/(\w+)/\@var{"$1"}/g; |
| 56 | $dir_arg = '[' . $dir_arg . ']' |
| 57 | if $opt eq '['; |
| 58 | } |
| 59 | $long = "$long$long_arg"; |
| 60 | $short = "$short $arg" if $short && $short ne '-d'; |
| 61 | $dir = "$dir $dir_arg" if $dir; |
| 62 | } |
| 63 | $option{$long} = $short; |
| 64 | $directive{$long} = $dir; |
| 65 | } |
| 66 | } |
| 67 | |
| 68 | my $sep = ''; |
| 69 | foreach my $long (sort keys %option) |
| 70 | { |
| 71 | # Avoid trailing spaces. |
| 72 | print $sep; |
| 73 | $sep = "\n"; |
| 74 | print '@item @option{', $long, "}\n\@tab"; |
| 75 | print ' @option{', $option{$long}, '}' if $option{$long}; |
| 76 | print "\n\@tab"; |
| 77 | print ' @code{', $directive{$long}, '}' if $directive{$long}; |
| 78 | print "\n"; |
| 79 | } |