diff options
author | Ulrich Drepper <drepper@redhat.com> | 2002-11-20 19:42:37 +0000 |
---|---|---|
committer | Ulrich Drepper <drepper@redhat.com> | 2002-11-20 19:42:37 +0000 |
commit | 832737d5e2b924f18884c78d253e8a950c07fcc5 (patch) | |
tree | d02c2bae57dff9dd7f8b555e187505a4a98ba8d9 /include | |
parent | 7f1b7f038df43bdbc62c86f2cb3d414d58aebbcc (diff) | |
download | glibc-832737d5e2b924f18884c78d253e8a950c07fcc5.tar.gz |
(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.h | 28 |
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 |