/* builtin_vec_new() und builtin_vec_delete, für new[] und delete [] */

typedef void (*vfp)(void);

void *__builtin_new(unsigned long Anz);
void __builtin_delete(unsigned long *p);

void default_new_handler ();

extern vfp __new_handler;

void *
__builtin_vec_new (p, maxindex, size, ctor)
     void *p;
     int maxindex, size;
     void (*ctor)(void *);
{
  int i, nelts = maxindex + 1;
  void *rval;

  if (p == 0)
    p = (void *)__builtin_new (nelts * size);

  rval = p;

  for (i = 0; i < nelts; i++)
    {
      (*ctor) (p);
      p += size;
    }

  return rval;
}


void
__builtin_vec_delete (ptr, maxindex, size, dtor, auto_delete_vec, auto_delete)
     void *ptr;
     int maxindex, size;
     void (*dtor)();
     int auto_delete;
{
  int i, nelts = maxindex + 1;
  void *p = ptr;

  ptr += nelts * size;

  for (i = 0; i < nelts; i++)
    {
      ptr -= size;
      (*dtor) (ptr, auto_delete);
    }

  if (auto_delete_vec)
    __builtin_delete (p);
}

