| #! /usr/bin/env perl |
| # Copyright (c) 2003 The Regents of The University of Michigan |
| # All rights reserved. |
| # |
| # Redistribution and use in source and binary forms, with or without |
| # modification, are permitted provided that the following conditions are |
| # met: redistributions of source code must retain the above copyright |
| # notice, this list of conditions and the following disclaimer; |
| # redistributions in binary form must reproduce the above copyright |
| # notice, this list of conditions and the following disclaimer in the |
| # documentation and/or other materials provided with the distribution; |
| # neither the name of the copyright holders nor the names of its |
| # contributors may be used to endorse or promote products derived from |
| # this software without specific prior written permission. |
| # |
| # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
| # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
| # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
| # A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
| # OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
| # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
| # LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
| # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
| # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
| # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
| # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
| # |
| # Authors: Steve Reinhardt |
| |
| open (FOO, "<$ARGV[0]") or die; |
| |
| # Suck in everything before the first include |
| # (line-by-line into @before list). |
| while (($_ = <FOO>) && !/^#include/) { |
| push @before, $_; |
| } |
| |
| #print join("", @before); |
| #print "##########################\n"; |
| |
| # Suck in include lines into @includes list. |
| # Skip blank lines (keep processing, but don't put in @includes). |
| # End on first non-blank, non-include line. |
| # Note that this means that files with comments or #ifdefs |
| # interspersed among their #includes will only get the initial |
| # set of #includes sorted. |
| do { |
| push @includes, $_ unless /^\s*$/; |
| } while (($_ = <FOO>) && /^#include|^\s*$/); |
| |
| # Now sort the includes. This simple ordering function |
| # puts system includes first, followed by non-system includes. |
| # Within each group the sort is alphabetical. |
| # We may want something a little more sophisticated. |
| # Personally, I'd like to see something like: |
| # <sys/*.h> - header files from sys subdir |
| # <*.h> - other system headers |
| # <*> - STL headers |
| # "base/*" - M5 base headers |
| # "sim/*" - M5 sim headers |
| # "*" - other M5 headers |
| # ...but I didn't have the energy to code that up. |
| sub sortorder { |
| my $sysa = ($a =~ /<.*>/); |
| my $sysb = ($b =~ /<.*>/); |
| return -1 if ($sysa && !$sysb); |
| return 1 if ($sysb && !$sysa); |
| return $a cmp $b; |
| } |
| |
| @includes = sort sortorder @includes; |
| #print join("", @includes); |
| #print "##########################\n"; |
| |
| # Put everything after the includes in the @after list. |
| do { |
| push @after, $_; |
| if (/^#include/) { |
| print "$ARGV[0]: "; |
| print $after[0]; |
| exit 0; |
| } |
| } while ($_ = <FOO>); |
| |
| #print join("", @after); |
| #print "##########################\n"; |
| |
| # Print out the file with sorted includes. |
| |
| print join("", @before, @includes, @after); |
| |