#!/usr/bin/perl $sep = "\246"; $html = 0; if ($ARGV[0] eq "-html") { $html = 1; shift; } # Skip initial junk while(($_ = <>) && ! m/^\(\* Module \[(.*)\]:/) { } m/^\(\* Module \[(.*)\]:/; $modname = $1; chop; s/^\(\* *//; s/ *\*\) *$//; s/\[/{\\tt /g; s/\]/}/g; print "\\section{$_}\n\n"; $label = $modname; $label =~ s/[^A-Za-z0-9]//g; print "\\label{s:$label}\n"; print "\\index{$modname (module)@\\verb~$modname~ (module)}%\n\n"; s/{\\tt //g; s/}//g; s/_//g; print "\\pdfsection{$_}\n\n"; $incomment = 0; $inverbatim = 0; line: while(<>) { chop; last line if /^\s*\(\*--/; if (s/^\(\*- //) { s/ *\*\)$//; } if (m/^\s*\(\*\*\*\s*(.*)\*\)\s*$/) { if ($inverbatim) { do end_verbatim(); } print "\\subsection*{", $1, "}\n"; next line; } if (m/^\s*\(\*\*\s*(.*)\*\)\s*$/) { if ($inverbatim) { do end_verbatim(); } print "\\subsubsection*{", $1, "}\n"; next line; } if (s/^\s*\(\*//) { if ($inverbatim) { do end_verbatim(); } print "\\begin{comment}\n"; $incomment = 1; } if ($incomment) { $endcomment = s/\*\)\s*$//; if (m/^\s*\[\s*$/) { print "\\begin{restoreindent}\n" unless $html; print "\\begin{verbatim}\n"; while (($_ = <>) && ! m/^\s*\]\s*$/) { print $_; } print "\\end{verbatim}\n"; print "\\end{restoreindent}\n" unless $html; } else { if (s/^-//) { print "\\\\"; print "[\\smallskipamount]" unless $html; } s/^\s*//; $count = 0; foreach $part (split(/(\\?[\[\]])/, $_)) { if ($part eq "[") { print ($count == 0 ? "\\verb$sep" : "["); $count++; } elsif ($part eq "]") { $count--; print ($count == 0 ? "$sep" : "]"); } elsif ($part =~ m/^\\([\[\]])$/) { print $1; } else { print $part; } } } if ($endcomment) { print "\n\\end{comment}"; $incomment = 0; $inverbatim = 0; } } else { next line if /^$/; if (! $inverbatim) { print "\\begin{verbatim}\n"; $inverbatim = 1; } s/^external /val /; s/ = ("[^"]*"\s*)+$//; next line if /^\s*$/; s/^val \( ([^ )]+) \)/val (\1)/; { do indexentry($1, " (operator)"), last if (m/^val \(([^)]*)\)/); do indexentry($1, ""), last if (m/^val ([a-zA-Z0-9_']*)/); do indexentry($1, " (type)"), last if (m/^type\s.*([a-zA-Z0-9_']*)\s*=/); do indexentry($1, " (exception)"), last if (m/^exception ([a-zA-Z0-9_']*)/); do indexentry($1, " (module type)"), last if (m/^module type ([a-zA-Z0-9_']*)/); do indexentry($1, " (functor)"), last if (m/^module ([a-zA-Z0-9_']*)\s*\(/); do indexentry($1, " (module)"), last if (m/^module ([a-zA-Z0-9_']*)/); } print $_; } print "\n"; } do end_verbatim() if $inverbatim; print "\\end{comment}\n" if $incomment; sub indexentry { local ($_, $comment) = @_; return if m/^$/ || m/^[a-zA-Z]$/; s/([@|!])/"$1/g; if (! m|`|) { $s = "`"; } elsif (! m|~|) { $s = "~"; } elsif (! m/\|/) { $s = "|"; } else { die("Can't find quote character for $_"); } push (@index, "\\index{$_$comment@\\verb$s$_$s$comment}"); } sub end_verbatim { print "\\end{verbatim}\n"; foreach $idx (@index) { print $idx, "%\n"; } undef(@index); $inverbatim = 0; }