DXR is a code search and navigation tool aimed at making sense of large projects. It supports full-text and regex searches as well as structural queries.

Mercurial (920bcf17a9e1)

VCS Links

Line Code
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154
#!/bin/bash
#
# ***** BEGIN LICENSE BLOCK *****
# Version: MPL 1.1/GPL 2.0/LGPL 2.1
#
# The contents of this file are subject to the Mozilla Public License Version
# 1.1 (the "License"); you may not use this file except in compliance with
# the License. You may obtain a copy of the License at
# http://www.mozilla.org/MPL/
#
# Software distributed under the License is distributed on an "AS IS" basis,
# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
# for the specific language governing rights and limitations under the
# License.
#
# The Original Code is uuidgrep.bash code, released
# Nov 26, 2002.
#
# The Initial Developer of the Original Code is
# Netscape Communications Corporation.
# Portions created by the Initial Developer are Copyright (C) 2002
# the Initial Developer. All Rights Reserved.
#
# Contributor(s):
#   Garrett Arch Blythe, 26-November-2002
#
# Alternatively, the contents of this file may be used under the terms of
# either the GNU General Public License Version 2 or later (the "GPL"), or
# the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
# in which case the provisions of the GPL or the LGPL are applicable instead
# of those above. If you wish to allow use of your version of this file only
# under the terms of either the GPL or the LGPL, and not to allow others to
# use your version of this file under the terms of the MPL, indicate your
# decision by deleting the provisions above and replace them with the notice
# and other provisions required by the GPL or the LGPL. If you do not delete
# the provisions above, a recipient may use your version of this file under
# the terms of any one of the MPL, the GPL or the LGPL.
#
# ***** END LICENSE BLOCK *****

#
# This file is meant to be run from the parent directory of the
#  source tree.
# It does some fairly brain dead grepping to determine where
#  uuids are defined, and where they may be refereced.
#
# A report is generated in the end, which could be saved.
# There are two sections to the report, on one usage and one on
#  definitions.
#
# One day a stronger tool will likely be written, but this is a start
#  on reporting source dependencies on uuids.
#


# Place to store stuff.
MYTMPDIR=`mktemp -d /tmp/deps.tmp.XXXXXXXX`

# What we are matching on.
# If you want only CIDs, or IIDs, change.
SEARCHING4="[~#]*NS_DEFINE_[CI]ID[:space:]*(.*,.*)[:space:]*;"

# Find the source files.
# Exclude the dist directory to find the headers in their natural dirs.
ALLSOURCEFILES=$MYTMPDIR/allsources.txt
find . -type f -and \( -name \*.cpp -or -name \*.c -or -name \*.h \) > $ALLSOURCEFILES

# Go through the sources and find what we want.
# Assuming it is all on one line....
export IDMATCHFILE=$MYTMPDIR/idmatches.txt
xargs -l grep -Hn $SEARCHING4 < $ALLSOURCEFILES > $IDMATCHFILE

# Separate the variable names out of the matches.
# We have the possibility here of having duplicates with differing names
#  or of having different CIDs with the same names here, but this is as
#  good as it gets for now.
VARNAMESFILE=$MYTMPDIR/varnames.txt
sed "{ s/.*://; s/\/\/.*//; s/\/\*.*\*\///; s/.*(//; s/[#,].*//; s/ *//; }" < $IDMATCHFILE | grep -v \^\$ | sort | uniq > $VARNAMESFILE

# Create a file that has states which variable were defined where.
# This also helps with identification of duplicate names
export DEFINITIONFILE=$MYTMPDIR/definevars.txt
testdefinition () {
    FILENAMES=`grep $0 $IDMATCHFILE | sed s/:.*//`
    if [ "" != "$FILENAMES" ]; then
	echo $0:$FILENAMES
    fi
}
export -f testdefinition
xargs -l bash -c testdefinition < $VARNAMESFILE > $DEFINITIONFILE
export -n testdefinition

# Find all sources which use variable names.
# This will imply which libraries use the IDs, subsequently linking with said
#  library would cause a dependency.
# This is an inferior matching method compared to actually looking at the
#  symbols in resultant binaries.
export GREPVARMATCHFILE=$MYTMPDIR/grepvarmatches.txt
xargs -l grep -F -Hn --file=$VARNAMESFILE < $ALLSOURCEFILES > $GREPVARMATCHFILE

# Make a variable match file that is more readable.
# Basically, remove the actual code and leave only varaible to file mapping.
export VARMATCHFILE=$MYTMPDIR/usevars.txt
testvarname () {
    grep $0 $GREPVARMATCHFILE | sed s/:.*$0.*/:$0/
}
export -f testvarname
xargs -l bash -c testvarname < $VARNAMESFILE | sort | uniq > $VARMATCHFILE
export -n testvarname

# Make a file which only contains filenames that use variables.
LISTUSERFILES=$MYTMPDIR/listuserfiles.txt
stripfname() {
    THEFNAME=`echo $0 | sed s/:.*//`
    echo $THEFNAME
}
export -f stripfname
xargs -l bash -c stripfname < $VARMATCHFILE | sort | uniq > $LISTUSERFILES
export -n stripfname

# Output a delimiter.
# Output a list of files that use the vars.
# With each file, output the variable names.
echo -e \*\*\* DELIMITER \*\*\*  FILE depends on ID\\n
listusers() {
    echo -e $0 depends on:
    SYMBOLS=`grep $0 $VARMATCHFILE | sed s/.*://`
    for symbol in $SYMBOLS; do
	echo -e \\t$symbol
    done
    echo -e \\n
}
export -f listusers
xargs -l bash -c listusers < $LISTUSERFILES
export -n listusers

# Output a delimiter.
# Output a list of variables.
# With each variable, output the files which defined them.
echo -e \*\*\* DELIMITER \*\*\*  ID defined in FILE\\n
listdefs() {
    echo -e $0 defined in:
    DEFINES=`grep $0 $DEFINITIONFILE | sed s/.*://`
    for define in $DEFINES; do
	echo -e \\t$define
    done
    echo -e \\n
}
export -f listdefs
xargs -l bash -c listdefs < $VARNAMESFILE
export -n listdefs

# Done with the temporary stuff.
rm -rf $MYTMPDIR