308 lines
7.1 KiB
Bash
308 lines
7.1 KiB
Bash
#!/bin/sh
|
|
# $Id: ocs,v 1.4 2004/06/21 18:13:21 broeker Exp $
|
|
# This utility maintains the database for cscope on a recursive dir set
|
|
# Author: donwo Tue Jun 25 15:36:39 PDT 1996
|
|
# Modified: hops Jan 2000 chg defaults to not update if files exist and force
|
|
#
|
|
# These comments ARE the manual. What more do you really need?
|
|
# if using unadorned cscope with this use cscope -d so not trash db
|
|
# cscope -L -0 <ptn> - to display ptn matches on stdout
|
|
#
|
|
# The lists of files are kept in two forms:
|
|
# TMP cscope.tmplst
|
|
# The list generated by this program
|
|
# This list will be updated each time this program
|
|
# is executed.
|
|
#
|
|
# LST cscope.lst
|
|
# The fixed list generated by some other process
|
|
# This list will be used, if found, rather than
|
|
# the TMP form generated here.
|
|
#
|
|
# CSD cscope.csd
|
|
# The fixed list generated by some other process
|
|
# This list will be used, if found, rather than
|
|
# the LST or TMP forms. CSD differs from LST in
|
|
# that the CSD list is used where the source files
|
|
# change only seldom. Cscope is requested not to
|
|
# check for changed files. This can be
|
|
# significantly faster on large source trees.
|
|
#
|
|
# INC cscope.inc
|
|
# This is a list of additional directories
|
|
# in which to search for include files.
|
|
#
|
|
# Three hierarchies of libraries are supported:
|
|
# Local In the current directory ./
|
|
# This is most useful for transient projects or
|
|
# where the information is of no use to others on
|
|
# the system. This type is NOT usable on source
|
|
# directories that are read-only.
|
|
# Home In users home directory $HOME/lib/cs/`pwd`
|
|
# This is good for items that seldom change but are
|
|
# of use only the the current user. This type is
|
|
# usable on source directories that are read-only.
|
|
# System In a global system directory $SYSDIR/`pwd`
|
|
# This is for items that are of interest to all accounts.
|
|
# This option is not available unless the system directory
|
|
# is writable by the current user. This type is usable
|
|
# on source directories that are read-only.
|
|
#
|
|
# If a shell script named ./cscope.rc is found and is
|
|
# executable, the execution of it will be included within this
|
|
# script after defaults_set/cmdline_parse and locating the
|
|
# database.
|
|
#
|
|
# Command line options:
|
|
# -x set shell debugging
|
|
# -f force
|
|
# o Do not ask about regenerating TMP. Just do it.
|
|
# o Allow cscope to regenerate libraries for CSD lists.
|
|
# -q Tell cscope to build an inverted index for quick
|
|
# symbol searching. There is a SIGNIFICANT
|
|
# increase in speed with this option however the
|
|
# disk space used is doubled. Once the quick
|
|
# database is generated, cs will detect the files
|
|
# and continue to use them.
|
|
# -d Do not regenerate. Intended for cscope sub-tasks.
|
|
# -u Update/regenerate.
|
|
|
|
#
|
|
# Here is where we put things
|
|
|
|
CSCOPE=cscope
|
|
HOMEDIR=${HOME}/lib/cs
|
|
|
|
#set the default value for SYSDIR
|
|
if [ -z "${SYSDIR}" ]; then
|
|
SYSDIR=/usr/local/lib/cs
|
|
echo setting default sysdir
|
|
fi
|
|
|
|
#check that SYSDIR exists
|
|
if [ ! -d ${SYSDIR} ]; then
|
|
echo -n $SYSDIR does not exist.
|
|
echo Please create the directory and set SYSDIR appropriately
|
|
exit
|
|
fi
|
|
|
|
# Check that cscope is in PATH
|
|
type cscope 1>/dev/null 2>&1
|
|
|
|
if [ $? -ne 0 ]
|
|
then
|
|
echo "ERROR: cscope is not in \$PATH" >&2
|
|
echo " Please set \$PATH correctly or make sure cscope is installed" >&2
|
|
exit 1
|
|
fi
|
|
|
|
# popup editor
|
|
#XCS_EDITOR=${HOME}/bin/x_cscope_editor
|
|
XCS_EDITOR=${HOME}/bin/xme
|
|
if [ -n "$DISPLAY" -a -x ${XCS_EDITOR} ]
|
|
then
|
|
EDITOR=${XCS_EDITOR}
|
|
export EDITOR
|
|
fi
|
|
unset XCS_EDITOR
|
|
|
|
#
|
|
# Misc defaults
|
|
|
|
#FORCE=N
|
|
#NOUPDATE=
|
|
FORCE=Y # hops - default to force rather than query
|
|
NOUPDATE=-d # hops - default to no update if files already exist
|
|
QUICK=
|
|
SPECDEST= # hops - query for files
|
|
|
|
#
|
|
# Parse the command line
|
|
|
|
set -- `getopt xfqdu $*`
|
|
|
|
if [ $? -ne 0 ]
|
|
then
|
|
echo "Use: cs [-x] [-f] [-q] [-u]" >&2
|
|
echo " -x debug on " >&2
|
|
echo " -q quick Index - faster search but larger index" >&2
|
|
echo " -f ask about about regeneration" >&2
|
|
echo " -d don't update database (default)" >&2
|
|
echo " -u update database" >&2
|
|
echo " -s specify where files go" >&2
|
|
exit 1
|
|
fi
|
|
|
|
for arg
|
|
do
|
|
case $arg in
|
|
-x ) set -x; shift ;;
|
|
-f ) FORCE=N; NOUPDATE=; shift;;
|
|
-q ) QUICK=-q; shift ;;
|
|
-d ) NOUPDATE=-d; shift ;;
|
|
-u ) NOUPDATE=; shift ;;
|
|
-s ) SPECDEST=Y; shift ;;
|
|
esac
|
|
done
|
|
|
|
#
|
|
# Here is the security hole. Execute whatever is needed for
|
|
# this project. A per-project setup script may be available.
|
|
|
|
[ -x ./cscope.rc ] && {
|
|
. ./cscope.rc
|
|
}
|
|
|
|
#
|
|
# We look hard for appropriate files to scope. We ignore items
|
|
# containing "SCCS" assuming that these are directories of
|
|
# source code control data.
|
|
|
|
create_list()
|
|
{
|
|
LIST=$1
|
|
|
|
if [ -f ${LIST} ]
|
|
then
|
|
[ -n "${NOUPDATE}" ] && return
|
|
|
|
if [ "${FORCE}" != "Y" ]
|
|
then
|
|
echo "\n${LIST}"
|
|
echo "Update the library? <(Y)es, (N)o, (Q)uit> [n] \c"
|
|
read x y
|
|
case $x in
|
|
[Yy]* ) ;;
|
|
[Qq]* ) exit 1 ;;
|
|
*) return ;;
|
|
esac
|
|
fi
|
|
echo "Updating library:\n ${LIST} \c"
|
|
else
|
|
echo "Creating library:\n ${LIST} \c"
|
|
fi
|
|
|
|
(
|
|
find . -follow -type f \( -name \*.[sScChHlyG] -o \
|
|
-name \*.asm -o \
|
|
-name \*.cc -o \
|
|
-name \*.cxx -o \
|
|
-name \*.ccP -o \
|
|
-name \*.hP -o \
|
|
-name \*.inc -o \
|
|
-name \*.ed -o \
|
|
-name vuifile -o \
|
|
-name Gensymvals -o \
|
|
-name \[mM\]ake\* \) \
|
|
-print
|
|
) | grep -v SCCS | sort -u > ${LIST}
|
|
|
|
echo "\n`cat ${LIST} | wc -l` files listed"
|
|
}
|
|
|
|
#
|
|
# Expand the include file list into command line arguments
|
|
|
|
exp_inc()
|
|
{
|
|
theInc=$1
|
|
|
|
if [ -s "${theInc}" ]
|
|
then
|
|
for i in `cat ${theInc}`
|
|
do
|
|
echo "-I $i \c"
|
|
done
|
|
fi
|
|
}
|
|
|
|
#
|
|
# This routine does not return to the caller
|
|
|
|
do_cscope()
|
|
{
|
|
LIST=$1
|
|
CSLIB=$2
|
|
INC=$3
|
|
shift;shift;shift
|
|
ARGS="$*"
|
|
|
|
INCARGS=`exp_inc ${INC}`
|
|
|
|
echo "exec cscope"
|
|
exec $CSCOPE ${ARGS} -p 2 ${INCARGS} -i ${LIST} -f ${CSLIB}
|
|
echo "exec of $CSCOPE failed" >&2
|
|
exit 1
|
|
}
|
|
|
|
#
|
|
# If we have existing libraries, we should use them.
|
|
std_libs()
|
|
{
|
|
DIR=$1
|
|
OUT=${DIR}/cscope.out
|
|
LST=${DIR}/cscope.lst
|
|
CSD=${DIR}/cscope.csd
|
|
TMP=${DIR}/cscope.tmplst
|
|
INC=${DIR}/cscope.inc
|
|
QCK=${DIR}/cscope.out.po
|
|
|
|
[ -s ${QCK} ] && QUICK=-q
|
|
|
|
[ -f ${CSD} ] && {
|
|
if [ "${FORCE}" = "Y" ]
|
|
then
|
|
do_cscope ${CSD} ${OUT} ${INC} ${QUICK}
|
|
else
|
|
do_cscope ${CSD} ${OUT} ${INC} ${QUICK} -d
|
|
fi
|
|
}
|
|
|
|
[ -f ${LST} ] && do_cscope ${LST} ${OUT} ${INC} ${QUICK} ${NOUPDATE}
|
|
|
|
[ -f ${TMP} ] && {
|
|
create_list ${TMP}
|
|
do_cscope ${TMP} ${OUT} ${INC} ${QUICK} ${NOUPDATE}
|
|
}
|
|
}
|
|
|
|
#
|
|
# ######## main() #######
|
|
|
|
umask 0
|
|
PWD=`pwd`
|
|
|
|
umask 02
|
|
|
|
#
|
|
# Check for existing libraries
|
|
|
|
std_libs $PWD
|
|
std_libs ${HOMEDIR}$PWD
|
|
std_libs ${SYSDIR}$PWD
|
|
|
|
#
|
|
# We may need to create one for this area
|
|
|
|
DIR=$PWD
|
|
if [ ! -n "${NOUPDATE}" -o -n "${SPECDEST}" ] ; then
|
|
echo "Create new library? <(L)ocal, (H)ome, (S)ystem, (Q)uit> [q] \c"
|
|
read x y
|
|
case $x in
|
|
[Ll]* ) DIR=$PWD ;;
|
|
[Hh]* ) DIR=${HOMEDIR}$PWD ;;
|
|
[Ss]* ) DIR=${SYSDIR}$PWD ;;
|
|
*) exit 1 ;;
|
|
esac
|
|
fi
|
|
[ -d $DIR ] || {
|
|
mkdir -p $DIR || exit $?
|
|
}
|
|
|
|
OUT=${DIR}/cscope.out
|
|
TMP=${DIR}/cscope.tmplst
|
|
INC=${DIR}/cscope.inc
|
|
|
|
create_list ${TMP}
|
|
do_cscope ${TMP} ${OUT} ${INC} ${QUICK}
|
|
|