Created default c2man compatible perl script for generating
documentation, in case c2man isn't installed.
diff --git a/tools/c2man.pl b/tools/c2man.pl
new file mode 100755
index 0000000..4e4b9ff
--- /dev/null
+++ b/tools/c2man.pl
@@ -0,0 +1,324 @@
+#!/usr/bin/perl
+
+#####################################################################################
+#
+# c2man.pl v0.1 Copyright (C) 2000 Mike McCormack
+#
+# Genenerates Documents from C source code.
+#
+# Input is source code with specially formatted comments, output
+# is man pages. The functionality is meant to be similar to c2man.
+# The following is an example provided in the Wine documentation.
+#
+# TODO:
+# Write code to generate HTML output with the -Th option.
+# Need somebody who knows about TROFF to help touch up the man page generation.
+# Parse spec files passed with -w option and generate pages for the functions
+# in the spec files only.
+# Modify Makefiles to pass multiple C files to speed up man page generation.
+# Use nm on the shared libraries specified in the spec files to determine which
+# source files should be parsed, and only parse them.(requires wine to be compiled)
+#
+#####################################################################################
+# Input from C source file:
+#
+# /******************************************************************
+# * CopyMetaFile32A (GDI32.23)
+# *
+# * Copies the metafile corresponding to hSrcMetaFile to either
+# * a disk file, if a filename is given, or to a new memory based
+# * metafile, if lpFileName is NULL.
+# *
+# * RETURNS
+# *
+# * Handle to metafile copy on success, NULL on failure.
+# *
+# * BUGS
+# *
+# * Copying to disk returns NULL even if successful.
+# */
+# HMETAFILE32 WINAPI CopyMetaFile32A(
+# HMETAFILE32 hSrcMetaFile, /* handle of metafile to copy */
+# LPCSTR lpFilename /* filename if copying to a file */
+# ) { ... }
+#
+#####################################################################################
+# Output after processing with nroff -man
+#
+# CopyMetaFileA(3w) CopyMetaFileA(3w)
+#
+#
+# NAME
+# CopyMetaFileA - CopyMetaFile32A (GDI32.23)
+#
+# SYNOPSIS
+# HMETAFILE32 CopyMetaFileA
+# (
+# HMETAFILE32 hSrcMetaFile,
+# LPCSTR lpFilename
+# );
+#
+# PARAMETERS
+# HMETAFILE32 hSrcMetaFile
+# Handle of metafile to copy.
+#
+# LPCSTR lpFilename
+# Filename if copying to a file.
+#
+# DESCRIPTION
+# Copies the metafile corresponding to hSrcMetaFile to
+# either a disk file, if a filename is given, or to a new
+# memory based metafile, if lpFileName is NULL.
+#
+# RETURNS
+# Handle to metafile copy on success, NULL on failure.
+#
+# BUGS
+# Copying to disk returns NULL even if successful.
+#
+# SEE ALSO
+# GetMetaFileA(3w), GetMetaFileW(3w), CopyMetaFileW(3w),
+# PlayMetaFile(3w), SetMetaFileBitsEx(3w), GetMetaFileBit-
+# sEx(3w)
+#
+#####################################################################################
+
+sub output_manpage
+{
+ my ($buffer,$apiref) = @_;
+ my $parameters;
+ my $desc;
+
+ # join all the lines of the description together and highlight the headings
+ for (@$buffer) {
+ s/\n//g;
+ s/^\s*//g;
+ s/\s*$//g;
+ if ( /^([A-Z]+)$/ ) {
+ $desc = $desc.".SH $1\n.PP\n";
+ }
+ elsif ( /^$/ ) {
+ $desc = "$desc\n";
+ }
+ else {
+ $desc = "$desc $_";
+ }
+ }
+
+ #seperate out all the parameters
+
+ $plist = join ( ' ', @$apiref );
+
+ $name_type = $plist;
+ $name_type =~ s/\n//g; # remove newlines
+ $name_type =~ s/\(.*$//;
+ $name_type =~ s/WINAPI//;
+
+ #check that this is a function that we want
+ if ( $funcdb{$apiname."ORD"} eq "" ) { return; }
+ print "Generating $apiname.$section\n";
+
+ $plist =~ s/\n//g; # remove newlines
+ $plist =~ s/^.*\(\s*//; # remove leading bracket and before
+ $plist =~ s/\s*\).*$//; # remove trailing bracket and leftovers
+ $plist =~ s/\s*,?\s*\/\*([^*]*)\*\// - $1,/g; # move the comma to the back
+ @params = split ( /,/ , $plist); # split parameters
+ for(@params) {
+ s/^\s*//;
+ s/\s*$//;
+ }
+
+ # figure the month and the year
+ @datetime = localtime;
+ @months = ( "January", "Febuary", "March", "April", "May", "June",
+ "July", "August", "September", "October", "November", "December" );
+ $date = "$months[$datetime[4]] $datetime[5]";
+
+ # create the manual page
+ $manfile = "$mandir/$apiname.$section";
+ open(MAN,">$manfile") || die "Couldn't create the man page file $manfile\n";
+ print MAN ".\\\" DO NOT MODIFY THIS FILE! It was generated by gendoc 1.0.\n";
+ print MAN ".TH $apiname \"$section\" \"$date\" \"Wine API\" \"The Wine Project\"\n";
+ print MAN ".SH NAME\n";
+ print MAN "$apiname ($apientry)\n";
+ print MAN ".SH SYNOPSIS\n";
+ print MAN ".PP\n";
+ print MAN "$name_type\n";
+ print MAN " (\n";
+ for($i=0; $i<@params; $i++) {
+ $x = ($i == (@params-1)) ? "" : ",";
+ $c = $params[$i];
+ $c =~ s/-.*//;
+ print MAN " $c$x\n";
+ }
+ print MAN " );\n";
+ print MAN ".SH PARAMETERS\n";
+ print MAN ".PP\n";
+ for($i=0; $i<@params; $i++) {
+ print MAN " $params[$i]\n";
+ }
+ print MAN ".SH DESCRIPTION\n";
+ print MAN ".PP\n";
+ print MAN $desc;
+ close(MAN);
+}
+
+#
+# extract the comments from source file
+#
+sub parse_source
+{
+ my $file = $_[0];
+ print "Processing $file\n";
+
+ open(SOURCE,"<$file") || die "Couldn't open the source file $file\n";
+ $state = 0;
+ while(<SOURCE>) {
+ if($state == 0 ) {
+ if ( /^\/\**$/ ) {
+ # find the start of the comment /**************
+ $state = 3;
+ @buffer = ();
+ }
+ }
+ elsif ($state == 3) {
+ #extract the wine API name and DLLNAME.XXX string
+ if ( / *([A-Za-z_0-9]+) *\(([A-Za-z0-9_]+\.[0-9]+)\) *$/ ) {
+ $apiname = $1;
+ $apientry = $2;
+ $state = 1;
+ }
+ else {
+ $state = 0;
+ }
+ }
+ elsif ($state == 1) {
+ #save the comment text into buffer, removing leading astericks
+ if ( /^ \*\// ) {
+ $state = 2;
+ }
+ else {
+ # find the end of the comment
+ if ( s/^ \*// ) {
+ @buffer = ( @buffer , $_ );
+ }
+ else {
+ $state = 0;
+ }
+ }
+ }
+ elsif ($state == 2) {
+ # check that the comment is followed by the declaration of
+ # a WINAPI function.
+ if ( /WINAPI/ ) {
+ @apidef = ( $_ );
+ #check if the function's parameters end on this line
+ if( /\)/ ) {
+ output_manpage(\@buffer, \@apidef);
+ $state = 0;
+ }
+ else {
+ $state = 4;
+ }
+ }
+ else {
+ $state = 0;
+ }
+ }
+ elsif ($state == 4) {
+ @apidef = ( @apidef , $_ );
+ #find the end of the parameters list
+ if( /\)/ ) {
+ output_manpage(\@buffer, \@apidef);
+ $state = 0;
+ }
+ }
+ }
+ close(SOURCE);
+}
+
+# generate a database of functions to have man pages created from the source
+# creates funclist and funcdb
+sub parse_spec
+{
+ my $spec = $_[0];
+ my $name,$type,$ord,$func;
+
+ open(SPEC,"<$spec") || die "Couldn't open the spec file $spec\n";
+ while(<SPEC>)
+ {
+ if( /^#/ ) { next; }
+ if( /^name/ ) { next; }
+ if( /^type/ ) { next; }
+ if( /^init/ ) { next; }
+ if( /^rsrc/ ) { next; }
+ if( /^import/ ) { next; }
+ if( /^\s*$/ ) { next; }
+ if( /^\s*([0-9]+)/ ) {
+ s/\(.*\)//; #remove all the args
+ ($ord,$type,$name,$func) = split( /\s+/ );
+ if(( $type eq "stub" ) || ($type eq "forward")) {next;}
+ if( $func eq "" ) { next; }
+ @funclist = ( @funclist , $func );
+ $funcdb{$func."ORD"} = $ord;
+ $funcdb{$func."TYPE"} = $type;
+ $funcdb{$func."NAME"} = $name;
+ $funcdb{$func."SPEC"} = $spec;
+ }
+ }
+ close(SPEC);
+}
+
+######################################################################
+
+#main starts here
+
+$mandir = "man3w";
+$section = "3";
+
+#process args
+while(@ARGV) {
+ if($ARGV[0] eq "-o") { # extract output directory
+ shift @ARGV;
+ $mandir = $ARGV[0];
+ shift @ARGV;
+ next;
+ }
+ if($ARGV[0] =~ s/^-S// ) { # extract man section
+ $section = $ARGV[0];
+ shift @ARGV;
+ next;
+ }
+ if($ARGV[0] =~ s/^-w// ) { # extract man section
+ shift @ARGV;
+ @specfiles = ( @specfiles , $ARGV[0] );
+ shift @ARGV;
+ next;
+ }
+ if($ARGV[0] =~ s/^-T// ) {
+ die "FIXME: Only NROFF supported\n";
+ }
+ if($ARGV[0] =~ s/^-[LDiI]// ) { #compatible with C2MAN flags
+ shift @ARGV;
+ next;
+ }
+ last; # stop after there's no more flags
+}
+
+#print "manual section: $section\n";
+#print "man directory : $mandir\n";
+#print "input files : @ARGV\n";
+#print "spec files : @specfiles\n";
+
+while(@specfiles) {
+ parse_spec($specfiles[0]);
+ shift @specfiles;
+}
+
+#print "Functions: @funclist\n";
+
+while(@ARGV) {
+ parse_source($ARGV[0]);
+ shift @ARGV;
+}
+