1cb77f0d6SKamil Rytarowski#!/usr/bin/env perl 2*b2441318SGreg Kroah-Hartman# SPDX-License-Identifier: GPL-2.0 31da177e4SLinus Torvalds# 492f3f19cSLuis R. Rodriguez# checkincludes: find/remove files included more than once 592f3f19cSLuis R. Rodriguez# 61da177e4SLinus Torvalds# Copyright abandoned, 2000, Niels Kristian Bech Jensen <[email protected]>. 792f3f19cSLuis R. Rodriguez# Copyright 2009 Luis R. Rodriguez <[email protected]> 892f3f19cSLuis R. Rodriguez# 992f3f19cSLuis R. Rodriguez# This script checks for duplicate includes. It also has support 1092f3f19cSLuis R. Rodriguez# to remove them in place. Note that this will not take into 1192f3f19cSLuis R. Rodriguez# consideration macros so you should run this only if you know 1292f3f19cSLuis R. Rodriguez# you do have real dups and do not have them under #ifdef's. You 1392f3f19cSLuis R. Rodriguez# could also just review the results. 141da177e4SLinus Torvalds 153da27157SStephen Hemmingeruse strict; 163da27157SStephen Hemminger 17f9d490abSLuis R. Rodriguezsub usage { 1892f3f19cSLuis R. Rodriguez print "Usage: checkincludes.pl [-r]\n"; 1992f3f19cSLuis R. Rodriguez print "By default we just warn of duplicates\n"; 2092f3f19cSLuis R. Rodriguez print "To remove duplicated includes in place use -r\n"; 21f9d490abSLuis R. Rodriguez exit 1; 22f9d490abSLuis R. Rodriguez} 23f9d490abSLuis R. Rodriguez 2492f3f19cSLuis R. Rodriguezmy $remove = 0; 2592f3f19cSLuis R. Rodriguez 26f9d490abSLuis R. Rodriguezif ($#ARGV < 0) { 27f9d490abSLuis R. Rodriguez usage(); 28f9d490abSLuis R. Rodriguez} 29f9d490abSLuis R. Rodriguez 3092f3f19cSLuis R. Rodriguezif ($#ARGV >= 1) { 3192f3f19cSLuis R. Rodriguez if ($ARGV[0] =~ /^-/) { 3292f3f19cSLuis R. Rodriguez if ($ARGV[0] eq "-r") { 3392f3f19cSLuis R. Rodriguez $remove = 1; 3492f3f19cSLuis R. Rodriguez shift; 3592f3f19cSLuis R. Rodriguez } else { 3692f3f19cSLuis R. Rodriguez usage(); 3792f3f19cSLuis R. Rodriguez } 3892f3f19cSLuis R. Rodriguez } 3992f3f19cSLuis R. Rodriguez} 4092f3f19cSLuis R. Rodriguez 418087a560SCheah Kok Cheongmy $dup_counter = 0; 428087a560SCheah Kok Cheong 433da27157SStephen Hemmingerforeach my $file (@ARGV) { 443da27157SStephen Hemminger open(my $f, '<', $file) 453da27157SStephen Hemminger or die "Cannot open $file: $!.\n"; 461da177e4SLinus Torvalds 471da177e4SLinus Torvalds my %includedfiles = (); 4892f3f19cSLuis R. Rodriguez my @file_lines = (); 491da177e4SLinus Torvalds 503da27157SStephen Hemminger while (<$f>) { 511da177e4SLinus Torvalds if (m/^\s*#\s*include\s*[<"](\S*)[>"]/o) { 521da177e4SLinus Torvalds ++$includedfiles{$1}; 531da177e4SLinus Torvalds } 5492f3f19cSLuis R. Rodriguez push(@file_lines, $_); 551da177e4SLinus Torvalds } 561da177e4SLinus Torvalds 573da27157SStephen Hemminger close($f); 58d9a7a2bdSLuis R. Rodriguez 5992f3f19cSLuis R. Rodriguez if (!$remove) { 603da27157SStephen Hemminger foreach my $filename (keys %includedfiles) { 611da177e4SLinus Torvalds if ($includedfiles{$filename} > 1) { 621da177e4SLinus Torvalds print "$file: $filename is included more than once.\n"; 638087a560SCheah Kok Cheong ++$dup_counter; 641da177e4SLinus Torvalds } 651da177e4SLinus Torvalds } 6692f3f19cSLuis R. Rodriguez next; 6792f3f19cSLuis R. Rodriguez } 6892f3f19cSLuis R. Rodriguez 693da27157SStephen Hemminger open($f, '>', $file) 703da27157SStephen Hemminger or die("Cannot write to $file: $!"); 7192f3f19cSLuis R. Rodriguez 7292f3f19cSLuis R. Rodriguez my $dups = 0; 7392f3f19cSLuis R. Rodriguez foreach (@file_lines) { 7492f3f19cSLuis R. Rodriguez if (m/^\s*#\s*include\s*[<"](\S*)[>"]/o) { 753da27157SStephen Hemminger foreach my $filename (keys %includedfiles) { 7692f3f19cSLuis R. Rodriguez if ($1 eq $filename) { 7792f3f19cSLuis R. Rodriguez if ($includedfiles{$filename} > 1) { 7892f3f19cSLuis R. Rodriguez $includedfiles{$filename}--; 7992f3f19cSLuis R. Rodriguez $dups++; 808087a560SCheah Kok Cheong ++$dup_counter; 8192f3f19cSLuis R. Rodriguez } else { 823da27157SStephen Hemminger print {$f} $_; 8392f3f19cSLuis R. Rodriguez } 8492f3f19cSLuis R. Rodriguez } 8592f3f19cSLuis R. Rodriguez } 8692f3f19cSLuis R. Rodriguez } else { 873da27157SStephen Hemminger print {$f} $_; 8892f3f19cSLuis R. Rodriguez } 8992f3f19cSLuis R. Rodriguez } 9092f3f19cSLuis R. Rodriguez if ($dups > 0) { 9192f3f19cSLuis R. Rodriguez print "$file: removed $dups duplicate includes\n"; 9292f3f19cSLuis R. Rodriguez } 933da27157SStephen Hemminger close($f); 941da177e4SLinus Torvalds} 958087a560SCheah Kok Cheong 968087a560SCheah Kok Cheongif ($dup_counter == 0) { 978087a560SCheah Kok Cheong print "No duplicate includes found.\n"; 988087a560SCheah Kok Cheong} 99