/* cpp.c */

#include <stdlib.h>
#include <io.h>

typedef void (*vfp)(void);

static void default_new_handler (void);

vfp __new_handler = default_new_handler;

static void default_new_handler (void)
{
  static char *msg = "Virtual memory exhausted in `new'\n";

  write (2, msg, strlen (msg));
  _exit (255);
}


void *__builtin_new (size_t size)
{
  void *p;

  /* Assume that malloc(0) does not return NULL.  This is true for
     malloc() of the emx C library. */

  p = malloc (size);
  while (p == NULL)
    {
      (*__new_handler)();
      p = malloc (size);
    }
  return (p);
}


void *__builtin_vec_new (size_t size)
{
  return (__builtin_new (size));
}


void __builtin_delete (void *p)
{
  if (p != NULL)
    free (p);
}


void __builtin_vec_delete (void *p)
{
  __builtin_delete (p);
}


vfp set_new_handler (vfp handler)
{
  vfp prev_handler;

  prev_handler = __new_handler;
  if (handler == NULL)
    handler = default_new_handler;
  __new_handler = handler;
  return (prev_handler);
}
