OSDN Git Service

openat*: use a static function with the different type and strong_alias_untyped
[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, write to the Free
16    Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
17    02111-1307 USA.  */
18
19 #ifndef _ALLOCA_H
20 #define _ALLOCA_H       1
21
22 #include <features.h>
23
24 #define __need_size_t
25 #include <stddef.h>
26
27 __BEGIN_DECLS
28
29 /* Remove any previous definitions.  */
30 #undef  alloca
31
32 /* Allocate a block that will be freed when the calling function exits.  */
33 extern void *alloca (size_t __size) __THROW;
34
35 #ifdef  __GNUC__
36 # define alloca(size)   __builtin_alloca (size)
37 #endif /* GCC.  */
38
39 #ifdef _LIBC
40 # define __MAX_ALLOCA_CUTOFF    65536
41
42 # include <bits/stackinfo.h>
43 # ifdef _STACK_GROWS_DOWN
44 #  define extend_alloca(buf, len, newlen) \
45    (__typeof (buf)) ({ size_t __newlen = (newlen);                            \
46                       char *__newbuf = alloca (__newlen);                     \
47                       if (__newbuf + __newlen == (char *) buf)                \
48                         len += __newlen;                                      \
49                       else                                                    \
50                         len = __newlen;                                       \
51                       __newbuf; })
52 # elif defined _STACK_GROWS_UP
53 #  define extend_alloca(buf, len, newlen) \
54    (__typeof (buf)) ({ size_t __newlen = (newlen);                            \
55                       char *__newbuf = alloca (__newlen);                     \
56                       char *__buf = (buf);                                    \
57                       if (__buf + __newlen == __newbuf)                       \
58                         {                                                     \
59                           len += __newlen;                                    \
60                           __newbuf = __buf;                                   \
61                         }                                                     \
62                       else                                                    \
63                         len = __newlen;                                       \
64                       __newbuf; })
65 # else
66 #  error unknown stack
67 #  define extend_alloca(buf, len, newlen) \
68    alloca (((len) = (newlen)))
69 # endif
70
71 extern int __libc_alloca_cutoff (size_t size);
72 #endif
73
74 __END_DECLS
75
76 #endif /* alloca.h */