📄 cscope
字号:
#!/bin/perl# $Id: cscope,v 1.1 2001/06/29 14:20:16 petr Exp $## WebCscope: A web interface to the cscope application# Copyright (C) 2001, Ragho Mahalingam <ragho@mahalingam.com>## This program is free software; you can redistribute it and/or# modify it under the terms of the GNU Lesser General Public# License as published by the Free Software Foundation; either# version 2.1 of the License, or (at your option) any later version.# # This program is distributed in the hope that it will be useful,# but WITHOUT ANY WARRANTY; without even the implied warranty of# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU# General Public License for more details.# # You should have received a copy of the GNU General Public# License along with this program; if not, write to the Free Software# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA## Change History:# # $Log: cscope,v $# Revision 1.1 2001/06/29 14:20:16 petr# Added webcscope to contribs.## Revision 1.3.4.1 2001/02/05 15:14:34 rmahalin# initial release with some bug fixes## Revision 1.3.3.1 2001/01/22 22:21:23 rmahalin# added multi-database support# fixed cookie support for trivial functions; removed global trivials# added syntax highlighting for files displayed on browser## Revision 1.3.1.1 2001/01/11 22:17:30 rmahalin# added direct download with mime-type 'text/c-source' and made cosmetic changes## Revision 1.3 2001/01/11 21:36:39 rmahalin# *** empty log message ***## Revision 1.2 2001/01/11 21:34:13 rmahalin# incorporated draft feedback changes## Revision 1.1 2001/01/11 21:19:32 rmahalin# Initial revision#require "cgi-lib.pl";# current code version being used$version = "iSOS 2.5/int16";# full path to the cscope binary$cscopecmd = "/usr/global/bin/cscope";# cscope working directory, where all the in/out and db files are stored$cscopedir = "/usr/local/cscope";# trivial functions not to display, one per line in the trivs file$trivs = "/usr/local/htdocs/cscope/trivials";# temporary storage directory$tmpdir = "/tmp";$tmpinfile = $tmpdir . "/cscopein.$$";$tmpoutfile = $tmpdir . "/cscopeout.$$";$showfile = $tmpdir . "/showfile.$$";# C syntax highlighting application or uncomment the line beneath to just cat#$hiliter = "/bin/cat";$hiliter = "/usr/local/cgi-bin/cscope/hilite";($sec,$min,$hour,$mday,$mon,$year,$wday,$yday) = gmtime(time+1000000);$cookie_exp = sprintf("%s %02d-%s-%s %02d:%02d:%02d GMT", $wday, $mday, $mon, $year, $hour, $min, $sec);# standard images, from the apache distribution$img{openfile} = "/icons/folder.gif";$img{downloadfile} = "/icons/folder.open.gif";$img{csymbol} = "/icons/c.gif";$img{upfunc} = "/icons/up.gif";$img{downfunc} = "/icons/down.gif";$img{globalfunc} = "/icons/world2.gif";$img{trashfunc} = "/icons/bomb.gif";$img{untrashfunc} = "/icons/back.gif";$img{back} = "/icons/left.gif";# feedback details$comment{name} = "Ragho Mahalingam";$comment{email} = "ragho\@mahalingam.com";# operations allowed@oper = ( "Find this C symbol","Find this global symbol","Find functions called by","Find functions calling","Find this text string","---------------------","Find this egrep pattern","Find this file","Find files #including this file" );# -- removed global trivial function list in favor of customized trivials#open(TRIVIAL_FUNC, $trivs);#@trivial = <TRIVIAL_FUNC>;#close(TRIVIAL_FUNC);@trivial = ();MAIN:{ $starttime = time; if (&ReadParse(*input)) { &ProcessCookie; &ProcessForm; } else { &PrintForm; }}sub ProcessCookie { if ( defined $ENV{HTTP_COOKIE} ) { ($var, $val) = split('=',$ENV{HTTP_COOKIE}); $Cookie{$var} = $val; if ( defined $Cookie{'cs-trivf'} ) { # do nothing, else initialize it to null } else { $Cookie{'cs-trivf'} = "defined"; } @loc_trivial = split(',', $Cookie{'cs-trivf'}); @trivial = ( @loc_trivial ); }}sub ProcessTrashForm { if ( defined $input{'trash'} ) { @trivial = (@trivial, $input{'func'}); } else { @tmptriv = (); for ($i=0; $i <= $#trivial; $i++) { $fhash = unpack('H*', $input{'func'}); $thash = unpack('H*', $trivial[$i]); if ( $fhash != $thash ) { @tmptriv = ( @tmptriv, $trivial[$i] ); } } @trivial = @tmptriv; } $Cookie{'cs-trivf'} = join(',',@trivial); print "Content-type: text/html\n"; print "Set-Cookie: cs-trivf=$Cookie{'cs-trivf'}; path=$ENV{SCRIPT_NAME}; expires $cookie_exp\n\n"; print &HtmlTop("Your WebCScope Trivial Functions"); print "<ul>"; for ($i=0; $i <= $#trivial; $i++) { print "<li><a href=\"$ENV{SCRIPT_NAME}?untrash=&func=$trivial[$i]\"><img src=$img{untrashfunc} border=0></a> $trivial[$i]"; } print "</ul><hr>\n"; print "Click <a href=\"#\" onClick=\"history.back();\"><img src=$img{back} border=0></a> to go back.\n"; print &HtmlBot;}sub ProcessForm { chdir $cscopedir; opendir(DIRLIST,$cscopedir); @dirlist = readdir(DIRLIST); closedir(DIRLIST); if ( $input{'db'} eq "all" ) { @csdirs = (); for ($i=0; $i <= $#dirlist; $i++ ) { if ( ($dirlist[$i] ne ".") && ($dirlist[$i] ne "..") && ( -d $dirlist[$i] ) ) { @csdirs = ( @csdirs, $dirlist[$i] ); } } } else { @csdirs = ( $input{'db'} ); } $op = $input{'op'}; $arg = $input{'arg'}; $shtriv = $input{'triv'}; $db = $input{'db'}; if ( defined $input{'fshow'} ) { &ShowFileForm; exit; } if ( defined $input{'load'} ) { &DownloadFileForm; exit; } if ( (defined $input{'trash'}) || (defined $input{'untrash'}) ) { &ProcessTrashForm; exit; } print &PrintHeader; print &HtmlTop ("WebCscope"); print <<ENDOFHDR;<h3>Instructions</h3><p><ul><li><img src=$img{csymbol}> will find a symbol with this name<br><li><img src=$img{upfunc}> will find functions <i>calling</i> this function<br><li><img src=$img{downfunc}> will find functions <i>called</i> by this function<br><li><img src=$img{globalfunc}> will locate a global definition of this name<br><li><img src=$img{openfile}> will display this file and highlight the fragment line<br><li><img src=$img{downloadfile}> will download this file with mimetype "text/c-source"<br><li><img src=$img{trashfunc}> will add this symbol/function to your trivial list<br></ul><p><hr>ENDOFHDR foreach $index ( 0 .. $#csdirs ) { unlink $tmpinfile, $tmpoutfile; open(CSCOPEIN, ">$tmpinfile"); print CSCOPEIN "$op$arg\n"; print CSCOPEIN "exit\n"; close(CSCOPEIN); $dbdir = $cscopedir . "/" . $csdirs[$index]; chdir($dbdir); $syscmd = "cd $dbdir; $cscopecmd -d -l < $tmpinfile > $tmpoutfile;"; system($syscmd); $count = 1; open(CSCOPEIN, "$tmpoutfile"); $line = <CSCOPEIN>; @temp = split(' ',$line); $numresult = $temp[2]; print <<ENDOFHDRs;<h2>Search Results from <b>$csdirs[$index]</b></h2><font size=+1>$oper[$op]: <b>$arg</b></font><br>Matches: $numresult<p><table border=1 cellpadding=2 cellspacing=2><tr><td><b>Num</b></td><td><b>File</b></td><td><b>Function</b></td><td><b>Line</b></td><td><b>Fragment</b></td></tr>ENDOFHDRs $trivs_rm = 0; for ($i=0; $i < $numresult; $i++ ) { $line = <CSCOPEIN>; @fields = split(' ',$line); $file = shift @fields; $fshowfile = $file; $func = shift @fields; $lnum = shift @fields; @filef = split('/',$file); $file = $filef[$#filef]; $frag = join(' ',@fields); if ( ! $shtriv ) { for ( $j=0; $j <= $#trivial; $j++ ) { $fhash = unpack('H*', $func); $thash = unpack('H*', $trivial[$j]); if ( $fhash == $thash ) { $trivs_rm++; goto done; } } } if ( $func ne "<global>" && $func ne "<unknown>" ) { print <<ENDOFBODY1;<tr><td>$count</td><td><a href="$ENV{SCRIPT_NAME}?fshow=1&fshowfile=$fshowfile&line=$lnum&db=$db"><img src=$img{openfile} border=0></a> $file <a href="$ENV{SCRIPT_NAME}?load=1&file=$fshowfile&db=$db"><img src=$img{downloadfile} border=0></a></td><td><a href="$ENV{SCRIPT_NAME}?op=0&triv=$shtriv&arg=$func&db=$db"><img src=$img{csymbol} border=0></a><a href="$ENV{SCRIPT_NAME}?op=3&triv=$shtriv&arg=$func&db=$db"><img src=$img{upfunc} border=0></a>$func<a href="$ENV{SCRIPT_NAME}?op=2&triv=$shtriv&arg=$func&db=$db"><img src=$img{downfunc} border=0></a><a href="$ENV{SCRIPT_NAME}?op=1&triv=$shtriv&arg=$func&db=$db"><img src=$img{globalfunc} border=0></a><a href="$ENV{SCRIPT_NAME}?trash=&func=$func&db=$db"><img src=$img{trashfunc} border=0></a></td><td>$lnum</td><td>$frag</td></tr>ENDOFBODY1} else { $func =~ tr/<>/[]/; print <<ENDOFBODY2;<tr><td>$count</td><td><a href="$ENV{SCRIPT_NAME}?fshow=1&fshowfile=$fshowfile&line=$lnum&db=$db"><img src=$img{openfile} border=0></a> $file <a href="$ENV{SCRIPT_NAME}?load=1&file=$fshowfile&db=$db"><img src=$img{downloadfile} border=0></a></td><td>$func</td><td>$lnum</td><td><$frag</td></tr>ENDOFBODY2} $count++;done: } close(CSCOPEIN); print "</table>\n"; print "<br>Eliminated $trivs_rm line item(s) as trivial functions<p><hr>\n"; unlink $tmpinfile, $tmpoutfile;} print &OperationTime; print &Feedback; print &HtmlBot;}sub DownloadFileForm { $file = $input{'file'}; print "Content-type: text/c-source\n\n"; open(SHOWFILE, $file); while (<SHOWFILE>) { print; } close(SHOWFILE);}sub ShowFileForm { $file = $input{'fshowfile'}; $lnum = $input{'line'}; print &PrintHeader; print &HtmlTop ("WebCscope"); print "<b>Note</b>: Click <a href=#ref><img src=$img{downfunc} border=0></a> to go to the reference line<p><hr>\n"; print "<hr>"; unlink $showfile; system("$hiliter $file > $showfile"); open(SHOWFILE, $showfile); $curline = 1; while ( <SHOWFILE> ) { $line = $_; if ( $curline == $lnum ) { print "<a name=ref><blink>$line</blink>"; } else { print $line; } $curline++; } close (SHOWFILE); print &OperationTime; print &Feedback; print &HtmlBot;}sub PrintForm { chdir $cscopedir; opendir(DIRLIST,$cscopedir); @dirlist = readdir(DIRLIST); closedir(DIRLIST); @csdirs = (); for ($i=0; $i <= $#dirlist; $i++ ) { if ( ($dirlist[$i] ne ".") && ($dirlist[$i] ne "..") && ( -d $dirlist[$i] ) ) { @csdirs = ( @csdirs, $dirlist[$i] ); } } print &PrintHeader; print &HtmlTop ("Web-CScope"); print <<ENDOFTEXTA;Select an operation below and enter a symbol, function or text to search inthe database. The active version is $version. Input is case-sensitive,so if your search returns no results, check the case and the symbol name.<hr><form method="get" action="$ENV{SCRIPT_NAME}"><table border=0 cellpadding=2 cellspacing=2><tr><td>Operation:</td><td><select name="op">ENDOFTEXTA foreach $opi ( 0 .. $#oper ) { print "<option value=$opi>$oper[$opi]"; } print <<ENDOFTEXTB;</select></td></tr><tr><td>CScope Database:</td><td><select name="db"> <option selected value="all">All DatabasesENDOFTEXTB for ($i=0; $i <= $#csdirs; $i++) { print " <option value=\"$csdirs[$i]\">$csdirs[$i]\n"; } print <<ENDOFTEXT2;</select><tr><td>Symbol, function or text:</td><td><input name="arg" size=30></td></tr><tr><td></td><td halign=center>Show trivial functions: <input type=radio name="triv" value=1>Yes<input type=radio name="triv" value=0 checked>No<br><br><input type="submit" value="Scope It!"></td></tr></table><hr></form>ENDOFTEXT2 print &Feedback; print &HtmlBot;}sub Feedback { $feedback = "<font size=-1>"; $feedback .= '$Id: cscope,v 1.1 2001/06/29 14:20:16 petr Exp $<br>'; $feedback .= "$comment{name}<i><"; $feedback .= "<a href=\"mailto:$comment{email}\">"; $feedback .= "$comment{email}</a>></i></font>"; return $feedback;}sub OperationTime { $deltime = time - $starttime; return "Operation took $deltime second(s)<br>";}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -