#!/usr/local/bin/perl -w use strict; use warnings; use Getopt::Std; my $RCSID = '$Id: include.perl,v 1.2 2007-01-31 14:42:16-08 - - $'; $0 =~ s|/*$||; $0 =~ s|^.*/||; my $EXITCODE = 0; END { exit $EXITCODE; } sub note(@){ print STDERR "$0: @_"; }; $SIG{'__WARN__'} = sub { note @_; $EXITCODE = 1; }; $SIG{'__DIE__'} = sub { warn @_; exit; }; my $MAN_PAGE = <<__END_MAN_PAGE__; # # NAME # $0 - search C source for #include statements # # SYNOPSIS # $0 -h | csourcefile... # # DESCRIPTION # Takes a sequence of C source files as arguments and prints # each line number and reference to an include file. # # OPTIONS # -h Prints out help information in man page format. # # $RCSID __END_MAN_PAGE__ $MAN_PAGE =~ s/^#[ ]?//mg; my @worklist; my $target; my $source; my $dep; my %OPTIONS; my $dependencies; getopts "mhsu", \%OPTIONS; print $MAN_PAGE and exit if $OPTIONS{'h'}; die "Usage: $0 -h | csourcefile...\n" unless @ARGV; for my $filename (@ARGV) { my %foundfiles; my %dependencies; while (@worklist) { unless (open FILE, $filename) { warn "$filename: $!\n"; }else { while (defined (my $line = )) { next unless $line =~ m/^\s*#include\s+(<.*?>|".*?")\s*$/; my $include = $1; # this is a user include, set flag $include =~ s|"(.*)"|$1| if $OPTIONS {'u'}; # this is a sys include, set flag $include =~ s|<(.*)>|/usr/include/$1| if $OPTIONS {'s'}; $dependencies {"$target: $source"} = 1; $foundfiles{$source} = 1; push @{%dependencies}, $include;; push @worklist, $include; }; }; close FILE; } my @targets = qw (target1 target2 target3 target4); my @sources = qw (source1 source2 source3 source4); my @worklist; while (@targets) { my $target = shift @targets; my $source = shift @sources; push @worklist, [$target, $source]; } while (@worklist) { my $pair = shift @worklist; my $target = $pair->[0]; my $source = $pair->[1]; } for $dep (sort keys %dependencies) { print $dependencies; } }