OSDN Git Service

mkostemp: fix implementation
[uclinux-h8/uClibc.git] / include / alloca.h
1 /* Copyright (C) 1992, 1996, 1997, 1998, 1999 Free Software Foundation, Inc.
2    This file is part of the GNU C Library.
3
4    The GNU C Library is free software; you can redistribute it and/or
5    modify it under the terms of the GNU Lesser General Public
6    License as published by the Free Software Foundation; either
7    version 2.1 of the License, or (at your option) any later version.
8
9    The GNU C Library is distributed in the hope that it will be useful,
10    but WITHOUT ANY WARRANTY; without even the implied warranty of
11    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12    Lesser General Public License for more details.
13
14    You should have received a copy of the GNU Lesser General Public
15    License along with the GNU C Library; if not, see
16    <http://www.gnu.org/licenses/>.  */
17
18 #ifndef _ALLOCA_H
19 #define _ALLOCA_H       1
20
21 #include <features.h>
22
23 #define __need_size_t
24 #include <stddef.h>
25
26 __BEGIN_DECLS
27
28 /* Remove any previous definitions.  */
29 #undef  alloca
30
31 /* Allocate a block that will be freed when the calling function exits.  */
32 extern void *alloca (size_t __size) __THROW;
33
34 #ifdef  __GNUC__
35 # define alloca(size)   __builtin_alloca (size)
36 #endif /* GCC.  */
37
38 #ifdef _LIBC
39 # define __MAX_ALLOCA_CUTOFF    65536
40
41 # include <bits/stackinfo.h>
42 # ifdef _STACK_GROWS_DOWN
43 #  define extend_alloca(buf, len, newlen) \
44    (__typeof (buf)) ({ size_t __newlen = (newlen);                            \
45                       char *__newbuf = alloca (__newlen);                     \
46                       if (__newbuf + __newlen == (char *) buf)                \
47                         len += __newlen;                                      \
48                       else                                                    \
49                         len = __newlen;                                       \
50                       __newbuf; })
51 # elif defined _STACK_GROWS_UP
52 #  define extend_alloca(buf, len, newlen) \
53    (__typeof (buf)) ({ size_t __newlen = (newlen);                            \
54                       char *__newbuf = alloca (__newlen);                     \
55                       char *__buf = (buf);                                    \
56                       if (__buf + __newlen == __newbuf)                       \
57                         {                                                     \
58                           len += __newlen;                                    \
59                           __newbuf = __buf;                                   \
60                         }                                                     \
61                       else                                                    \
62                         len = __newlen;                                       \
63                       __newbuf; })
64 # else
65 #  error unknown stack
66 #  define extend_alloca(buf, len, newlen) \
67    alloca (((len) = (newlen)))
68 # endif
69
70 extern int __libc_alloca_cutoff (size_t size);
71 #endif
72
73 __END_DECLS
74
75 #endif /* alloca.h */