eval '(exit $?0)' && eval 'exec perl -S "$0" ${1+"$@"}'
    & eval 'exec perl -S "$0" $argv:q'
    if 0;

## Copyright (c) 2002-2021 Simon Josefsson
##                    added -texinfo, -listfunc, -pkg-name
##                    man page revamp
##                    various improvements
## Copyright (c) 2001, 2002 Nikos Mavrogiannopoulos
##                    added -tex
## Copyright (c) 1998 Michael Zucchi
## Copyright (c) 2013 Adam Sampson
##                    made highlighting not depend on hash order, for Perl 5.18

# This program 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 3 of the License, 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.
#
# You should have received a copy of the GNU General Public License
# along with this program.  If not, see <https://www.gnu.org/licenses/>.

# This will read a C source code file and scan for embedded comments
# in the style of gnome comments (+minor extensions - see below).

# usage:
# gdoc [ -docbook | -html | -text | -man | -tex | -texinfo | -listfunc ]
#      [ -sourceversion verno ] [ -include file | -includefuncprefix ]
#      [ -bugsto address ] [ -pkg-name packagename ]
#      [ -seeinfo infonode ] [ -copyright notice ] [ -verbatimcopying ]
#      [ -function funcname [ -function funcname ...] ] c file(s)s > outputfile
#
#  Set output format using one of -docbook, -html, -text, -man, -tex,
#  -texinfo, or -listfunc.  Default is man.
#
#  -sourceversion
#       Version number for source code, e.g. '1.0.4'.  Used in 'man' headers.
#       Defaults to using current date.
#
#  -include FILE
#       For man pages, mention #include <FILE.h> in the synopsis.
#
#  -includefuncprefix
#       For man pages, mention a #include <FILE.h> in the synopsis.
#       The FILE derived from the function prefix.  For example, a
#       function gss_init_sec_context will generate an include
#       statement of #include <gss.h>.
#
#  -bugsto address
#       For man pages, include a section about reporting bugs and mention
#       the given e-mail address, e.g 'bug-libidn@gnu.org'.
#
#  -pkg-name packagename
#       For man pages when -bugsto is used, also include help URLs to the
#       the project's home page.  For example, "GNU Libidn".
#
#  -seeinfo infonode
#       For man pages, include a section that point to an info manual
#       for more information.
#
#  -copyright notice
#       For man pages, include a copyright section with the given
#       notice after a preamble.  Use, e.g., '2002, 2003 Simon Josefsson'.
#
#  -verbatimcopying
#       For man pages, and when the -copyright parameter is used,
#       add a licensing statement that say verbatim copying is permitted.
#
#  -function funcname
#	If set, then only generate documentation for the given function(s).  All
#	other functions are ignored.
#
#  c files - list of 'c' files to process
#
#  All output goes to stdout, with errors to stderr.

#
# format of comments.
# In the following table, (...)? signifies optional structure.
#                         (...)* signifies 0 or more structure elements
# /**
#  * function_name(:)? (- short description)?
# (* @parameterx: (description of parameter x)?)*
# (* a blank line)?
#  * (Description:)? (Description of function)?
#  * (Section header: (section description)? )*
#  (*)?*/
#
# So .. the trivial example would be:
#
# /**
#  * my_function
#  **/
#
# If the Description: header tag is omitted, then there must be a blank line
# after the last parameter specification.
# e.g.
# /**
#  * my_function - does my stuff
#  * @my_arg: its mine damnit
#  *
#  * Does my stuff explained.
#  */
#
#  or, could also use:
# /**
#  * my_function - does my stuff
#  * @my_arg: its mine damnit
#  * Description: Does my stuff explained.
#  */
# etc.
#
# All descriptions can be multiline, apart from the short function description.
#
# All descriptive text is further processed, scanning for the following special
# patterns, which are highlighted appropriately.
#
# 'funcname()' - function
# '$ENVVAR' - environmental variable OBSOLETE (?)
# '#struct_name' - name of a structure
# '@parameter' - name of a parameter
# '%CONST' - name of a constant.

#
# Extensions for LaTeX:
#
# 1. the symbol '->' will be replaced with a rightarrow
# 2. x^y with ${x}^{y}$.
# 3. xxx\: with xxx:

use POSIX qw(strftime);

# match expressions used to find embedded type information
$type_constant = "\\\%([A-Za-z0-9_]+)";
$type_func = "([A-Za-z0-9_]+\\(\\))";
$type_param = '\@([A-Za-z0-9_]+)\s*';
$type_struct = "\\\#([A-Za-z0-9_]+)";
$type_env = "(\\\$[A-Za-z0-9_]+)";


# Output conversion substitutions.
#  One for each output format

# these work fairly well
@highlights_html = ( [$type_constant, '"<i>$1</i>"'],
		     [$type_func, '"<b>$1</b>"'],
		     [$type_struct, '"<i>$1</i>"'],
		     [$type_param, '" <tt><b>$1</b></tt> "'] );
$blankline_html = "<p>";

@highlights_texinfo = ( [$type_param, '" \@code{$1} "'],
			[$type_constant, '"\@code{$1} "'],
			[$type_func, '"\@code{$1} "'],
			[$type_struct, '"\@code{$1} "'],
			 );
$blankline_texinfo = "";

@highlights_tex = ( [$type_param, '" {\\\bf $1} "'],
		[$type_constant, '"{\\\it $1}"'],
		[$type_func, '"{\\\bf $1}"'],
		[$type_struct, '"{\\\it $1}"'],
		      );
$blankline_tex = "\\\\";

# sgml, docbook format
@highlights_sgml = ( [$type_constant, '"<replaceable class=\"option\">$1</replaceable>"'],
		     [$type_func, '"<function>$1</function>"'],
		     [$type_struct, '"<structname>$1</structname>"'],
		     [$type_env, '"<envar>$1</envar>"'],
		     [$type_param, '" <parameter>$1</parameter> "'] );
$blankline_sgml = "</para><para>\n";

# these are pretty rough
@highlights_man = ( [$type_constant, '"\\\fB$1\\\fP"'],
		    [$type_func, '"\\\fB$1\\\fP"'],
		    [$type_struct, '"\\\fB$1\\\fP"'],
		    [$type_param, '" \\\fI$1\\\fP "'] );
$blankline_man = "";

# text-mode
@highlights_text = ( [$type_constant, '"$1"'],
		     [$type_func, '"$1"'],
		     [$type_struct, '"$1"'],
		     [$type_param, '"$1 "'] );
$blankline_text = "";
my $lineprefix = "";

sub usage {
    print "Usage: $0 [ -v ] [ -docbook | -html | -text | -man | -tex | -texinfo  -listfunc ]\n";
    print "         [ -sourceversion verno ] [ -include file | -includefuncprefix ]\n";
    print "         [ -bugsto address ] [ -seeinfo infonode ] [ -copyright notice]\n";
    print "         [ -verbatimcopying ] [ -pkg-name packagename ]\n";
    print "         [ -function funcname [ -function funcname ...] ]\n";
    print "         c source file(s) > outputfile\n";
    exit 1;
}

# read arguments
if ($#ARGV==-1) {
    usage();
}

$verbose = 0;
$output_mode = "man";
@highlights = @highlights_man;
$blankline = $blankline_man;
$modulename = "API Documentation";
$sourceversion = strftime "%Y-%m-%d", localtime;
$function_only = 0;
while ($ARGV[0] =~ m/^-(.*)/) {
    $cmd = shift @ARGV;
    if ($cmd eq "-html") {
	$output_mode = "html";
	@highlights = @highlights_html;
	$blankline = $blankline_html;
    } elsif ($cmd eq "-man") {
	$output_mode = "man";
	@highlights = @highlights_man;
	$blankline = $blankline_man;
    } elsif ($cmd eq "-tex") {
	$output_mode = "tex";
	@highlights = @highlights_tex;
	$blankline = $blankline_tex;
    } elsif ($cmd eq "-texinfo") {
	$output_mode = "texinfo";
	@highlights = @highlights_texinfo;
	$blankline = $blankline_texinfo;
    } elsif ($cmd eq "-text") {
	$output_mode = "text";
	@highlights = @highlights_text;
	$blankline = $blankline_text;
    } elsif ($cmd eq "-docbook") {
	$output_mode = "sgml";
	@highlights = @highlights_sgml;
	$blankline = $blankline_sgml;
    } elsif ($cmd eq "-listfunc") {
	$output_mode = "listfunc";
    } elsif ($cmd eq "-module") { # not needed for sgml, inherits from calling document
	$modulename = shift @ARGV;
    } elsif ($cmd eq "-sourceversion") {
	$sourceversion = shift @ARGV;
    } elsif ($cmd eq "-include") {
	$include = shift @ARGV;
    } elsif ($cmd eq "-includefuncprefix") {
	$includefuncprefix = 1;
    } elsif ($cmd eq "-bugsto") {
	$bugsto = shift @ARGV;
    } elsif ($cmd eq "-pkg-name") {
	$pkgname = shift @ARGV;
    } elsif ($cmd eq "-copyright") {
	$copyright = shift @ARGV;
    } elsif ($cmd eq "-verbatimcopying") {
	$verbatimcopying = 1;
    } elsif ($cmd eq "-seeinfo") {
	$seeinfo = shift @ARGV;
    } elsif ($cmd eq "-function") { # to only output specific functions
	$function_only = 1;
	$function = shift @ARGV;
	$function_table{$function} = 1;
    } elsif ($cmd eq "-v") {
	$verbose = 1;
    } elsif (($cmd eq "-h") || ($cmd eq "--help")) {
	usage();
    }
}

##
# dumps section contents to arrays/hashes intended for that purpose.
#
sub dump_section {
    my $name = shift @_;
    my $contents = join "\n", @_;

    $name = " $name";

    if ($name =~ m/$type_constant/) {
	$name = $1;
#	print STDERR "constant section '$1' = '$contents'\n";
	$constants{$name} = $contents;
    } elsif ($name =~ m/$type_param/) {
#	print STDERR "parameter def '$1' = '$contents'\n";
	$name = $1;
	$parameters{$name} = $contents;
    } else {
#	print STDERR "other section '$name' = '$contents'\n";
	$name =~ tr/ //d;
	$sections{$name} = $contents;
	push @sectionlist, $name;
    }
}

##
# output function
#
# parameters, a hash.
#  function => "function name"
#  parameterlist => @list of parameters
#  parameters => %parameter descriptions
#  sectionlist => @list of sections
#  sections => %section descriptions
#

sub just_highlight {
    my $contents = join "\n", @_;
    my $line;
    my $ret = "";

    foreach $highlight (@highlights) {
	my ($pattern, $replace) = @$highlight;
	#print "scanning pattern $pattern ($replace)\n";
	$contents =~ s/$pattern/$replace/gees;
    }
    foreach $line (split "\n", $contents) {
	if ($line eq ""){
	    $ret = $ret . $lineprefix . $blankline;
	} else {
	    $ret = $ret . $lineprefix . $line;
	}
	$ret = $ret . "\n";
    }

    return $ret;
}

sub output_highlight {
    print (just_highlight (@_));
}

# output in texinfo
sub output_texinfo {
    my %args = %{$_[0]};
    my ($parameter, $section);
    my $count;

    print "\@subheading ".$args{'function'}."\n";
    print "\@anchor{".$args{'function'}."}\n";
    print "\@deftypefun {" . $args{'functiontype'} . "} ";
    print "{".$args{'function'}."} ";
    print "(";
    $count = 0;
    foreach $parameter (@{$args{'parameterlist'}}) {
	print $args{'parametertypes'}{$parameter}." \@var{".$parameter."}";
	if ($count != $#{$args{'parameterlist'}}) {
	    $count++;
	    print ", ";
	}
    }
    print ")\n";
    foreach $parameter (@{$args{'parameterlist'}}) {
	if ($args{'parameters'}{$parameter}) {
	    print "\@var{".$parameter."}: ";
	    output_highlight($args{'parameters'}{$parameter});
	    print "\n";
	}
    }
    foreach $section (@{$args{'sectionlist'}}) {
	$section =~ s/\@//g;
	print "\n\@strong{$section:} " if $section ne $section_default;
	$args{'sections'}{$section} =~ s:([{}]):\@$1:gs;
	output_highlight($args{'sections'}{$section});
    }
    print "\@end deftypefun\n\n";
}

sub output_enum_texinfo {
    my %args = %{$_[0]};
    my ($parameter, $section);
    my $count;
    my $name = $args{'enum'};
    my $param;
    my $param2;
    my $sec;
    my $check;
    my $type;

    print "\n\@c $name\n";
    print "\@table \@code\n";

    $check=0;
    foreach $parameter (@{$args{'parameterlist'}}) {
        $param1 = $parameter;
	$param1 =~ s/_/_\@-/g;

	$check = 1;
	print "\@item ".$param1."\n";
#	print "\n";

        $param2 = $args{'parameters'}{$parameter};
	$out = just_highlight($param2);
	chomp $out;
	print $out . "\n";
    }
    print "\@end table\n";
}

# output in html
sub output_html {
    my %args = %{$_[0]};
    my ($parameter, $section);
    my $count;
    print "\n\n<a name=\"". $args{'function'} . "\">&nbsp</a><h2>Function</h2>\n";

    print "<i>".$args{'functiontype'}."</i>\n";
    print "<b>".$args{'function'}."</b>\n";
    print "(";
    $count = 0;
    foreach $parameter (@{$args{'parameterlist'}}) {
	print "<i>".$args{'parametertypes'}{$parameter}."</i> <b>".$parameter."</b>\n";
	if ($count != $#{$args{'parameterlist'}}) {
	    $count++;
	    print ", ";
	}
    }
    print ")\n";

    print "<h3>Arguments</h3>\n";
    print "<dl>\n";
    foreach $parameter (@{$args{'parameterlist'}}) {
	print "<dt><i>".$args{'parametertypes'}{$parameter}."</i> <b>".$parameter."</b>\n";
	print "<dd>";
	output_highlight($args{'parameters'}{$parameter});
    }
    print "</dl>\n";
    foreach $section (@{$args{'sectionlist'}}) {
	print "<h3>$section</h3>\n";
	print "<ul>\n";
	output_highlight($args{'sections'}{$section});
	print "</ul>\n";
    }
    print "<hr>\n";
}

# output in tex
sub output_tex {
    my %args = %{$_[0]};
    my ($parameter, $section);
    my $count;
    my $func = $args{'function'};
    my $param;
    my $param2;
    my $sec;
    my $check;
    my $type;

    $func =~ s/_/\\_/g;

    print "\n\n\\begin{function}\n";
    print "\\functionTitle{". $func . "}\n";
    print "\\index{". $func . "}\n";

    $type = $args{'functiontype'};
    $type =~ s/_/\\_/g;

    print "{\\it ".$type."}\n";
    print "{\\bf ".$func."}\n";
    print "(";
    $count = 0;
    foreach $parameter (@{$args{'parameterlist'}}) {
        $param = $args{'parametertypes'}{$parameter};
        $param2 = $parameter;
	$param =~ s/_/\\_/g;
        $param2 =~ s/_/\\_/g;

	print "{\\it ".$param."} {\\bf ".$param2."}";
	if ($count != $#{$args{'parameterlist'}}) {
	    $count++;
	    print ", ";
	}
    }
    print ")\n";

    print "\n\\begin{functionArguments}\n";

    $check=0;
    foreach $parameter (@{$args{'parameterlist'}}) {
        $param1 = $args{'parametertypes'}{$parameter};
        $param1 =~ s/_/\\_/g;
        $param2 = $parameter;
	$param2 =~ s/_/\\_/g;

	$check = 1;
	print "\\functionArgument {\\it ".$param1."} {\\bf ".$param2."}: \n";
#	print "\n";

	$param3 = $args{'parameters'}{$parameter};
	$param3 =~ s/\#([a-zA-Z\_]+)/{\\it $1}/g;
	$param3 =~ s/\%([a-zA-Z\_]+)/{\\bf $1}/g;

	$out = just_highlight($param3);
	$out =~ s/_/\\_/g;
	print $out;
    }
    if ($check==0) {
	print "\\item void\n";
    }
    print "\\end{functionArguments}\n";

    foreach $section (@{$args{'sectionlist'}}) {
	$sec = $section;
	$sec =~ s/_/\\_/g;
	$sec =~ s/#([a-zA-Z\_]+)/{\\it $1}/g;

	print "\n\\begin{function${sec}}\n";
	$out = $args{'sections'}{$section};

	$out =~ s/\#([a-zA-Z\_]+)/{\\it $1}/g;
	$out =~ s/\%([a-zA-Z\_]+)/{\\bf $1}/g;
	$out =~ s/\@([a-zA-Z\_]+)/{\\bf $1}/g;
	$out =~ s/_/\\_\\-/g;
        $out =~ s/\$/\\\$/g;
	$out =~ s/#/\\#/g;
	$out =~ s/\n\n/\n/g;
	$out =~ s/\\:/:/g;
	$out =~ s/\-\>/\$\\rightarrow\$/g;
	$out =~ s/([0-9]+)\^([0-9]+)/\$\{$1\}\^\{$2\}\$/g;

	print $out;
	print "\\end{function${sec}}\n";
    }
    print "\\end{function}\n\n";
}

sub output_enum_tex {
    my %args = %{$_[0]};
    my ($parameter, $section);
    my $count;
    my $name = $args{'enum'};
    my $param;
    my $param2;
    my $sec;
    my $check;
    my $type;

    print "\n\n\\begin{enum}\n";
    $name =~ s/_/\\_/g;
    print "\\enumTitle{". $name . "}\n";
    print "\\index{". $name . "}\n";

    print "\n\\begin{enumList}\n";

    $check=0;
    foreach $parameter (@{$args{'parameterlist'}}) {
        $param1 = $parameter;
	$param1 =~ s/_/\\_\\-/g;

	$check = 1;
	print "\\enumElement{".$param1."}{";
#	print "\n";

        $param2 = $args{'parameters'}{$parameter};
	$param2 =~ s/\#([a-zA-Z\_]+)/{\\it $1}/g;
	$param2 =~ s/\%([a-zA-Z\_]+)/{\\bf $1}/g;
	$out = just_highlight($param2);
	$out =~ s/_/\\_/g;
	chomp $out;
	print $out . "}\n";
    }
    print "\\end{enumList}\n";

    print "\\end{enum}\n\n";
}

# output in sgml DocBook
sub output_sgml {
    my %args = %{$_[0]};
    my ($parameter, $section);
    my $count;
    my $id;

    $id = $args{'module'}."-".$args{'function'};
    $id =~ s/[^A-Za-z0-9]/-/g;

    print "<refentry>\n";
    print "<refmeta>\n";
    print "<refentrytitle><phrase id=\"$id\">".$args{'function'}."</phrase></refentrytitle>\n";
    print "</refmeta>\n";
    print "<refnamediv>\n";
    print " <refname>".$args{'function'}."</refname>\n";
    print " <refpurpose>\n";
    print "  ".$args{'purpose'}."\n";
    print " </refpurpose>\n";
    print "</refnamediv>\n";

    print "<refsynopsisdiv>\n";
    print " <title>Synopsis</title>\n";
    print "  <funcsynopsis>\n";
    print "   <funcdef>".$args{'functiontype'}." ";
    print "<function>".$args{'function'}." ";
    print "</function></funcdef>\n";

#    print "<refsect1>\n";
#    print " <title>Synopsis</title>\n";
#    print "  <funcsynopsis>\n";
#    print "   <funcdef>".$args{'functiontype'}." ";
#    print "<function>".$args{'function'}." ";
#    print "</function></funcdef>\n";

    $count = 0;
    if ($#{$args{'parameterlist'}} >= 0) {
	foreach $parameter (@{$args{'parameterlist'}}) {
	    print "   <paramdef>".$args{'parametertypes'}{$parameter};
	    print " <parameter>$parameter</parameter></paramdef>\n";
	}
    } else {
	print "  <void>\n";
    }
    print "  </funcsynopsis>\n";
    print "</refsynopsisdiv>\n";
#    print "</refsect1>\n";

    # print parameters
    print "<refsect1>\n <title>Arguments</title>\n";
#    print "<para>\nArguments\n";
    if ($#{$args{'parameterlist'}} >= 0) {
	print " <variablelist>\n";
	foreach $parameter (@{$args{'parameterlist'}}) {
	    print "  <varlistentry>\n   <term><parameter>$parameter</parameter></term>\n";
	    print "   <listitem>\n    <para>\n";
	    $lineprefix="     ";
	    output_highlight($args{'parameters'}{$parameter});
	    print "    </para>\n   </listitem>\n  </varlistentry>\n";
	}
	print " </variablelist>\n";
    } else {
	print " <para>\n  None\n </para>\n";
    }
    print "</refsect1>\n";

    # print out each section
    $lineprefix="   ";
    foreach $section (@{$args{'sectionlist'}}) {
	print "<refsect1>\n <title>$section</title>\n <para>\n";
#	print "<para>\n$section\n";
	if ($section =~ m/EXAMPLE/i) {
	    print "<example><para>\n";
	}
	output_highlight($args{'sections'}{$section});
#	print "</para>";
	if ($section =~ m/EXAMPLE/i) {
	    print "</para></example>\n";
	}
	print " </para>\n</refsect1>\n";
    }

    print "\n\n";
}

##
# output in man
sub output_man {
    my %args = %{$_[0]};
    my ($parameter, $section);
    my $count;

    print ".\\\" DO NOT MODIFY THIS FILE!  It was generated by gdoc.\n";
    print ".TH \"$args{'function'}\" 3 \"$args{'sourceversion'}\" \"". $args{'module'} . "\" \"". $args{'module'} . "\"\n";

    print ".SH NAME\n";

    print $args{'function'};
    if ($args{'purpose'}) {
	print " \\- " . $args{'purpose'} . "\n";
    } else {
	print " \\- API function\n";
    }

    print ".SH SYNOPSIS\n";
    print ".B #include <". $args{'include'} . ">\n"
	if $args{'include'};
    print ".B #include <". lc((split /_/, $args{'function'})[0]) . ".h>\n"
	if $args{'includefuncprefix'};
    print ".sp\n";
    print ".BI \"".$args{'functiontype'}." ".$args{'function'}."(";
    $count = 0;
    foreach $parameter (@{$args{'parameterlist'}}) {
	print $args{'parametertypes'}{$parameter}." \" ".$parameter." \"";
	if ($count != $#{$args{'parameterlist'}}) {
	    $count++;
	    print ", ";
	}
    }
    print ");\"\n";

    print ".SH ARGUMENTS\n";
    foreach $parameter (@{$args{'parameterlist'}}) {
	print ".IP \"".$args{'parametertypes'}{$parameter}." ".$parameter."\" 12\n";
	$param = $args{'parameters'}{$parameter};
	$param =~ s/-/\\-/g;
	output_highlight($param);
    }
    foreach $section (@{$args{'sectionlist'}}) {
	print ".SH \"" . uc($section) . "\"\n";
	$sec = $args{'sections'}{$section};
	$sec =~ s/-/\\-/g;
	output_highlight($sec);
    }

    if ($args{'bugsto'}) {
	print ".SH \"REPORTING BUGS\"\n";
	print "Report bugs to <". $args{'bugsto'} . ">.\n";
        print ".br\n";
	print "General guidelines for reporting bugs: https://www.gnu.org/gethelp/\n";
        print ".br\n";
	if ($args{'pkgname'}) {
	    print $args{'pkgname'} . " home page: " .
		"https://www.gnu.org/software/" . $args{'module'} . "/\n";
	}
	print "\n";
    }

    if ($args{'copyright'}) {
	print ".SH COPYRIGHT\n";
	print "Copyright \\(co ". $args{'copyright'} . ".\n";
	if ($args{'verbatimcopying'}) {
	    print ".br\n";
	    print "Copying and distribution of this file, with or without modification,\n";
	    print "are permitted in any medium without royalty provided the copyright\n";
	    print "notice and this notice are preserved.\n";
	}
    }

    if ($args{'seeinfo'}) {
	print ".SH \"SEE ALSO\"\n";
	print "The full documentation for\n";
	print ".B " . $args{'module'} . "\n";
	print "is maintained as a Texinfo manual.  If the\n";
	print ".B info\n";
	print "and\n";
	print ".B " . $args{'module'} . "\n";
	print "programs are properly installed at your site, the command\n";
	print ".IP\n";
	print ".B info " . $args{'seeinfo'} . "\n";
	print ".PP\n";
	print "should give you access to the complete manual.\n";
	print "As an alternative you may obtain the manual from:\n";
	print ".IP\n";
	print ".B https://www.gnu.org/software/" . $args{'module'} . "/manual/\n";
	print ".PP\n";
    }
}

sub output_listfunc {
    my %args = %{$_[0]};
    print $args{'function'} . "\n";
}

##
# output in text
sub output_text {
    my %args = %{$_[0]};
    my ($parameter, $section);

    print "Function = ".$args{'function'}."\n";
    print "  return type: ".$args{'functiontype'}."\n\n";
    foreach $parameter (@{$args{'parameterlist'}}) {
	print " ".$args{'parametertypes'}{$parameter}." ".$parameter."\n";
	print "    -> ".$args{'parameters'}{$parameter}."\n";
    }
    foreach $section (@{$args{'sectionlist'}}) {
	print " $section:\n";
	print "    -> ";
	output_highlight($args{'sections'}{$section});
    }
}

##
# generic output function - calls the right one based
# on current output mode.
sub output_function {
#    output_html(@_);
    eval "output_".$output_mode."(\@_);";
}

sub output_enum {
    eval "output_enum_".$output_mode."(\@_);";
}


##
# takes a function prototype and spits out all the details
# stored in the global arrays/hsahes.
sub dump_function {
    my $prototype = shift @_;

    if ($prototype =~ m/^()([a-zA-Z0-9_~:]+)\s*\(([^\)]*)\)/ ||
	$prototype =~ m/^(\w+)\s+([a-zA-Z0-9_~:]+)\s*\(([^\)]*)\)/ ||
	$prototype =~ m/^(\w+\s*\*)\s*([a-zA-Z0-9_~:]+)\s*\(([^\)]*)\)/ ||
	$prototype =~ m/^(\w+\s+\w+)\s+([a-zA-Z0-9_~:]+)\s*\(([^\)]*)\)/ ||
	$prototype =~ m/^(\w+\s+\w+\s*\*)\s*([a-zA-Z0-9_~:]+)\s*\(([^\)]*)\)/)  {
	$return_type = $1;
	$function_name = $2;
	$args = $3;

#	print STDERR "ARGS = '$args'\n";

	foreach $arg (split ',', $args) {
	    # strip leading/trailing spaces
	    $arg =~ s/^\s*//;
	    $arg =~ s/\s*$//;
#	    print STDERR "SCAN ARG: '$arg'\n";
	    @args = split('\s', $arg);

#	    print STDERR " -> @args\n";
	    $param = pop @args;
#	    print STDERR " -> @args\n";
	    if ($param =~ m/^(\*+)(.*)/) {
		$param = $2;
		push @args, $1;
	    }
	    if ($param =~ m/^(.*)(\[\])$/) {
		$param = $1;
		push @args, $2;
	    }
#	    print STDERR " :> @args\n";
	    $type = join " ", @args;

	    if ((!defined($parameters{$param}) || $parameters{$param} eq "") && $param ne "void") {
		$parameters{$param} = "-- undescribed --";
		print STDERR "warning: $lineno: Function parameter '$param' not described in '$function_name'\n";
	    }

	    push @parameterlist, $param;
	    $parametertypes{$param} = $type;

#	    print STDERR "param = '$param', type = '$type'\n";
	}
    } else {
	print STDERR "warning: $lineno: Cannot understand prototype: '$prototype'\n";
	return;
    }

    if ($function_only==0 || defined($function_table{$function_name})) {
	output_function({'function' => $function_name,
			 'module' => $modulename,
			 'sourceversion' => $sourceversion,
			 'include' => $include,
			 'includefuncprefix' => $includefuncprefix,
			 'bugsto' => $bugsto,
			 'pkgname' => $pkgname,
			 'copyright' => $copyright,
			 'verbatimcopying' => $verbatimcopying,
			 'seeinfo' => $seeinfo,
			 'functiontype' => $return_type,
			 'parameterlist' => \@parameterlist,
			 'parameters' => \%parameters,
			 'parametertypes' => \%parametertypes,
			 'sectionlist' => \@sectionlist,
			 'sections' => \%sections,
			 'purpose' => $function_purpose
			 });
    }
}

sub dump_enum {
    my $prototype = shift @_;

    if (($prototype =~ m/^\s*typedef\s+enum\s*[a-zA-Z0-9_~:]*\s*\{([\-a-zA-Z0-9_~=,:\s\(\)\<]+)\s*\}\s*([a-zA-Z0-9_]+);.*/)) {
#        || $prototype =~ m/^\s*enum\s+([a-zA-Z0-9_~:]+).*/) {
        $args = $1;
	$name = $2;

	foreach $arg (split ',', $args) {
	    # strip leading/trailing spaces
	    $arg =~ s/^\s*//;
	    $arg =~ s/\s*$//;
	    $arg =~ s/([A-Za-z0-9_]+)\s*=.*/$1/g;
#	    print STDERR "SCAN ARG: '$arg'\n";

            next if $arg eq '';
	    if ((!defined($parameters{$arg}) || $parameters{$arg} eq "")) {
		$parameters{$arg} = "-- undescribed --";
		print STDERR "warning: $lineno: Enumeration parameter '$arg' not described in '$name'\n";
	    }

	    push @parameterlist, $arg;

#	    print STDERR "param = '$arg'\n";
	}
    } else {
#	print STDERR "warning: $lineno: Cannot understand enumeration: '$prototype'\n";
	return;
    }

    output_enum({'enum' => $name,
			 'module' => $modulename,
			 'sourceversion' => $sourceversion,
			 'include' => $include,
			 'includefuncprefix' => $includefuncprefix,
			 'bugsto' => $bugsto,
			 'pkgname' => $pkgname,
			 'copyright' => $copyright,
			 'verbatimcopying' => $verbatimcopying,
			 'seeinfo' => $seeinfo,
			 'functiontype' => $return_type,
			 'parameterlist' => \@parameterlist,
			 'parameters' => \%parameters,
			 'parametertypes' => \%parametertypes,
			 'sectionlist' => \@sectionlist,
			 'sections' => \%sections,
			 'purpose' => $function_purpose
			 });
}

######################################################################
# main
# states
# 0 - normal code
# 1 - looking for function name
# 2 - scanning field start.
# 3 - scanning prototype.
$state = 0;
$section = "";

$doc_special = "\@\%\$\#";

$doc_start = "^/\\*\\*\$";
$doc_end = "\\*/";
$doc_com = "\\s*\\*\\s*";
$doc_func = $doc_com."(\\w+):?";
$doc_sect = $doc_com."([".$doc_special."[:upper:]][\\w]+):\\s*(.*)";
$doc_content = $doc_com."(.*)";

%constants = ();
%parameters = ();
@parameterlist = ();
%sections = ();
@sectionlist = ();

$contents = "";
$section_default = "Description";	# default section
$section = $section_default;
$enum = 0;

$lineno = 0;

foreach $file (@ARGV) {
    if (!open(IN,"<$file")) {
	print STDERR "Error: Cannot open file $file\n";
	next;
    }
    while ($line = <IN>) {
	$lineno++;

	if ($state == 0) {
	    if ($line =~ /$doc_start/o) {
		$state = 1;		# next line is always the function name
#	    print STDERR "XXX: start of doc comment\n";
	    }
	} elsif ($state == 1) {	# this line is the function name (always)
	    if ($line =~ /$doc_func/o) {
		$function = $1;
		$state = 2;
#	    print STDERR "XXX: start of doc comment, looking for prototype\n";

		if ($line =~ /-\s*(.*)/) {
		    $function_purpose = $1;
		} else {
		    $function_purpose = "";
		}
		if ($verbose) {
		    print STDERR "Info($lineno): Scanning doc for $function\n";
		}
	    } else {
		print STDERR "warning: $lineno: Cannot understand $_ on line $lineno",
		" - I thought it was a doc line\n";
		$state = 0;
	    }
	} elsif ($state == 2) {	# look for head: lines, and include content
	    if ($line =~ /$doc_sect/o) {
		$newsection = $1;
		$newcontents = $2;

		if ($contents ne '') {
		    dump_section($section, $contents);
		    $section = $section_default;
		}

		$contents = $newcontents;
		if ($contents ne "") {
		    $contents .= "\n";
		}
		$section = $newsection;
	    } elsif ($line =~ /$doc_end/) {

		if ($contents ne "") {
		    dump_section($section, $contents);
		    $section = $section_default;
		    $contents = "";
		}

		$prototype = '';
		$state = 3;
	    } elsif ($line =~ /$doc_content/) {
		# miguel-style comment kludge, look for blank lines after
		# @parameter line to signify start of description
		if ($1 eq '' && $section =~ m/^@/) {
		    dump_section($section, $contents);
		    $section = $section_default;
		    $contents = "";
		} else {
		    $contents .= $1."\n";
		}
	    } else {
		# i don't know - bad line?  ignore.
		print STDERR "warning: $lineno: Bad line: $_";
	    }
	} elsif ($state == 3) {	# scanning for function { (end of prototype)
	    if ($line =~ /([a-zA-Z\s]+)enum(.*)$/) {
	        $enum = 1;
	    }

	    if ($line =~ m#\s*/\*\s+MACDOC\s*#io) {
	      # do nothing
	    }
	    elsif ($enum == 1 && $line =~ /(\s*\{).*/) {
		$prototype = "typedef enum {";
	    }
	    elsif ($line =~ /([^\{]*)/) {
		$prototype .= $1;
	    }

	    if ($enum == 0 && $line =~ /;/) {
		$prototype =~ s@/\*.*?\*/@@gos;	# strip comments.
		$prototype =~ s@[\r\n]+@ @gos; # strip newlines/cr's.
		$prototype =~ s@^ +@@gos; # strip leading spaces

		dump_function($prototype);

		$function = "";
		%constants = ();
		%parameters = ();
		%parametertypes = ();
		@parameterlist = ();
		%sections = ();
		@sectionlist = ();
		$prototype = "";
		$enum = 0;

		$state = 0;
	    }
	    elsif ($enum == 1 && $line =~ /\}/) {
		$prototype =~ s@/\*.*?\*/@@gos;	# strip comments.
		$prototype =~ s@[\r\n]+@ @gos; # strip newlines/cr's.
		$prototype =~ s@^ +@@gos; # strip leading spaces

		dump_enum($prototype);

		$function = "";
		%constants = ();
		%parameters = ();
		%parametertypes = ();
		@parameterlist = ();
		%sections = ();
		@sectionlist = ();
		$prototype = "";
		$enum = 0;

		$state = 0;
	    }

	}
    }

}
