http://lists.gnu.org/archive/html/bug-cssc/2014-09/msg00003.html
http://git.savannah.gnu.org/cgit/cssc.git/commit/?id=9737f41b5d2a49e61061e9f896b5a9ae19e3a3ac
--- auxfiles/Makefile.in	2014-07-11 07:32:58.000000000 -0500
+++ auxfiles/Makefile.in	2014-10-05 02:24:06.000000000 -0500
@@ -799,7 +799,7 @@
 top_build_prefix = @top_build_prefix@
 top_builddir = @top_builddir@
 top_srcdir = @top_srcdir@
-EXTRA_DIST = check-testfiles.sh
+EXTRA_DIST = check-testfiles.sh firstinclude.sed
 all: all-am
 
 .SUFFIXES:
--- dev/null
+++ auxfiles/firstinclude.sed
@@ -0,0 +1,19 @@
+/^ *# *include ["<].*[">]/ {
+s/^ *# *include ["<]\(.*\)[">]/\1/ 
+t YESREALLY
+i\
+Internal error - regexes are inconsistent
+q
+: YESREALLY
+#s/^\(config\|cssc\).h$//
+s/^config\.h$//
+t OK
+=
+i\
+config.h should be #included first
+: OK
+# q with an exit code is a GNU extension, don't use it.
+q
+}
+
+   
--- src/Makefile.in	2014-07-11 07:33:00.000000000 -0500
+++ src/Makefile.in	2014-10-05 02:24:06.000000000 -0500
@@ -1615,6 +1615,20 @@
 sccsdiff: sccsdiff.sh
 	sed -e 's:__csscutildir__:$(csscutildir):g' < sccsdiff.sh > $@ && chmod a+x $@ || { rm -f $@; false; }
 
+check-include-order:
+	rv=0; \
+	for f in $(srcdir)/*.cc; \
+	do \
+		msg="`sed -n -f $(top_srcdir)/auxfiles/firstinclude.sed < $$f`"; \
+		if test -n "$${msg}"; \
+		then \
+			set -- $${msg} ; line=$${1} ; shift; errmsg="$${*}"; \
+			echo "$${f}:$${line}:$${errmsg}" >&2; \
+			rv=1; \
+		fi \
+	done; \
+	exit $${rv}
+
 testsplit$(EXEEXT): fnsplit.cc mystring.$(OBJEXT) quit.$(OBJEXT)
 	$(CXXCOMPILE) -DTEST_FNSPLIT -o testsplit$(EXEEXT) \
 		$(srcdir)/fnsplit.cc mystring.$(OBJEXT) quit.$(OBJEXT)
--- src/admin.cc
+++ src/admin.cc
@@ -23,6 +23,8 @@
  * Administer and create SCCS files.
  *
  */
+#include <config.h>
+
 #include <errno.h>
 
 #include "cssc.h"
--- src/bodyio.cc
+++ src/bodyio.cc
@@ -23,6 +23,12 @@
  *
  */
 
+#include <config.h>
+
+#include <cstdio>
+#include <cstring>
+
+#include "cssc.h"
 #include "bodyio.h"
 #include "quit.h"
 #include "cssc-assert.h"
@@ -32,9 +38,6 @@
 #include "ioerr.h"
 #include "file.h"
 
-#include <cstdio>
-#include <cstring>
-
 /* Check if we have exceeded the maximum line length.
  */
 static bool check_line_len(const char *iname,
--- src/cap.cc
+++ src/cap.cc
@@ -23,6 +23,8 @@
  * Utilities for limiting output to the constraints of the file format.
  */
 
+#include <config.h>
+
 #include "cssc.h"
 
 
--- src/cdc.cc
+++ src/cdc.cc
@@ -23,6 +23,8 @@
  *
  */
 
+#include <config.h>
+
 #include "cssc.h"
 #include "my-getopt.h"
 #include "fileiter.h"
--- src/delta-iterator.cc
+++ src/delta-iterator.cc
@@ -25,6 +25,9 @@
  *
  */
 
+#include <config.h>
+
+#include "cssc.h"
 #include "delta-iterator.h"
 #include "delta-table.h"
 #include "cssc-assert.h"
--- src/delta-table.cc
+++ src/delta-table.cc
@@ -22,6 +22,9 @@
  *
  */
 
+#include <config.h>
+
+#include "cssc.h"
 #include "delta-table.h"
 #include "delta-iterator.h"
 
--- src/delta.cc
+++ src/delta.cc
@@ -24,6 +24,10 @@
  *
  */
 
+
+#include <config.h>
+
+#include "cssc.h"
 #include "delta.h"
 #include "cleanup.h"
 #include "my-getopt.h"
--- src/dtbl-prepend.cc
+++ src/dtbl-prepend.cc
@@ -24,6 +24,9 @@
  *
  */
 
+#include <config.h>
+
+#include "cssc.h"
 #include "delta-table.h"
 
 
--- src/encoding.cc
+++ src/encoding.cc
@@ -25,6 +25,9 @@
  * Compile on its own, defining TEST_CODE, to compile a test program.
  */
 
+#include <config.h>
+
+#include "cssc.h"
 #include "bodyio.h"
 #include "cssc-assert.h"
 
--- src/environment.cc
+++ src/environment.cc
@@ -22,15 +22,15 @@
  * sections "Environment" and "Interoperability" in the CSSC manual.
  *
  */
+#include "config.h"
+
+#include <cerrno>
+#include <cstdio>
 #include <cstdlib>
 #include <cstring>
-#include <cstdio>
-#include <cerrno>
-
-#include "cssc.h"
-
 #include <limits.h>
 
+#include "cssc.h"
 
 bool binary_file_creation_allowed (void)
 {
--- src/fatalsig.cc
+++ src/fatalsig.cc
@@ -22,14 +22,15 @@
  * Handle fatal signals...
  *
  */
+#include "config.h"
+
 #include <cstdlib>
+#include <signal.h>             /* TODO: consider using sigaction(). */
 
+#include "cssc-assert.h"
 #include "cssc.h"
-#include "version.h"
 #include "quit.h"
-
-#include <signal.h>             /* TODO: consider using sigaction(). */
-#include "cssc-assert.h"
+#include "version.h"
 
 
 /* The expansion of RETSIGTYPE is automatically decided by the configure
--- src/fdclosed.cc
+++ src/fdclosed.cc
@@ -31,13 +31,14 @@
  * the file pointer on our file too).
  */
 
-#include "cssc.h"
-#include "sysdep.h"
-#include "defaults.h"		// CONFIG_NULL_FILENAME
+#include <config.h>
 
 #include <unistd.h>
 #include <stdio.h>		/* perror() */
 
+#include "cssc.h"
+#include "sysdep.h"
+#include "defaults.h"		// CONFIG_NULL_FILENAME
 
 class SafeFdCheck
 {
--- src/file.cc
+++ src/file.cc
@@ -23,19 +23,22 @@
  * System dependent routines for accessing files.
  *
  */
+#include "config.h"
+
 #include <errno.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <unistd.h>
+#include <stdio.h>
+#include <stdlib.h>
 
-#include "cssc.h"
+#include "cssc.h"		/* for CONFIG_CAN_HARD_LINK_AN_OPEN_FILE */
 #include "cssc-assert.h"
 #include "sysdep.h"
 #include "file.h"
 #include "quit.h"
 #include "ioerr.h"
 #include "defaults.h"
-
-#include <unistd.h>
-#include <sys/stat.h>
-#include <stdio.h>
 #include "dirent-safer.h"
 
 /* Redirects stdout to a "null" file (eg. /dev/null). */
@@ -152,14 +155,14 @@
 
 
 
+static int unprivileged = 0;
+
 #ifdef CONFIG_UIDS
 
 /* A flag to indicate whether or not the programme is an privileged
    (effective UID != real UID) or unprivileged (effective UID == real
    UID). */
 
-static int unprivileged = 0;
-
 #ifdef SAVED_IDS_OK
 
 static uid_t old_euid;
--- src/file.h
+++ src/file.h
@@ -33,6 +33,7 @@
 #include <sys/types.h>
 
 #include "filelock.h"
+#include "mystring.h"
 
 enum create_mode {
 	CREATE_EXCLUSIVE     =  001,
--- src/filelock.h
+++ src/filelock.h
@@ -28,6 +28,7 @@
 #define CSSC__FILELOCK_H__
 
 #include "cleanup.h"
+#include "mystring.h"
 
 class file_lock : private cleanup {
 	int locked;
--- src/fnsplit.cc
+++ src/fnsplit.cc
@@ -20,6 +20,8 @@
  * Functions for canonifying filenames.
  */
 
+#include <config.h>
+
 #include "cssc.h"
 #include "mystring.h"
 #include "file.h"		// declaration of split_filename.
--- src/get.cc
+++ src/get.cc
@@ -23,6 +23,8 @@
  * Extract a requested delta from a SCCS file.
  *
  */
+#include "config.h"
+
 #include <errno.h>
 
 #include "cssc.h"
--- src/l-split.cc
+++ src/l-split.cc
@@ -24,6 +24,8 @@
  *
  */
 
+#include <config.h>
+
 #include "cssc.h"
 #include "mylist.h"
 #include "sccsfile.h"		// declares these functions.
--- src/linebuf.cc
+++ src/linebuf.cc
@@ -23,6 +23,8 @@
  * Members of the class cssc_linebuf.
  *
  */
+#include "config.h"
+
 #include <cstdio>
 #include <cstring>
 #include <climits>
--- src/pf-add.cc
+++ src/pf-add.cc
@@ -23,6 +23,8 @@
  *
  */
 
+#include <config.h>
+
 #include "cssc.h"
 #include "pfile.h"
 #include "except.h"
--- src/pf-del.cc
+++ src/pf-del.cc
@@ -24,6 +24,8 @@
  * a p-file.
  *
  */
+#include "config.h"
+
 #include <utility>
 
 #include "cssc.h"
--- src/pfile.cc
+++ src/pfile.cc
@@ -23,6 +23,8 @@
  * Common members of the class sccs_pfile.
  *
  */
+#include "config.h"
+
 #include <errno.h>
 
 #include "cssc.h"
--- src/prompt.cc
+++ src/prompt.cc
@@ -24,6 +24,8 @@
  *
  */
 
+#include "config.h"
+
 #include <cstdio>
 #include <cstring>
 #include <cstdio>
--- src/prs.cc
+++ src/prs.cc
@@ -24,6 +24,7 @@
  *
  */
 
+#include <config.h>
 #include "cssc.h"
 #include "fileiter.h"
 #include "sccsfile.h"
--- src/prt.cc
+++ src/prt.cc
@@ -26,6 +26,7 @@
  */
 
 
+#include <config.h>
 #include "cssc.h"
 #include "fileiter.h"
 #include "sccsfile.h"
--- src/quit.cc
+++ src/quit.cc
@@ -23,6 +23,8 @@
  * Functions for cleaning up and quitting.
  *
  */
+#include "config.h"
+
 #include <cstdio>
 #include <cstring>
 #include <cerrno>
--- src/rel_list.cc
+++ src/rel_list.cc
@@ -20,6 +20,7 @@
  * placed in the Public Domain.
  *
  */
+#include "config.h"
 #include <cstdlib>
 
 #include "cssc.h"
--- src/rl-merge.cc
+++ src/rl-merge.cc
@@ -22,6 +22,7 @@
  *
  */
 
+#include <config.h>
 #include "cssc.h"
 #include "rel_list.h"
 
--- src/rmdel.cc
+++ src/rmdel.cc
@@ -25,6 +25,7 @@
  *
  */
 
+#include <config.h>
 #include "cssc.h"
 #include "fileiter.h"
 #include "sccsfile.h"
--- src/run.cc
+++ src/run.cc
@@ -24,6 +24,8 @@
  * Routines for running programmes.
  *
  */
+#include "config.h"
+
 #include <cstdio>
 #include <errno.h>
 
--- src/sact.cc
+++ src/sact.cc
@@ -25,6 +25,7 @@
  *
  */
 
+#include <config.h>
 #include "cssc.h"
 #include "fileiter.h"
 #include "pfile.h"
--- src/sccs-delta.cc
+++ src/sccs-delta.cc
@@ -25,6 +25,7 @@
  *
  */
 
+#include <config.h>
 #include "cssc.h"
 #include "sccsfile.h"
 #include "delta.h"
--- src/sccsdate.cc
+++ src/sccsdate.cc
@@ -24,6 +24,7 @@
  * Members of the class sccs_date.
  *
  */
+#include <config.h>
 #include <cstring>
 
 #include "cssc.h"
--- src/sccsfile.cc
+++ src/sccsfile.cc
@@ -25,6 +25,7 @@
  * the members in this file are used to read from the SCCS file.
  *
  */
+#include <config.h>
 #include <errno.h>
 
 #include "cssc.h"
--- src/sccsname.cc
+++ src/sccsname.cc
@@ -25,6 +25,7 @@
  *
  */
 
+#include <config.h>
 #include "cssc.h"
 #include "sccsname.h"
 #include "cssc-assert.h"
--- src/seqstate.cc
+++ src/seqstate.cc
@@ -21,6 +21,7 @@
  *
  */
 
+#include <config.h>
 #include "cssc.h"
 #include "seqstate.h"
 
--- src/sf-add.cc
+++ src/sf-add.cc
@@ -26,6 +26,7 @@
  *
  */
 
+#include <config.h>
 #include "cssc.h"
 #include "sccsfile.h"
 #include "delta.h"
--- src/sf-admin.cc
+++ src/sf-admin.cc
@@ -26,6 +26,7 @@
  *
  */
 
+#include <config.h>
 #include "cssc.h"
 #include "sccsfile.h"
 #include "sl-merge.h"
--- src/sf-cdc.cc
+++ src/sf-cdc.cc
@@ -26,6 +26,7 @@
  *
  */
 
+#include <config.h>
 #include "cssc.h"
 #include "sccsfile.h"
 #include "delta.h"
--- src/sf-chkid.cc
+++ src/sf-chkid.cc
@@ -23,13 +23,15 @@
  *
  */
 
+#include <config.h>
+
+#include <string.h>
+
 #include "cssc.h"
 #include "sccsfile.h"
 #include "linebuf.h"
 #include "bodyio.h"
 
-#include <string.h>
-
 bool
 is_id_keyword_letter(char ch)
 {
--- src/sf-delta.cc
+++ src/sf-delta.cc
@@ -25,7 +25,10 @@
  * Members of sccs_file for adding a delta to the SCCS file.
  *
  */
+#include <config.h>
+
 #include <errno.h>
+#include <unistd.h>
 
 #include "cssc.h"
 #include "sccsfile.h"
@@ -43,9 +46,6 @@
 
 #undef JAY_DEBUG
 
-#include <unistd.h>
-
-
 
 class diff_state
 {
--- src/sf-get.cc
+++ src/sf-get.cc
@@ -26,6 +26,8 @@
  *
  */
 
+#include <config.h>
+
 #include "cssc.h"
 #include "sccsfile.h"
 #include "pfile.h"
--- src/sf-get2.cc
+++ src/sf-get2.cc
@@ -25,6 +25,10 @@
  *
  */
 
+#include <config.h>
+
+#include <ctype.h>
+
 #include "cssc.h"
 #include "sccsfile.h"
 #include "pfile.h"
@@ -33,8 +37,6 @@
 #include "delta-table.h"
 
 
-#include <ctype.h>
-
 bool sccs_file::sid_matches(const sid& requested,
 			    const sid& found,
 			    bool get_top_delta) const
--- src/sf-get3.cc
+++ src/sf-get3.cc
@@ -25,6 +25,8 @@
  *
  */
 
+#include <config.h>
+
 #include "cssc.h"
 #include "sccsfile.h"
 #include "seqstate.h"
--- src/sf-kw.cc
+++ src/sf-kw.cc
@@ -21,6 +21,8 @@
  * sccs_file::no_id_keywords()
  */
 
+#include <config.h>
+
 #include "cssc.h"
 #include "sccsfile.h"
 #include "except.h"
--- src/sf-prs.cc
+++ src/sf-prs.cc
@@ -27,6 +27,8 @@
  *
  */
 
+#include <config.h>
+
 #include "cssc.h"
 #include "sccsfile.h"
 #include "seqstate.h"
--- src/sf-prt.cc
+++ src/sf-prt.cc
@@ -24,6 +24,8 @@
  */
 
 
+#include <config.h>
+
 #include "cssc.h"
 #include "sccsfile.h"
 #include "seqstate.h"
--- src/sf-rmdel.cc
+++ src/sf-rmdel.cc
@@ -26,6 +26,8 @@
  *
  */
 
+#include <config.h>
+
 #include "cssc.h"
 #include "sccsfile.h"
 #include "delta.h"
--- src/sf-val.cc
+++ src/sf-val.cc
@@ -22,7 +22,10 @@
  * Members of class sccs_file used by "val".
  *
  */
+#include <config.h>
+
 #include <vector>
+
 #include "cssc.h"
 #include "sccsfile.h"
 #include "delta.h"
--- src/sf-write.cc
+++ src/sf-write.cc
@@ -26,6 +26,8 @@
  *
  */
 
+#include <config.h>
+
 #include "cssc.h"
 #include "sccsfile.h"
 #include "delta.h"
--- src/sid.cc
+++ src/sid.cc
@@ -25,12 +25,14 @@
  *
  */
 
+#include <config.h>
+
+#include <ctype.h>
+
 #include "cssc.h"
 #include "sid.h"
 #include "ioerr.h"
 
-#include <ctype.h>
-
 mystring sid::as_string() const
 {
   char buf[32];
--- src/unget.cc
+++ src/unget.cc
@@ -25,6 +25,8 @@
  *
  */
 
+#include <config.h>
+
 #include "cssc.h"
 #include "fileiter.h"
 #include "pfile.h"
--- src/val.cc
+++ src/val.cc
@@ -21,6 +21,8 @@
  *
  */
 
+#include <config.h>
+
 #include "cssc.h"
 #include "fileiter.h"
 #include "sccsfile.h"
--- src/writesubst.cc
+++ src/writesubst.cc
@@ -22,6 +22,8 @@
  *
  */
 
+#include <config.h>
+
 #include "cssc.h"
 #include "sccsfile.h"
 #include "delta.h"