A few bug fixes.

diff --git a/tools/winapi_check/modules.pm b/tools/winapi_check/modules.pm
index 357e850..1880b49 100644
--- a/tools/winapi_check/modules.pm
+++ b/tools/winapi_check/modules.pm
@@ -14,7 +14,7 @@
 use config qw(
     &file_type &files_skip
     &file_directory
-    &get_c_files 
+    &get_c_files &get_spec_files 
     $current_dir $wine_dir
     $winapi_check_dir
 );
@@ -23,36 +23,58 @@
 
 $modules = 'modules'->new;
 
+sub get_spec_file_type {
+    my $file = shift;
+
+    my $module;
+    my $type;
+
+    open(IN, "< $file") || die "$file: $!\n";
+    local $/ = "\n";
+    while(<IN>) {
+	s/^\s*(.*?)\s*$/$1/;
+	s/^(.*?)\s*#.*$/$1/;
+	/^$/ && next;
+
+	if(/^name\s*(\S*)/) { $module = $1; }
+	if(/^type\s*(\w+)/) { $type = $1; }
+
+	if(defined($module) && defined($type)) { last; }
+    }
+    close(IN);
+
+    if(!defined($module)) {
+	$module = $file;
+	$module =~ s%^.*?([^/]+)\.spec|%$1%;
+    }
+
+    if(!defined($type)) {
+	$type = "";
+    }
+
+    return ($type, $module);
+}
+
 sub new {
     my $proto = shift;
     my $class = ref($proto) || $proto;
     my $self  = {};
     bless ($self, $class);
 
+    my $spec_files16 = \@{$self->{SPEC_FILES16}};
+    my $spec_files32 = \@{$self->{SPEC_FILES32}};
     my $dir2spec_file = \%{$self->{DIR2SPEC_FILE}};
     my $spec_file2dir = \%{$self->{SPEC_FILE2DIR}};
     my $spec_file2module = \%{$self->{SPEC_FILE2MODULE}};
+    my $module2spec_file = \%{$self->{MODULE2SPEC_FILE}};
 
     my $module_file = "$winapi_check_dir/modules.dat";
 
-    my @all_spec_files = map {
-	s/^.\/(.*)$/$1/;
-	if(file_type($_) eq "winelib") {
-	    $_;
-	} else {
-	    ();
-	}
-    } split(/\n/, `find $wine_dir -name \\*.spec`);
-
-    my %all_spec_files;
-    foreach my $file (@all_spec_files) {
-	$all_spec_files{$file}++ ;
-    }
-
     if($options->progress) {
 	$output->progress("modules.dat");
     }
 
+    my %spec_file_found;
     my $allowed_dir;
     my $spec_file;
 
@@ -65,17 +87,13 @@
 
 	if(/^%\s+(.*?)$/) {
 	    $spec_file = $1;
-	   
+
 	    if(!-f "$wine_dir/$spec_file") {
 		$output->write("modules.dat: $spec_file: file ($spec_file) doesn't exist or is no file\n");
 	    } 
 
-	    if($wine_dir eq ".") {
-		$all_spec_files{$spec_file}--;
-	    } else {
-		$all_spec_files{"$wine_dir/$spec_file"}--;
-	    }
-	    $$dir2spec_file{""}{$spec_file}++; # FIXME: Kludge
+	    $spec_file_found{$spec_file}++;
+	    $$spec_file2dir{$spec_file} = {};
 	    next;
 	} else {
 	    $allowed_dir = $1;
@@ -89,8 +107,40 @@
     }
     close(IN);
 
-    foreach my $spec_file (sort(keys(%all_spec_files))) {
-	if($all_spec_files{$spec_file} > 0) {
+    my @spec_files;
+    if($wine_dir eq ".") {
+	@spec_files = get_spec_files("winelib");
+    } else {
+	my %spec_files = ();
+	foreach my $dir ($options->directories) {
+	    $dir = "$current_dir/$dir";
+	    $dir =~ s%/\.$%%;
+	    foreach my $spec_file (sort(keys(%{$$dir2spec_file{$dir}}))) {
+		$spec_files{$spec_file}++;
+	    }
+	}
+	@spec_files = sort(keys(%spec_files));
+    }
+
+    @$spec_files16 = ();
+    @$spec_files32 = ();
+    foreach my $spec_file (@spec_files) {
+	(my $type, my $module) = get_spec_file_type("$wine_dir/$spec_file");
+
+	$$spec_file2module{$spec_file} = $module;
+	$$module2spec_file{$module} = $spec_file;
+
+	if($type eq "win16") {
+	    push @$spec_files16, $spec_file;
+	} elsif($type eq "win32") {
+	    push @$spec_files32, $spec_file;
+	} else {
+	    $output->write("$spec_file: unknown type '$type'\n");
+	}
+    }
+
+    foreach my $spec_file (@spec_files) {
+	if(!$spec_file_found{$spec_file}) {
 	    $output->write("modules.dat: $spec_file: exists but is not specified\n");
 	}
     }
@@ -146,19 +196,14 @@
     return @complete_modules;
 }
 
-sub spec_file_module {
+sub is_allowed_module {
     my $self = shift;
 
-    my $spec_file2module = \%{$self->{SPEC_FILE2MODULE}};
     my $module2spec_file = \%{$self->{MODULE2SPEC_FILE}};
 
-    my $spec_file = shift;
-    $spec_file =~ s/^\.\///;
-
     my $module = shift;
-  
-    $$spec_file2module{$spec_file} = $module;
-    $$module2spec_file{$module} = $spec_file;
+
+    return defined($$module2spec_file{$module});
 }
 
 sub is_allowed_module_in_file {
@@ -205,7 +250,9 @@
 	$allowed_modules{$module}++;
     }
 
-    return join(" & ", sort(keys(%allowed_modules)));
+    my $module = join(" & ", sort(keys(%allowed_modules)));
+
+    return $module;
 }
 
 sub allowed_dirs_for_module {
@@ -221,32 +268,20 @@
    return sort(keys(%{$$spec_file2dir{$spec_file}}));
 }
 
-sub allowed_spec_files {
+sub allowed_spec_files16 {
     my $self = shift;
 
-    my $dir2spec_file = \%{$self->{DIR2SPEC_FILE}};
+    my $spec_files16 = \@{$self->{SPEC_FILES16}};
 
-    my @dirs = map {
-	s/^\.\/(.*)$/$1/;
-	if(/^\.$/) {
-	    $current_dir;
-	} else {
-	    if($current_dir ne ".") {
-		"$current_dir/$_";
-	    } else {
-		$_;
-	    }
-	}
-    } split(/\n/, `find . -type d ! -name CVS`);
+    return @$spec_files16;
+}
 
-    my %allowed_spec_files = ();
-    foreach my $dir (sort(@dirs)) {
-	foreach my $spec_file (sort(keys(%{$$dir2spec_file{$dir}}))) {
-	    $allowed_spec_files{$spec_file}++; 
-	}
-    }
+sub allowed_spec_files32 {
+    my $self = shift;
 
-    return sort(keys(%allowed_spec_files));
+    my $spec_files32 = \@{$self->{SPEC_FILES32}};
+
+    return @$spec_files32;
 }
 
 sub found_module_in_dir {
@@ -257,6 +292,9 @@
 
     my $used_module_dirs = \%{$self->{USED_MODULE_DIRS}};
 
+    $dir = "$current_dir/$dir";
+    $dir =~ s%/\.$%%;
+
     $$used_module_dirs{$module}{$dir}++;
 }
 
@@ -264,15 +302,16 @@
     my $self = shift;
 
     my $dir2spec_file = \%{$self->{DIR2SPEC_FILE}};
-    my $spec_file2module = \%{$self->{SPEC_FILE2MODULE}};
+    my $module2spec_file = \%{$self->{MODULE2SPEC_FILE}};
     my $used_module_dirs = \%{$self->{USED_MODULE_DIRS}};
 
     my @messages;
-    foreach my $dir (sort(keys(%$dir2spec_file))) {
-	if($dir eq "") { next; }
-	foreach my $spec_file (sort(keys(%{$$dir2spec_file{$dir}}))) {
-	    my $module = $$spec_file2module{$spec_file};
+    foreach my $dir ($options->directories) {
+	$dir = "$current_dir/$dir";
+	$dir =~ s%/\.$%%;
+	foreach my $module ($self->all_modules) {
 	    if(!$$used_module_dirs{$module}{$dir}) {
+		my $spec_file = $$module2spec_file{$module};
 		push @messages, "modules.dat: $spec_file: directory ($dir) is not used\n";
 	    }
 	}