1563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark#!/usr/bin/perl -w
2563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
3563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark# Copyright (C) 2005 Apple Computer, Inc.  All rights reserved.
4563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark#
5563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark# Redistribution and use in source and binary forms, with or without
6563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark# modification, are permitted provided that the following conditions
7563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark# are met:
8563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark#
9563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark# 1.  Redistributions of source code must retain the above copyright
10563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark#     notice, this list of conditions and the following disclaimer. 
11563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark# 2.  Redistributions in binary form must reproduce the above copyright
12563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark#     notice, this list of conditions and the following disclaimer in the
13563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark#     documentation and/or other materials provided with the distribution. 
14563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark# 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
15563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark#     its contributors may be used to endorse or promote products derived
16563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark#     from this software without specific prior written permission. 
17563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark#
18563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark# THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
19563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark# EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
20563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
21563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark# DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
22563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
23563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
24563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
25563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
27563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
29563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark# "find-extra-includes" script for WebKit Open Source Project
30563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
31563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkuse strict;
32563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkuse File::Find;
33563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
34563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkfind(\&wanted, @ARGV ? @ARGV : ".");
35563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
36563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkmy %paths;
37563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkmy %includes;
38563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
39563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarksub wanted
40563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark{
41563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    my $file = $_;
42563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
43563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    if ($file eq "icu") {
44563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        $File::Find::prune = 1;
45563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        return;
46563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    }
47563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
48563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    if ($file !~ /^\./ && $file =~ /\.(h|cpp|c|mm|m)$/) {
49563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        $paths{$file} = $File::Find::name;
50563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        open FILE, $file or die;
51563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        while (<FILE>) {
52563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark            if (m-^\s*#\s*(include|import)\s+["<]((\S+/)*)(\S+)[">]-) {
53563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark                my $include = ($2 eq "sys/" ? $2 : "") . $4;
54563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark                $includes{$file}{$include}++;
55563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark            }
56563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        }
57563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        close FILE;
58563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    }
59563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark}
60563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
61563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkmy %totalIncludes;
62563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
63563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarksub fillOut
64563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark{
65563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    my ($file) = @_;
66563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
67563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    return if defined $totalIncludes{$file};
68563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
69563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    for my $include (keys %{ $includes{$file} }) {
70563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        $totalIncludes{$file}{$include} = 1;
71563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        fillOut($include);
72563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        for my $i (keys %{ $totalIncludes{$include} }) {
73563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark            $totalIncludes{$file}{$i} = 1;
74563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        }
75563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    }
76563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark}
77563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
78563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarksub check
79563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark{
80563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    my ($file) = @_;
81563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
82563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    for my $include (keys %{ $includes{$file} }) {
83563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        fillOut($include);
84563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    }
85563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    for my $i1 (sort keys %{ $includes{$file} }) {
86563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        for my $i2 (keys %{ $includes{$file} }) {
87563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark            next if $i1 eq $i2;
88563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark            if ($totalIncludes{$i2}{$i1}) {
89563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark                my $b1 = $i1;
90563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark                my $b2 = $file;
91563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark                $b1 =~ s/\..+$//;
92563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark                $b2 =~ s/\..+$//;
93563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark                print "$paths{$file} does not need to include $i1, because $i2 does\n" if $b1 ne $b2;
94563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark                last;
95563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark            }
96563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        }
97563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    }
98563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark}
99563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
100563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkfor my $file (sort keys %includes) {
101563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    check($file);
102563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark}
103