Yet another major reorganization and a few new features.

diff --git a/tools/winapi/winapi_extract b/tools/winapi/winapi_extract
index de72ae0..c93c1e2 100755
--- a/tools/winapi/winapi_extract
+++ b/tools/winapi/winapi_extract
@@ -15,40 +15,12 @@
 );
 use modules;
 use nativeapi;
-use output;
+use output qw($output);
 use options;
 use winapi;
 use winapi_function;
 use winapi_parser;
-
-my $output = 'output'->new;
-
-my %options_long = (
-    "debug" => { default => 0, description => "debug mode" },
-    "help" => { default => 0, description => "help mode" },
-    "verbose" => { default => 0, description => "verbose mode" },
-
-    "progress" => { default => 1, description => "show progress" },
-
-    "win16" => { default => 1, description => "Win16 extraction" },
-    "win32" => { default => 1, description => "Win32 extraction" },
-
-    "local" =>  { default => 1, description => "local extraction" },
-    "global" => { default => 1, description => "global extraction" },
-
-    "spec-files" => { default => 1, parent => "global", description => "spec files extraction" },
-    "stub-statistics" => { default => 0, parent => "global", description => "stub statistics" },
-);
-
-my %options_short = (
-    "d" => "debug",
-    "?" => "help",
-    "v" => "verbose"
-);
-
-my $options_usage = "usage: winapi_extract [--help] [<files>]\n";
-
-my $options = 'options'->new(\%options_long, \%options_short, $options_usage);
+use winapi_extract_options qw($options);
 
 my %module2spec_file;
 my %module2type;
@@ -104,7 +76,6 @@
     my $return_type = $function->return_type;
     my $linkage = $function->linkage;
     my $internal_name = $function->internal_name;
-    my @argument_types = @{$function->argument_types};
 
     if($linkage eq "static") {
 	return;
@@ -203,14 +174,11 @@
 	my $return_type = $function->return_type;
 	my $calling_convention = $function->calling_convention;
 	my $internal_name = $function->internal_name;
-	my @argument_types = @{$function->argument_types};
-	my @argument_names = @{$function->argument_names};
-	my @argument_documentations = @{$function->argument_documentations};
 	my $statements = $function->statements;
 
 	$functions{$internal_name} = $function;
 
-	$output->prefix("$file: " . $function->prefix);
+	$output->prefix_callback(sub { return $function->prefix; });
 
 	if($options->spec_files) {
 	    documentation_specifications($function);
@@ -228,7 +196,7 @@
 	my $argument = shift;
     };
 
-    winapi_parser::parse_c_file $options, $output, $file, $found_function, $found_preprocessor;
+    &winapi_parser::parse_c_file($options, $file, $found_function, $found_preprocessor);
 
     my @internal_names = keys(%functions);
     if($#internal_names < 0) {
@@ -247,18 +215,23 @@
 
     my $return_kind;
     my $calling_convention;
-    my @argument_kinds;
+    my $refargument_kinds;
     if($type eq "win16") {
 	$return_kind = $function->return_kind16 || "undef";
 	$calling_convention = $function->calling_convention16 || "undef";
-	@argument_kinds = map { $_ || "undef"; } @{$function->argument_kinds16};
+	$refargument_kinds = $function->argument_kinds16;
     } elsif($type eq "win32") {
 	$return_kind = $function->return_kind32 || "undef";
 	$calling_convention = $function->calling_convention32 || "undef";
-	@argument_kinds = map { $_ || "undef"; } @{$function->argument_kinds32};
+	$refargument_kinds = $function->argument_kinds32;
     }
 
-    print OUT "$ordinal $calling_convention $external_name(@argument_kinds) $internal_name\n";
+    if(defined($refargument_kinds)) {
+	my @argument_kinds = map { $_ || "undef"; } @$refargument_kinds;
+	print OUT "$ordinal $calling_convention $external_name(@argument_kinds) $internal_name\n";
+    } else {
+	print OUT "$ordinal $calling_convention $external_name() $internal_name # FIXME: arguments undefined\n";
+    }
 }
 
 if($options->spec_files) {