diff --git a/testsuite/dejagnu.h b/testsuite/dejagnu.h
index 0d47fdfa176136be2ec6113d0b5f7b1791d131f8..45ee070913436fee92c45a4894b81d7b45ea24ad 100644
--- a/testsuite/dejagnu.h
+++ b/testsuite/dejagnu.h
@@ -1,271 +1,316 @@
-/* 
- *   Copyright (C) 2000, 2001 Free Software Foundation, Inc.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
-
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
+/* DejaGnu unit testing header.
+   Copyright (C) 2000, 2001, 2002, 2004, 2006 Free Software
+   Foundation, Inc.
+
+This file is part of DejaGnu.
+
+DejaGnu is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 3 of the License, or
+(at your option) any later version.
+
+DejaGnu is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with DejaGnu; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.  */
 
 #ifndef __DEJAGNU_H__
 #define __DEJAGNU_H__
 
 #include <stdio.h>
-#include <stdarg.h> 
+#include <stdarg.h>
 #include <string.h>
 
-#define _BUFFER_SIZE_ 512
+/* If you have problems with DejaGnu dropping failed, untested, or
+ * unresolved messages generated by a unit testcase, then:  */
+
+/* #define _DEJAGNU_WAIT_  */
 
-static int passed = 0;
-static int failed = 0;
-static int untest = 0;
-static int unresolve = 0;
-static int tests = 0;
+#ifdef _DEJAGNU_WAIT_
+#include <sys/time.h>
+#include <sys/types.h>
+#include <unistd.h>
+#endif
 
-static char buffer[ _BUFFER_SIZE_ ];
+static int passed;
+static int failed;
+static int untest;
+static int unresolve;
+static int xfailed;
+static int xpassed;
 
+static char buffer[512];
 
-inline void
-pass (const char* fmt, ... ) __attribute__ ((format (printf, 1, 2)));
-inline void
-pass (const char* fmt, ... ) {
-	va_list ap;
+void
+wait (void)
+{
+#ifdef _DEJAGNU_WAIT_
+  fd_set rfds;
+  struct timeval tv;
 
-	tests++;
-	passed++;
-	va_start( ap, fmt );
-	vsnprintf( buffer, _BUFFER_SIZE_, fmt, ap );
-	va_end( ap );
-	printf ("\tPASSED: #%d %s\n", tests, buffer );
-	fflush( stdout );
+  FD_ZERO (&rfds);
+  tv.tv_sec = 0;
+  tv.tv_usec = 1;
+
+  select (0, &rfds, NULL, NULL, &tv);
+#endif
 }
 
-inline void
-fail (const char* fmt, ... ) __attribute__ ((format (printf, 1, 2)));
-inline void
-fail (const char* fmt, ... ) {
-	va_list ap;
+static inline void
+pass (const char* fmt, ...)
+{
+  va_list ap;
+
+  passed++;
+  va_start (ap, fmt);
+  vsnprintf (buffer, sizeof (buffer), fmt, ap);
+  va_end (ap);
+  printf ("\tPASSED: %s\n", buffer);
+  wait ();
+}
 
-	tests++;
-	failed++;
-	va_start( ap, fmt );
-	vsnprintf( buffer, _BUFFER_SIZE_, fmt, ap );
-	va_end( ap );
-	printf ("\tFAILED: #%d %s\n", tests, buffer );
-	fflush( stdout );
+static inline void
+xpass (const char* fmt, ...)
+{
+  va_list ap;
+
+  passed++;
+  va_start (ap, fmt);
+  vsnprintf (buffer, sizeof (buffer), fmt, ap);
+  va_end (ap);
+  printf ("\tXPASSED: %s\n", buffer);
+  wait ();
 }
 
-inline void
-untested (const char* fmt, ... ) __attribute__ ((format (printf, 1, 2)));
-inline void
-untested (const char* fmt, ... ) {
-	va_list ap;
+static inline void
+fail (const char* fmt, ...)
+{
+  va_list ap;
+
+  failed++;
+  va_start (ap, fmt);
+  vsnprintf (buffer, sizeof (buffer), fmt, ap);
+  va_end (ap);
+  printf ("\tFAILED: %s\n", buffer);
+  wait ();
+}
 
-	tests++;
-	untest++;
-	va_start( ap, fmt );
-	vsnprintf( buffer, _BUFFER_SIZE_, fmt, ap );
-	va_end( ap );
-	printf ("\tUNTESTED: #%d %s\n", tests, buffer );
-	fflush( stdout );
+static inline void
+xfail (const char* fmt, ...)
+{
+  va_list ap;
+
+  failed++;
+  va_start (ap, fmt);
+  vsnprintf (buffer, sizeof (buffer), fmt, ap);
+  va_end (ap);
+  printf ("\tXFAILED: %s\n", buffer);
+  wait ();
 }
 
-inline void
-unresolved (const char* fmt, ... ) __attribute__ ((format (printf, 1, 2)));
-inline void
-unresolved (const char* fmt, ... ) {
-	va_list ap;
+static inline void
+untested (const char* fmt, ...)
+{
+  va_list ap;
+
+  untest++;
+  va_start (ap, fmt);
+  vsnprintf (buffer, sizeof (buffer), fmt, ap);
+  va_end (ap);
+  printf ("\tUNTESTED: %s\n", buffer);
+  wait ();
+}
 
-	tests++;
-	unresolve++;
-	va_start( ap, fmt );
-	vsnprintf( buffer, _BUFFER_SIZE_, fmt, ap );
-	va_end( ap );
-	printf ("\tUNRESOLVED: #%d %s\n", tests, buffer );
-	fflush( stdout );
+static inline void
+unresolved (const char* fmt, ...)
+{
+  va_list ap;
+
+  unresolve++;
+  va_start (ap, fmt);
+  vsnprintf (buffer, sizeof (buffer), fmt, ap);
+  va_end (ap);
+  printf ("\tUNRESOLVED: %s\n", buffer);
+  wait ();
 }
 
-inline void
-note (const char* fmt, ... ) __attribute__ ((format (printf, 1, 2)));
-inline void
-note (const char* fmt, ... ) {
-	va_list ap;
-
-	va_start( ap, fmt );
-	vsnprintf( buffer, _BUFFER_SIZE_, fmt, ap );
-	va_end( ap );
-	printf ("\tNOTE: %s\n", buffer );
-	fflush( stdout );
+static inline void
+note (const char* fmt, ...)
+{
+  va_list ap;
+
+  va_start (ap, fmt);
+  vsnprintf (buffer, sizeof (buffer), fmt, ap);
+  va_end (ap);
+  printf ("\tNOTE: %s\n", buffer);
+  wait ();
 }
 
-inline void
-totals (void) {
-	printf ("\nTotals:\n");
-	printf ("\t#passed:\t\t%d\n", passed);
-	printf ("\t#failed:\t\t%d\n", failed);
-	if (untest)
-		printf ("\t#untested:\t\t%d\n", untest);
-	if (unresolve)
-		printf ("\t#unresolved:\t\t%d\n", unresolve);
+static inline void
+totals (void)
+{
+  printf ("\nTotals:\n");
+  printf ("\t#passed:\t\t%d\n", passed);
+  printf ("\t#real failed:\t\t%d\n", failed);
+  if (xfailed)
+    printf ("\t#expected failures:\t\t%d\n", xfailed);
+  if (untest)
+    printf ("\t#untested:\t\t%d\n", untest);
+  if (unresolve)
+    printf ("\t#unresolved:\t\t%d\n", unresolve);
 }
 
 #ifdef __cplusplus
 
-
 #include <iostream>
 #include <iomanip>
 #include <fstream>
 #include <string>
-#if 0
-#if HAVE_STL3
-#include <sstream>
-#else
-#include <strstream>
-#endif
-#endif
 
 const char *outstate_list[] = {
-	"FAILED: ",
-	"PASSED: ",
-	"UNTESTED: ",
-	"UNRESOLVED: "
+  "FAILED: ", "PASSED: ", "UNTESTED: ", "UNRESOLVED: ", "XFAILED: ", "XPASSED: "
 };
 
 const char ** outstate = outstate_list;
 
-#if 0
-extern ios& __iomanip_testout (ios&, int);
-inline smanip<int> testout (int n) {
-	return smanip<int> (__iomanip_testout, n);
-}
-ios & __iomanip_testout (ios& i, int x) {
-	return i;
-}
-
-template<class T>
-class OMANIP {
-	private:
-		T i;
-		ostream &(*f)(ostream&, T);
-	public:
-		OMANIP(ostream& (*ff)(ostream&, T), T ii) : f(ff), i(ii) {
-		}
-		friend ostream operator<<(ostream& us, OMANIP& m) {
-			return m.f(os,m.i);
-		}
-};
-
-ostream&
-freakout(ostream& os, int x) {
-	return os << "FREAKOUT" ;
-	//    return x << "TESTOUT " << x ;
-}
-
-OMANIP<int> testout(int i) {
-	return OMANIP<int>(&freakout,i);
-}
-#endif
-
-enum teststate {FAILED, PASSED,UNTESTED,UNRESOLVED} laststate;
+enum teststate { FAILED, PASSED, UNTESTED, UNRESOLVED, XFAILED, XPASSED} laststate;
 
 class TestState {
-	private:
-		teststate laststate;
-		std::string lastmsg;
-	public:
-		TestState(void) {
-			passed = 0;
-			failed = 0;
-			untest = 0;
-			unresolve = 0;
-		}
-		~TestState(void) {
-			totals();
-		};
-
-		void testrun (bool b, std::string s) {
-			if (b)
-				pass (s);
-			else
-				fail (s);
-		}
-
-		void pass (std::string s) {
-			passed++;
-			laststate = PASSED;
-			lastmsg = s;
-			std::cout << "\t" << outstate[PASSED] << s << std::endl;
-		}
-		void pass (const char *c) {
-			std::string s = c;
-			pass (s);
-		}
-
-		void fail (std::string s) {
-			failed++;
-			laststate = FAILED;
-			lastmsg = s;
-			std::cout << "\t" << outstate[FAILED] << s << std::endl;
-		}
-		void fail (const char *c) {
-			std::string s = c;
-			fail (s);
-		}
-
-		void untested (std::string s) {
-			untest++;
-			laststate = UNTESTED;
-			lastmsg = s;
-			std::cout << "\t" << outstate[UNTESTED] << s << std::endl;
-		}
-		void untested (const char *c) {
-			std::string s = c;
-			untested (s);
-		}
-
-		void unresolved (std::string s) {
-			unresolve++;
-			laststate = UNRESOLVED;
-			lastmsg = s;
-			std::cout << "\t" << outstate[UNRESOLVED] << s << std::endl;
-		}
-		void unresolved (const char *c) {
-			std::string s = c;
-			unresolved (s);
-		}
-
-		void totals (void) {
-			std::cout << "\t#passed:\t\t" << passed << std::endl;
-			std::cout << "\t#failed:\t\t" << failed << std::endl;
-			if (untest)
-				std::cout << "\t#untested:\t\t" << untest << std::endl;
-			if (unresolve)
-				std::cout << "\t#unresolved:\t\t" << unresolve << std::endl;
-		}
-
-		// This is so this class can be printed in an ostream.
-		friend std::ostream & operator << (std::ostream &os, TestState& t) {
-			return os << "\t" << outstate[t.laststate] << t.lastmsg ;
-		}
-
-		int GetState(void) {
-			return laststate;
-		}
-		std::string GetMsg(void) {
-			return lastmsg;
-		}
-};
+ private:
+  teststate laststate;
+  std::string lastmsg;
+ public:
+  TestState (void)
+    {
+      passed = 0;
+      failed = 0;
+      untest = 0;
+      xpassed = 0;
+      xfailed = 0;
+      unresolve = 0;
+    }
+
+  ~TestState (void) { totals(); }
+
+  void testrun (bool b, std::string s)
+    {
+      if (b)
+	pass (s);
+      else
+	fail (s);
+    }
+
+    void pass (std::string s)
+      {
+	passed++;
+	laststate = PASSED;
+	lastmsg = s;
+	std::cout << "\t" << outstate[PASSED] << s << std::endl;
+      }
+
+    void pass (const char *c)
+      {
+	std::string s = c;
+	pass (s);
+      }
+
+    void xpass (std::string s)
+      {
+	xpassed++;
+	laststate = PASSED;
+	lastmsg = s;
+	std::cout << "\t" << outstate[XPASSED] << s << std::endl;
+      }
+
+    void xpass (const char *c)
+      {
+	std::string s = c;
+	xpass (s);
+      }
+
+    void fail (std::string s)
+      {
+	failed++;
+	laststate = FAILED;
+	lastmsg = s;
+	std::cout << "\t" << outstate[FAILED] << s << std::endl;
+      }
+
+    void fail (const char *c)
+      {
+	std::string s = c;
+	fail (s);
+      }
+
+    void xfail (std::string s)
+      {
+	xfailed++;
+	laststate = XFAILED;
+	lastmsg = s;
+	std::cout << "\t" << outstate[XFAILED] << s << std::endl;
+      }
+
+    void xfail (const char *c)
+      {
+	std::string s = c;
+	xfail (s);
+      }
+
+    void untested (std::string s)
+      {
+	untest++;
+	laststate = UNTESTED;
+	lastmsg = s;
+	std::cout << "\t" << outstate[UNTESTED] << s << std::endl;
+      }
+
+    void untested (const char *c)
+      {
+	std::string s = c;
+	untested (s);
+      }
+
+    void unresolved (std::string s)
+      {
+	unresolve++;
+	laststate = UNRESOLVED;
+	lastmsg = s;
+	std::cout << "\t" << outstate[UNRESOLVED] << s << std::endl;
+      }
+
+    void unresolved (const char *c)
+      {
+	std::string s = c;
+	unresolved (s);
+      }
+
+    void totals (void)
+      {
+	std::cout << "\t#passed:\t\t" << passed << std::endl;
+	std::cout << "\t#real failed:\t\t" << failed << std::endl;
+	if (xfailed)
+	  std::cout << "\t#expected failures:\t\t" << xfailed << std::endl;
+	if (xpassed)
+	  std::cout << "\t#unexpected passes:\t\t" << xpassed << std::endl;
+	if (untest)
+	  std::cout << "\t#untested:\t\t" << untest << std::endl;
+	if (unresolve)
+	  std::cout << "\t#unresolved:\t\t" << unresolve << std::endl;
+      }
 
-#endif		// __cplusplus
-#endif          // _DEJAGNU_H_
+    // This is so this class can be printed in an ostream.
+    friend std::ostream & operator << (std::ostream &os, TestState& t)
+      {
+	return os << "\t" << outstate[t.laststate] << t.lastmsg ;
+      }
 
+    int GetState (void) { return laststate; }
+    std::string GetMsg (void) { return lastmsg; }
+};
 
+#endif /* __cplusplus */
+#endif /* _DEJAGNU_H_ */