home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / LIBSRC.ZOO / libsrc / gpp / gppstuff.c < prev    next >
Text File  |  1992-03-14  |  2KB  |  107 lines

  1. /* frills for C++ */
  2.  
  3. typedef void (*vfp)(void);
  4.  
  5. extern vfp __new_handler;
  6.  
  7. void *
  8. __builtin_new (sz)
  9.      long sz;
  10. {
  11.   void *p;
  12.  
  13.   p = (void *) malloc (sz);
  14.   if (p == 0)
  15.     (*__new_handler) ();
  16.   return p;
  17. }
  18.  
  19. static void default_new_handler ();
  20.  
  21. vfp __new_handler = default_new_handler;
  22.  
  23. void *
  24. __builtin_vec_new (p, maxindex, size, ctor)
  25.      void *p;
  26.      int maxindex, size;
  27.      void (*ctor)(void *);
  28. {
  29.   int i, nelts = maxindex + 1;
  30.   void *rval;
  31.  
  32.   if (p == 0)
  33.     p = (void *)__builtin_new (nelts * size);
  34.  
  35.   rval = p;
  36.  
  37.   for (i = 0; i < nelts; i++)
  38.     {
  39.       (*ctor) (p);
  40.       p += size;
  41.     }
  42.  
  43.   return rval;
  44. }
  45.  
  46. vfp
  47. __set_new_handler (handler)
  48.      vfp handler;
  49. {
  50.   vfp prev_handler;
  51.  
  52.   prev_handler = __new_handler;
  53.   if (handler == 0) handler = default_new_handler;
  54.   __new_handler = handler;
  55.   return prev_handler;
  56. }
  57.  
  58. vfp
  59. set_new_handler (handler)
  60.      vfp handler;
  61. {
  62.   return __set_new_handler (handler);
  63. }
  64.  
  65. static void
  66. default_new_handler ()
  67. {
  68.   /* don't use fprintf (stderr, ...) because it may need to call malloc.  */
  69.   /* This should really print the name of the program, but that is hard to
  70.      do.  We need a standard, clean way to get at the name.  */
  71.   write (2, "Virtual memory exceeded in `new'\n", 33);
  72.   /* don't call exit () because that may call global destructors which
  73.      may cause a loop.  */
  74.   _exit (-1);
  75. }
  76.  
  77. void
  78. __builtin_delete (ptr)
  79.      void *ptr;
  80. {
  81.   if (ptr)
  82.     free (ptr);
  83. }
  84.  
  85. void
  86. __builtin_vec_delete (ptr, maxindex, size, dtor, auto_delete_vec, auto_delete)
  87.      void *ptr;
  88.      int maxindex, size;
  89.      void (*dtor)();
  90.      int auto_delete;
  91. {
  92.   int i, nelts = maxindex + 1;
  93.   void *p = ptr;
  94.  
  95.   ptr += nelts * size;
  96.  
  97.   for (i = 0; i < nelts; i++)
  98.     {
  99.       ptr -= size;
  100.       (*dtor) (ptr, auto_delete);
  101.     }
  102.  
  103.   if (auto_delete_vec)
  104.     __builtin_delete (p);
  105. }
  106.  
  107.