"Fossies" - the Fresh Open Source Software Archive 
Member "rman-3.2/contrib/hman.pl" (26 Jul 2003, 8005 Bytes) of package /linux/www/old/rman-3.2.tar.gz:
As a special service "Fossies" has tried to format the requested source page into HTML format using (guessed) Perl source code syntax highlighting (style:
standard) with prefixed line numbers and
code folding option.
Alternatively you can here
view or
download the uninterpreted source code file.
For more information about "hman.pl" see the
Fossies "Dox" file reference documentation.
1 #!/usr/bin/perl -w
2 #!/citi/gtfd/mach/bin/perl -w
3 ###############
4 # $Id: hman.pl,v 1.7 1997/11/04 21:56:13 teto Exp teto $
5 # $Source: /pub/src/dev/hman/RCS/hman.pl,v $
6 ############################################
7 # TODO:
8 # reorganize location of man pages - move 3x stuff from man3 to man3x
9 # recurse - if 'man 3x curses' does not work try 'man 3 curses'
10 # display more STDERR
11 # Fix broken whatis entries - instead of
12 # manpage section - description
13 # manpage description section -
14 # highlite keywords found
15 # pass MANPATH as a command line argument
16 ############################################
17 # Inspired by:
18 # http://www.jinr.dubna.su/~gagin
19 # http://thsun1.jinr.dubna.su/~gagin/rman.pl
20 # http://thsun1.jinr.dubna.su/cgi-bin/rman.pl
21 # http://www.jinr.dubna.su/~gagin/rman.pl.html
22 #
23 # CGI form interface to PolyglotMan program, which is available as
24 # ftp://ftp.cs.berkeley.edu:/ucb/people/phelps/tcltk/rman.tar.Z
25 #
26 # The most recent version of this program available as
27 # http://www.geocities.com/SiliconValley/Lakes/8777/hman.html
28 #---------------------------------------------------------------------
29 # This is free software; you can redistribute it and/or modify
30 # it under the terms of the GNU General Public License as published by
31 # the Free Software Foundation; either version 2, or (at your option)
32 # any later version.
33 #
34 # hman is distributed in the hope that
35 # it will be useful, but WITHOUT ANY WARRANTY; without even the implied
36 # warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
37 # See the GNU General Public License for more details.
38 #
39 # You should have received a copy of the GNU General Public License
40 # along with this software; see the file COPYING. If not, write to the
41 # Free Software Foundation, Inc., 59 Temple Place - Suite 330,
42 # Boston, MA 02111-1307, USA.
43 #
44 # THIS SOFTWARE IS NOT DESIGNED OR INTENDED FOR USE OR RESALE AS ON-LINE
45 # CONTROL EQUIPMENT IN HAZARDOUS ENVIRONMENTS REQUIRING FAIL-SAFE
46 # PERFOHMANCE, SUCH AS IN THE OPERATION OF NUCLEAR FACILITIES, AIRCRAFT
47 # NAVIGATION OR COMMUNICATION SYSTEMS, AIR TRAFFIC CONTROL, DIRECT LIFE
48 # SUPPORT MACHINES, OR WEAPONS SYSTEMS, IN WHICH THE FAILURE OF THE
49 # SOFTWARE COULD LEAD DIRECTLY TO DEATH, PERSONAL INJURY, OR SEVERE
50 # PHYSICAL OR ENVIRONMENTAL DAMAGE ("HIGH RISK ACTIVITIES").
51 # ANY EXPRESS OR IMPLIED WARRANTY OF FITNESS FOR HIGH RISK ACTIVITIES
52 # IS SPECIFICALLY DISCLAIMED.
53 #---------------------------------------------------------------------
54 # Request form: hman.pl?ManTopic=SOMETOPIC&ManSection=SECTION
55 # Request form: hman.pl?DirectPath=filename
56 #
57 #---------------------------------------------------------------------
58 # Stuff to change
59
60 # path to PolyglotMan program. "-b" is not nessesary
61 $hman="$ENV{HMANPRG} $ENV{HMANOPT}";
62
63 # path to man program
64 $ManPrg='/usr/bin/man';
65
66 # path to cat program
67 $ENV{PAGER} = '/bin/cat';
68
69 # path to man directories
70 ($ManPathFind = $ENV{MANPATH}) =~ s/:/ /g;
71
72 # URL to this program
73 $hmanpl='/cgi-bin/hman';
74
75 # if man produced number of lines less then follows,
76 # I assume that request failed
77 $emptyman=5;
78
79 # tail of every produced html document
80 $HtmlTail='<hr><A HREF="' . $hmanpl . '">Back to Hman</a>';
81 # $HtmlTitle="<title>CGI form interface to PolyglotMan</title>\n";
82 $HtmlHdr="Content-type: text/html\n\n";
83
84 # end changable things
85 #----------------------------------------------------------------------
86 @ManSections = (
87 '1', 'user commands',
88 '2', 'system calls',
89 '3', 'subroutines',
90 '4', 'devices',
91 '5', 'file formats',
92 '6', 'games',
93 '7', 'miscellanious',
94 '8', 'sys. admin.',
95 '9', 'Linux Internals',
96 'n', 'section n'
97 );
98
99 # Set unbuffered I/O. Prevents buffering problems with
100 # "system()" calls.
101 select((select(STDOUT), $| = 1)[0]);
102 print $HtmlHdr;
103
104 $string = $ENV{QUERY_STRING};
105 #
106 # Initial Form
107 #
108 if($string eq "") { initialForm(); }
109
110 #
111 # Generic parameter parsing ...
112 #
113 $DirectPath = $ManSection = $ManTopic = "";
114 $string =~ s/&/'; \$/g;
115 $string =~ s/=/='/g;
116 $string =~ s/^(.*)$/\$$1';/;
117 eval $string;
118
119 hmanDirect($DirectPath) if ($DirectPath ne "");
120
121 if ($ManTopic eq "") { badness("<code>Topic for man search needed</code>\n"); }
122
123 if ($ManSection eq "") { badness("<code>No section specified</code>\n"); }
124
125 $ManSection =~ s/all//;
126 if ($ManSection =~ /key/) { manKey($ManTopic); }
127
128 findIt($ManTopic);
129 open(MANOUT, "$ManPrg $ManSection $ManTopic |")
130 || die "$hmanpl: can't run \"$ManPrg Section $ManTopic |\", $!\n";
131 for (0..$emptyman) {
132 $temp = <MANOUT> || last;
133 push @temp, $temp;
134 }
135 #
136 if (@temp < $emptyman) {
137 close(MANOUT);
138 print"<strong>Request failed for topic $ManTopic:</strong>\n<code>";
139 for (@temp) {print;}
140 print "</code><br><h3>Let's try a keyword search:</h3><hr>\n";
141 manKey($ManTopic);
142 }
143 #
144 $cmd = "$hman -r \"$hmanpl?ManTopic=%s&ManSection=%s\" -l \"Man page for $ManTopic";
145 if ($ManSection eq "") {
146 $cmd .= '"';
147 } else {
148 $cmd .= "($ManSection)\"";
149 }
150 #
151 open(HMANIN, "| $cmd") || die "$hmanpl: can't open $cmd: $!\n";
152 for (@temp) {print HMANIN;}
153 while(<MANOUT>){print HMANIN;}
154 close(MANOUT);
155 close(HMANIN);
156
157 exitIt();
158 ###############################################################################
159 sub initialForm {
160 print <<EOF;
161 <h1>Select a manual page:</h1>
162 <FORM METHOD="GET" action="$hmanpl">
163 <table border=0>
164 <tr>
165 <td align=right>Section:</td>
166 <td>
167 <select name=ManSection>
168 <OPTION value=all>All</option>
169 <OPTION value=key>Keyword Search</option>
170 EOF
171 for ($ndx = 0; $ndx < @ManSections; $ndx += 2) {
172 print ' <OPTION value=' . $ManSections[$ndx] . '>'
173 . "$ManSections[$ndx] - $ManSections[$ndx + 1] "
174 . '</option>' . "\n";
175 }
176 print <<EOF;
177 </SELECT>
178 </td>
179 </tr>
180 <tr>
181 <td align=right>Topic:</td>
182 <td><input type="TEXT" name="ManTopic"></td>
183 </tr>
184 <tr>
185 <td align=right><INPUT TYPE="submit" VALUE="Search">
186 <td align=left><input type="reset" value="Reset">
187 </td>
188 </tr>
189 </table>
190 </FORM>
191 EOF
192 exitIt();
193 }
194 sub findIt {
195 my($topic) = ($_[0]);
196 my($cmd, $mixedCase, $navigation, $zcat);
197 $mixedCase = '';
198 foreach (split(/\s*/, $topic)) {
199 $mixedCase .= "[" . $_ . uc($_) . "]";
200 }
201 $cmd = 'find ' . $ManPathFind . ' \( -type f -o -type l \) -name '
202 . $mixedCase .'\* | sort -t. +1';
203 open(FINDIN, "$cmd |") || die "can't open pipe \"$cmd |\": $!";
204 $navigation = 0;
205 while (<FINDIN>) {
206 if ($navigation == 0) {
207 print "<UL>\n";
208 $navigation = 1;
209 }
210 $_ =~ s/[\n\r]*$//;
211 print "<li><A HREF=\"$hmanpl?DirectPath=$_\">$_</a>\n";
212 }
213 close(FINDIN);
214 print "</UL><hr>\n" if ($navigation == 1);
215 }
216 sub hmanDirect {
217 my($path) = ($_[0], $_[1]);
218 my($cmd, $dir, $topic, $section);
219 ($dir = $path) =~ s/\.(gz|z|Z)$//;
220 ($topic = $dir) =~ s,^.*/,,;
221 $dir =~ s,/[^/]*/[^/]*$,,;
222 # $dir =~ s,/[^/]*$,,;
223 ($section=$topic)=~s/^.*\.([^\.]*)$/$1/;
224 $topic =~ s/\.[^\.]*$//;
225 findIt($topic);
226 $cmd = "cd $dir; (gzip -dc < $path 2>/dev/null || cat < $path) | $hman -r '"
227 . $hmanpl . '?ManTopic=%s&ManSection=%s' ."' -l 'Man page for $topic($section)'";
228 system($cmd) || warn "can't run command \"$cmd\": $!";
229 print $HtmlTail;
230 exit 0;
231 }
232 sub exitIt {
233 print $HtmlTail;
234 exit 0;
235 }
236 sub badness {
237 my($text) = ($_[0]);
238 print "<strong>Request failed:</strong> $text, Try again<hr>\n";
239 initialForm();
240 }
241 sub manKey {
242 my($topic) = ($_[0]);
243 open(TMPHTML,"$ManPrg -k $topic | sort -u |")
244 || die "can't open pipe \"$ManPrg -k $topic | sort -u |\": $!\n";
245 print "<title>Keyword search results for \"$topic\"</title>\n";
246 print "<h1>Keyword search results for \"$topic\"</h1><hr>\n";
247 while(<TMPHTML>) {
248 s/\( \)//g;
249 next if (! /^([^(]+)\s*\(([^)]+)[^-]+-\s(.*)[\n\r]*$/);
250 @topics=split(/, /,$1);
251 next if ($2 eq "");
252 print "<h2>$3:</h2>\n";
253 print "<UL>\n";
254 for $topic (@topics) {
255 print "<li><A HREF=\"$hmanpl?ManSection=$2&ManTopic=$topic\">$topic</a>($2)\n";
256 }
257 print "</UL>\n";
258 }
259 close(TMPHTML);
260 exitIt();
261 }