home *** CD-ROM | disk | FTP | other *** search
/ Amiga ISO Collection / AmigaUtilCD2.iso / Programming / GCC / GERLIB_DEV08B.LHA / gerlib / gnulib / normal / ger_newdel_vec.c < prev    next >
Encoding:
C/C++ Source or Header  |  1993-12-12  |  968 b   |  58 lines

  1. /* builtin_vec_new() und builtin_vec_delete, für new[] und delete [] */
  2.  
  3. typedef void (*vfp)(void);
  4.  
  5. void *__builtin_new(unsigned long Anz);
  6. void __builtin_delete(unsigned long *p);
  7.  
  8. void default_new_handler ();
  9.  
  10. extern vfp __new_handler;
  11.  
  12. void *
  13. __builtin_vec_new (p, maxindex, size, ctor)
  14.      void *p;
  15.      int maxindex, size;
  16.      void (*ctor)(void *);
  17. {
  18.   int i, nelts = maxindex + 1;
  19.   void *rval;
  20.  
  21.   if (p == 0)
  22.     p = (void *)__builtin_new (nelts * size);
  23.  
  24.   rval = p;
  25.  
  26.   for (i = 0; i < nelts; i++)
  27.     {
  28.       (*ctor) (p);
  29.       p += size;
  30.     }
  31.  
  32.   return rval;
  33. }
  34.  
  35.  
  36. void
  37. __builtin_vec_delete (ptr, maxindex, size, dtor, auto_delete_vec, auto_delete)
  38.      void *ptr;
  39.      int maxindex, size;
  40.      void (*dtor)();
  41.      int auto_delete;
  42. {
  43.   int i, nelts = maxindex + 1;
  44.   void *p = ptr;
  45.  
  46.   ptr += nelts * size;
  47.  
  48.   for (i = 0; i < nelts; i++)
  49.     {
  50.       ptr -= size;
  51.       (*dtor) (ptr, auto_delete);
  52.     }
  53.  
  54.   if (auto_delete_vec)
  55.     __builtin_delete (p);
  56. }
  57.  
  58.