--- lib/LXR/Common.pm 2006-05-28 21:35:32.000000000 +0300 +++ /var/www/mxr/lib/LXR/Common.pm 2006-06-15 18:26:50.000000000 +0300 @@ -26,16 +26,16 @@ 'string', '"', '"', 'string', "'", "'", 'verb', '\\b(?:for|while|else|if|throw)\\b', '[\s(]', - 'verb', '\\b(?:return|true|false|void)\\b', '[\s;]', + 'verb', '\\b(?:return|true|false|void)\\b', '[\s();]', 'verb', -'^(?:function|[gs]et\s|const|var|public|protected|private|package|implements|interface|extends|final|import|static|break|next|continue|typedef|class|struct)\b', +'^(?:function|[gs]et\s|const|var|public|protected|private|package|implements|interface|extends|final|import|static|switch|case|default|break|next|continue|typedef|class|struct)\b', '\s', 'verb', '\\b(?:try|catch|finally)\\b', '[\s{(]', 'verb', -'^#(?:if|ifn?def|else|elsif|define|endif|pragma|warn)\b', +'^#\\s*(?:if|(?:ifn?|un)def|else|elsif|define|endif|pragma|warn)\\b', '(?:\s|$)', - 'include', '#include\\b', '[\r\n]', - 'include', '#import\\b', '[\r\n]'); + 'include', '#\\s*include\\b', '[\r\n\b]', + 'include', '#\\s*import\\b', '[\r\n]'); @pterm = ('atom', '\\\\.', '', 'atom', '(?:[\$\@\&\%])', '\\W', @@ -62,9 +62,9 @@ @tterm = ('atom', '\\\\.', '', 'comment', '\[\%#', '\%\]', - 'include', 'PROCESS', '\%\]|\s$', - 'include', 'INCLUDE', '\%\]|\s$', - 'use', 'USE', '\%\]', + 'include', '\\bPROCESS\\b', '\%\]|\s$', + 'include', '\\bINCLUDE\\b', '\%\]|\s$', + 'use', '\\bUSE\\b', '\%\]', 'string', '"', '"', 'string', "'", "'" ); @@ -290,50 +290,92 @@ } } +my @file_listing; +my $file_iterator; +my $file_length; + +sub getnext_fileentry{ + unless (defined @file_listing) + { + my $indexname = $indexname || $Conf->dbdir."/.glimpse_filenames"; + $sourceroot = $sourceroot || $Conf->sourceroot; + + return undef unless open(FILELLISTING,$indexname); + $file_length = ; + @file_listing = (); + } + if ($file_iterator == $file_length) { + close FILELLISTING; + return undef; + } + my $fileentry; + if ($file_iterator == scalar @file_listing) { + $fileentry = ; + chomp $fileentry; + $fileentry =~ s/^$sourceroot//; + $fileentry =~ s/\n//; + push @file_listing, $fileentry; + } + return $file_listing{$file_iterator++}; +} + sub filelookup{ my ($filename,$bestguess,$prettyname)=@_; $prettyname = $filename unless defined $prettyname; my $idlfile; $idlfile = $1 if ($filename =~ /(^.*)\.h$/); return &fileref($prettyname, $bestguess) if -e $Conf->sourceroot.$bestguess; - my ($pfile_ref,$gfile_ref,$ifile_ref,$jfile_ref,$loosefile,$p,$g,$i,$j); + my $baseurl = $Conf->{virtroot}; # &baseurl; + my ($pfile_ref,$gfile_ref,$ifile_ref,$jfile_ref,$kfile_ref,$loosefile,$basefile,$p,$g,$i,$j,$k); + $filename =~ s|([(){}^\$.*?\&\@\\+])|\\$1|g; if ($filename =~ m|/|) { - $loosefile = $filename; + $basefile = $loosefile = $filename; + $basefile =~ s|^.*/|/|g; $loosefile =~ s|/|/.*/|g; } - $indexname = $indexname || $Conf->dbdir."/.glimpse_filenames"; - if (open(FILELLISTING,$indexname)) { - $sourceroot = $sourceroot || $Conf->sourceroot; - while ($fileentry = ) { - chomp $fileentry; - $fileentry =~ s/^$sourceroot//; - $fileentry =~ s/\n//; - if ($fileentry =~ m|\Q/$bestguess\E|i) { - $pfile_ref=&fileref($prettyname, $fileentry); - $p++; - } elsif ($fileentry =~ m|\Q/$filename\E|i) { - $gfile_ref=&fileref($prettyname, $fileentry); - $g++; - } elsif ($idlfile && $fileentry =~ m|\Q/$idlfile.idl\E|i) { - $ifile_ref=&fileref($prettyname, $fileentry); - $i++; - } elsif ($loosefile && $fileentry =~ m|$loosefile|i) { - $jfile_ref=&fileref($prettyname, $fileentry); - $j++; - } - } + $filename = '/' . $filename . '$'; + $file_iterator = 0; + while ($fileentry = &getnext_fileentry) { + if ($fileentry =~ m|/\Q$bestguess\E$|i) { + $pfile_ref=&fileref($prettyname, $fileentry); + $p++; + } + if ($fileentry =~ m|$filename|i) { + $gfile_ref=&fileref($prettyname, $fileentry); + $g++; + } + if ($idlfile && $fileentry =~ m|/\Q$idlfile.idl\E$|i) { + $ifile_ref=&fileref($prettyname, $fileentry); + $i++; + } + if ($loosefile && $fileentry =~ m|$loosefile|i) { + $jfile_ref=&fileref($prettyname, $fileentry); + $j++; + } + if ($basefile && $fileentry =~ m|$basefile$|i) { + $kfile_ref=&fileref($prettyname, $fileentry); + $k++; + } # Short circuiting: # If there's more than one idl file then just give a find for all stems # If there's an idl file and a header file then just give a find for all stems - return "$prettyname" if ($p || $g || $i > 1) && $i; + return "$prettyname" if ($p || $g || $i > 1) && $i; } return $pfile_ref if $p == 1; - return $gfile_ref if $p == 0 && $g == 1; - return $ifile_ref if $p == 0 && $g == 0 && $i == 1; - return $jfile_ref if $p == 0 && $g == 0 && $i == 0 && $j == 1; - return "$prettyname" if $i; - return "$prettyname" if $p || $g || !$loosefile; - return "$prettyname"; + if ($p == 0) { + return $gfile_ref if $g == 1; + if ($g == 0) { + return $ifile_ref if $i == 1; + if ($i == 0) { + return $jfile_ref if $j == 1; + return $kfile_ref if $j == 0 && $k == 1; + } + } + } + return "$prettyname" if $i; + return "$prettyname" if $p || $g || !$loosefile; + return "$prettyname" if $j; + return "$prettyname"; } sub notvcalled { @@ -410,9 +452,9 @@ } elsif ($btype eq 'include') { # Include directive if ($frag =~ s#\0(<)(.*?)\0(>)# - $1. + '<'. &filelookup($2, $Conf->mappath($Conf->incprefix.'/'.$2)). - $3#e) { + '>'#e) { } else { my ($inc_head, $inc_file, $inc_tail, $prettyfile); if ($frag =~ s#(\s*[\"\'])(.*?)([\"\'])# @@ -429,7 +471,7 @@ &filelookup($inc_file, $virtp.$inc_file,$prettyfile)#e; } $frag =~ s/('[^'+]*)\+(.*?')/$1\%2b$2/ while $frag =~ /(?:'[^'+]*)\+(?:.*?')/; - $frag =~ s|(\S+)|$1|; + $frag =~ s|(#?\s*[^\s"'<]+)|$1|; } elsif ($btype eq 'use') { # perl use directive $frag =~ s#(use|USE)(\s+)([^\s;]*)#$1$2$3#; @@ -540,20 +582,53 @@ sub fixpaths { - $Path->{'virtf'} = '/'.shift; + my $virtf = '/'.shift; $Path->{'root'} = $Conf->sourceroot; - while ($Path->{'virtf'} =~ s#/[^/]+/\.\./#/#g) { + while ($virtf =~ s#/[^/]+/\.\./#/#g) { } - $Path->{'virtf'} =~ s#/\.\./#/#g; + $virtf =~ s#/\.\./#/#g; - $Path->{'virtf'} .= '/' if (-d $Path->{'root'}.$Path->{'virtf'}); - $Path->{'virtf'} =~ s#//+#/#g; + $virtf .= '/' if (-d $Path->{'root'}.$virtf); + $virtf =~ s#//+#/#g; - ($Path->{'virt'}, $Path->{'file'}) = $Path->{'virtf'} =~ m#^(.*/)([^/]*)$#; + my ($virt, $file) = $virtf =~ m#^(.*/)([^/]*)$#; + ($Path->{'virtf'}, $Path->{'virt'}, $Path->{'file'}) = ($virtf, $virt, $file); + + my $real = $Path->{'real'} = $Path->{'root'}.$virt; + my $realf = $Path->{'realf'} = $Path->{'root'}.$virtf; - $Path->{'real'} = $Path->{'root'}.$Path->{'virt'}; - $Path->{'realf'} = $Path->{'root'}.$Path->{'virtf'}; + my $svndirprop = $real . ".svn/dir-wcprops"; + if (-f $svndirprop) { + if (open (SVN, $svndirprop)) + { + my $svnpath; + $svnpath = while $svnpath !~ /^V \d+$/; + $svnpath = ; + $svnpath =~ m|^/svn/([^/]*)/!svn/ver/\d+/(.*)|; + my $svntree = $1; + $svnpath = $2; + $svnpath =~ s/[\n\r]//g; + + $Path->{'svnvirt'} = $svnpath; + $Path->{'svntree'} = $svntree; + close SVN; + } + } + my $svnentries = $real . ".svn/entries"; + if (-f $svnentries) { + if (open (SVN, $svnentries)) + { + my $svnrepo; + while ($svnrepo = ) { + if ($svnrepo =~ /repos="(.*)"/) { + $Path->{'svnrepo'} = $1; + last; + } + } + close SVN; + } + } @pathelem = $Path->{'virtf'} =~ /([^\/]+$|[^\/]+\/)/g; @@ -573,7 +648,7 @@ unshift(@pathelem, $Conf->sourcerootname.'/'); unshift(@addrelem, $fix); - foreach (0..$#pathelem) { + foreach (1..$#pathelem) { if (defined($addrelem[$_])) { # jwz: put a space after each / in the banner so that it's possible @@ -826,6 +901,18 @@ return urlpath(); } +sub filename { + return url_quote ($Path->{'file'}); +} + +sub virtfold { + return url_quote ($Path->{'svnvirt'}); +} + +sub virttree { + return url_quote ($Path->{'svntree'}); +} + sub treename { return $Conf->{'treename'}; } @@ -1093,6 +1180,15 @@ ('dotdoturl', \&dotdoturl), ('thisurl', \&thisurl), ('pathname', \&pathname), + ('filename', \&filename), + ('virtfold', \&virtfold), + ('virttree', \&virttree), + ('beginbonsai', \&Local::beginbonsai), + ('endbonsai', \&Local::endbonsai), + ('begintrac', \&Local::begintrac), + ('endtrac', \&Local::endtrac), + ('beginviewcvs', \&Local::beginviewcvs), + ('endviewcvs', \&Local::endviewcvs), ('urlpath', \&urlpath), ('treename', \&treename), ('modes', \&modeexpand), @@ -1160,7 +1256,8 @@ sub url_quote { my($toencode) = (@_); - $toencode=~s/([^a-zA-Z0-9_\-.])/uc sprintf("%%%02x",ord($1))/eg; +# don't escape / + $toencode=~s|([^a-zA-Z0-9_/\-.])|uc sprintf("%%%02x",ord($1))|eg; return $toencode; }