#!perl -w # # Convert .info file into VMS help file # # Author: Martin Vorlaender # # 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; ; # leave out preface (everything up to the first separator) while () { 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__