/* this file is NOT C++, it's C. cf gnu-1.35\gnulib.c, these are extra things required by G++ */ #define L_builtin_new #define L_builtin_New #define L_builtin_del /* frills for C++ */ #ifdef L_builtin_new typedef void (*vfp)(); extern vfp __new_handler; char * __builtin_new (sz) long sz; { char *p; p = (char *)malloc (sz); if (p == 0) (*__new_handler) (); return p; } #endif #ifdef L_builtin_New /* this seems to be completely fukt... typedef void (*vfp)(); */ static void default_new_handler (); vfp __new_handler = default_new_handler; char * __builtin_vec_new (p, maxindex, size, ctor) char *p; int maxindex, size; void (*ctor)(); { int i, nelts = maxindex + 1; char *rval; if (p == 0) p = (char *)__builtin_new (nelts * size); rval = p; for (i = 0; i < nelts; i++) { ctor (p); p += size; } return rval; } vfp __set_new_handler (handler) vfp handler; { vfp prev_handler; prev_handler = __new_handler; if (handler == 0) handler = default_new_handler; __new_handler = handler; return prev_handler; } vfp set_new_handler (handler) vfp handler; { return __set_new_handler (handler); } static void default_new_handler () { /* don't use fprintf (stderr, ...) because it may need to call malloc. */ write (2, "default_new_handler: out of memory... aaaiiiiiieeeeeeeeeeeeee!\n", 65); /* don't call exit () because that may call global destructors which may cause a loop. */ _exit (-1); } #endif #ifdef L_builtin_del /* this ifdef added by jrd; this construct appears broken in the original */ #ifndef L_builtin_New typedef void (*vfp)(); #endif void __builtin_delete (ptr) char *ptr; { if (ptr) free (ptr); } void __builtin_vec_delete (ptr, maxindex, size, dtor, auto_delete_vec, auto_delete) char *ptr; int maxindex, size; void (*dtor)(); int auto_delete; { int i, nelts = maxindex + 1; char *p = ptr; ptr += nelts * size; for (i = 0; i < nelts; i++) { ptr -= size; dtor (ptr, auto_delete); } if (auto_delete_vec) free (p); } #endif