summaryrefslogtreecommitdiff
path: root/lib/alloca.c
diff options
context:
space:
mode:
authorPaul Eggert <eggert@cs.ucla.edu>2002-12-05 20:46:03 +0000
committerPaul Eggert <eggert@cs.ucla.edu>2002-12-05 20:46:03 +0000
commit504274b059ba334afce41151572ac5b782a3cc59 (patch)
treedc6ffe9e00bd9cf933a3257cde1ce47144c444d2 /lib/alloca.c
parent4ff9279d9d4e96e036b780f359f954ab3641dbc0 (diff)
downloadtar-504274b059ba334afce41151572ac5b782a3cc59.tar.gz
import from gnulib
Diffstat (limited to 'lib/alloca.c')
-rw-r--r--lib/alloca.c48
1 files changed, 26 insertions, 22 deletions
diff --git a/lib/alloca.c b/lib/alloca.c
index 6ad425a4..fd95a34d 100644
--- a/lib/alloca.c
+++ b/lib/alloca.c
@@ -33,7 +33,15 @@
#endif
#ifdef emacs
+# include "lisp.h"
# include "blockinput.h"
+# define xalloc_die() memory_full ()
+# ifdef EMACS_FREE
+# undef free
+# define free EMACS_FREE
+# endif
+#else
+# include <xalloc.h>
#endif
/* If compiling with GCC 2, this file's not needed. */
@@ -53,6 +61,8 @@
you
lose
-- must know STACK_DIRECTION at compile-time
+/* Using #error here is not wise since this file should work for
+ old and obscure compilers. */
# endif /* STACK_DIRECTION undefined */
# endif /* static */
# endif /* emacs */
@@ -67,32 +77,19 @@ long i00afunc ();
# define ADDRESS_FUNCTION(arg) &(arg)
# endif
-# if __STDC__
-typedef void *pointer;
-# else
-typedef char *pointer;
+# ifndef POINTER_TYPE
+# ifdef __STDC__
+# define POINTER_TYPE void
+# else
+# define POINTER_TYPE char
+# endif
# endif
+typedef POINTER_TYPE *pointer;
# ifndef NULL
# define NULL 0
# endif
-/* Different portions of Emacs need to call different versions of
- malloc. The Emacs executable needs alloca to call xmalloc, because
- ordinary malloc isn't protected from input signals. On the other
- hand, the utilities in lib-src need alloca to call malloc; some of
- them are very simple, and don't have an xmalloc routine.
-
- Non-Emacs programs expect this to call xmalloc.
-
- Callers below should use malloc. */
-
-# ifndef emacs
-# undef malloc
-# define malloc xmalloc
-# endif
-extern pointer malloc ();
-
/* Define STACK_DIRECTION if you know the direction of stack
growth for your system; otherwise it will be automatically
deduced at run-time.
@@ -169,7 +166,8 @@ static header *last_alloca_header = NULL; /* -> last alloca header. */
implementations of C, for example under Gould's UTX/32. */
pointer
-alloca (size_t size)
+alloca (size)
+ size_t size;
{
auto char probe; /* Probes stack depth: */
register char *depth = ADDRESS_FUNCTION (probe);
@@ -215,8 +213,14 @@ alloca (size_t size)
/* Allocate combined header + user data storage. */
{
- register pointer new = malloc (sizeof (header) + size);
/* Address of header. */
+ register pointer new;
+
+ size_t combined_size = sizeof (header) + size;
+ if (combined_size < sizeof (header))
+ xalloc_die ();
+
+ new = xmalloc (combined_size);
if (new == 0)
abort();