NetBSD/gnu/dist/texinfo/util/infosrch

105 lines
2.4 KiB
Perl

#!/usr/local/bin/perl -w
# Id: infosrch,v 1.2 2004/04/11 17:56:47 karl Exp
# infosrch does a regex search on an info manual.
# By Harry Putnam <reader@newsguy.com>.
($myscript = $0) =~ s:^.*/::;
$six = '';
if($ARGV[0] eq "help"){
&usage;
exit;
}
if($ARGV[0] eq "-e"){
shift;
$six = "true";
}
if(!$ARGV[1]){
&usage;
exit;
}
$target = shift;
$regex = shift;
$shell_proc = "info --output - --subnodes 2>/dev/null $target";
open(SHELL_PROC," $shell_proc|");
while(<SHELL_PROC>){
chomp;
push @lines,$_;
}
close(SHELL_PROC);
$cnt = 0;
for(@lines){
if(/$regex/ && !$six){
print "$target\n $lines[($cnt-1)]\n<$cnt> $lines[$cnt]\n $lines[($cnt+1)]\n";
print "-- \n";
}elsif(/$regex/ && $six){
print "$target\n";
if($lines[($cnt-6)]){
print " $lines[($cnt-6)]\n";
}
if($lines[($cnt-5)]){
print " $lines[($cnt-5)]\n";
}
if($lines[($cnt-4)]){
print " $lines[($cnt-4)]\n";
}
if($lines[($cnt-3)]){
print " $lines[($cnt-3)]\n";
}
if($lines[($cnt-2)]){
print " $lines[($cnt-2)]\n";
}
if($lines[($cnt-1)]){
print " $lines[($cnt-1)]\n";
}
if($lines[$cnt]){
print "$cnt $lines[$cnt]\n";
}
if($lines[($cnt+1)]){
print " $lines[($cnt+1)]\n";
}
if($lines[($cnt+2)]){
print " $lines[($cnt+2)]\n";
}
if($lines[($cnt+3)]){
print " $lines[($cnt+3)]\n";
}
if($lines[($cnt+4)]){
print " $lines[($cnt+4)]\n";
}
if($lines[($cnt+5)]){
print " $lines[($cnt+5)]\n";
}
if($lines[($cnt+6)]){
print " $lines[($cnt+6)]\n";
}
print "-- \n";
}
$cnt++;
}
sub usage {
print <<EOM;
Purpose: Extract full text from info node and search it by regex
Usage: $myscript [-e] TARGET REGEX
Where TARGET is an info node such as `emacs', `bash' etc, and
REGEX is what you want to find in it.
The -e flag is not required but if used then 6 lines preceding and six
lines following any hits will be printed. The default (with no -e flag)
is to print one line before and after.
The output has the line number prepended to the line containing the
actual regex.
Info command used:
info --output - --subnodes 2>/dev/null TARGET
EOM
}