home *** CD-ROM | disk | FTP | other *** search
/ The Atari Compendium / The Atari Compendium (Toad Computers) (1994).iso / files / prgtools / gnustuff / tos / g__~1 / gplibs17.zoo / gnuaux.c < prev    next >
Encoding:
C/C++ Source or Header  |  1992-11-13  |  2.1 KB  |  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. typedef void (*vfp)();
  16.  
  17. /* frills for C++ */
  18.  
  19. #ifdef L_builtin_new
  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 ? sz : (size_t)1);
  29.   if (p == 0)
  30.     (*__new_handler) ();
  31.   return p;
  32. }
  33. #endif
  34.  
  35. #ifdef L_builtin_New
  36.  
  37. char *
  38. __builtin_vec_new (p, maxindex, size, ctor)
  39.      char *p;
  40.      size_t maxindex, size;
  41.      void (*ctor)();
  42. {
  43.   char *__builtin_new(size_t);
  44.   size_t i, nelts = maxindex + 1;
  45.   char *rval;
  46.  
  47.   if (p == 0)
  48.     p = (char *)__builtin_new (nelts * size);
  49.  
  50.   rval = p;
  51.  
  52.   for (i = 0; i < nelts; i++)
  53.     {
  54.       (*ctor) (p);
  55.       p += size;
  56.     }
  57.  
  58.   return rval;
  59. }
  60. #endif
  61.  
  62. #ifdef L_new_hand
  63. static void
  64. default_new_handler ();
  65.  
  66. vfp __new_handler = default_new_handler;
  67.  
  68. vfp
  69. __set_new_handler (handler)
  70.      vfp handler;
  71. {
  72.   vfp prev_handler;
  73.  
  74.   prev_handler = __new_handler;
  75.   if (handler == 0) handler = default_new_handler;
  76.   __new_handler = handler;
  77.   return prev_handler;
  78. }
  79.  
  80. vfp
  81. set_new_handler (handler)
  82.      vfp handler;
  83. {
  84.   return __set_new_handler (handler);
  85. }
  86.  
  87. #define MESSAGE "default_new_handler: out of memory... aaaiiiiiieeeeeeeeeeeeee!\n"
  88. static void
  89. default_new_handler ()
  90. {
  91.   /* don't use fprintf (stderr, ...) because it may need to call malloc.  */
  92.   _write (2, MESSAGE, sizeof(MESSAGE));
  93.   /* don't call exit () because that may call global destructors which
  94.      may cause a loop.  */
  95.   _exit (-1);
  96. }
  97. #endif
  98.  
  99. #ifdef L_builtin_del
  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.