diff options
Diffstat (limited to 'contrib/webcscope/cscope')
-rwxr-xr-x | contrib/webcscope/cscope | 446 |
1 files changed, 446 insertions, 0 deletions
diff --git a/contrib/webcscope/cscope b/contrib/webcscope/cscope new file mode 100755 index 0000000..7d98fce --- /dev/null +++ b/contrib/webcscope/cscope @@ -0,0 +1,446 @@ +#!/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 in +the 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 Databases +ENDOFTEXTB + + 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>"; + +} |