--- /dev/null
+#! /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);
+