Add function prototypes.
Change the way functions are called and either alter their declaration
order or predeclare them so perl can check the prototypes.

diff --git a/tools/winapi/c_function.pm b/tools/winapi/c_function.pm
index b5d32ce..84accfa 100644
--- a/tools/winapi/c_function.pm
+++ b/tools/winapi/c_function.pm
@@ -20,7 +20,7 @@
 
 use strict;
 
-sub new {
+sub new($) {
     my $proto = shift;
     my $class = ref($proto) || $proto;
     my $self  = {};
@@ -29,7 +29,7 @@
     return $self;
 }
 
-sub file {
+sub file($$) {
     my $self = shift;
     my $file = \${$self->{FILE}};
 
@@ -40,7 +40,7 @@
     return $$file;
 }
 
-sub begin_line {
+sub begin_line($$) {
     my $self = shift;
     my $begin_line = \${$self->{BEGIN_LINE}};
 
@@ -51,7 +51,7 @@
     return $$begin_line;
 }
 
-sub begin_column {
+sub begin_column($$) {
     my $self = shift;
     my $begin_column = \${$self->{BEGIN_COLUMN}};
 
@@ -62,7 +62,7 @@
     return $$begin_column;
 }
 
-sub end_line {
+sub end_line($$) {
     my $self = shift;
     my $end_line = \${$self->{END_LINE}};
 
@@ -73,7 +73,7 @@
     return $$end_line;
 }
 
-sub end_column {
+sub end_column($$) {
     my $self = shift;
     my $end_column = \${$self->{END_COLUMN}};
 
@@ -84,7 +84,7 @@
     return $$end_column;
 }
 
-sub linkage {
+sub linkage($$) {
     my $self = shift;
     my $linkage = \${$self->{LINKAGE}};
 
@@ -95,7 +95,7 @@
     return $$linkage;
 }
 
-sub return_type {
+sub return_type($$) {
     my $self = shift;
     my $return_type = \${$self->{RETURN_TYPE}};
 
@@ -106,7 +106,7 @@
     return $$return_type;
 }
 
-sub calling_convention {
+sub calling_convention($$) {
     my $self = shift;
     my $calling_convention = \${$self->{CALLING_CONVENTION}};
 
@@ -117,7 +117,7 @@
     return $$calling_convention;
 }
 
-sub name {
+sub name($$) {
     my $self = shift;
     my $name = \${$self->{NAME}};
 
@@ -128,7 +128,7 @@
     return $$name;
 }
 
-sub argument_types {
+sub argument_types($$) {
     my $self = shift;
     my $argument_types = \${$self->{ARGUMENT_TYPES}};
 
@@ -139,7 +139,7 @@
     return $$argument_types;
 }
 
-sub argument_names {
+sub argument_names($$) {
     my $self = shift;
     my $argument_names = \${$self->{ARGUMENT_NAMES}};
 
@@ -150,7 +150,7 @@
     return $$argument_names;
 }
 
-sub statements_line {
+sub statements_line($$) {
     my $self = shift;
     my $statements_line = \${$self->{STATEMENTS_LINE}};
 
@@ -161,7 +161,7 @@
     return $$statements_line;
 }
 
-sub statements_column {
+sub statements_column($$) {
     my $self = shift;
     my $statements_column = \${$self->{STATEMENTS_COLUMN}};
 
@@ -172,7 +172,7 @@
     return $$statements_column;
 }
 
-sub statements {
+sub statements($$) {
     my $self = shift;
     my $statements = \${$self->{STATEMENTS}};
 
diff --git a/tools/winapi/c_parser.pm b/tools/winapi/c_parser.pm
index b8f7d54..ab58fb6 100644
--- a/tools/winapi/c_parser.pm
+++ b/tools/winapi/c_parser.pm
@@ -41,10 +41,20 @@
 		    "WINE_UNUSED";
 
 
+sub parse_c_function($$$$$);
+sub parse_c_function_call($$$$$$$$);
+sub parse_c_preprocessor($$$$);
+sub parse_c_statements($$$$);
+sub parse_c_tuple($$$$$$$);
+sub parse_c_type($$$$$);
+sub parse_c_typedef($$$$);
+sub parse_c_variable($$$$$$$);
+
+
 ########################################################################
 # new
 #
-sub new {
+sub new($$) {
     my $proto = shift;
     my $class = ref($proto) || $proto;
     my $self  = {};
@@ -83,7 +93,7 @@
 ########################################################################
 # set_found_comment_callback
 #
-sub set_found_comment_callback {
+sub set_found_comment_callback($$) {
     my $self = shift;
 
     my $found_comment = \${$self->{FOUND_COMMENT}};
@@ -94,7 +104,7 @@
 ########################################################################
 # set_found_declaration_callback
 #
-sub set_found_declaration_callback {
+sub set_found_declaration_callback($$) {
     my $self = shift;
 
     my $found_declaration = \${$self->{FOUND_DECLARATION}};
@@ -105,7 +115,7 @@
 ########################################################################
 # set_found_function_callback
 #
-sub set_found_function_callback {
+sub set_found_function_callback($$) {
     my $self = shift;
 
     my $found_function = \${$self->{FOUND_FUNCTION}};
@@ -116,7 +126,7 @@
 ########################################################################
 # set_found_function_call_callback
 #
-sub set_found_function_call_callback {
+sub set_found_function_call_callback($$) {
     my $self = shift;
 
     my $found_function_call = \${$self->{FOUND_FUNCTION_CALL}};
@@ -127,7 +137,7 @@
 ########################################################################
 # set_found_line_callback
 #
-sub set_found_line_callback {
+sub set_found_line_callback($$) {
     my $self = shift;
 
     my $found_line = \${$self->{FOUND_LINE}};
@@ -138,7 +148,7 @@
 ########################################################################
 # set_found_preprocessor_callback
 #
-sub set_found_preprocessor_callback {
+sub set_found_preprocessor_callback($$) {
     my $self = shift;
 
     my $found_preprocessor = \${$self->{FOUND_PREPROCESSOR}};
@@ -149,7 +159,7 @@
 ########################################################################
 # set_found_statement_callback
 #
-sub set_found_statement_callback {
+sub set_found_statement_callback($$) {
     my $self = shift;
 
     my $found_statement = \${$self->{FOUND_STATEMENT}};
@@ -160,7 +170,7 @@
 ########################################################################
 # set_found_type_callback
 #
-sub set_found_type_callback {
+sub set_found_type_callback($$) {
     my $self = shift;
 
     my $found_type = \${$self->{FOUND_TYPE}};
@@ -171,7 +181,7 @@
 ########################################################################
 # set_found_variable_callback
 #
-sub set_found_variable_callback {
+sub set_found_variable_callback($$) {
     my $self = shift;
 
     my $found_variable = \${$self->{FOUND_VARIABLE}};
@@ -183,7 +193,7 @@
 ########################################################################
 # _format_c_type
 
-sub _format_c_type {
+sub _format_c_type($$) {
     my $self = shift;
 
     local $_ = shift;
@@ -208,72 +218,11 @@
 
 
 ########################################################################
-# _parse_c
-
-sub _parse_c {
-    my $self = shift;
-
-    my $pattern = shift;
-    my $refcurrent = shift;
-    my $refline = shift;
-    my $refcolumn = shift;
-
-    my $refmatch = shift;
-
-    local $_ = $$refcurrent;
-    my $line = $$refline;
-    my $column = $$refcolumn;
-
-    my $match;
-    if(s/^(?:$pattern)//s) {
-	$self->_update_c_position($&, \$line, \$column);
-	$match = $&;
-    } else {
-	return 0;
-    }
-
-    $self->_parse_c_until_one_of("\\S", \$_, \$line, \$column);
-
-    $$refcurrent = $_;
-    $$refline = $line;
-    $$refcolumn = $column;
-
-    $$refmatch = $match;
-
-    return 1;
-}
-
-########################################################################
-# _parse_c_error
-
-sub _parse_c_error {
-    my $self = shift;
-
-    local $_ = shift;
-    my $line = shift;
-    my $column = shift;
-    my $context = shift;
-    my $message = shift;
-
-    $message = "parse error" if !$message;
-
-    # Why did I do this?
-    if($output->prefix) {
-	# $output->write("\n");
-	$output->prefix("");
-    }
-
-    $self->_parse_c_warning($_, $line, $column, $context, $message);
-
-    exit 1;
-}
-
-########################################################################
 # _parse_c_warning
 #
 # FIXME: Use caller (See man perlfunc)
 
-sub _parse_c_warning {
+sub _parse_c_warning($$$$$$) {
     my $self = shift;
 
     local $_ = shift;
@@ -307,9 +256,98 @@
 }
 
 ########################################################################
+# _parse_c_error
+
+sub _parse_c_error($$$$$$) {
+    my $self = shift;
+
+    local $_ = shift;
+    my $line = shift;
+    my $column = shift;
+    my $context = shift;
+    my $message = shift;
+
+    $message = "parse error" if !$message;
+
+    # Why did I do this?
+    if($output->prefix) {
+	# $output->write("\n");
+	$output->prefix("");
+    }
+
+    $self->_parse_c_warning($_, $line, $column, $context, $message);
+
+    exit 1;
+}
+
+########################################################################
+# _update_c_position
+
+sub _update_c_position($$$$) {
+    my $self = shift;
+
+    local $_ = shift;
+    my $refline = shift;
+    my $refcolumn = shift;
+
+    my $line = $$refline;
+    my $column = $$refcolumn;
+
+    while($_) {
+	if(s/^[^\n\t\'\"]*//s) {
+	    $column += length($&);
+	}
+
+	if(s/^\'//) {
+	    $column++;
+	    while(/^./ && !s/^\'//) {
+		s/^([^\'\\]*)//s;
+		$column += length($1);
+		if(s/^\\//) {
+		    $column++;
+		    if(s/^(.)//s) {
+			$column += length($1);
+			if($1 eq "0") {
+			    s/^(\d{0,3})//s;
+			    $column += length($1);
+			}
+		    }
+		}
+	    }
+	    $column++;
+	} elsif(s/^\"//) {
+	    $column++;
+	    while(/^./ && !s/^\"//) {
+		s/^([^\"\\]*)//s;
+		$column += length($1);
+		if(s/^\\//) {
+		    $column++;
+		    if(s/^(.)//s) {
+			$column += length($1);
+			if($1 eq "0") {
+			    s/^(\d{0,3})//s;
+			    $column += length($1);
+			}
+		    }
+		}
+	    }
+	    $column++;
+	} elsif(s/^\n//) {
+	    $line++;
+	    $column = 0;
+	} elsif(s/^\t//) {
+	    $column = $column + 8 - $column % 8;
+	}
+    }
+
+    $$refline = $line;
+    $$refcolumn = $column;
+}
+
+########################################################################
 # __parse_c_until_one_of
 
-sub __parse_c_until_one_of {
+sub __parse_c_until_one_of($$$$$$$) {
     my $self = shift;
 
     my $characters = shift;
@@ -432,7 +470,7 @@
 ########################################################################
 # _parse_c_until_one_of
 
-sub _parse_c_until_one_of {
+sub _parse_c_until_one_of($$$$$$) {
     my $self = shift;
 
     my $characters = shift;
@@ -447,7 +485,7 @@
 ########################################################################
 # _parse_c_on_same_level_until_one_of
 
-sub _parse_c_on_same_level_until_one_of {
+sub _parse_c_on_same_level_until_one_of($$$$$$) {
     my $self = shift;
 
     my $characters = shift;
@@ -460,73 +498,9 @@
 }
 
 ########################################################################
-# _update_c_position
-
-sub _update_c_position {
-    my $self = shift;
-
-    local $_ = shift;
-    my $refline = shift;
-    my $refcolumn = shift;
-
-    my $line = $$refline;
-    my $column = $$refcolumn;
-
-    while($_) {
-	if(s/^[^\n\t\'\"]*//s) {
-	    $column += length($&);
-	}
-
-	if(s/^\'//) {
-	    $column++;
-	    while(/^./ && !s/^\'//) {
-		s/^([^\'\\]*)//s;
-		$column += length($1);
-		if(s/^\\//) {
-		    $column++;
-		    if(s/^(.)//s) {
-			$column += length($1);
-			if($1 eq "0") {
-			    s/^(\d{0,3})//s;
-			    $column += length($1);
-			}
-		    }
-		}
-	    }
-	    $column++;
-	} elsif(s/^\"//) {
-	    $column++;
-	    while(/^./ && !s/^\"//) {
-		s/^([^\"\\]*)//s;
-		$column += length($1);
-		if(s/^\\//) {
-		    $column++;
-		    if(s/^(.)//s) {
-			$column += length($1);
-			if($1 eq "0") {
-			    s/^(\d{0,3})//s;
-			    $column += length($1);
-			}
-		    }
-		}
-	    }
-	    $column++;
-	} elsif(s/^\n//) {
-	    $line++;
-	    $column = 0;
-	} elsif(s/^\t//) {
-	    $column = $column + 8 - $column % 8;
-	}
-    }
-
-    $$refline = $line;
-    $$refcolumn = $column;
-}
-
-########################################################################
 # parse_c_block
 
-sub parse_c_block {
+sub parse_c_block($$$$$$$) {
     my $self = shift;
 
     my $refcurrent = shift;
@@ -590,7 +564,7 @@
 ########################################################################
 # parse_c_declaration
 
-sub parse_c_declaration {
+sub parse_c_declaration($$$$$$$$$$$$) {
     my $self = shift;
 
     my $found_declaration = \${$self->{FOUND_DECLARATION}};
@@ -694,7 +668,7 @@
 ########################################################################
 # parse_c_declarations
 
-sub parse_c_declarations {
+sub parse_c_declarations($$$$) {
     my $self = shift;
 
     my $refcurrent = shift;
@@ -705,9 +679,45 @@
 }
 
 ########################################################################
+# _parse_c
+
+sub _parse_c($$$$$$) {
+    my $self = shift;
+
+    my $pattern = shift;
+    my $refcurrent = shift;
+    my $refline = shift;
+    my $refcolumn = shift;
+
+    my $refmatch = shift;
+
+    local $_ = $$refcurrent;
+    my $line = $$refline;
+    my $column = $$refcolumn;
+
+    my $match;
+    if(s/^(?:$pattern)//s) {
+	$self->_update_c_position($&, \$line, \$column);
+	$match = $&;
+    } else {
+	return 0;
+    }
+
+    $self->_parse_c_until_one_of("\\S", \$_, \$line, \$column);
+
+    $$refcurrent = $_;
+    $$refline = $line;
+    $$refcolumn = $column;
+
+    $$refmatch = $match;
+
+    return 1;
+}
+
+########################################################################
 # parse_c_enum
 
-sub parse_c_enum {
+sub parse_c_enum($$$$) {
     my $self = shift;
 
     my $refcurrent = shift;
@@ -781,7 +791,7 @@
 ########################################################################
 # parse_c_expression
 
-sub parse_c_expression {
+sub parse_c_expression($$$$) {
     my $self = shift;
 
     my $refcurrent = shift;
@@ -837,7 +847,7 @@
 ########################################################################
 # parse_c_file
 
-sub parse_c_file {
+sub parse_c_file($$$$) {
     my $self = shift;
 
     my $found_comment = \${$self->{FOUND_COMMENT}};
@@ -1152,7 +1162,7 @@
 ########################################################################
 # parse_c_function
 
-sub parse_c_function {
+sub parse_c_function($$$$$) {
     my $self = shift;
 
     my $file = \${$self->{FILE}};
@@ -1304,7 +1314,7 @@
 ########################################################################
 # parse_c_function_call
 
-sub parse_c_function_call {
+sub parse_c_function_call($$$$$$$$) {
     my $self = shift;
 
     my $refcurrent = shift;
@@ -1352,7 +1362,7 @@
 ########################################################################
 # parse_c_preprocessor
 
-sub parse_c_preprocessor {
+sub parse_c_preprocessor($$$$) {
     my $self = shift;
 
     my $found_preprocessor = \${$self->{FOUND_PREPROCESSOR}};
@@ -1402,7 +1412,7 @@
 ########################################################################
 # parse_c_statement
 
-sub parse_c_statement {
+sub parse_c_statement($$$$) {
     my $self = shift;
 
     my $refcurrent = shift;
@@ -1486,7 +1496,7 @@
 ########################################################################
 # parse_c_statements
 
-sub parse_c_statements {
+sub parse_c_statements($$$$) {
     my $self = shift;
 
     my $refcurrent = shift;
@@ -1583,7 +1593,7 @@
 ########################################################################
 # parse_c_struct_union
 
-sub parse_c_struct_union {
+sub parse_c_struct_union($$$$$$$$$) {
     my $self = shift;
 
     my $refcurrent = shift;
@@ -1681,7 +1691,7 @@
 ########################################################################
 # parse_c_tuple
 
-sub parse_c_tuple {
+sub parse_c_tuple($$$$$$$) {
     my $self = shift;
 
     my $refcurrent = shift;
@@ -1757,7 +1767,7 @@
 ########################################################################
 # parse_c_type
 
-sub parse_c_type {
+sub parse_c_type($$$$$) {
     my $self = shift;
 
     my $refcurrent = shift;
@@ -1799,7 +1809,7 @@
 ########################################################################
 # parse_c_typedef
 
-sub parse_c_typedef {
+sub parse_c_typedef($$$$) {
     my $self = shift;
 
     my $create_type = \${$self->{CREATE_TYPE}};
@@ -1920,7 +1930,7 @@
 ########################################################################
 # parse_c_variable
 
-sub parse_c_variable {
+sub parse_c_variable($$$$$$$) {
     my $self = shift;
 
     my $found_variable = \${$self->{FOUND_VARIABLE}};
diff --git a/tools/winapi/c_type.pm b/tools/winapi/c_type.pm
index efe64c6..18508b7 100644
--- a/tools/winapi/c_type.pm
+++ b/tools/winapi/c_type.pm
@@ -22,7 +22,9 @@
 
 use output qw($output);
 
-sub new {
+sub _refresh($);
+
+sub new($) {
     my $proto = shift;
     my $class = ref($proto) || $proto;
     my $self  = {};
@@ -34,7 +36,7 @@
 ########################################################################
 # set_find_align_callback
 #
-sub set_find_align_callback {
+sub set_find_align_callback($$) {
     my $self = shift;
 
     my $find_align = \${$self->{FIND_ALIGN}};
@@ -45,7 +47,7 @@
 ########################################################################
 # set_find_kind_callback
 #
-sub set_find_kind_callback {
+sub set_find_kind_callback($$) {
     my $self = shift;
 
     my $find_kind = \${$self->{FIND_KIND}};
@@ -56,7 +58,7 @@
 ########################################################################
 # set_find_size_callback
 #
-sub set_find_size_callback {
+sub set_find_size_callback($$) {
     my $self = shift;
 
     my $find_size = \${$self->{FIND_SIZE}};
@@ -67,7 +69,7 @@
 ########################################################################
 # set_find_count_callback
 #
-sub set_find_count_callback {
+sub set_find_count_callback($$) {
     my $self = shift;
 
     my $find_count = \${$self->{FIND_COUNT}};
@@ -75,7 +77,7 @@
     $$find_count = shift;
 }
 
-sub kind {
+sub kind($$) {
     my $self = shift;
     my $kind = \${$self->{KIND}};
     my $dirty = \${$self->{DIRTY}};
@@ -91,7 +93,7 @@
     return $$kind;
 }
 
-sub _name {
+sub _name($$) {
     my $self = shift;
     my $_name = \${$self->{_NAME}};
     my $dirty = \${$self->{DIRTY}};
@@ -103,7 +105,7 @@
     return $$_name;
 }
 
-sub name {
+sub name($$) {
     my $self = shift;
     my $name = \${$self->{NAME}};
     my $dirty = \${$self->{DIRTY}};
@@ -122,7 +124,7 @@
     }
 }
 
-sub pack {
+sub pack($$) {
     my $self = shift;
     my $pack = \${$self->{PACK}};
     my $dirty = \${$self->{DIRTY}};
@@ -134,7 +136,7 @@
     return $$pack;
 }
 
-sub align {
+sub align($) {
     my $self = shift;
 
     my $align = \${$self->{ALIGN}};
@@ -144,7 +146,7 @@
     return $$align;
 }
 
-sub fields {
+sub fields($) {
     my $self = shift;
 
     my $count = $self->field_count;
@@ -157,7 +159,7 @@
     return @fields;
 }
 
-sub field_base_sizes {
+sub field_base_sizes($) {
     my $self = shift;
     my $field_base_sizes = \${$self->{FIELD_BASE_SIZES}};
 
@@ -166,7 +168,7 @@
     return $$field_base_sizes;
 }
 
-sub field_aligns {
+sub field_aligns($) {
     my $self = shift;
     my $field_aligns = \${$self->{FIELD_ALIGNS}};
 
@@ -175,7 +177,7 @@
     return $$field_aligns;
 }
 
-sub field_count {
+sub field_count($) {
     my $self = shift;
     my $field_type_names = \${$self->{FIELD_TYPE_NAMES}};
 
@@ -185,7 +187,7 @@
     return $count;
 }
 
-sub field_names {
+sub field_names($$) {
     my $self = shift;
     my $field_names = \${$self->{FIELD_NAMES}};
     my $dirty = \${$self->{DIRTY}};
@@ -197,7 +199,7 @@
     return $$field_names;
 }
 
-sub field_offsets {
+sub field_offsets($) {
     my $self = shift;
     my $field_offsets = \${$self->{FIELD_OFFSETS}};
 
@@ -206,7 +208,7 @@
     return $$field_offsets;
 }
 
-sub field_sizes {
+sub field_sizes($) {
     my $self = shift;
     my $field_sizes = \${$self->{FIELD_SIZES}};
 
@@ -215,7 +217,7 @@
     return $$field_sizes;
 }
 
-sub field_type_names {
+sub field_type_names($$) {
     my $self = shift;
     my $field_type_names = \${$self->{FIELD_TYPE_NAMES}};
     my $dirty = \${$self->{DIRTY}};
@@ -227,7 +229,7 @@
     return $$field_type_names;
 }
 
-sub size {
+sub size($) {
     my $self = shift;
 
     my $size = \${$self->{SIZE}};
@@ -237,7 +239,7 @@
     return $$size;
 }
 
-sub _refresh {
+sub _refresh($) {
     my $self = shift;
 
     my $dirty = \${$self->{DIRTY}};
@@ -369,7 +371,7 @@
 
 package c_type_field;
 
-sub new {
+sub new($$$) {
     my $proto = shift;
     my $class = ref($proto) || $proto;
     my $self  = {};
@@ -384,7 +386,7 @@
     return $self;
 }
 
-sub align {
+sub align($) {
     my $self = shift;
     my $type = \${$self->{TYPE}};
     my $number = \${$self->{NUMBER}};
@@ -394,7 +396,7 @@
     return $$field_aligns[$$number];
 }
 
-sub base_size {
+sub base_size($) {
     my $self = shift;
     my $type = \${$self->{TYPE}};
     my $number = \${$self->{NUMBER}};
@@ -404,7 +406,7 @@
     return $$field_base_sizes[$$number];
 }
 
-sub name {
+sub name($) {
     my $self = shift;
     my $type = \${$self->{TYPE}};
     my $number = \${$self->{NUMBER}};
@@ -414,7 +416,7 @@
     return $$field_names[$$number];
 }
 
-sub offset {
+sub offset($) {
     my $self = shift;
     my $type = \${$self->{TYPE}};
     my $number = \${$self->{NUMBER}};
@@ -424,7 +426,7 @@
     return $$field_offsets[$$number];
 }
 
-sub size {
+sub size($) {
     my $self = shift;
     my $type = \${$self->{TYPE}};
     my $number = \${$self->{NUMBER}};
@@ -434,7 +436,7 @@
     return $$field_sizes[$$number];
 }
 
-sub type_name {
+sub type_name($) {
     my $self = shift;
     my $type = \${$self->{TYPE}};
     my $number = \${$self->{NUMBER}};
diff --git a/tools/winapi/config.pm b/tools/winapi/config.pm
index 96614d3..a992a72 100644
--- a/tools/winapi/config.pm
+++ b/tools/winapi/config.pm
@@ -27,14 +27,14 @@
 
 @ISA = qw(Exporter);
 @EXPORT = qw(
-    &file_absolutize &file_normalize
-    &file_directory
-    &file_type &files_filter
-    &file_skip &files_skip
-    &get_c_files
-    &get_h_files
-    &get_makefile_in_files
-    &get_spec_files
+    file_absolutize file_normalize
+    file_directory
+    file_type files_filter
+    file_skip files_skip
+    get_c_files
+    get_h_files
+    get_makefile_in_files
+    get_spec_files
 );
 @EXPORT_OK = qw(
     $current_dir $wine_dir $winapi_dir $winapi_check_dir
@@ -46,71 +46,7 @@
 
 use File::Find;
 
-sub file_type {
-    local $_ = shift;
-
-    $_ = file_absolutize($_);
-
-    m%^(?:libtest|rc|server|tests|tools)/% && return "";
-    m%^(?:programs|debugger|miscemu)/% && return "wineapp";
-    m%^(?:libs)/% && return "library";
-    m%^windows/x11drv/wineclipsrv\.c$% && return "application";
-
-    return "winelib";
-}
-
-sub files_filter {
-    my $type = shift;
-
-    my @files;
-    foreach my $file (@_) {
-	if(file_type($file) eq $type) {
-	    push @files, $file;
-	}
-    }
-
-    return @files;
-}
-
-sub file_skip {
-    local $_ = shift;
-
-    $_ = file_absolutize($_);
-
-    m%^(?:libtest|programs|rc|server|tests|tools)/% && return 1;
-    m%^(?:debugger|miscemu|libs|server)/% && return 1;
-    m%^dlls/wineps/data/% && return 1;
-    m%^windows/x11drv/wineclipsrv\.c$% && return 1;
-    m%^dlls/winmm/wineoss/midipatch\.c$% && return 1;
-    m%(?:glue|spec)\.c$% && return 1;
-
-    return 0;
-}
-
-sub files_skip {
-    my @files;
-    foreach my $file (@_) {
-	if(!file_skip($file)) {
-	    push @files, $file;
-	}
-    }
-
-    return @files;
-}
-
-sub file_absolutize {
-    local $_ = shift;
-
-    $_ = file_normalize($_);
-    if(!s%^$wine_dir/%%) {
-	$_ = "$current_dir/$_";
-    }
-    s%^\./%%;
-
-    return $_;
-}
-
-sub file_normalize {
+sub file_normalize($) {
     local $_ = shift;
 
     foreach my $dir (split(m%/%, $current_dir)) {
@@ -130,7 +66,71 @@
     return $_;
 }
 
-sub file_directory {
+sub file_absolutize($) {
+    local $_ = shift;
+
+    $_ = file_normalize($_);
+    if(!s%^$wine_dir/%%) {
+	$_ = "$current_dir/$_";
+    }
+    s%^\./%%;
+
+    return $_;
+}
+
+sub file_type($) {
+    local $_ = shift;
+
+    $_ = file_absolutize($_);
+
+    m%^(?:libtest|rc|server|tests|tools)/% && return "";
+    m%^(?:programs|debugger|miscemu)/% && return "wineapp";
+    m%^(?:libs)/% && return "library";
+    m%^windows/x11drv/wineclipsrv\.c$% && return "application";
+
+    return "winelib";
+}
+
+sub files_filter($@) {
+    my $type = shift;
+
+    my @files;
+    foreach my $file (@_) {
+	if(file_type($file) eq $type) {
+	    push @files, $file;
+	}
+    }
+
+    return @files;
+}
+
+sub file_skip($) {
+    local $_ = shift;
+
+    $_ = file_absolutize($_);
+
+    m%^(?:libtest|programs|rc|server|tests|tools)/% && return 1;
+    m%^(?:debugger|miscemu|libs|server)/% && return 1;
+    m%^dlls/wineps/data/% && return 1;
+    m%^windows/x11drv/wineclipsrv\.c$% && return 1;
+    m%^dlls/winmm/wineoss/midipatch\.c$% && return 1;
+    m%(?:glue|spec)\.c$% && return 1;
+
+    return 0;
+}
+
+sub files_skip(@) {
+    my @files;
+    foreach my $file (@_) {
+	if(!file_skip($file)) {
+	    push @files, $file;
+	}
+    }
+
+    return @files;
+}
+
+sub file_directory($) {
     local $_ = shift;
 
     s%/?[^/]*$%%;
@@ -143,7 +143,7 @@
     return $_;
 }
 
-sub _get_files {
+sub _get_files($$;$) {
     my $pattern = shift;
     my $type = shift;
     my $dir = shift;
@@ -178,9 +178,9 @@
     return @files;
 }
 
-sub get_c_files { return _get_files('\.c$', @_); }
-sub get_h_files { return _get_files('\.h$', @_); }
-sub get_spec_files { return _get_files('\.spec$', @_); }
-sub get_makefile_in_files { return _get_files('^Makefile.in$', @_); }
+sub get_c_files($;$) { return _get_files('\.c$', $_[0], $_[1]); }
+sub get_h_files($;$) { return _get_files('\.h$', $_[0], $_[1]); }
+sub get_spec_files($;$) { return _get_files('\.spec$', $_[0], $_[1]); }
+sub get_makefile_in_files($;$) { return _get_files('^Makefile.in$', $_[0], $_[1]); }
 
 1;
diff --git a/tools/winapi/function.pm b/tools/winapi/function.pm
index fbc3475..78a7670 100644
--- a/tools/winapi/function.pm
+++ b/tools/winapi/function.pm
@@ -20,7 +20,7 @@
 
 use strict;
 
-sub new {
+sub new($) {
     my $proto = shift;
     my $class = ref($proto) || $proto;
     my $self  = {};
@@ -29,7 +29,7 @@
     return $self;
 }
 
-sub file {
+sub file($$) {
     my $self = shift;
     my $file = \${$self->{FILE}};
 
@@ -40,7 +40,7 @@
     return $$file;
 }
 
-sub debug_channels {
+sub debug_channels($$) {
     my $self = shift;
     my $debug_channels = \${$self->{DEBUG_CHANNELS}};
 
@@ -51,7 +51,7 @@
     return $$debug_channels;
 }
 
-sub documentation_line {
+sub documentation_line($$) {
     my $self = shift;
     my $documentation_line = \${$self->{DOCUMENTATION_LINE}};
 
@@ -62,7 +62,7 @@
     return $$documentation_line;
 }
 
-sub documentation {
+sub documentation($$) {
     my $self = shift;
     my $documentation = \${$self->{DOCUMENTATION}};
 
@@ -73,7 +73,7 @@
     return $$documentation;
 }
 
-sub function_line {
+sub function_line($$) {
     my $self = shift;
     my $function_line = \${$self->{FUNCTION_LINE}};
 
@@ -84,7 +84,7 @@
     return $$function_line;
 }
 
-sub linkage {
+sub linkage($$) {
     my $self = shift;
     my $linkage = \${$self->{LINKAGE}};
 
@@ -95,7 +95,7 @@
     return $$linkage;
 }
 
-sub return_type {
+sub return_type($$) {
     my $self = shift;
     my $return_type = \${$self->{RETURN_TYPE}};
 
@@ -106,7 +106,7 @@
     return $$return_type;
 }
 
-sub calling_convention {
+sub calling_convention($$) {
     my $self = shift;
     my $calling_convention = \${$self->{CALLING_CONVENTION}};
 
@@ -117,7 +117,7 @@
     return $$calling_convention;
 }
 
-sub internal_name {
+sub internal_name($$) {
     my $self = shift;
     my $internal_name = \${$self->{INTERNAL_NAME}};
 
@@ -128,7 +128,7 @@
     return $$internal_name;
 }
 
-sub argument_types {
+sub argument_types($$) {
     my $self = shift;
     my $argument_types = \${$self->{ARGUMENT_TYPES}};
 
@@ -139,7 +139,7 @@
     return $$argument_types;
 }
 
-sub argument_names {
+sub argument_names($$) {
     my $self = shift;
     my $argument_names = \${$self->{ARGUMENT_NAMES}};
 
@@ -150,7 +150,7 @@
     return $$argument_names;
 }
 
-sub argument_documentations {
+sub argument_documentations($$) {
     my $self = shift;
     my $argument_documentations = \${$self->{ARGUMENT_DOCUMENTATIONS}};
 
@@ -161,7 +161,7 @@
     return $$argument_documentations;
 }
 
-sub statements_line {
+sub statements_line($$) {
     my $self = shift;
     my $statements_line = \${$self->{STATEMENTS_LINE}};
 
@@ -172,7 +172,7 @@
     return $$statements_line;
 }
 
-sub statements {
+sub statements($$) {
     my $self = shift;
     my $statements = \${$self->{STATEMENTS}};
 
diff --git a/tools/winapi/make_filter b/tools/winapi/make_filter
index 5f7c293..1664e84 100755
--- a/tools/winapi/make_filter
+++ b/tools/winapi/make_filter
@@ -25,7 +25,7 @@
 }
 
 use config qw(
-    &file_absolutize &file_normalize
+    file_absolutize file_normalize
     $current_dir $wine_dir
 );
 use output qw($output);
@@ -49,20 +49,20 @@
 while(<IN>) {
     chomp;
 
-    if(!&make_parser::line($_)) {
+    if(!make_parser::line($_)) {
 	next;
     }
 
     if($message) {
 	if($file && $line) {
 	    if($directory && $directory ne "." && $file !~ m%^/%) {
-		$output->write(&file_normalize("$directory/$file") . ":$line: $message\n");
+		$output->write(file_normalize("$directory/$file") . ":$line: $message\n");
 	    } else {
 		$output->write("$file:$line: $message\n");
 	    }
 	} elsif($file) {
 	    if($directory && $directory ne "." && $file !~ m%^/%) {
-		$output->write(&file_normalize("$directory/$file") . ": $message\n");
+		$output->write(file_normalize("$directory/$file") . ": $message\n");
 	    } else {
 		$output->write("$file: $message\n");
 	    }
diff --git a/tools/winapi/make_parser.pm b/tools/winapi/make_parser.pm
index 5d433f1..45523b0 100644
--- a/tools/winapi/make_parser.pm
+++ b/tools/winapi/make_parser.pm
@@ -20,8 +20,6 @@
 
 use strict;
 
-use strict;
-
 use setup qw($current_dir $wine_dir $winapi_dir $winapi_check_dir);
 
 use vars qw($VERSION @ISA @EXPORT @EXPORT_OK);
@@ -36,6 +34,16 @@
 use output qw($output);
 use options qw($options);
 
+
+#sub command($);
+#sub gcc_output($$);
+#sub ld_output($$);
+#sub make_output($$);
+#sub winebuild_output($$);
+#sub wmc_output($$);
+#sub wrc_output($$);
+
+
 ########################################################################
 # global
 ########################################################################
@@ -47,7 +55,7 @@
 # error
 ########################################################################
 
-sub error {
+sub error($) {
     my $where = shift;
 
     if(!defined($where)) {
@@ -77,126 +85,10 @@
 }
 
 ########################################################################
-# line
-########################################################################
-
-sub line {
-    local $_ = shift;
-
-    $file = "";
-    $line = "";
-    $message = "";
-
-    $current = $_;
-
-    my ($new_tool, $read_files, $write_files, $remove_files) = command($_);
-    if(defined($new_tool)) {
-	$tool = $new_tool;
-
-	$function = "";
-
-	my $progress = "";
-	if($directory && $directory ne ".") {
-	    $progress .= "$directory: ";
-	}
-	if($tool) {
-	    $progress .= "$tool: ";
-	}
-
-	if($tool =~ /^(?:cd|make)$/) {
-	    # Nothing
-	} elsif($tool eq "ld"/) {
-	    foreach my $file (@{$read_files}) {
-		$output->lazy_progress("${progress}reading '$file'");
-	    }
-	    my $file = $$write_files[0];
-	    $output->progress("$progress: writing '$file'");
-	} elsif($tool eq "rm") {
-	    foreach my $file (@{$remove_files}) {
-		$output->lazy_progress("${progress}removing '$file'");
-	    }
-	} else {
-	    if($#$read_files >= 0) {
-		$progress .= "read[" . join(" ", @{$read_files}) . "]";
-	    }
-	    if($#$write_files >= 0) {
-		if($#$read_files >= 0) {
-		    $progress .= ", ";
-		}
-		$progress .= "write[" . join(" ", @{$write_files}) . "]";
-	    }
-	    if($#$remove_files >= 0) {
-		if($#$read_files >= 0 || $#$write_files >= 0) {
-		    $progress .= ", ";
-		}
-		$progress .= "remove[" . join(" ", @{$remove_files}) . "]";
-	    }
-
-	    $output->progress($progress);
-	}
-
-	return 0;
-    }
-
-    my $make = $options->make;
-
-    if(/^Wine build complete\.$/) {
-	# Nothing
-    } elsif(/^(.*?) is newer than (.*?), please rerun (.*?)\!$/) {
-	$message = "$_";
-    } elsif(/^(.*?) is older than (.*?), please rerun (.*?)$/) {
-	$message = "$_";
-    } elsif(/^\`(.*?)\' is up to date.$/) {
-	$tool = "make";
-	make_output($1, $_);
-    } elsif(s/^$make(?:\[(\d+)\])?:\s*//) {
-	$tool = "make";
-	make_output($1, $_);
-    } elsif(!defined($tool)) {
-	error("line");
-    } elsif($tool eq "make") {
-	make_output($1, $_);
-    } elsif($tool eq "bison" && /^conflicts:\s+\d+\s+shift\/reduce$/) {
-	# Nothing
-    } elsif($tool eq "gcc" && /^(?:In file included |\s*)from (.+?):(\d+)[,:]$/) {
-	# Nothing
-    } elsif($tool =~ /^(?:gcc|ld)$/ && s/^(.+?\.s?o)(?:\(.*?\))?:\s*//) {
-	$tool = "ld";
-	ld_output($1, $_)
-    } elsif($tool =~ /^(?:gcc|ld)$/ && s/^(.*?)ld:\s*//) {
-	$tool = "ld";
-	ld_output("", $_)
-    } elsif($tool =~ /^(?:gcc|ld)$/ && s/^collect2:\s*//) {
-	$tool = "ld";
-	ld_output("collect2", $_);
-    } elsif($tool eq "gcc" && s/^(.+?\.[chly]):\s*//) {
-	gcc_output($1, $_);
-    } elsif($tool eq "ld" && s/^(.+?\.c):(?:\d+:)?\s*//) {
-	ld_output($1, $_);
-    } elsif($tool eq "winebuild" && s/^(.+?\.spec):\s*//) {
-	winebuild_output($1, $_);
-    } elsif($tool eq "wmc" && s/^(.+?\.mc):\s*//) {
-        wmc_output($1, $_);
-    } elsif($tool eq "wrc" && s/^(.+?\.rc):\s*//) {
-	wrc_output($1, $_);
-    } elsif($tool eq "cd" && s/^\/bin\/sh:\s*cd:\s*//) {
-	parse_cd_output($_);
-    } elsif(/^\s*$/) {
-	# Nothing
-    } else {
-	error("line");
-    }
-
-    $file =~ s/^\.\///;
-
-    return 1;
-}
-
-########################################################################
 # make_output
 ########################################################################
 
-sub make_output {
+sub make_output($$) {
     my $level = shift;
     local $_ = shift;
 
@@ -258,91 +150,10 @@
 }
 
 ########################################################################
-# command
-########################################################################
-
-sub command {
-    local $_ = shift;
-
-    my $tool;
-    my $file;
-    my $read_files = ["<???>"];
-    my $write_files = ["<???>"];
-    my $remove_files = [];
-
-    s/^\s*(.*?)\s*$/$1/;
-
-    if(s/^\[\s+-d\s+(.*?)\s+\]\s+\|\|\s+//) {
-	# Nothing
-    }
-
-    if(s/^ar\s+//) {
-	$tool = "ar";
-	($read_files, $write_files) = ar_command($_);
-    } elsif(s/^as\s+//) {
-	$tool = "as";
-	($read_files, $write_files) = as_command($_);
-    } elsif(s/^bison\s+//) {
-	$tool = "bison";
-	($read_files, $write_files) = bison_command($_);
-    } elsif(s/^cd\s+//) {
-	$tool = "cd";
-	($read_files, $write_files) = cd_command($_);
-    } elsif(s/^flex\s+//) {
-	$tool = "flex";
-	($read_files, $write_files) = flex_command($_);
-    } elsif(s/^for\s+//) {
-	$tool = "for";
-	($read_files, $write_files) = for_command($_);
-    } elsif(s/^\/usr\/bin\/install\s+//) {
-	$tool = "install";
-	($read_files, $write_files) = install_command($_);
-    } elsif(s/^ld\s+//) {
-	$tool = "ld";
-	($read_files, $write_files) = ld_command($_);
-    } elsif(s/^\/sbin\/ldconfig\s+//) {
-	$tool = "ldconfig";
-	($read_files, $write_files) = ldconfig_command();
-    } elsif(s/^gcc\s+//) {
-	$tool = "gcc";
-	($read_files, $write_files) = gcc_command($_);
-    } elsif(s/^(?:(?:\.\.\/)+|\.\/)tools\/makedep\s+//) {
-	$tool = "makedep";
-	($read_files, $write_files) = makedep_command($_);
-    } elsif(s/^mkdir\s+//) {
-	$tool = "mkdir";
-	($read_files, $write_files) = mkdir_command($_);
-    } elsif(s/^ranlib\s+//) {
-	$tool = "ranlib";
-	($read_files, $write_files) = ranlib_command($_);
-    } elsif(s/^rm\s+//) {
-	$tool = "rm";
-	($read_files, $write_files, $remove_files) = rm_command($_);
-    } elsif(s/^sed\s+//) {
-	$tool = "sed";
-	($read_files, $write_files) = sed_command($_);
-    } elsif(s/^strip\s+//) {
-	$tool = "sed";
-	($read_files, $write_files) = strip_command($_);
-    } elsif(s/^LD_LIBRARY_PATH="(?:(?:\.\.\/)*unicode)?:\$LD_LIBRARY_PATH"\s+(?:\.\.\/)*tools\/winebuild\/winebuild\s+//) {
-	$tool = "winebuild";
-	($read_files, $write_files) = winebuild_command($_);
-    } elsif(s/^LD_LIBRARY_PATH="(?:(?:\.\.\/)*unicode)?:\$LD_LIBRARY_PATH"\s+(?:\.\.\/)*tools\/wmc\/wmc\s+//) {
-	$tool = "wmc";
-	($read_files, $write_files) = wmc_command($_);
-    } elsif(s/^LD_LIBRARY_PATH="(?:(?:\.\.\/)*unicode)?:\$LD_LIBRARY_PATH"\s+(?:\.\.\/)*tools\/wrc\/wrc\s+//) {
-	$tool = "wrc";
-	($read_files, $write_files) = wrc_command($_);
-    }
-
-    return ($tool, $read_files, $write_files, $remove_files);
-}
-
-########################################################################
 # ar_command
 ########################################################################
 
-sub ar_command {
+sub ar_command($) {
     local $_ = shift;
 
     my $read_files;
@@ -364,7 +175,7 @@
 # as_command
 ########################################################################
 
-sub as_command {
+sub as_command($) {
     local $_ = shift;
 
     my $read_files;
@@ -384,7 +195,7 @@
 # bision_command
 ########################################################################
 
-sub bison_command {
+sub bison_command($) {
     local $_ = shift;
 
     return ([], []);
@@ -394,7 +205,7 @@
 # cd_command
 ########################################################################
 
-sub cd_command {
+sub cd_command($) {
     local $_ = shift;
 
     return ([], []);
@@ -404,7 +215,7 @@
 # cd_output
 ########################################################################
 
-sub cd_output {
+sub cd_output($) {
     local $_ = shift;
 
     if(/^(.*?): No such file or directory/) {
@@ -416,7 +227,7 @@
 # flex_command
 ########################################################################
 
-sub flex_command {
+sub flex_command($) {
     local $_ = shift;
 
     return ([], []);
@@ -426,7 +237,7 @@
 # for_command
 ########################################################################
 
-sub for_command {
+sub for_command($) {
     local $_ = shift;
 
     return ([], []);
@@ -436,7 +247,7 @@
 # gcc_command
 ########################################################################
 
-sub gcc_command {
+sub gcc_command($) {
     my $read_files;
     my $write_files;
 
@@ -474,7 +285,7 @@
 # gcc_output
 ########################################################################
 
-sub gcc_output {
+sub gcc_output($$) {
     $file = shift;
     local $_ = shift;
 
@@ -606,7 +417,7 @@
 # install_command
 ########################################################################
 
-sub install_command {
+sub install_command($) {
     local $_ = shift;
 
     return ([], []);
@@ -616,7 +427,7 @@
 # ld_command
 ########################################################################
 
-sub ld_command {
+sub ld_command($) {
     local $_ = shift;
 
     my $read_files;
@@ -636,7 +447,7 @@
 # ld_output
 ########################################################################
 
-sub ld_output {
+sub ld_output($$) {
     $file = shift;
     local $_ = shift;
 
@@ -663,7 +474,7 @@
 # ldconfig_command
 ########################################################################
 
-sub ldconfig_command {
+sub ldconfig_command($) {
     local $_ = shift;
 
     return ([], []);
@@ -673,7 +484,7 @@
 # makedep_command
 ########################################################################
 
-sub makedep_command {
+sub makedep_command($) {
     local $_ = shift;
 
     return ([], []);
@@ -683,7 +494,7 @@
 # mkdir_command
 ########################################################################
 
-sub mkdir_command {
+sub mkdir_command($) {
     local $_ = shift;
 
     return ([], []);
@@ -693,7 +504,7 @@
 # ranlib_command
 ########################################################################
 
-sub ranlib_command {
+sub ranlib_command($) {
     local $_ = shift;
 
     my $read_files;
@@ -709,7 +520,7 @@
 # rm_command
 ########################################################################
 
-sub rm_command {
+sub rm_command($) {
     local $_ = shift;
     s/^-f\s*//;
     return ([], [], [split(/\s+/, $_)]);
@@ -719,7 +530,7 @@
 # sed_command
 ########################################################################
 
-sub sed_command {
+sub sed_command($) {
     local $_ = shift;
 
     return ([], []);
@@ -729,7 +540,7 @@
 # strip_command
 ########################################################################
 
-sub strip_command {
+sub strip_command($) {
     local $_ = shift;
 
     return ([], []);
@@ -739,7 +550,7 @@
 # winebuild_command
 ########################################################################
 
-sub winebuild_command {
+sub winebuild_command($) {
     local $_ = shift;
 
     return ([], []);
@@ -749,7 +560,7 @@
 # winebuild_output
 ########################################################################
 
-sub winebuild_output {
+sub winebuild_output($$) {
     $file = shift;
     local $_ = shift;
 
@@ -760,7 +571,7 @@
 # wmc_command
 ########################################################################
 
-sub wmc_command {
+sub wmc_command($) {
     local $_ = shift;
 
     my $read_files;
@@ -785,7 +596,7 @@
 # wmc_output
 ########################################################################
 
-sub wmc_output {
+sub wmc_output($$) {
     $file = shift;
     local $_ = shift;
 }
@@ -794,7 +605,7 @@
 # wrc_command
 ########################################################################
 
-sub wrc_command {
+sub wrc_command($) {
     local $_ = shift;
 
     my $read_files;
@@ -819,9 +630,206 @@
 # wrc_output
 ########################################################################
 
-sub wrc_output {
+sub wrc_output($$) {
     $file = shift;
     local $_ = shift;
 }
 
+########################################################################
+# command
+########################################################################
+
+sub command($) {
+    local $_ = shift;
+
+    my $tool;
+    my $file;
+    my $read_files = ["<???>"];
+    my $write_files = ["<???>"];
+    my $remove_files = [];
+
+    s/^\s*(.*?)\s*$/$1/;
+
+    if(s/^\[\s+-d\s+(.*?)\s+\]\s+\|\|\s+//) {
+	# Nothing
+    }
+
+    if(s/^ar\s+//) {
+	$tool = "ar";
+	($read_files, $write_files) = ar_command($_);
+    } elsif(s/^as\s+//) {
+	$tool = "as";
+	($read_files, $write_files) = as_command($_);
+    } elsif(s/^bison\s+//) {
+	$tool = "bison";
+	($read_files, $write_files) = bison_command($_);
+    } elsif(s/^cd\s+//) {
+	$tool = "cd";
+	($read_files, $write_files) = cd_command($_);
+    } elsif(s/^flex\s+//) {
+	$tool = "flex";
+	($read_files, $write_files) = flex_command($_);
+    } elsif(s/^for\s+//) {
+	$tool = "for";
+	($read_files, $write_files) = for_command($_);
+    } elsif(s/^\/usr\/bin\/install\s+//) {
+	$tool = "install";
+	($read_files, $write_files) = install_command($_);
+    } elsif(s/^ld\s+//) {
+	$tool = "ld";
+	($read_files, $write_files) = ld_command($_);
+    } elsif(s/^\/sbin\/ldconfig\s+//) {
+	$tool = "ldconfig";
+	($read_files, $write_files) = ldconfig_command();
+    } elsif(s/^gcc\s+//) {
+	$tool = "gcc";
+	($read_files, $write_files) = gcc_command($_);
+    } elsif(s/^(?:(?:\.\.\/)+|\.\/)tools\/makedep\s+//) {
+	$tool = "makedep";
+	($read_files, $write_files) = makedep_command($_);
+    } elsif(s/^mkdir\s+//) {
+	$tool = "mkdir";
+	($read_files, $write_files) = mkdir_command($_);
+    } elsif(s/^ranlib\s+//) {
+	$tool = "ranlib";
+	($read_files, $write_files) = ranlib_command($_);
+    } elsif(s/^rm\s+//) {
+	$tool = "rm";
+	($read_files, $write_files, $remove_files) = rm_command($_);
+    } elsif(s/^sed\s+//) {
+	$tool = "sed";
+	($read_files, $write_files) = sed_command($_);
+    } elsif(s/^strip\s+//) {
+	$tool = "sed";
+	($read_files, $write_files) = strip_command($_);
+    } elsif(s/^LD_LIBRARY_PATH="(?:(?:\.\.\/)*unicode)?:\$LD_LIBRARY_PATH"\s+(?:\.\.\/)*tools\/winebuild\/winebuild\s+//) {
+	$tool = "winebuild";
+	($read_files, $write_files) = winebuild_command($_);
+    } elsif(s/^LD_LIBRARY_PATH="(?:(?:\.\.\/)*unicode)?:\$LD_LIBRARY_PATH"\s+(?:\.\.\/)*tools\/wmc\/wmc\s+//) {
+	$tool = "wmc";
+	($read_files, $write_files) = wmc_command($_);
+    } elsif(s/^LD_LIBRARY_PATH="(?:(?:\.\.\/)*unicode)?:\$LD_LIBRARY_PATH"\s+(?:\.\.\/)*tools\/wrc\/wrc\s+//) {
+	$tool = "wrc";
+	($read_files, $write_files) = wrc_command($_);
+    }
+
+    return ($tool, $read_files, $write_files, $remove_files);
+}
+
+########################################################################
+# line
+########################################################################
+
+sub line($) {
+    local $_ = shift;
+
+    $file = "";
+    $line = "";
+    $message = "";
+
+    $current = $_;
+
+    my ($new_tool, $read_files, $write_files, $remove_files) = command($_);
+    if(defined($new_tool)) {
+	$tool = $new_tool;
+
+	$function = "";
+
+	my $progress = "";
+	if($directory && $directory ne ".") {
+	    $progress .= "$directory: ";
+	}
+	if($tool) {
+	    $progress .= "$tool: ";
+	}
+
+	if($tool =~ /^(?:cd|make)$/) {
+	    # Nothing
+	} elsif($tool eq "ld"/) {
+	    foreach my $file (@{$read_files}) {
+		$output->lazy_progress("${progress}reading '$file'");
+	    }
+	    my $file = $$write_files[0];
+	    $output->progress("$progress: writing '$file'");
+	} elsif($tool eq "rm") {
+	    foreach my $file (@{$remove_files}) {
+		$output->lazy_progress("${progress}removing '$file'");
+	    }
+	} else {
+	    if($#$read_files >= 0) {
+		$progress .= "read[" . join(" ", @{$read_files}) . "]";
+	    }
+	    if($#$write_files >= 0) {
+		if($#$read_files >= 0) {
+		    $progress .= ", ";
+		}
+		$progress .= "write[" . join(" ", @{$write_files}) . "]";
+	    }
+	    if($#$remove_files >= 0) {
+		if($#$read_files >= 0 || $#$write_files >= 0) {
+		    $progress .= ", ";
+		}
+		$progress .= "remove[" . join(" ", @{$remove_files}) . "]";
+	    }
+
+	    $output->progress($progress);
+	}
+
+	return 0;
+    }
+
+    my $make = $options->make;
+
+    if(/^Wine build complete\.$/) {
+	# Nothing
+    } elsif(/^(.*?) is newer than (.*?), please rerun (.*?)\!$/) {
+	$message = "$_";
+    } elsif(/^(.*?) is older than (.*?), please rerun (.*?)$/) {
+	$message = "$_";
+    } elsif(/^\`(.*?)\' is up to date.$/) {
+	$tool = "make";
+	make_output($1, $_);
+    } elsif(s/^$make(?:\[(\d+)\])?:\s*//) {
+	$tool = "make";
+	make_output($1, $_);
+    } elsif(!defined($tool)) {
+	error("line");
+    } elsif($tool eq "make") {
+	make_output($1, $_);
+    } elsif($tool eq "bison" && /^conflicts:\s+\d+\s+shift\/reduce$/) {
+	# Nothing
+    } elsif($tool eq "gcc" && /^(?:In file included |\s*)from (.+?):(\d+)[,:]$/) {
+	# Nothing
+    } elsif($tool =~ /^(?:gcc|ld)$/ && s/^(.+?\.s?o)(?:\(.*?\))?:\s*//) {
+	$tool = "ld";
+	ld_output($1, $_)
+    } elsif($tool =~ /^(?:gcc|ld)$/ && s/^(.*?)ld:\s*//) {
+	$tool = "ld";
+	ld_output("", $_)
+    } elsif($tool =~ /^(?:gcc|ld)$/ && s/^collect2:\s*//) {
+	$tool = "ld";
+	ld_output("collect2", $_);
+    } elsif($tool eq "gcc" && s/^(.+?\.[chly]):\s*//) {
+	gcc_output($1, $_);
+    } elsif($tool eq "ld" && s/^(.+?\.c):(?:\d+:)?\s*//) {
+	ld_output($1, $_);
+    } elsif($tool eq "winebuild" && s/^(.+?\.spec):\s*//) {
+	winebuild_output($1, $_);
+    } elsif($tool eq "wmc" && s/^(.+?\.mc):\s*//) {
+        wmc_output($1, $_);
+    } elsif($tool eq "wrc" && s/^(.+?\.rc):\s*//) {
+	wrc_output($1, $_);
+    } elsif($tool eq "cd" && s/^\/bin\/sh:\s*cd:\s*//) {
+	parse_cd_output($_);
+    } elsif(/^\s*$/) {
+	# Nothing
+    } else {
+	error("line");
+    }
+
+    $file =~ s/^\.\///;
+
+    return 1;
+}
+
 1;
diff --git a/tools/winapi/msvcmaker b/tools/winapi/msvcmaker
index f4e6e4a..627d434 100755
--- a/tools/winapi/msvcmaker
+++ b/tools/winapi/msvcmaker
@@ -11,7 +11,7 @@
 
 use setup qw($current_dir $wine_dir);
 use lib $setup::winapi_dir;
-use config qw(&get_spec_files &get_makefile_in_files);
+use config qw(get_spec_files get_makefile_in_files);
 use output qw($output);
 use util qw(replace_file);
 
diff --git a/tools/winapi/options.pm b/tools/winapi/options.pm
index 33aff9f..bd69cd2 100644
--- a/tools/winapi/options.pm
+++ b/tools/winapi/options.pm
@@ -25,13 +25,13 @@
 
 @ISA = qw(Exporter);
 @EXPORT = qw();
-@EXPORT_OK = qw($options &parse_comma_list &parse_value);
+@EXPORT_OK = qw($options parse_comma_list parse_value);
 
 use vars qw($options);
 
 use output qw($output);
 
-sub parse_comma_list {
+sub parse_comma_list($$) {
     my $prefix = shift;
     my $value = shift;
 
@@ -48,7 +48,7 @@
     }
 }
 
-sub parse_value {
+sub parse_value($$) {
     my $prefix = shift;
     my $value = shift;
 
@@ -61,7 +61,9 @@
 
 use output qw($output);
 
-sub new {
+sub options_set($$);
+
+sub new($$$$) {
     my $proto = shift;
     my $class = ref($proto) || $proto;
     my $self  = {};
@@ -199,7 +201,7 @@
 sub DESTROY {
 }
 
-sub parse_files {
+sub parse_files($) {
     my $self = shift;
 
     my $arguments = \@{$self->{_ARGUMENTS}};
@@ -279,7 +281,7 @@
     @$directories = sort(keys(%dirs));
 }
 
-sub options_set {
+sub options_set($$) {
     my $self = shift;
 
     my $options_long = \%{$self->{_OPTIONS_LONG}};
@@ -315,7 +317,7 @@
     }
 }
 
-sub show_help {
+sub show_help($) {
     my $self = shift;
 
     my $options_long = \%{$self->{_OPTIONS_LONG}};
@@ -391,7 +393,7 @@
     }
 }
 
-sub arguments {
+sub arguments($) {
     my $self = shift;
 
     my $arguments = \@{$self->{_ARGUMENTS}};
@@ -399,7 +401,7 @@
     return @$arguments;
 }
 
-sub c_files {
+sub c_files($) {
     my $self = shift;
 
     my $c_files = \@{$self->{_C_FILES}};
@@ -411,7 +413,7 @@
     return @$c_files;
 }
 
-sub h_files {
+sub h_files($) {
     my $self = shift;
 
     my $h_files = \@{$self->{_H_FILES}};
@@ -423,7 +425,7 @@
     return @$h_files;
 }
 
-sub directories {
+sub directories($) {
     my $self = shift;
 
     my $directories = \@{$self->{_DIRECTORIES}};
diff --git a/tools/winapi/tests.pm b/tools/winapi/tests.pm
index d9679a8..aae1258 100644
--- a/tools/winapi/tests.pm
+++ b/tools/winapi/tests.pm
@@ -33,15 +33,17 @@
 use options qw($options);
 use output qw($output);
 
-sub import {
+sub import(@) {
     $Exporter::ExportLevel++;
-    &Exporter::import(@_);
+    Exporter::import(@_);
     $Exporter::ExportLevel--;
 
     $tests = 'tests'->new;
 }
 
-sub new {
+sub parse_tests_file($);
+
+sub new($) {
     my $proto = shift;
     my $class = ref($proto) || $proto;
     my $self  = {};
@@ -52,7 +54,7 @@
     return $self;
 }
 
-sub parse_tests_file {
+sub parse_tests_file($) {
     my $self = shift;
 
     my $file = "tests.dat";
@@ -90,7 +92,7 @@
     close(IN);
 }
 
-sub get_tests {
+sub get_tests($$) {
     my $self = shift;
 
     my $tests = \%{$self->{TESTS}};
@@ -112,7 +114,7 @@
     return sort(keys(%tests));
 }
 
-sub get_test_dirs {
+sub get_test_dirs($$) {
     my $self = shift;
 
     my $tests = \%{$self->{TESTS}};
@@ -135,7 +137,7 @@
     return sort(keys(%test_dirs));
 }
 
-sub get_sections {
+sub get_sections($$$) {
     my $self = shift;
 
     my $tests = \%{$self->{TESTS}};
@@ -175,7 +177,7 @@
     return sort(keys(%sections));
 }
 
-sub get_section {
+sub get_section($$$$) {
     my $self = shift;
 
     my $tests = \%{$self->{TESTS}};
diff --git a/tools/winapi/type.pm b/tools/winapi/type.pm
index 1026e92..675fcd6 100644
--- a/tools/winapi/type.pm
+++ b/tools/winapi/type.pm
@@ -20,7 +20,7 @@
 
 use strict;
 
-sub new {
+sub new($) {
     my $proto = shift;
     my $class = ref($proto) || $proto;
     my $self  = {};
diff --git a/tools/winapi/util.pm b/tools/winapi/util.pm
index d8e5361..a2de015 100644
--- a/tools/winapi/util.pm
+++ b/tools/winapi/util.pm
@@ -25,8 +25,8 @@
 
 @ISA = qw(Exporter);
 @EXPORT = qw(
-    &append_file &edit_file &read_file &replace_file
-    &normalize_set &is_subset
+    append_file edit_file read_file replace_file
+    normalize_set is_subset
 );
 @EXPORT_OK = qw();
 %EXPORT_TAGS = ();
@@ -34,7 +34,7 @@
 ########################################################################
 # _compare_files
 
-sub _compare_files {
+sub _compare_files($$) {
     my $file1 = shift;
     my $file2 = shift;
 
@@ -54,7 +54,7 @@
 ########################################################################
 # append_file
 
-sub append_file {
+sub append_file($$@) {
     my $filename = shift;
     my $function = shift;
 
@@ -68,7 +68,7 @@
 ########################################################################
 # edit_file
 
-sub edit_file {
+sub edit_file($$@) {
     my $filename = shift;
     my $function = shift;
 
@@ -93,7 +93,7 @@
 ########################################################################
 # read_file
 
-sub read_file {
+sub read_file($$@) {
     my $filename = shift;
     my $function = shift;
 
@@ -107,7 +107,7 @@
 ########################################################################
 # replace_file
 
-sub replace_file {
+sub replace_file($$@) {
     my $filename = shift;
     my $function = shift;
 
@@ -130,7 +130,7 @@
 ########################################################################
 # normalize_set
 
-sub normalize_set {
+sub normalize_set($) {
     local $_ = shift;
 
     if(!defined($_)) {
@@ -148,7 +148,7 @@
 ########################################################################
 # is_subset
 
-sub is_subset {
+sub is_subset($$) {
     my $subset = shift;
     my $set = shift;
 
diff --git a/tools/winapi/winapi.pm b/tools/winapi/winapi.pm
index 256e88f..1aeef1b 100644
--- a/tools/winapi/winapi.pm
+++ b/tools/winapi/winapi.pm
@@ -35,9 +35,17 @@
 
 use vars qw($modules);
 
-sub import {
+sub found_shared_internal_function($$);
+sub function_external_calling_convention_in_module($$$);
+sub function_internal_module($$);
+sub is_function_stub_in_module($$$);
+sub new($$$);
+sub parse_api_file($$);
+sub parse_spec_file($$);
+
+sub import(@) {
     $Exporter::ExportLevel++;
-    &Exporter::import(@_);
+    Exporter::import(@_);
     $Exporter::ExportLevel--;
 
     if (defined($modules) && defined($win16api) && defined($win32api)) {
@@ -69,7 +77,7 @@
 }
 
 
-sub new {
+sub new($$$) {
     my $proto = shift;
     my $class = ref($proto) || $proto;
     my $self  = {};
@@ -102,15 +110,15 @@
     return $self;
 }
 
-sub win16api {
+sub win16api() {
     return $win16api;
 }
 
-sub win32api {
+sub win32api() {
     return $win32api;
 }
 
-sub parse_api_file {
+sub parse_api_file($$) {
     my $self = shift;
 
     my $allowed_kind = \%{$self->{ALLOWED_KIND}};
@@ -217,7 +225,7 @@
     close(IN);
 }
 
-sub parse_spec_file {
+sub parse_spec_file($$) {
     my $self = shift;
 
     my $function_internal_arguments = \%{$self->{FUNCTION_INTERNAL_ARGUMENTS}};
@@ -468,14 +476,14 @@
     $$module_files{$module} = $file;
 }
 
-sub name {
+sub name($) {
     my $self = shift;
     my $name = \${$self->{NAME}};
 
     return $$name;
 }
 
-sub is_allowed_kind {
+sub is_allowed_kind($$) {
     my $self = shift;
     my $allowed_kind = \%{$self->{ALLOWED_KIND}};
 
@@ -488,7 +496,7 @@
 
 }
 
-sub allow_kind {
+sub allow_kind($$) {
     my $self = shift;
     my $allowed_kind = \%{$self->{ALLOWED_KIND}};
 
@@ -497,7 +505,7 @@
     $$allowed_kind{$kind}++;
 }
 
-sub is_limited_type {
+sub is_limited_type($$) {
     my $self = shift;
     my $allowed_modules_limited = \%{$self->{ALLOWED_MODULES_LIMITED}};
 
@@ -506,7 +514,7 @@
     return $$allowed_modules_limited{$type};
 }
 
-sub is_allowed_type_in_module {
+sub is_allowed_type_in_module($$) {
     my $self = shift;
     my $allowed_modules = \%{$self->{ALLOWED_MODULES}};
     my $allowed_modules_limited = \%{$self->{ALLOWED_MODULES_LIMITED}};
@@ -523,7 +531,7 @@
     return 0;
 }
 
-sub allow_type_in_module {
+sub allow_type_in_module($$) {
     my $self = shift;
     my $allowed_modules = \%{$self->{ALLOWED_MODULES}};
 
@@ -535,7 +543,7 @@
     }
 }
 
-sub type_used_in_module {
+sub type_used_in_module($$) {
     my $self = shift;
     my $used_modules = \%{$self->{USED_MODULES}};
 
@@ -549,7 +557,7 @@
     return ();
 }
 
-sub types_not_used {
+sub types_not_used($) {
     my $self = shift;
     my $used_modules = \%{$self->{USED_MODULES}};
     my $allowed_modules = \%{$self->{ALLOWED_MODULES}};
@@ -565,7 +573,7 @@
     return $not_used;
 }
 
-sub types_unlimited_used_in_modules {
+sub types_unlimited_used_in_modules($) {
     my $self = shift;
 
     my $used_modules = \%{$self->{USED_MODULES}};
@@ -589,7 +597,7 @@
     return $used_types;
 }
 
-sub translate_argument {
+sub translate_argument($$) {
     my $self = shift;
     my $translate_argument = \%{$self->{TRANSLATE_ARGUMENT}};
 
@@ -598,7 +606,7 @@
     return $$translate_argument{$type};
 }
 
-sub declare_argument {
+sub declare_argument($$$) {
     my $self = shift;
     my $translate_argument = \%{$self->{TRANSLATE_ARGUMENT}};
 
@@ -608,14 +616,14 @@
     $$translate_argument{$type} = $kind;
 }
 
-sub all_declared_types {
+sub all_declared_types($) {
     my $self = shift;
     my $translate_argument = \%{$self->{TRANSLATE_ARGUMENT}};
 
     return sort(keys(%$translate_argument));
 }
 
-sub is_allowed_type_format {
+sub is_allowed_type_format($$$$) {
     my $self = shift;
     my $type_format = \%{$self->{TYPE_FORMAT}};
 
@@ -651,14 +659,14 @@
     return 0;
 }
 
-sub all_modules {
+sub all_modules($) {
     my $self = shift;
     my $modules = \%{$self->{MODULES}};
 
     return sort(keys(%$modules));
 }
 
-sub is_module {
+sub is_module($$) {
     my $self = shift;
     my $modules = \%{$self->{MODULES}};
 
@@ -667,7 +675,7 @@
     return $$modules{$name};
 }
 
-sub module_file {
+sub module_file($$) {
     my $self = shift;
 
     my $module = shift;
@@ -677,14 +685,14 @@
     return $$module_files{$module};
 }
 
-sub all_internal_functions {
+sub all_internal_functions($) {
     my $self = shift;
     my $function_internal_calling_convention = \%{$self->{FUNCTION_INTERNAL_CALLING_CONVENTION}};
 
     return sort(keys(%$function_internal_calling_convention));
 }
 
-sub all_internal_functions_in_module {
+sub all_internal_functions_in_module($$) {
     my $self = shift;
     my $function_internal_calling_convention = \%{$self->{FUNCTION_INTERNAL_CALLING_CONVENTION}};
     my $function_internal_module = \%{$self->{FUNCTION_INTERNAL_MODULE}};
@@ -701,14 +709,14 @@
     return sort(@names);
 }
 
-sub all_external_functions {
+sub all_external_functions($) {
     my $self = shift;
     my $function_external_name = \%{$self->{FUNCTION_EXTERNAL_NAME}};
 
     return sort(keys(%$function_external_name));
 }
 
-sub all_external_functions_in_module {
+sub all_external_functions_in_module($$) {
     my $self = shift;
     my $function_external_name = \%{$self->{FUNCTION_EXTERNAL_NAME}};
     my $function_external_module = \%{$self->{FUNCTION_EXTERNAL_MODULE}};
@@ -725,7 +733,7 @@
     return sort(@names);
 }
 
-sub all_functions_in_module {
+sub all_functions_in_module($$) {
     my $self = shift;
     my $module_external_calling_convention = \%{$self->{MODULE_EXTERNAL_CALLING_CONVENTION}};
 
@@ -734,7 +742,7 @@
     return sort(keys(%{$$module_external_calling_convention{$module}}));
 }
 
-sub all_broken_forwards {
+sub all_broken_forwards($) {
     my $self = shift;
     my $function_forward = \%{$self->{FUNCTION_FORWARD}};
 
@@ -755,7 +763,7 @@
 }
 
 
-sub function_internal_ordinal {
+sub function_internal_ordinal($$) {
     my $self = shift;
     my $function_internal_ordinal = \%{$self->{FUNCTION_INTERNAL_ORDINAL}};
 
@@ -764,7 +772,7 @@
     return $$function_internal_ordinal{$name};
 }
 
-sub function_external_ordinal {
+sub function_external_ordinal($$) {
     my $self = shift;
     my $function_external_ordinal = \%{$self->{FUNCTION_EXTERNAL_ORDINAL}};
 
@@ -773,7 +781,7 @@
     return $$function_external_ordinal{$name};
 }
 
-sub function_internal_calling_convention {
+sub function_internal_calling_convention($$) {
     my $self = shift;
     my $function_internal_calling_convention = \%{$self->{FUNCTION_INTERNAL_CALLING_CONVENTION}};
 
@@ -782,7 +790,7 @@
     return $$function_internal_calling_convention{$name};
 }
 
-sub function_external_calling_convention {
+sub function_external_calling_convention($$) {
     my $self = shift;
     my $function_external_calling_convention = \%{$self->{FUNCTION_EXTERNAL_CALLING_CONVENTION}};
 
@@ -791,7 +799,7 @@
     return $$function_external_calling_convention{$name};
 }
 
-sub function_external_calling_convention_in_module {
+sub function_external_calling_convention_in_module($$$) {
     my $self = shift;
     my $module_external_calling_convention = \%{$self->{MODULE_EXTERNAL_CALLING_CONVENTION}};
 
@@ -801,7 +809,7 @@
     return $$module_external_calling_convention{$module}{$name};
 }
 
-sub function_internal_name {
+sub function_internal_name($$) {
     my $self = shift;
     my $function_internal_name = \%{$self->{FUNCTION_INTERNAL_NAME}};
 
@@ -810,7 +818,7 @@
     return $$function_internal_name{$name};
 }
 
-sub function_external_name {
+sub function_external_name($$) {
     my $self = shift;
     my $function_external_name = \%{$self->{FUNCTION_EXTERNAL_NAME}};
 
@@ -819,7 +827,7 @@
     return $$function_external_name{$name};
 }
 
-sub function_forward_final_destination {
+sub function_forward_final_destination($$$) {
     my $self = shift;
 
     my $function_forward = \%{$self->{FUNCTION_FORWARD}};
@@ -836,7 +844,7 @@
     return ($forward_module, $forward_name);
 }
 
-sub is_function {
+sub is_function($$) {
     my $self = shift;
     my $function_internal_calling_convention = \%{$self->{FUNCTION_INTERNAL_CALLING_CONVENTION}};
 
@@ -845,14 +853,14 @@
     return $$function_internal_calling_convention{$name};
 }
 
-sub all_shared_internal_functions {
+sub all_shared_internal_functions($$) {
     my $self = shift;
     my $function_shared = \%{$self->{FUNCTION_SHARED}};
 
     return sort(keys(%$function_shared));
 }
 
-sub is_shared_internal_function {
+sub is_shared_internal_function($$) {
     my $self = shift;
     my $function_shared = \%{$self->{FUNCTION_SHARED}};
 
@@ -861,7 +869,7 @@
     return $$function_shared{$name};
 }
 
-sub found_shared_internal_function {
+sub found_shared_internal_function($$) {
     my $self = shift;
     my $function_shared = \%{$self->{FUNCTION_SHARED}};
 
@@ -870,7 +878,7 @@
     $$function_shared{$name} = 1;
 }
 
-sub function_internal_arguments {
+sub function_internal_arguments($$) {
     my $self = shift;
     my $function_internal_arguments = \%{$self->{FUNCTION_INTERNAL_ARGUMENTS}};
 
@@ -879,7 +887,7 @@
     return $$function_internal_arguments{$name};
 }
 
-sub function_external_arguments {
+sub function_external_arguments($$) {
     my $self = shift;
     my $function_external_arguments = \%{$self->{FUNCTION_EXTERNAL_ARGUMENTS}};
 
@@ -888,7 +896,7 @@
     return $$function_external_arguments{$name};
 }
 
-sub function_internal_module {
+sub function_internal_module($$) {
     my $self = shift;
     my $function_internal_module = \%{$self->{FUNCTION_INTERNAL_MODULE}};
 
@@ -897,7 +905,7 @@
     return $$function_internal_module{$name};
 }
 
-sub function_external_module {
+sub function_external_module($$) {
     my $self = shift;
     my $function_external_module = \%{$self->{FUNCTION_EXTERNAL_MODULE}};
 
@@ -906,7 +914,7 @@
     return $$function_external_module{$name};
 }
 
-sub function_wine_extension {
+sub function_wine_extension($$$) {
     my $self = shift;
     my $function_wine_extension = \%{$self->{FUNCTION_WINE_EXTENSION}};
 
@@ -916,7 +924,7 @@
     return $$function_wine_extension{$module}{$name};
 }
 
-sub is_function_stub {
+sub is_function_stub($$$) {
     my $self = shift;
     my $module_external_calling_convention = \%{$self->{MODULE_EXTERNAL_CALLING_CONVENTION}};
 
@@ -929,7 +937,7 @@
     return 0;
 }
 
-sub is_function_stub_in_module {
+sub is_function_stub_in_module($$$) {
     my $self = shift;
     my $module_external_calling_convention = \%{$self->{MODULE_EXTERNAL_CALLING_CONVENTION}};
 
@@ -946,7 +954,7 @@
 # class methods
 #
 
-sub _get_all_module_internal_ordinal {
+sub _get_all_module_internal_ordinal($$) {
     my $winapi = shift;
     my $internal_name = shift;
 
@@ -986,24 +994,24 @@
     return @entries;
 }
 
-sub get_all_module_internal_ordinal16 {
-    return _get_all_module_internal_ordinal($win16api, @_);
+sub get_all_module_internal_ordinal16($) {
+    return _get_all_module_internal_ordinal($win16api, $_[0]);
 }
 
-sub get_all_module_internal_ordinal32 {
-    return _get_all_module_internal_ordinal($win32api, @_);
+sub get_all_module_internal_ordinal32($) {
+    return _get_all_module_internal_ordinal($win32api, $_[0]);
 }
 
-sub get_all_module_internal_ordinal {
+sub get_all_module_internal_ordinal($) {
     my @entries = ();
     foreach my $winapi (@winapis) {
-	push @entries, _get_all_module_internal_ordinal($winapi, @_);
+	push @entries, _get_all_module_internal_ordinal($winapi, $_[0]);
     }
 
     return @entries;
 }
 
-sub _get_all_module_external_ordinal {
+sub _get_all_module_external_ordinal($$) {
     my $winapi = shift;
     my $external_name = shift;
 
@@ -1043,18 +1051,18 @@
     return @entries;
 }
 
-sub get_all_module_external_ordinal16 {
-    return _get_all_module_external_ordinal($win16api, @_);
+sub get_all_module_external_ordinal16($) {
+    return _get_all_module_external_ordinal($win16api, $_[0]);
 }
 
-sub get_all_module_external_ordinal32 {
-    return _get_all_module_external_ordinal($win32api, @_);
+sub get_all_module_external_ordinal32($) {
+    return _get_all_module_external_ordinal($win32api, $_[0]);
 }
 
-sub get_all_module_external_ordinal {
+sub get_all_module_external_ordinal($) {
     my @entries = ();
     foreach my $winapi (@winapis) {
-	push @entries, _get_all_module_external_ordinal($winapi, @_);
+	push @entries, _get_all_module_external_ordinal($winapi, $_[0]);
     }
 
     return @entries;
diff --git a/tools/winapi/winapi_check_options.pm b/tools/winapi/winapi_check_options.pm
index 581d00d..cd788fd 100644
--- a/tools/winapi/winapi_check_options.pm
+++ b/tools/winapi/winapi_check_options.pm
@@ -165,7 +165,7 @@
 
 use strict;
 
-sub report_module {
+sub report_module($$) {
     my $self = shift;
     my $refvalue = $self->{MODULE};
 
@@ -178,7 +178,7 @@
     }
 }
 
-sub report_argument_forbidden {
+sub report_argument_forbidden($$) {
     my $self = shift;
     my $refargument_forbidden = $self->{ARGUMENT_FORBIDDEN};
 
@@ -187,7 +187,7 @@
     return $$refargument_forbidden->{active} && (!$$refargument_forbidden->{filter} || $$refargument_forbidden->{hash}->{$type});
 }
 
-sub report_argument_kind {
+sub report_argument_kind($$) {
     my $self = shift;
     my $refargument_kind = $self->{ARGUMENT_KIND};
 
diff --git a/tools/winapi/winapi_cleanup b/tools/winapi/winapi_cleanup
index 568525b..ad88e95 100755
--- a/tools/winapi/winapi_cleanup
+++ b/tools/winapi/winapi_cleanup
@@ -40,7 +40,7 @@
 ########################################################################
 # cleanup_file
 
-sub cleanup_file {
+sub cleanup_file($$$) {
     local *IN = shift;
     local *OUT = shift;
 
@@ -57,8 +57,8 @@
 	local $_ = "";
 	if ($#comments == 0) {
 	    my $comment = $comments[0];
-	    
-	    $_ = "$indent/*$comment */";	   
+
+	    $_ = "$indent/*$comment */";
 	} elsif ($#comments > 0) {
 	    $_ = "$indent/*\n";
 	    foreach my $comment (@comments) {
diff --git a/tools/winapi/winapi_extract b/tools/winapi/winapi_extract
index 7497ef2..4923556 100755
--- a/tools/winapi/winapi_extract
+++ b/tools/winapi/winapi_extract
@@ -25,7 +25,7 @@
 }
 
 use config qw(
-    &file_type &files_skip &files_filter &get_spec_files
+    file_type files_skip files_filter get_spec_files
     $current_dir $wine_dir $winapi_dir $winapi_check_dir
 );
 use output qw($output);
@@ -99,7 +99,7 @@
 
 my %specifications;
 
-sub documentation_specifications {
+sub documentation_specifications($) {
     my $function = shift;
 
     my @debug_channels = @{$function->debug_channels};
@@ -161,7 +161,7 @@
 
 my %module_pseudo_stub;
 
-sub statements_pseudo_stub {
+sub statements_pseudo_stub($) {
     my $function = shift;
 
     my $pseudo_stub = 0;
@@ -415,7 +415,7 @@
     }
 }
 
-sub output_function {
+sub output_function($$$$$) {
     local *OUT = shift;
     my $type = shift;
     my $ordinal = shift;
diff --git a/tools/winapi/winapi_fixup b/tools/winapi/winapi_fixup
index fb338a7..ca42dce 100755
--- a/tools/winapi/winapi_fixup
+++ b/tools/winapi/winapi_fixup
@@ -25,10 +25,10 @@
 }
 
 use config qw(
-    &file_type &files_filter
-    &file_skip &files_skip
-    &file_normalize
-    &get_spec_files
+    file_type files_filter
+    file_skip files_skip
+    file_normalize
+    get_spec_files
     $current_dir $wine_dir $winapi_dir $winapi_check_dir
 );
 use output qw($output);
@@ -44,9 +44,9 @@
 use c_parser;
 use type;
 
-use winapi_fixup_documentation qw(&fixup_documentation);
+use winapi_fixup_documentation qw(fixup_documentation);
 use winapi_fixup_editor;
-use winapi_fixup_statements qw(&fixup_statements);
+use winapi_fixup_statements qw(fixup_statements);
 
 my @c_files = $options->c_files;
 @c_files = files_skip(@c_files);
diff --git a/tools/winapi/winapi_fixup_documentation.pm b/tools/winapi/winapi_fixup_documentation.pm
index c8ea86c..77462ce 100644
--- a/tools/winapi/winapi_fixup_documentation.pm
+++ b/tools/winapi/winapi_fixup_documentation.pm
@@ -25,7 +25,7 @@
 
 @ISA = qw(Exporter);
 @EXPORT = qw();
-@EXPORT_OK = qw(&fixup_documentation);
+@EXPORT_OK = qw(fixup_documentation);
 
 use config qw($current_dir $wine_dir);
 use modules qw($modules);
@@ -35,7 +35,7 @@
 
 my %documentation_line_used;
 
-sub fixup_documentation {
+sub fixup_documentation($$) {
     my $function = shift;
     my $editor = shift;
 
diff --git a/tools/winapi/winapi_fixup_editor.pm b/tools/winapi/winapi_fixup_editor.pm
index 3700f7d..4ed59de 100644
--- a/tools/winapi/winapi_fixup_editor.pm
+++ b/tools/winapi/winapi_fixup_editor.pm
@@ -26,7 +26,7 @@
 
 use util;
 
-sub new {
+sub new($$) {
     my $proto = shift;
     my $class = ref($proto) || $proto;
     my $self  = {};
@@ -39,7 +39,7 @@
     return $self;
 }
 
-sub add_trigger {
+sub add_trigger($$$) {
     my $self = shift;
 
     my $triggers = \%{$self->{TRIGGERS}};
@@ -54,7 +54,7 @@
     push @{$$triggers{$line}}, $action;
 }
 
-sub replace {
+sub replace($$$$$$) {
     my $self = shift;
 
     my $begin_line = shift;
@@ -78,7 +78,7 @@
     });
 }
 
-sub flush {
+sub flush($) {
     my $self = shift;
 
     my $file = \${$self->{FILE}};
@@ -189,7 +189,7 @@
 
 my %spec_file;
 
-sub flush_old {
+sub flush_old($) {
     my $self = shift;
 
     my $file = ${$self->{FILE}};
@@ -357,7 +357,7 @@
     %spec_file = ();
 }
 
-sub delete_line {
+sub delete_line($$$) {
     my $self = shift;
 
     my $line = shift;
@@ -366,7 +366,7 @@
     $delete_line{$line} = $pattern;
 }
 
-sub insert_line {
+sub insert_line($$$) {
     my $self = shift;
 
     my $line = shift;
@@ -375,7 +375,7 @@
     $insert_line{$line} = $insert;
 }
 
-sub substitute_line {
+sub substitute_line($$$$) {
     my $self = shift;
 
     my $line = shift;
@@ -386,7 +386,7 @@
     $substitute_line{$line}{replace} = $replace;
 }
 
-sub replace_spec_file {
+sub replace_spec_file($$$$) {
     my $self = shift;
 
     my $module = shift;
diff --git a/tools/winapi/winapi_fixup_statements.pm b/tools/winapi/winapi_fixup_statements.pm
index 80185dc..9f538d4 100644
--- a/tools/winapi/winapi_fixup_statements.pm
+++ b/tools/winapi/winapi_fixup_statements.pm
@@ -25,7 +25,7 @@
 
 @ISA = qw(Exporter);
 @EXPORT = qw();
-@EXPORT_OK = qw(&fixup_statements);
+@EXPORT_OK = qw(fixup_statements);
 
 use config qw($wine_dir);
 use options qw($options);
@@ -33,15 +33,15 @@
 
 use c_parser;
 use winapi_module_user qw(
-    &get_message_result_kind
-    &get_message_wparam_kind
-    &get_message_lparam_kind
+    get_message_result_kind
+    get_message_wparam_kind
+    get_message_lparam_kind
 );
 
 ########################################################################
 # fixup_function_call
 
-sub fixup_function_call {
+sub fixup_function_call($$) {
     my $name = shift;
     my @arguments = @{(shift)};;
 
@@ -51,7 +51,7 @@
 ########################################################################
 # _parse_makelong
 
-sub _parse_makelong {
+sub _parse_makelong($) {
     local $_ = shift;
 
     my $low;
@@ -88,7 +88,7 @@
 ########################################################################
 # fixup_function_call_2_windowsx
 
-sub fixup_user_message_2_windowsx {
+sub fixup_user_message_2_windowsx($$) {
     my $name = shift;
     (my $hwnd, my $msg, my $wparam, my $lparam) = @{(shift)};
 
@@ -182,7 +182,7 @@
 ########################################################################
 # _get_messages
 
-sub _get_messages {
+sub _get_messages($) {
     local $_ = shift;
 
     if(/^(?:BM|CB|EM|LB|STM|WM)_\w+(.*?)$/) {
@@ -206,7 +206,7 @@
 ########################################################################
 # _fixup_user_message
 
-sub _fixup_user_message {
+sub _fixup_user_message($$) {
     my $name = shift;
     (my $hwnd, my $msg, my $wparam, my $lparam) = @{(shift)};
 
@@ -215,14 +215,14 @@
     my $wkind;
     my $lkind;
     foreach my $msg (_get_messages($msg)) {
-	my $new_wkind = &get_message_wparam_kind($msg);
+	my $new_wkind = get_message_wparam_kind($msg);
 	if(defined($wkind) && $new_wkind ne $wkind) {
 	    $output->write("messsages used together do not have the same type\n");
 	} else {
 	    $wkind = $new_wkind;
 	}
 
-	my $new_lkind = &get_message_lparam_kind($msg);
+	my $new_lkind = get_message_lparam_kind($msg);
 	if(defined($lkind) && $new_lkind ne $lkind) {
 	    $output->write("messsages used together do not have the same type\n");
 	} else {
@@ -274,7 +274,7 @@
 ########################################################################
 # fixup_statements
 
-sub fixup_statements {
+sub fixup_statements($$) {
     my $function = shift;
     my $editor = shift;
 
diff --git a/tools/winapi/winapi_module_user.pm b/tools/winapi/winapi_module_user.pm
index 7c54bf7..90b35a3 100644
--- a/tools/winapi/winapi_module_user.pm
+++ b/tools/winapi/winapi_module_user.pm
@@ -26,13 +26,13 @@
 @ISA = qw(Exporter);
 @EXPORT = qw();
 @EXPORT_OK = qw(
-    &is_user_function
-    &get_message_result_type
-    &get_message_result_kind
-    &get_message_wparam_type
-    &get_message_wparam_kind
-    &get_message_lparam_type
-    &get_message_lparam_kind
+    is_user_function
+    get_message_result_type
+    get_message_result_kind
+    get_message_wparam_type
+    get_message_wparam_kind
+    get_message_lparam_type
+    get_message_lparam_kind
 );
 
 use config qw($wine_dir);
@@ -48,7 +48,7 @@
 ########################################################################
 # is_user_function
 
-sub is_user_function {
+sub is_user_function($) {
     my $name = shift;
     if($name =~ /^(?:DefWindowProc|SendMessage)[AW]?$/) {
     }
@@ -558,7 +558,7 @@
 ########################################################################
 # _get_kind
 
-sub _get_kind {
+sub _get_kind($) {
     local $_ = shift;
 
     if(!$_) {
@@ -575,7 +575,7 @@
 ########################################################################
 # get_message_result_type
 
-sub get_message_result_type {
+sub get_message_result_type($) {
     my $name = shift;
     return $$message{$name}{result};
 }
@@ -583,14 +583,14 @@
 ########################################################################
 # get_message_result_kind
 
-sub get_message_result_kind {
+sub get_message_result_kind(@) {
     return _get_kind(get_message_result_type(@_));
 }
 
 ########################################################################
 # get_message_wparam_type
 
-sub get_message_wparam_type {
+sub get_message_wparam_type($) {
     my $name = shift;
     return $$message{$name}{wparam};
 }
@@ -598,14 +598,14 @@
 ########################################################################
 # get_message_wparam_kind
 
-sub get_message_wparam_kind {
+sub get_message_wparam_kind(@) {
     return _get_kind(get_message_wparam_type(@_));
 }
 
 ########################################################################
 # get_message_lparam_type
 
-sub get_message_lparam_type {
+sub get_message_lparam_type($) {
     my $name = shift;
     return $$message{$name}{lparam};
 }
@@ -613,14 +613,14 @@
 ########################################################################
 # get_message_lparam_kind
 
-sub get_message_lparam_kind {
+sub get_message_lparam_kind(@) {
     return _get_kind(get_message_lparam_type(@_));
 }
 
 ########################################################################
 # _parse_file
 
-sub _parse_file {
+sub _parse_file($$$) {
     my $file = shift;
     my $found_preprocessor = shift;
     my $found_comment = shift;
@@ -666,7 +666,7 @@
 ########################################################################
 # _get_tuple_arguments
 
-sub _get_tuple_arguments {
+sub _get_tuple_arguments($) {
     local $_ = shift;
 
     my $parser = new c_parser;
@@ -688,7 +688,7 @@
 # _parse_windowsx_h
 
 
-sub _parse_windowsx_h {
+sub _parse_windowsx_h($$$) {
     my $last_comment;
 
     my $found_preprocessor = sub {
@@ -867,7 +867,7 @@
 ########################################################################
 # _parse_winuser_h
 
-sub _parse_winuser_h {
+sub _parse_winuser_h($$$) {
     my %not_found = ();
 
     my $found_preprocessor = sub {
diff --git a/tools/winapi/winapi_test b/tools/winapi/winapi_test
index d3390de..8363a81 100755
--- a/tools/winapi/winapi_test
+++ b/tools/winapi/winapi_test
@@ -25,7 +25,7 @@
 }
 
 use config qw(
-    &file_type &files_skip &files_filter
+    file_type files_skip files_filter
     $current_dir $wine_dir $winapi_dir $winapi_check_dir
 );
 use output qw($output);
@@ -172,7 +172,7 @@
 my %size_kludge_reported = ("FILETIME" => 1, "LARGE_INTEGER" => 1);
 my %size_parse_reported;
 
-sub _find_align_kind_size {
+sub _find_align_kind_size($) {
     my $type_name = shift;
 
     local $_ = $type_name;
@@ -309,26 +309,26 @@
     return ($align, $kind, $size);
 }
 
-sub find_align {
+sub find_align($) {
     my $type_name = shift;
     (my $align, my $kind, my $size) = _find_align_kind_size($type_name);
     return $align;
 }
 
-sub find_kind {
+sub find_kind($) {
     my $type_name = shift;
     (my $align, my $kind, my $size) = _find_align_kind_size($type_name);
 
     return $kind;
 }
 
-sub find_size {
+sub find_size($) {
     my $type_name = shift;
     (my $align, my $kind, my $size) = _find_align_kind_size($type_name);
     return $size;
 }
 
-sub find_count {
+sub find_count($) {
     my $count = shift;
     return $defines{$count};
 }
@@ -454,7 +454,7 @@
 ########################################################################
 # output_header
 
-sub output_header {
+sub output_header($$$) {
     local *OUT = shift; 
 
     my $test_dir = shift;
@@ -595,7 +595,7 @@
 ########################################################################
 # output_footer
 
-sub output_footer {
+sub output_footer($$$) {
     local *OUT = shift; 
 
     my $test_dir = shift;
@@ -612,7 +612,7 @@
 ########################################################################
 # output_test_pack_type
 
-sub output_test_pack_type {
+sub output_test_pack_type($$$$$$) {
     local *OUT = shift;
 
     my $type_name2type = shift;
@@ -696,7 +696,8 @@
     }
 }
 
-sub output_test_pack_fields {
+sub output_test_pack_fields($$$$$$$);
+sub output_test_pack_fields($$$$$$$) {
     local *OUT = shift;
 
     my $type_name2type = shift;
@@ -745,7 +746,7 @@
 ########################################################################
 # output_test_pack
 
-sub output_test_pack {
+sub output_test_pack($$$$) {
     local *OUT = shift;
 
     my $test_dir = shift;
@@ -812,7 +813,7 @@
 ########################################################################
 # output_file
 
-sub output_file {
+sub output_file($$$$) {
     local *OUT = shift;
 
     my $test_dir = shift;