big speedup
Dave Mitchell [Tue, 22 May 2001 22:08:09 +0000 (23:08 +0100)]
Message-Id: <200105222108.WAA09442@gizmo.fdgroup.co.uk>

p4raw-id: //depot/perl@10182

emacs/e2ctags.pl

index ef7a8d8..34e3e14 100644 (file)
@@ -16,6 +16,7 @@ use strict;
 my $filename;
 my ($tag,$line_no,$line);
 my %tags = ();
+my %filetags = ();
 my %files = ();
 my @lines = ();
 
@@ -34,21 +35,17 @@ while (<>) {
   next if /struct/;
   if (/\x01/) {
     ($tag,$line_no) = /\x7F(\w+)\x01(\d+)/;
-    next unless $tag;
-    ##Take only the first entry per tag
-    next if defined($tags{$tag});
-    $tags{$tag}{FILE} = $filename;
-    $tags{$tag}{LINE_NO} = $line_no;
   }
   else {
     tr/(//d;
     ($tag,$line_no) = /(\w+)\s*\x7F(\d+),/;
-    next unless $tag;
-    ##Take only the first entry per tag
-    next if defined($tags{$tag});
-    $tags{$tag}{FILE} = $filename;
-    $tags{$tag}{LINE_NO} = $line_no;
   }
+  next unless $tag;
+  ##Take only the first entry per tag
+  next if defined($tags{$tag});
+  $tags{$tag}{FILE} = $filename;
+  $tags{$tag}{LINE_NO} = $line_no;
+  push @{$filetags{$filename}}, $tag;
 }
 
 foreach $filename (keys %files) {
@@ -56,8 +53,7 @@ foreach $filename (keys %files) {
   @lines = <FILE>;
   close FILE;
   chomp @lines;
-  foreach $tag ( keys %tags ) {
-    next unless $filename eq $tags{$tag}{FILE};
+  foreach $tag ( @{$filetags{$filename}} ) {
     $line = $lines[$tags{$tag}{LINE_NO}-1];
     if (length($line) >= 50) {
       $line = substr($line,0,50);