X-Git-Url: https://git.saurik.com/bison.git/blobdiff_plain/f4101aa612b2e2783ee0a78b88fb0d5f481ba363..ba061fa6f2fb7b144df75c1e052d61eeca392288:/build-aux/cross-options.pl?ds=sidebyside

diff --git a/build-aux/cross-options.pl b/build-aux/cross-options.pl
index 4c941b04..6d153a05 100755
--- a/build-aux/cross-options.pl
+++ b/build-aux/cross-options.pl
@@ -5,28 +5,68 @@ use 5.005;
 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 . '}' : '';
+	$short = '' if ! defined $short;
+	$short = '-d' if $long eq '--defines' && ! $short;
+	my $dir = '%' . substr($long, 2);
+	$dir = '' if index ($scanner, "\"$dir\"") < 0;
 	if ($arg)
 	{
+            # if $opt, $arg contains the closing ].
+            substr ($arg, -1) = ''
+                if $opt eq '[';
 	    $arg =~ s/^=//;
-	    $arg = '@var{' . lc ($arg) . '}';
+            $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;
 	    $arg = '[' . $arg . ']'
-		if defined $opt;
-	    $option{"$long=$arg"} = "$short $arg";
-	}
-	else
-	{
-	    $option{"$long"} = "$short";
+		if $opt eq '[';
+	    # 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=$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";
 }