home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Chip 2007 January, February, March & April
/
Chip-Cover-CD-2007-02.iso
/
boot
/
i386
/
rescue
/
usr
/
bin
/
mkinfodir
< prev
next >
Wrap
Text File
|
2006-11-29
|
8KB
|
374 lines
#!/usr/bin/perl
# Copyright (c) 1996-2003 SuSE Linux AG, Nuernberg, Germany.
# All rights reserved.
#
# Author: Werner Fink <werner@suse.de>, 1996,1997,2003
#
# MAKEDIR.perl --- Version 0.54
#
use bytes;
if ( $#ARGV > 0 ) {
printf(STDERR "%s: Usage:\n", $0);
printf(STDERR " %s [info_dir_file]\n", $0); exit(1);
}
if ( length($ENV{'INFOPATH'}) > 0 ) {
@PATHS = split(/:/, $ENV{'INFOPATH'});
}
@PATHS=(
#
# /usr/share/info is the first in Path because it's our main info dir!
#
"/usr/share/info",
"/usr/info",
#
# Insert INFOPATH
#
@PATHS,
"/usr/lib/info",
#
# TeTeX-Infos are looked in by symbolic links in /usr/info.
#
# "/usr/lib/teTeX/info",
"/usr/local/info",
"/usr/local/lib/info",
"/usr/X11R6/info",
"/usr/X11R6/lib/info",
#
# xemacs has big problems handling nodes of the same name but
# different paths ... it's really buggy.
#
"/usr/X11R6/lib/xemacs/info",
"/usr/share/xemacs/xemacs-packages/info",
"/usr/share/xemacs/mule-packages/info",
"/usr/share/xemacs/info",
);
#
# Special: flushing file descriptor for speed, smothing, and big results
#
sub flush {
local($old) = select(shift);
$| = 1;
print "";
$| = 0;
select($old);
}
#
# Open the main dir file
#
$rand = int(rand(32767));
if ( $#ARGV == 0 ) {
$mdir = "$ARGV[0]";
$mdirbak = "$ARGV[0].bak";
$mdirtmp = "$ARGV[0].tmp$$.$rand";
} else {
$mdir = "$PATHS[0]/dir";
$mdirbak = "$PATHS[0]/dir.bak";
$mdirtmp = "$PATHS[0]/dir.tmp$$.$rand";
}
sub cleanup {
unlink $mdirtmp;
exit(1);
}
$SIG{'INT'} = "cleanup";
$SIG{'TERM'} = "cleanup";
$SIG{'HUP'} = "cleanup";
$SIG{'PIPE'} = 'IGNORE';
if ( !-e $mdir ) { `touch $mdir 2>&1 /dev/null`; }
if ( -w $mdir ) {
# sysopen(FH, $mdirtmp, O_RDWR|O_CREAT|O_EXCL) or die "Cannot create $mdirtmp\n";
# close(FH);
if ( -s $mdir && !-e $mdirbak ) {
`cp -p $mdir $mdirbak`;
if ( !-e $mdirbak ) { exit(1); }
}
`cp -p $mdir $mdirtmp`;
if ( !-e $mdirtmp ) { exit(1); }
$filehandle = ">$mdir" ;
} else {
printf(STDERR "%s: Warning, can not write to %s\n", $0, $mdir);
printf(STDERR " ... using STDOUT!\n");
flush(STDERR);
sleep (2);
$filehandle = ">-";
}
##
## read info dir
##
@allinfo = ();
%found = ();
for ( @PATHS ) {
@info = ();
$found{$_}++;
if ( $found{$_} > 1 ) {
next;
}
(-e $_) && (@info = ( -d $_ ) ? ( <$_/*> ) : ( $_ ));
@info = grep(/[^0-9](|\.gz)$/, @info);
@info = grep(!/(dir|dir\.bak|localdir|\~|\,v|\.orig)(|\.gz)$/, @info);
@info = sort grep(!/-\d+\./, @info);
push(@allinfo, @info);
}
sub basename {
local($name) = @_;
$name =~ s!.*/!!;
$name =~ s/\.gz//;
$name =~ s/\.info//;
$name =~ s/\+/\\\\+/g;
return ($name);
}
sub path {
local($name) = @_;
$name =~ s!\/[^/]*$!!;
return ($name);
}
##
##
## Global section titles used as keys
##
##
@sec = ();
#
# Reformat if required
#
sub do_format {
local($node, @buf) = @_;
local($base) = basename($node);
local($path) = path($node);
local($name) = "";
local($desc) = "";
local($link) = "";
local($l, $first, @ent);
$node =~ s/\.gz$//;
$node =~ s/\.info$//;
$node =~ s!//!/!g;
if ( $path =~ /^$PATHS[0]$/ ) { $node = $base; }
@ent = ();
foreach $l (@buf) {
$first = index($l,"*");
$l =~ s/\($base\)/\($node\)/g;
$l =~ s/::/: \($node\)\./g;
$name = "";
$desc = "";
$link = "";
($name,$desc) = split(/\.\s+/,"$l");
$name =~ s/\n//g;
$name =~ s/\s+$//g;
$name =~ s/^\s+//g;
$desc =~ s/\n//g;
$desc =~ s/\s+$//g;
$desc =~ s/^\s+//g;
if ( $first == 0 ) {
$l =~ s/^(\s+)//g;
($name, $link) = split(/:/, $name);
$name =~ s/\s+$//g;
$link =~ s/^\s+//g;
$link =~ s/\.$//g;
$name = $name . ':' . ' ' . $link . '.';
if ( length($l) > 80 ) {
if ( length($name) < 16 && length($desc) < 62) {
$l = sprintf("%-16.18s%s", $name, $desc);
} else {
if ( length($desc) > 0 ) {
$l = sprintf("%s\n\t\t%s", $name, $desc);
} else {
$l = sprintf("%s", $name);
}
}
}
}
push(@ent, $l);
}
return join("\n", @ent);
}
#
# No info for entry found, use old or make a new one
#
sub guess_missed {
local($node) = @_;
local($base) = basename($node);
local($path) = path($node);
local($cur) = "default";
local($ldir);
local(@buf, $add, $lines);
$node =~ s/\.gz$//;
$node =~ s/\.info$//;
$node =~ s!//!/!g;
if ( $path =~ /^$PATHS[0]$/ ) { $node = $base; }
if ( $path !~ /^$PATHS[0]$/ ) {
$ldir = "$path/dir";
} else {
$ldir = $mdirtmp;
}
@buf = ();
if ( -e $ldir && -r $ldir ) {
open(FILE, $ldir);
$add = 0;
while (<FILE>) {
#
# read next few lines if there is information ($add == 1)
#
if ( $add == 1 ) {
if ( /^\s+[^\:\*]+$/ ) {
push(@buf, $_); $lines++;
next;
}
last;
}
if ( /^\*\s+$base\:\s+\($base\)\.\s+\w/i ) {
$add = 1; push(@buf, $_); $lines = 1;
} elsif ( /^\*\s+$base\:\:\s+\w/i ) {
$add = 1; push(@buf, $_); $lines = 1;
} elsif ( /^\*\s+$base\:\s+\($base\)\.\s+$/i ) {
$add = 1; push(@buf, $_); $lines = 0;
} elsif ( /^\*\s+$base\:\:\s+$/i ) {
$add = 1; push(@buf, $_); $lines = 0;
} else {
next;
}
}
close(FILE);
}
if ($lines > 0) {
$sec{$cur} = join("\n", $sec{$cur}, do_format($node, @buf));
} else {
$base =~ s!(.*)!\L$1!;
$base =~ s!(.*)!\u$1!;
$base = '* ' . $base . ':';
$sec{$cur} = join("\n", $sec{$cur},
sprintf("%-0.80s %s\n", $base, '(' . $node . ').'));
}
}
#
# read info file for entry in dir file
#
sub read_entry {
local($file) = @_;
local($add, $lines, @buf);
local($cur) = "default";
local($source) = $file =~ /\.gz$/ ? "gunzip -q -d -c $file 2>/dev/null |" : "< $file";
local(@buf);
$add = 0;
$lines = 0;
@buf = ();
open(_FILE, $source) or warn "can't open $source\n";
while (<_FILE>) {
chomp;
s/\s+$//;
last if ( /^($|File:)/ );
next if ( /^$/ );
if ( /^INFO-DIR-SECTION/o ) {
s/^INFO-DIR-SECTION\s+//;
$cur = $_;
next;
}
if ( /^START-INFO-DIR-ENTRY/o ) {
$add = 1;
push(@buf, "\n") if ( $cur =~ /default/ );
next;
}
if ( /^END-INFO-DIR-ENTRY/o ) {
$add = 0;
$sec{$cur} = join("\n", $sec{$cur}, do_format($file, @buf));
next;
}
if ( $add == 1 ) {
$lines++;
push(@buf, $_);
next;
}
}
close(_FILE);
guess_missed($file) if ( $lines == 0 );
}
#
# Do all the stuff
#
foreach $elem (@allinfo) {
read_entry($elem) if ( -f $elem );
}
open(DIR, "$filehandle") or die "Cannot open $filehandle\n";
binmode DIR;
##
## define top format
##
format DIR =
-*- Text -*-
This is the file /usr/info/dir, which contains the topmost node of the
Info hierarchy. The first time you invoke Info you start off
looking at that node, which is (dir)Top.
File: dir Node: Top This is the top of the INFO tree
This (the Directory node) gives a menu of major topics.
Usage in info-mode of EMACS:
Typing "d" returns here, typing "?" lists all INFO commands,
typing "q" exits, typing "h" gives a primer for first-timers,
pressing 2nd button on a highlighted word follows cross-reference.
---- AUTOCONFIGURED BY SuSEConfig: EDIT WITH CARE: ----
---- Only descriptive text for otherwise empty topics will survive ----
* Menu: The list of major topics begins on the next line.
.
##
## end top format
##
write DIR; # write top format
flush(DIR);
@sec = sort keys %sec;
@keys = keys %sec;
while ($#keys >= 0) {
$cur = pop(@keys);
if ( $cur =~ /default/ ) {
printf(DIR "\nVarious Utilities");
} else {
printf(DIR "\n%s", $cur);
}
printf(DIR "%s\n", $sec{$cur});
}
printf(DIR "\n* Locales:\n");
close(DIR);
unlink($mdirtmp) if ( -e $mdirtmp );
exit 0;