Index: gperf/src/gperf/3.0.1/gperf-3.0.1-src/doc/help2man |
=================================================================== |
--- gperf/src/gperf/3.0.1/gperf-3.0.1-src/doc/help2man (revision 0) |
+++ gperf/src/gperf/3.0.1/gperf-3.0.1-src/doc/help2man (revision 0) |
@@ -0,0 +1,517 @@ |
+#!/usr/bin/perl -w |
+ |
+# Generate a short man page from --help and --version output. |
+# Copyright © 1997, 1998, 1999, 2000 Free Software Foundation, Inc. |
+ |
+# This program is free software; you can redistribute it and/or modify |
+# it under the terms of the GNU General Public License as published by |
+# the Free Software Foundation; either version 2, or (at your option) |
+# any later version. |
+ |
+# This program is distributed in the hope that it will be useful, |
+# but WITHOUT ANY WARRANTY; without even the implied warranty of |
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
+# GNU General Public License for more details. |
+ |
+# You should have received a copy of the GNU General Public License |
+# along with this program; if not, write to the Free Software Foundation, |
+# Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. |
+ |
+# Written by Brendan O'Dea <bod@compusol.com.au> |
+# Available from ftp://ftp.gnu.org/gnu/help2man/ |
+ |
+use 5.004; |
+use strict; |
+use Getopt::Long; |
+use Text::Tabs qw(expand); |
+use POSIX qw(strftime setlocale LC_TIME); |
+ |
+my $this_program = 'help2man'; |
+my $this_version = '1.23'; |
+my $version_info = <<EOT; |
+GNU $this_program $this_version |
+ |
+Copyright (C) 1997, 1998, 1999, 2000 Free Software Foundation, Inc. |
+This is free software; see the source for copying conditions. There is NO |
+warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. |
+ |
+Written by Brendan O'Dea <bod\@compusol.com.au> |
+EOT |
+ |
+my $help_info = <<EOT; |
+`$this_program' generates a man page out of `--help' and `--version' output. |
+ |
+Usage: $this_program [OPTION]... EXECUTABLE |
+ |
+ -n, --name=STRING use `STRING' as the description for the NAME paragraph |
+ -s, --section=SECTION use `SECTION' as the section for the man page |
+ -i, --include=FILE include material from `FILE' |
+ -I, --opt-include=FILE include material from `FILE' if it exists |
+ -o, --output=FILE send output to `FILE' |
+ -N, --no-info suppress pointer to Texinfo manual |
+ --help print this help, then exit |
+ --version print version number, then exit |
+ |
+EXECUTABLE should accept `--help' and `--version' options. |
+ |
+Report bugs to <bug-help2man\@gnu.org>. |
+EOT |
+ |
+my $section = 1; |
+my ($opt_name, @opt_include, $opt_output, $opt_no_info); |
+ |
+# Parse options. |
+Getopt::Long::config('bundling'); |
+GetOptions ( |
+ 'n|name=s' => \$opt_name, |
+ 's|section=s' => \$section, |
+ 'i|include=s' => sub { push @opt_include, [ pop, 1 ] }, |
+ 'I|opt-include=s' => sub { push @opt_include, [ pop, 0 ] }, |
+ 'o|output=s' => \$opt_output, |
+ 'N|no-info' => \$opt_no_info, |
+ help => sub { print $help_info; exit }, |
+ version => sub { print $version_info; exit }, |
+) or die $help_info; |
+ |
+die $help_info unless @ARGV == 1; |
+ |
+my %include = (); |
+my %append = (); |
+my @include = (); # retain order given in include file |
+ |
+# Provide replacement `quote-regex' operator for pre-5.005. |
+BEGIN { eval q(sub qr { '' =~ $_[0]; $_[0] }) if $] < 5.005 } |
+ |
+# Process include file (if given). Format is: |
+# |
+# [section name] |
+# verbatim text |
+# |
+# or |
+# |
+# /pattern/ |
+# verbatim text |
+# |
+ |
+for (@opt_include) |
+{ |
+ my ($inc, $required) = @$_; |
+ |
+ next unless -f $inc or $required; |
+ die "$this_program: can't open `$inc' ($!)\n" |
+ unless open INC, $inc; |
+ |
+ my $key; |
+ my $hash = \%include; |
+ |
+ while (<INC>) |
+ { |
+ # [section] |
+ if (/^\[([^]]+)\]/) |
+ { |
+ $key = uc $1; |
+ $key =~ s/^\s+//; |
+ $key =~ s/\s+$//; |
+ $hash = \%include; |
+ push @include, $key unless $include{$key}; |
+ next; |
+ } |
+ |
+ # /pattern/ |
+ if (m!^/(.*)/([ims]*)!) |
+ { |
+ my $pat = $2 ? "(?$2)$1" : $1; |
+ |
+ # Check pattern. |
+ eval { $key = qr($pat) }; |
+ if ($@) |
+ { |
+ $@ =~ s/ at .*? line \d.*//; |
+ die "$inc:$.:$@"; |
+ } |
+ |
+ $hash = \%append; |
+ next; |
+ } |
+ |
+ # Silently ignore anything before the first |
+ # section--allows for comments and revision info. |
+ next unless $key; |
+ |
+ $hash->{$key} ||= ''; |
+ $hash->{$key} .= $_; |
+ } |
+ |
+ close INC; |
+ |
+ die "$this_program: no valid information found in `$inc'\n" |
+ unless $key; |
+} |
+ |
+# Compress trailing blank lines. |
+for my $hash (\(%include, %append)) |
+{ |
+ for (keys %$hash) { $hash->{$_} =~ s/\n+$/\n/ } |
+} |
+ |
+# Turn off localisation of executable's ouput. |
+@ENV{qw(LANGUAGE LANG LC_ALL)} = ('C') x 3; |
+ |
+# Turn off localisation of date (for strftime). |
+setlocale LC_TIME, 'C'; |
+ |
+# Grab help and version info from executable. |
+my ($help_text, $version_text) = map { |
+ join '', map { s/ +$//; expand $_ } `$ARGV[0] --$_ 2>/dev/null` |
+ or die "$this_program: can't get `--$_' info from $ARGV[0]\n" |
+} qw(help version); |
+ |
+my $date = strftime "%B %Y", localtime; |
+(my $program = $ARGV[0]) =~ s!.*/!!; |
+my $package = $program; |
+my $version; |
+ |
+if ($opt_output) |
+{ |
+ unlink $opt_output |
+ or die "$this_program: can't unlink $opt_output ($!)\n" |
+ if -e $opt_output; |
+ |
+ open STDOUT, ">$opt_output" |
+ or die "$this_program: can't create $opt_output ($!)\n"; |
+} |
+ |
+# The first line of the --version information is assumed to be in one |
+# of the following formats: |
+# |
+# <version> |
+# <program> <version> |
+# {GNU,Free} <program> <version> |
+# <program> ({GNU,Free} <package>) <version> |
+# <program> - {GNU,Free} <package> <version> |
+# |
+# and seperated from any copyright/author details by a blank line. |
+ |
+($_, $version_text) = split /\n+/, $version_text, 2; |
+ |
+if (/^(\S+) +\(((?:GNU|Free) +[^)]+)\) +(.*)/ or |
+ /^(\S+) +- *((?:GNU|Free) +\S+) +(.*)/) |
+{ |
+ $program = $1; |
+ $package = $2; |
+ $version = $3; |
+} |
+elsif (/^((?:GNU|Free) +)?(\S+) +(.*)/) |
+{ |
+ $program = $2; |
+ $package = $1 ? "$1$2" : $2; |
+ $version = $3; |
+} |
+else |
+{ |
+ $version = $_; |
+} |
+ |
+$program =~ s!.*/!!; |
+ |
+# No info for `info' itself. |
+$opt_no_info = 1 if $program eq 'info'; |
+ |
+# --name overrides --include contents. |
+$include{NAME} = "$program \\- $opt_name\n" if $opt_name; |
+ |
+# Default (useless) NAME paragraph. |
+$include{NAME} ||= "$program \\- manual page for $program $version\n"; |
+ |
+# Man pages traditionally have the page title in caps. |
+my $PROGRAM = uc $program; |
+ |
+# Extract usage clause(s) [if any] for SYNOPSIS. |
+if ($help_text =~ s/^Usage:( +(\S+))(.*)((?:\n(?: {6}\1| *or: +\S).*)*)//m) |
+{ |
+ my @syn = $2 . $3; |
+ |
+ if ($_ = $4) |
+ { |
+ s/^\n//; |
+ for (split /\n/) { s/^ *(or: +)?//; push @syn, $_ } |
+ } |
+ |
+ my $synopsis = ''; |
+ for (@syn) |
+ { |
+ $synopsis .= ".br\n" if $synopsis; |
+ s!^\S*/!!; |
+ s/^(\S+) *//; |
+ $synopsis .= ".B $1\n"; |
+ s/\s+$//; |
+ s/(([][]|\.\.+)+)/\\fR$1\\fI/g; |
+ s/^/\\fI/ unless s/^\\fR//; |
+ $_ .= '\fR'; |
+ s/(\\fI)( *)/$2$1/g; |
+ s/\\fI\\fR//g; |
+ s/^\\fR//; |
+ s/\\fI$//; |
+ s/^\./\\&./; |
+ |
+ $synopsis .= "$_\n"; |
+ } |
+ |
+ $include{SYNOPSIS} ||= $synopsis; |
+} |
+ |
+# Process text, initial section is DESCRIPTION. |
+my $sect = 'DESCRIPTION'; |
+$_ = "$help_text\n\n$version_text"; |
+ |
+# Normalise paragraph breaks. |
+s/^\n+//; |
+s/\n*$/\n/; |
+s/\n\n+/\n\n/g; |
+ |
+# Temporarily exchange leading dots, apostrophes and backslashes for |
+# tokens. |
+s/^\./\x80/mg; |
+s/^'/\x81/mg; |
+s/\\/\x82/g; |
+ |
+# Start a new paragraph (if required) for these. |
+s/([^\n])\n(Report +bugs|Email +bug +reports +to|Written +by)/$1\n\n$2/g; |
+ |
+sub convert_option; |
+ |
+while (length) |
+{ |
+ # Convert some standard paragraph names. |
+ if (s/^(Options|Examples): *\n//) |
+ { |
+ $sect = uc $1; |
+ next; |
+ } |
+ |
+ # Copyright section |
+ if (/^Copyright +[(\xa9]/) |
+ { |
+ $sect = 'COPYRIGHT'; |
+ $include{$sect} ||= ''; |
+ $include{$sect} .= ".PP\n" if $include{$sect}; |
+ |
+ my $copy; |
+ ($copy, $_) = split /\n\n/, $_, 2; |
+ |
+ for ($copy) |
+ { |
+ # Add back newline |
+ s/\n*$/\n/; |
+ |
+ # Convert iso9959-1 copyright symbol or (c) to nroff |
+ # character. |
+ s/^Copyright +(?:\xa9|\([Cc]\))/Copyright \\(co/mg; |
+ |
+ # Insert line breaks before additional copyright messages |
+ # and the disclaimer. |
+ s/(.)\n(Copyright |This +is +free +software)/$1\n.br\n$2/g; |
+ |
+ # Join hyphenated lines. |
+ s/([A-Za-z])-\n */$1/g; |
+ } |
+ |
+ $include{$sect} .= $copy; |
+ $_ ||= ''; |
+ next; |
+ } |
+ |
+ # Catch bug report text. |
+ if (/^(Report +bugs|Email +bug +reports +to) /) |
+ { |
+ $sect = 'REPORTING BUGS'; |
+ } |
+ |
+ # Author section. |
+ elsif (/^Written +by/) |
+ { |
+ $sect = 'AUTHOR'; |
+ } |
+ |
+ # Examples, indicated by an indented leading $, % or > are |
+ # rendered in a constant width font. |
+ if (/^( +)([\$\%>] )\S/) |
+ { |
+ my $indent = $1; |
+ my $prefix = $2; |
+ my $break = '.IP'; |
+ $include{$sect} ||= ''; |
+ while (s/^$indent\Q$prefix\E(\S.*)\n*//) |
+ { |
+ $include{$sect} .= "$break\n\\f(CW$prefix$1\\fR\n"; |
+ $break = '.br'; |
+ } |
+ |
+ next; |
+ } |
+ |
+ my $matched = ''; |
+ $include{$sect} ||= ''; |
+ |
+ # Sub-sections have a trailing colon and the second line indented. |
+ if (s/^(\S.*:) *\n / /) |
+ { |
+ $matched .= $& if %append; |
+ $include{$sect} .= qq(.SS "$1"\n); |
+ } |
+ |
+ my $indent = 0; |
+ my $content = ''; |
+ |
+ # Option with description. |
+ if (s/^( {1,10}([+-]\S.*?))(?:( +)|\n( {20,}))(\S.*)\n//) |
+ { |
+ $matched .= $& if %append; |
+ $indent = length ($4 || "$1$3"); |
+ $content = ".TP\n\x83$2\n\x83$5\n"; |
+ unless ($4) |
+ { |
+ # Indent may be different on second line. |
+ $indent = length $& if /^ {20,}/; |
+ } |
+ } |
+ |
+ # Option without description. |
+ elsif (s/^ {1,10}([+-]\S.*)\n//) |
+ { |
+ $matched .= $& if %append; |
+ $content = ".HP\n\x83$1\n"; |
+ $indent = 80; # not continued |
+ } |
+ |
+ # Indented paragraph with tag. |
+ elsif (s/^( +(\S.*?) +)(\S.*)\n//) |
+ { |
+ $matched .= $& if %append; |
+ $indent = length $1; |
+ $content = ".TP\n\x83$2\n\x83$3\n"; |
+ } |
+ |
+ # Indented paragraph. |
+ elsif (s/^( +)(\S.*)\n//) |
+ { |
+ $matched .= $& if %append; |
+ $indent = length $1; |
+ $content = ".IP\n\x83$2\n"; |
+ } |
+ |
+ # Left justified paragraph. |
+ else |
+ { |
+ s/(.*)\n//; |
+ $matched .= $& if %append; |
+ $content = ".PP\n" if $include{$sect}; |
+ $content .= "$1\n"; |
+ } |
+ |
+ # Append continuations. |
+ while (s/^ {$indent}(\S.*)\n//) |
+ { |
+ $matched .= $& if %append; |
+ $content .= "\x83$1\n" |
+ } |
+ |
+ # Move to next paragraph. |
+ s/^\n+//; |
+ |
+ for ($content) |
+ { |
+ # Leading dot and apostrophe protection. |
+ s/\x83\./\x80/g; |
+ s/\x83'/\x81/g; |
+ s/\x83//g; |
+ |
+ # Convert options. |
+ s/(^| )(-[][\w=-]+)/$1 . convert_option $2/mge; |
+ } |
+ |
+ # Check if matched paragraph contains /pat/. |
+ if (%append) |
+ { |
+ for my $pat (keys %append) |
+ { |
+ if ($matched =~ $pat) |
+ { |
+ $content .= ".PP\n" unless $append{$pat} =~ /^\./; |
+ $content .= $append{$pat}; |
+ } |
+ } |
+ } |
+ |
+ $include{$sect} .= $content; |
+} |
+ |
+# Refer to the real documentation. |
+unless ($opt_no_info) |
+{ |
+ $sect = 'SEE ALSO'; |
+ $include{$sect} ||= ''; |
+ $include{$sect} .= ".PP\n" if $include{$sect}; |
+ $include{$sect} .= <<EOT; |
+The full documentation for |
+.B $program |
+is maintained as a Texinfo manual. If the |
+.B info |
+and |
+.B $program |
+programs are properly installed at your site, the command |
+.IP |
+.B info $program |
+.PP |
+should give you access to the complete manual. |
+EOT |
+} |
+ |
+# Output header. |
+print <<EOT; |
+.\\" DO NOT MODIFY THIS FILE! It was generated by $this_program $this_version. |
+.TH $PROGRAM "$section" "$date" "$package $version" FSF |
+EOT |
+ |
+# Section ordering. |
+my @pre = qw(NAME SYNOPSIS DESCRIPTION OPTIONS EXAMPLES); |
+my @post = ('AUTHOR', 'REPORTING BUGS', 'COPYRIGHT', 'SEE ALSO'); |
+my $filter = join '|', @pre, @post; |
+ |
+# Output content. |
+for (@pre, (grep ! /^($filter)$/o, @include), @post) |
+{ |
+ if ($include{$_}) |
+ { |
+ my $quote = /\W/ ? '"' : ''; |
+ print ".SH $quote$_$quote\n"; |
+ |
+ for ($include{$_}) |
+ { |
+ # Replace leading dot, apostrophe and backslash tokens. |
+ s/\x80/\\&./g; |
+ s/\x81/\\&'/g; |
+ s/\x82/\\e/g; |
+ print; |
+ } |
+ } |
+} |
+ |
+exit; |
+ |
+# Convert option dashes to \- to stop nroff from hyphenating 'em, and |
+# embolden. Option arguments get italicised. |
+sub convert_option |
+{ |
+ local $_ = '\fB' . shift; |
+ |
+ s/-/\\-/g; |
+ unless (s/\[=(.*)\]$/\\fR[=\\fI$1\\fR]/) |
+ { |
+ s/=(.)/\\fR=\\fI$1/; |
+ s/ (.)/ \\fI$1/; |
+ $_ .= '\fR'; |
+ } |
+ |
+ $_; |
+} |