(extend_alloca): New define. Based on stack direction it'll try to append to the...
authorUlrich Drepper <drepper@redhat.com>
Wed, 20 Nov 2002 19:42:37 +0000 (19:42 +0000)
committerUlrich Drepper <drepper@redhat.com>
Wed, 20 Nov 2002 19:42:37 +0000 (19:42 +0000)
include/alloca.h

index 9536fe0..de541f4 100644 (file)
@@ -1,6 +1,7 @@
 #ifndef _ALLOCA_H
 
 #include <stdlib/alloca.h>
+#include <stackinfo.h>
 
 #undef __alloca
 
@@ -18,4 +19,31 @@ extern int __libc_alloca_cutoff (size_t size) __attribute__ ((const));
 
 #include <allocalim.h>
 
+#if _STACK_GROWS_DOWN
+# define extend_alloca(buf, len, newlen) \
+  (__typeof (buf)) ({ size_t __newlen = (newlen);                            \
+                     char *__newbuf = __alloca (__newlen);                   \
+                     if (__newbuf + __newlen == (char *) buf)                \
+                       len += __newlen;                                      \
+                     else                                                    \
+                       len = __newlen;                                       \
+                     __newbuf; })
+#elif _STACK_GROWS_UP
+# define extend_alloca(buf, len, newlen) \
+  (__typeof (buf)) ({ size_t __newlen = (newlen);                            \
+                     char *__newbuf = __alloca (__newlen);                   \
+                     char *__buf = (buf);                                    \
+                     if (__buf + __newlen == __newbuf)                       \
+                       {                                                     \
+                         len += __newlen;                                    \
+                         __newbuf = __buf;                                   \
+                       }                                                     \
+                     else                                                    \
+                       len = __newlen;                                       \
+                     __newbuf; })
+#else
+# define extern_alloca(buf, len, newlen) \
+  __alloca (((len) = (newlen)))
+#endif
+
 #endif