Browse Source

Update to assert behavior

Eric Andersen 23 years ago
parent
commit
448e40e86c
2 changed files with 34 additions and 8 deletions
  1. 25 2
      include/assert.h
  2. 9 6
      libc/misc/assert/__assert.c

+ 25 - 2
include/assert.h

@@ -11,12 +11,35 @@
 
 #else /* Not NDEBUG.  */
 
-extern void __assert __P((const char *, const char *, int));
+extern void __assert __P((const char *, const char *, int, const char *));
 
 #define	assert(expr)							      \
   ((void) ((expr) ||							      \
 	   (__assert (__STRING(expr),				      \
-			   __FILE__, __LINE__), 0)))
+			   __FILE__, __LINE__, __ASSERT_FUNCTION), 0)))
+
+  
+/* Version 2.4 and later of GCC define a magical variable `__PRETTY_FUNCTION__'
+   which contains the name of the function currently being defined.
+#  define __ASSERT_FUNCTION	__PRETTY_FUNCTION__
+   This is broken in G++ before version 2.6.
+   C9x has a similar variable called __func__, but prefer the GCC one since
+   it demangles C++ function names.  */
+# ifdef __GNUC__
+#  if __GNUC__ > 2 || (__GNUC__ == 2 \
+		       && __GNUC_MINOR__ >= (defined __cplusplus ? 6 : 4))
+#   define __ASSERT_FUNCTION	__PRETTY_FUNCTION__
+#  else
+#   define __ASSERT_FUNCTION	((__const char *) 0)
+#  endif
+# else
+#  if defined __STDC_VERSION__ && __STDC_VERSION__ >= 199901L
+#   define __ASSERT_FUNCTION	__func__
+#  else
+#   define __ASSERT_FUNCTION	((__const char *) 0)
+#  endif
+# endif
+
 
 #endif /* NDEBUG.  */
 

+ 9 - 6
libc/misc/assert/__assert.c

@@ -15,17 +15,20 @@ const char *str;
 	write(2, str, strlen(str));
 }
 
-void __assert(assertion, filename, linenumber)
+void __assert(assertion, filename, linenumber, function)
 const char *assertion;
 const char *filename;
 int linenumber;
+const char *function;
 {
-	errput("Failed assertion '");
-	errput(assertion);
-	errput("' in file ");
 	errput(filename);
-	errput(" at line ");
+	errput(":");
 	errput(itoa(linenumber));
-	errput(".\n");
+	errput(function ? ": " : "");
+	errput(function ? function : "");
+	errput(function ? "() " : "");
+	errput(": Assertion \"");
+	errput(assertion);
+	errput("\" failed.\n");
 	abort();
 }