Browse Source

Clifford Wolf:


			
			
				rocklinux
			
			
		
Clifford Wolf 17 years ago
parent
commit
4ef768f271
1 changed files with 64 additions and 0 deletions
  1. +64
    -0
      misc/archive/fix_missing_cxx_incl.pl

+ 64
- 0
misc/archive/fix_missing_cxx_incl.pl

@ -0,0 +1,64 @@
#!/usr/bin/perl -w
#
# Newer gcc versions come with c++ headers that do not include that many
# standard c headers. So many packages need a lot of additional #include
# statements to compile. This script helps automating the effort of fixing
# such packages by detecting the most common cases and adding the missing
# #include statements.
#
# Usage example:
# find -name '*.cpp' -o -name '*.cc' | xargs perl fix_missing_cxx_incl.pl
use strict;
use English;
foreach my $file (@ARGV)
{
my @lines = ( );
my %inc_found = ( );
my %inc_needs = ( );
open(F, "<$file") || die $!;
while (<F>) {
push @lines, $_;
$inc_found{$1} = 1 if /^ *#\s*include\s*<(.*?)>/;
$inc_needs{"string.h"} = 1 if /str(len|n?cpy|n?(case)?cmp|sep|r?chr)/;
$inc_needs{"string.h"} = 1 if /mem(set|cpy|r?chr)/;
$inc_needs{"stdlib.h"} = 1 if /atoi/;
}
close(F);
my $found_missing_inc = 0;
foreach my $i (keys %inc_needs) {
next if exists $inc_found{$i};
$found_missing_inc = 1;
}
next unless $found_missing_inc;
if (! -f "$file.orig") {
open(F, ">$file.orig") || die $!;
foreach (@lines) {
print F $_;
}
close(F);
}
open(F, ">$file") || die $!;
my $did_inc_dump = 0;
my $in_comment = 0;
foreach (@lines) {
$in_comment = 1 if /^\s*\/\*/;
if (!$did_inc_dump && !$in_comment && /^\s*([^#\s]|#\s*if)/ && !/^\s*\/\//) {
foreach my $i (keys %inc_needs) {
next if exists $inc_found{$i};
print F "#include <$i>\n";
}
$did_inc_dump = 1;
}
$in_comment = 0 if /\*\//;
print F $_;
}
close(F);
}

Loading…
Cancel
Save