Index: /MMagic/trunk/ChangeLog
===================================================================
--- /MMagic/trunk/ChangeLog	(revision 190)
+++ /MMagic/trunk/ChangeLog	(revision 193)
@@ -1,2 +1,7 @@
+2006-01-05  Yukio USUDA  <usu@namazu.org>
+
+	* MMagic.pm (checktype_data): performance improve.
+	  http://www.namazu.org/trac-namazu/trac.cgi/ticket/8
+
 2005-08-27  NOKUBI Takatsugu  <knok@daionet.gr.jp>
 
Index: /MMagic/trunk/MMagic.pm
===================================================================
--- /MMagic/trunk/MMagic.pm	(revision 190)
+++ /MMagic/trunk/MMagic.pm	(revision 193)
@@ -679,15 +679,18 @@
 	# in BSD's version, there's an effort to search from
 	# more specific to less, but I don't do that.
-	my ($token, %val);
+	my %val;
 	foreach my $type (keys %{$self->{SPECIALS}}) {
-	    my $token = '(' . 
-	      (join '|', sort {length($a) <=> length($b)} @{$self->{SPECIALS}->{$type}})
-		. ')';
-	    my $tdata = $data;
-	    if ($tdata =~ /$token/mg) {
-		$val{$type} = pos($tdata);
+	    my $matched_pos = undef;
+	    foreach my $token (@{$self->{SPECIALS}->{$type}}){ 
+		pos($data) = 0;
+		if ($data =~ /$token/mg) {
+		    my $tmp =  pos($data);
+		    if ((! defined $matched_pos) || ($matched_pos > $tmp)) {
+			$matched_pos = $tmp;
+		    }
+		}
 	    }
-	}
-
+	    $val{$type} = $matched_pos if $matched_pos;
+	}
 	# search latest match
 	if (%val) {
@@ -696,5 +699,4 @@
 	}
 	
-      ALLDONE:
 #	$mtype = 'text/plain' if (! defined $mtype);
     }
