#!/usr/bin/perl -w use strict; use File::Find; use File::Copy; use Getopt::Long; my %g_config; GetOptions ( \%g_config, qw( dir=s ) ) || Usage(); if (!defined $g_config{dir}) { &Usage(); } my $modified = 0; print "Adding external guards...\n"; find (\&RecurseFiles, $g_config{dir}); print "Done. $modified files modified.\n"; sub RecurseFiles { if ($_ =~ /\.cpp$/ || $_ =~ /\.h$/) { &AddExternalGuards ($_, $File::Find::name); } } sub AddExternalGuards { my ($filename, $fullname) = @_; my $found = 0; my $tmpname = $filename.".tmp"; open (FIN, "<$filename") or die "Can't open $filename for read."; open (FOUT, ">$tmpname") or die "Can't open $tmpname for write."; while (my $line = ) { if ($line =~ /#include\s*"(.+?)"/) { my $include = $1; my $guard = &GetIncludeGuard($include); if ($guard) { print FOUT "#ifndef $guard\n"; print FOUT "$line"; print FOUT "#endif\n"; $found = 1; } else { print FOUT "$line"; } } else { print FOUT "$line"; } } close FOUT or die; close FIN or die; if ($found) { copy ($tmpname, $filename) or die; $modified++; #print "\tUpdated $fullname\n"; } unlink $tmpname or die; } sub GetIncludeGuard() { my ($filename) = @_; if (!-e $filename) { return 0; } my $guard; my $found; open (INCLUDE, "<$filename") or die "Can't open $filename for read."; while (my $line = ) { if ($line =~ /#ifndef\s+(\w+)/) { $guard = $1; } if ($guard && $line =~ /#define\s+$guard/) { $found = $guard; } } close INCLUDE or die; if (!$found) { print "Couldn't find include guard for $filename\n"; } return $found; } sub Usage { print STDERR "Usage: $0 -dir directory\n"; print STDERR "\n"; exit(1); }