home *** CD-ROM | disk | FTP | other *** search
/ GEMini Atari / GEMini_Atari_CD-ROM_Walnut_Creek_December_1993.iso / files / gnu / g__lib / atarist.c < prev    next >
C/C++ Source or Header  |  1993-07-23  |  2KB  |  130 lines

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