#!perl -w
#
# Convert .info file into VMS help file
#
# Author: Martin Vorlaender <mv@pdv-systeme.de> <martin@radiogaga.harz.de>
#
# Date: 06-Jan-2001

use strict;

my $input     = $ARGV[0] || '../diff.info';
my $output    = $ARGV[1] || 'gnudiffutils.hlp';
my $top_title = $ARGV[2] || 'GNU_diffutils';  # replacement for the 'Top' node
my $verbose   = 0;  # if true, print tree information

my $newline = "\x0A"; # if .info file is Unix formatted

my (%info);

sub traverse {
	my ($node, $level) = @_;
	my $node_us;

	if ($verbose) {
		my $desc = $info{$node}{'desc'} || '(no description}';
		print ' ' x $level, "$node: $desc\n";
		$info{$node}{'visited'} = 1;
	}

	# ToDo: Find cross refs in the text (may span lines!)
	#       and replace them with the full path

	($node_us = $node) =~ tr/ /_/;
	print OUT "\n$level $node_us\n\n", $info{$node}{'text'};

	for my $child (@{$info{$node}{'children'}}) {
		traverse($child, $level+1);
	}
}


my $input_fname;
($input_fname = $input) =~ s|^.*/||;

print "\nReading $input_fname ...\n";
open INFO, $input or die "open $input: $!";
$/ = "\x1F".$newline;

<INFO>; # leave out preface (everything up to the first separator)

while (<INFO>) {
	chomp;

	my ($info, @text) = split /$newline/;
	my ($file,$node,$next,$prev,$up) = $info =~ /^File: ([^,]+),\s+Node: ([^,]+)(?:,\s+Next: ([^,]+))?(?:,\s+Prev: ([^,]+))?,\s+Up: (.*)$/;

	unless (defined $file && defined $node) {
		warn "Line doesn't match format\n\"$info\"\n"
			if $verbose;
		next;
	}

	$node = $top_title if $node eq 'Top';

	die "Reference to file '$file' at node $node"
		if $file ne $input_fname;

	shift @text
		while $text[0] eq '';

	foreach my $line (@text) {
		if ($line =~ /^\* ([^:]+)::\s*(.*)$/) {
			$info{$1}{'desc'} = $2;
			push @{$info{$node}{'children'}}, $1;
		} elsif ($line =~ /^\d+ /) {
			# lines starting with digits mark a new section
			$line = ' '.$line;
		}
	}

	$info{$node}{'next'} = $next;
	$info{$node}{'prev'} = $prev;
	$info{$node}{'up'  } = $up;
	$info{$node}{'text'} = join "\n", @text;
}

close INFO;

print "\nWriting $output ...\n";
open OUT, '>'.$output or die "open $output: $!";
traverse($top_title, 1);
close OUT;

if ($verbose) {
	print "\nOrphan nodes:\n";
	foreach my $node (keys %info) {
		print "$node\n" unless exists $info{$node}{'visited'};
	}
}
__END__
