/* Release 3.10 */ /*-------------------------------------------------------------------------* * * * NEW.CPP - new implementations. * * * * COPYRIGHT (C) 1989..1992 Clarion Software Corporation. * * All Rights Reserved * * * *--------------------------------------------------------------------------*/ #include #include #pragma module(init_prio=>22) _STATIC void (*new_handler)(void); #pragma save, call(reg_return=>(ax,bx)) void* operator new(unsigned size) { void *b; b=p_alloc(size); if((b == NULL) && (new_handler) && (size)) new_handler(); return b; } #pragma restore void* operator new(unsigned, void *place) { return place; } void operator delete(void *p) { p_free(p); } void (* set_new_handler(void(*nh)()))() { void (* ret)(); ret=new_handler; new_handler=nh; return ret; } extern "C" void * _vec_new( char * obj_ptr, unsigned n, unsigned siz, ctor_t ctor, unsigned vbnum) { unsigned *h; if (! obj_ptr) { h=(unsigned *)p_alloc(n * siz + sizeof(unsigned)); if(h == NULL) { if(new_handler) new_handler(); return NULL; } *h=n; obj_ptr= (char *)(h + 1); } if (ctor) _call_ctors(ctor, (char *) obj_ptr, vbnum, n, siz); return obj_ptr; } extern "C" void _vec_delete( char * obj_ptr, unsigned siz, dtor_t dtor, unsigned _free, unsigned vbnum, unsigned static_num) { unsigned n; unsigned *tmp; if (obj_ptr) { tmp = (unsigned *)obj_ptr-1; if(dtor) { if(_free) n=*tmp; else n=static_num; obj_ptr+=n*siz; _call_dtors(dtor,obj_ptr,vbnum,n,siz); } if(_free) p_free(tmp); } }