#! /usr/local/bin/perl

# Extract R object INDEX information from Rd files.
# Usage: R CMD Rdindex [options] files
# The titles are nicely formatted between two columns (defaults are 25
# and 72, respectively).

# Copyright (C) 1997-2001 The R Core Development Team
#
# This document 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.
#
# A copy of the GNU General Public License is available via WWW at
# http://www.gnu.org/copyleft/gpl.html.  You can also obtain it by
# writing to the Free Software Foundation, Inc., 59 Temple Place,
# Suite 330, Boston, MA  02111-1307  USA.

use Getopt::Long;
use R::Utils;
use R::Rd;

my $revision = ' $Revision: 1.15 $ ';
my $version;
my $name;

$revision =~ / ([\d\.]*) /;
$version = $1;
($name = $0) =~ s|.*/||;

sub usage {
    print STDERR <<END;
Usage: R CMD Rdindex [options] FILES

Create an index table from the R documentation sources specified by
FILES, by either giving the paths to the files, or the path to a
directory with the sources of a package.  The titles are nicely
formatted between two column positions (defaults are 25 and 72,
respectively).

Options:
  -h, --help            print short help message and exit
  -v, --version         print version info and exit
  -l, --left=X		make X the left column for title formatting
  -r, --right=Y		make Y the right column for title formatting
  -d, --data            include only data documentation files if a
                        directory was specified
      --os=NAME         use OS subdir \`NAME\' (unix, mac or windows)
      --OS=NAME         the same as \`--os\'.

Email bug reports to <r-bugs\@r-project.org>.
END
    exit 0; 
}

## <FIXME>
## Currently, R_OSTYPE is always set on Unix/Windows.
my $OSdir = R_getenv("R_OSTYPE", "mac");
## </FIXME>

my @knownoptions = ("h|help", "v|version", "l|left=s", "r|right=s",
		    "d|data", "os|OS:s");
GetOptions(@knownoptions) || &usage();
&R_version($name, $version) if $opt_v;
&usage() if $opt_h;

$opt_l = 25 unless $opt_l;
$opt_r = 72 unless $opt_r;
$OSdir = $opt_os if $opt_os;

my $l1 = $opt_l - 2;
my $l2 = $opt_r - $opt_l;

my ($rdname, $rdtitle);

my $cmd = "format short =\n";
$cmd .= "@" . rep("<", $l1) . " ^" . rep("<", $l2) . "\n";
$cmd .= "\$rdname, \$rdtitle\n";
$cmd .= ".\n";
eval($cmd);

$cmd = "format long =\n";
$cmd .= "@" . rep("<", $opt_r) . "\n";
$cmd .= "\$rdname\n";
$cmd .= ".\n";
eval($cmd);

$cmd = "format cont =\n";
$cmd .= "~" . rep(" ", $l1) . " ^" . rep("<", $l2) . "\n";
$cmd .= "\$rdtitle\n";
$cmd .= ".\n";
eval($cmd);
    
my @Rdfiles;
my $only_data_set_docs = 0;

if($#ARGV == 0 && -d $ARGV[0]) {
    $only_data_set_docs = 1 if($opt_d);
    my $dir = $ARGV[0];
    if(-d &file_path($dir, "man")) {
	$dir = &file_path($dir, "man");
    }
    @Rdfiles = &list_files_with_exts($dir, "[Rr]d");
    $dir = &file_path($dir, $OSdir);
    if(-d $dir) {
	@Rdfiles = (@Rdfiles,
		    &list_files_with_exts($dir, "[Rr]d"));
    }
} else {
    foreach my $arg (@ARGV) {
	@Rdfiles = (@Rdfiles, glob($arg));
    }
}

foreach my $rdfile (sort @Rdfiles) {
    my $rdinfo = R::Rd->info($rdfile, $OSdir);

    next if($only_data_set_docs &&
	    grep(!/^datasets$/, @{$rdinfo->{"keywords"}}));
    
    $rdname = $rdinfo->{"name"};
    my $l = length($rdname);
    if ($l <= $l1) {
	$~ = short;
    }
    else {
	$~ = long;
    }
    $rdtitle = $rdinfo->{"title"};
    write;
    $~ = cont;
    while ($rdtitle) {
	write;
    }
}

sub rep {
    my $retval = "";
    for($k=0; $k<$_[1]; $k++) {
	$retval .= $_[0];
    }
    $retval;
}

### Local Variables: ***
### mode: perl ***
### perl-indent-level: 4 ***
### End: ***
