#! /local/bin/perl -s
#
# faq2ms	--- convert a faq to -ms file (for input to ms2html)
#
# Author: Oscar Nierstrasz oscar@cui.unige.ch)
#
#v = '(v1.0)'; # first version
#v = '(v1.1)'; # 1.7.93 -- added -free
$v = '(v1.2)'; # 23.8.93 -- patched oofaq

$usg = 'faq2ms -<faq-type> [<faq>]
	-oo	-- Object-Oriented FAQ
	-perl	-- PERL FAQ
	-se	-- Software Engineering FAQ
	-www	-- World Wide Web FAQ
	-free	-- Free Compilers List
';

$/ = ""; # blank line is the record separator

chop($date = `date +%d.%m.%y`);
$sig = ".LP\n\\fIThis document was pre-processed by faq2ms $v on $date.\\fR\n";

if ($oo) { &oofaq; }
elsif ($perl) { &perl; }
elsif ($se) { &se; }
elsif ($www) { &www; }
elsif ($free) { &free; }
elsif ($txt) { &txt; } # a vanilla text converter
else { die $usg; };

sub free {
    print ".TL\nThe Free Compilers List\n${sig}.SH1\nIntroduction\n";
    while (<>) {
	s/\s*\n/\n/g;
	# chop;
	s/^From /.LP\t$&/ && s/\n/\n.LP\n/g && (print, next);
	s/^Archive-name:/.LP\t$&/ && s/\n/\n.LP\n/g && (print, next);
	s/^-+\n-+ (.*) -+\n-+$/${sig}.SH1\n$1/ && (print, next);
	s/^-+ (.*) -+$/${sig}.SH2\n$1/ && (print, next);
	s/^\s+/.DS\n$&/ && print && next;
	if ((/^language:\t+/) || (/^name:\t+/)) {
		if (/\(#\)/) {
			s/^(\w+:)\t+/.LP\n$1\n.IP\n/g;
		}
		else {
			s/^language:\t+/${sig}.SH2\n/;
			s/^name:\t+/${sig}.SH2\n/;
			s/package:\t*(.*)/[$1]/;
		}
		s/\n([\w ]+:)\t+/\n.LP\n$1\n.IP\n/g;
		# put ftp addresses in <site>:<file> format:
		s/ftp (\S+) from (\S+)/ftp: $2:$1/g;
		s/\n\t+/\n /g;
		s/\n--\n/\n.PP\n/g;
		print;
		next;
	}
	print ".PP\n$_";
    }
}

sub txt {
    print ".TL\n";
    while (<>) {
	chop;
	s/^.*\n=+$/${sig}.SH1\n$&\n/ && s/\n=+//g && print && next;
	s/^.*\n-+$/${sig}.SH2\n$&\n/ && s/\n-+//g && print && next;
	s/^- /.BU1\t/ && s/\n- /\n.BU1\t/g && print && next;
	s/^\s+/.IP\t/ && s/\n\s+/\n.IP\t/g && print && next;
	print ".PP\n$_";
    }
}

sub www {
    print ".TL\nWorld Wide Web FAQ\n";
    while (<>) {
	chop;
	s/^.*\n\*+/${sig}.SH1\n$&\n/ && s/\n\*+//g && print && next;
	s/^.*\n=+/${sig}.SH2\n$&\n/ && s/\n=+//g && print && next;
	# everything else is pre-formatted (blech!):
	print ".DS\n$_";
    }
}

sub se {
    print ".TL\nSoftware Engineering FAQ\n";
    while (<>) {
	chop;
	s/^-+\nSubject: ([^\n]*)/${sig}.SH1\n$1\n.LP\n/ && print && next;
	# everything else is pre-formatted (blech!):
	print ".DS\n$_";
    }
}

sub perl {
    print ".TL\nPERL FAQ\n";
    while (<>) {
	chop;
	s/^\d\.\d+\) [^\n]+$/${sig}.SH1\n$&/ && print && next;
	# everything else is pre-formatted (blech!):
	print ".DS\n$_";
    }
}

sub oofaq {
    print ".TL\nObject-Orientation FAQ\n";
    while (<>) {
	chop;
	# escape leading dot (unless a comment: .\\")
	s/^(\.[^\\])/\\$1/;
	s/\n(\.[^\\])/\n\\$1/g;
	s/_//g; # could try to put into italics ...?
	s/^>From/From/;
	s/\n>From/\nFrom/g;
	# double underlines => main section:
	s/^(.+)\n=+$/${sig}.SH1\n$1/ && print && next;
	s/^(.+)\n-+$/${sig}.SH2\n$1/ && print && next;
	s/^(.+)\n\_+$/${sig}.SH3\n$1/ && print && next;
	s/^>([^\.].+)$/${sig}.SH4\n$1/ && print && next;

	print ".DS\n$_";
    }
}

