home *** CD-ROM | disk | FTP | other *** search
/ Atari FTP / ATARI_FTP_0693.zip / ATARI_FTP_0693 / Mint / mntlib25.zoo / gnuaux.c < prev    next >
C/C++ Source or Header  |  1992-10-09  |  2KB  |  131 lines

  1. /* 
  2.     Selected parts of gnulib for atariST g++
  3.      ++jrb    bammi@cadence.com
  4. */
  5.  
  6. #ifndef _COMPILER_H
  7. #include <compiler.h>
  8. #endif
  9.  
  10. #include <stdlib.h>
  11. #include <memory.h>
  12. #include <unistd.h>
  13. #include <string.h>
  14.  
  15. /* frills for C++ */
  16.  
  17. #ifdef L_builtin_new
  18. typedef void (*vfp)();
  19.  
  20. extern vfp __new_handler;
  21.  
  22. char *
  23. __builtin_new (sz)
  24.      size_t sz;
  25. {
  26.   char *p;
  27.  
  28.   p = (char *)malloc (sz);
  29.   if (p == 0)
  30.     (*__new_handler) ();
  31.   return p;
  32. }
  33. #endif
  34.  
  35. #ifdef L_builtin_New
  36. typedef void (*vfp)();
  37.  
  38. static void
  39. default_new_handler ();
  40.  
  41. vfp __new_handler = default_new_handler;
  42.  
  43. char *
  44. __builtin_vec_new (p, maxindex, size, ctor)
  45.      char *p;
  46.      size_t maxindex, size;
  47.      void (*ctor)();
  48. {
  49.   char *__builtin_new(size_t);
  50.   size_t i, nelts = maxindex + 1;
  51.   char *rval;
  52.  
  53.   if (p == 0)
  54.     p = (char *)__builtin_new (nelts * size);
  55.  
  56.   rval = p;
  57.  
  58.   for (i = 0; i < nelts; i++)
  59.     {
  60.       (*ctor) (p);
  61.       p += size;
  62.     }
  63.  
  64.   return rval;
  65. }
  66.  
  67. vfp
  68. __set_new_handler (handler)
  69.      vfp handler;
  70. {
  71.   vfp prev_handler;
  72.  
  73.   prev_handler = __new_handler;
  74.   if (handler == 0) handler = default_new_handler;
  75.   __new_handler = handler;
  76.   return prev_handler;
  77. }
  78.  
  79. vfp
  80. set_new_handler (handler)
  81.      vfp handler;
  82. {
  83.   return __set_new_handler (handler);
  84. }
  85.  
  86. static void
  87. default_new_handler ()
  88. {
  89.   /* don't use fprintf (stderr, ...) because it may need to call malloc.  */
  90.   write (2, "default_new_handler: out of memory... aaaiiiiiieeeeeeeeeeeeee!\n", 65);
  91.   /* don't call exit () because that may call global destructors which
  92.      may cause a loop.  */
  93.   _exit (-1);
  94. }
  95. #endif
  96.  
  97. #ifdef L_builtin_del
  98. typedef void (*vfp)();
  99.  
  100. void
  101. __builtin_delete (ptr)
  102.      char *ptr;
  103. {
  104.   if (ptr)
  105.     free (ptr);
  106. }
  107.  
  108. void
  109. __builtin_vec_delete (ptr, maxindex, size, dtor, auto_delete_vec, auto_delete)
  110.      char *ptr;
  111.      size_t maxindex, size;
  112.      void (*dtor)();
  113.      int auto_delete;
  114. {
  115.   size_t i, nelts = maxindex + 1;
  116.   char *p = ptr;
  117.  
  118.   ptr += nelts * size;
  119.  
  120.   for (i = 0; i < nelts; i++)
  121.     {
  122.       ptr -= size;
  123.       (*dtor) (ptr, auto_delete);
  124.     }
  125.  
  126.   if (auto_delete_vec)
  127.     free (p);
  128. }
  129.  
  130. #endif
  131.