Files
sibo-playground/code/SIBOSDK/src/new.cpp
T

91 lines
2.0 KiB
C++
Raw Normal View History

2026-07-06 18:01:36 +01:00
/* Release 3.10 */
/*-------------------------------------------------------------------------*
* *
* NEW.CPP - new implementations. *
* *
* COPYRIGHT (C) 1989..1992 Clarion Software Corporation. *
* All Rights Reserved *
* *
*--------------------------------------------------------------------------*/
#include <clib.h>
#include <p_std.h>
#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);
}
}