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