New macro xnmalloca.
authorBruno Haible <bruno@clisp.org>
Mon, 31 Dec 2007 10:54:37 +0000 (11:54 +0100)
committerBruno Haible <bruno@clisp.org>
Mon, 31 Dec 2007 10:54:37 +0000 (11:54 +0100)
ChangeLog
lib/xmalloca.h

index 32c0264e1feaf43df9489840b8c54f4cb0e041e5..207323a48b54a71760691fa6c82e6c2a0b7e0bd0 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2007-12-30  Bruno Haible  <bruno@clisp.org>
+
+       * lib/xmalloca.h: Include xalloc.h.
+       (xnmalloca): New macro.
+
 2007-12-30  Bruno Haible  <bruno@clisp.org>
 
        * lib/malloca.h (nmalloca): New macro.
index 4a96300a091a6533b31015667fa9cdda9b49af00..bd4c5a91764e576618bf499054ccbb1c4e505348 100644 (file)
@@ -19,6 +19,7 @@
 #define _XMALLOCA_H
 
 #include "malloca.h"
+#include "xalloc.h"
 
 
 #ifdef __cplusplus
@@ -40,9 +41,19 @@ extern void * xmmalloca (size_t n);
   xmalloc (N)
 #endif
 
-/* Maybe we should also define a variant
-    xnmalloca (size_t n, size_t s) - behaves like xmalloca (n * s)
-   If this would be useful in your application. please speak up.  */
+/* xnmalloca(N,S) is an overflow-safe variant of xmalloca (N * S).
+   It allocates an array of N objects, each with S bytes of memory,
+   on the stack.  S must be positive and N must be nonnegative.
+   The array must be freed using freea() before the function returns.
+   Upon failure, it exits with an error message.  */
+#if HAVE_ALLOCA
+/* Rely on xmalloca (SIZE_MAX) calling xalloc_die ().  */
+# define xnmalloca(n, s) \
+    xmalloca (xalloc_oversized ((n), (s)) ? (size_t) (-1) : (n) * (s))
+#else
+# define xnmalloca(n, s) \
+    xnmalloc ((n), (s))
+#endif
 
 
 #ifdef __cplusplus