summaryrefslogtreecommitdiffstats
path: root/crawl-ref/source/util/includes.sh
blob: 7eedf1d3c6da4f202c1c5f19caa6d6ea195e81c1 (plain) (blame)
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
# A bunch of shell functions that help finding unnecessary includes.
# Relies on appropriate versions of etags, grep, tr, awk and maybe bash.
#
# To use:
#   $ . util/include.sh
#   $ checkall


# Tries to list all names defined in the header file $1.
# Indented names are assumed to be members that don't need to be checked,
# which will fail for indented declarations with #ifdefs.
names () 
{ 
    b=$(basename $1 .h);
    etags --declarations -D $1 -o - | grep '^[#a-z]' | grep -v '^'$b'\.h' \
        | tr '\177' '\t' | awk '{ print $(NF-1) }'
}

# lists possible uses in $2 of names defined in $1
mightuse () 
{ 
    for n in $(names $1);
    do
        if grep -F $n $2; then
            return 0;
        fi;
    done;
    return 1
}

# checks whether source file $2 #include's $1
includes () 
{ 
    grep '#include "'$1'"' $2
}

# echo arguments if $2 includes $1 put shouldn't
check ()
{
    if includes $1 $2 > /dev/null && ! mightuse $1 $2 > /dev/null; then
        echo $1 $2;
    fi
}

# run check on all source for a given header
# should really cache the result of "names"
checkhdr ()
{
    for src in *.cc; do
        check $1 $src
    done
}

# run check on all pairs
checkall ()
{
    for hdr in *.h; do
        if [ $hdr = AppHdr.h ]; then
            continue;
        fi
        checkhdr $hdr
    done
}

# remove #include of $1 from $2
remove ()
{
    b=$(basename $1 .h)
    sed -e '/^#include "'$b'\.h"$/d' < $2 > $2.rmincl
    mv $2.rmincl $2
}

# remove doubtful includes for a list as output by checkall.
removelst ()
{
    while read hdr src; do
        remove $hdr $src
    done
}