summary refs log tree commit diff
path: root/include
diff options
context:
space:
mode:
authorUlrich Drepper <drepper@redhat.com>2002-11-20 19:42:37 +0000
committerUlrich Drepper <drepper@redhat.com>2002-11-20 19:42:37 +0000
commit832737d5e2b924f18884c78d253e8a950c07fcc5 (patch)
treed02c2bae57dff9dd7f8b555e187505a4a98ba8d9 /include
parent7f1b7f038df43bdbc62c86f2cb3d414d58aebbcc (diff)
downloadglibc-832737d5e2b924f18884c78d253e8a950c07fcc5.tar.gz
glibc-832737d5e2b924f18884c78d253e8a950c07fcc5.tar.xz
glibc-832737d5e2b924f18884c78d253e8a950c07fcc5.zip
(extend_alloca): New define. Based on stack direction it'll try to append to the previouls allocated buffer.
Diffstat (limited to 'include')
-rw-r--r--include/alloca.h28
1 files changed, 28 insertions, 0 deletions
diff --git a/include/alloca.h b/include/alloca.h
index 9536fe0f1f..de541f4e5a 100644
--- a/include/alloca.h
+++ b/include/alloca.h
@@ -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