use Data::Dumper; my %seen; my @source; my $output = $ARGV[0]; my @fileList = `ls *.c *.h`; foreach $_ (@fileList) { chomp; if( $_ =~ /$output/ || $_ =~ /test/ ) {} elsif( $_ =~ /\.h/ ) { $seen{$_} = 0; } elsif( $_ =~ /\.c/ ) { push @source, $_ } } close DOTH; close DOTC; open DOTH, ">" . $output . ".h" or die; open DOTC, ">" . $output . ".c" or die; my @list; $seen{'config.h'} = 1; push @list, "config.h"; $seen{'sndfile.h'} = 1; push @list, "sndfile.h"; $seen{'common.h'} = 1; push @list, "common.h"; $seen{'G72x.h'} = 1; push @list, "G72x.h"; sub depend { my $file = shift; my $handle; open $handle, "<$file"; while(<$handle>) { if( my $include = /#include[ \t]*[<"]([\w\d]+\.h)[>"]/ ) { if( defined( $seen{$include} && $seen{$include} == 0 ) ) { depend( $include ); } } } close $handle; $seen{$file} = 1; push @list, $file; } foreach my $key ( keys %seen ) { if( $seen{$key} == 0 ) { depend($key); } } print DOTH '#include ' . "\n\n"; print DOTH '#include ' . "\n\n"; foreach my $file (@list) { open F, "<$file"; while() { if( $_ !~ /#include[ \t]*[<"](\w+\.h)[>"]/ ) { print DOTH $_; } } close F; } close FILE; print DOTC '#include ' . "\"$output.h\"\n"; print DOTC '#include ' . "\n\n"; print DOTC '#include ' . "\n\n"; foreach my $file (@source) { open FILE, $file; $file =~ s/\.[ch]//g; while( my $line = ) { if( $line !~ /#include[ \t]*("[\w\d]+\.[ch]")|/ ) { $line =~ s/(f2d_array)/$file$1/g; $line =~ s/(d2f_array)/$file$1/g; $line =~ s/(_\w+tab)/$file$1/g; $line =~ s/(STEP)/$file$1/g; $line =~ s/(HAVE_[^D]\w+)/$file$1/g; print DOTC $line; } } close FILE; } close DOTH; close DOTC;