]> git.saurik.com Git - bison.git/blobdiff - lib/alloca.c
(YYDECL): Use YYSTYPE, not its deprecated alias yystype. This follows
[bison.git] / lib / alloca.c
index 6ad425a4cd6cdd2224c6f0aad359da5e32f9ec61..fd95a34d63a7d8f7ddd4c3845a9dda6a3060d6be 100644 (file)
 #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();