blob: 261c173bab131c1cd620ca614877c1564894706b [file]
/**
* etch_objects.c
* etch type object wrappers construction
*/
#include <stdio.h>
#include "etch_objects.h"
#include "etchmem.h"
#include "etchrun.h"
#include "etch_arraylist.h"
/**
* new_etch_primitive_object()
* constructor for an etchobject wrapper for a primitive value
* TODO LOSE
*/
etchobject* new_etchobject_primitive(const int objtype)
{
etchobject* newobj = new_etchobject(objtype);
// newobj->is_static_data = 0; // *****************
return newobj;
}
/**
* new_etch_int32()
* constructor for ETCH_INT32, a boxed 32-bit integer
*/
ETCH_INT32* new_etch_int32(const int value)
{
etchobject* newobj = new_etchobject_primitive(ETCHTYPE_BOXED_INT32);
newobj->value_int32 = value;
newobj->size = sizeof(int);
return newobj;
}
/**
* new_etch_int8()
* constructor for ETCH_INT8, a boxed 8-bit integer
*/
ETCH_INT8* new_etch_int8(const signed char value)
{
etchobject* newobj = new_etchobject_primitive(ETCHTYPE_BOXED_INT8);
newobj->value_int8 = value;
newobj->size = sizeof(char);
return newobj;
}
/**
* new_etch_int16()
* constructor for ETCH_INT16, a boxed 16-bit integer
*/
ETCH_INT16* new_etch_int16(const short value)
{
etchobject* newobj = new_etchobject_primitive(ETCHTYPE_BOXED_INT16);
newobj->value_int16 = value;
newobj->size = sizeof(short);
return newobj;
}
/**
* new_etch_int64()
* constructor for ETCH_INT64, a boxed 64-bit integer
*/
ETCH_INT64* new_etch_int64(const int64 value)
{
etchobject* newobj = new_etchobject_primitive(ETCHTYPE_BOXED_INT64);
newobj->value_int64 = value;
newobj->size = sizeof(int64);
return newobj;
}
/**
* new_etch_byte()
* constructor for ETCH_BYTE, a boxed unsigned char
*/
ETCH_BYTE* new_etch_byte(const unsigned char value)
{
etchobject* newobj = new_etchobject_primitive(ETCHTYPE_BOXED_BYTE);
newobj->value_byte = value;
newobj->size = sizeof(char);
return newobj;
}
/**
* new_etch_bool()
* constructor for ETCH_BOOL, a boxed unsigned char
*/
ETCH_BOOL* new_etch_bool(const unsigned char value)
{
etchobject* newobj = new_etchobject_primitive(ETCHTYPE_BOXED_BOOL);
newobj->value_byte = value? TRUE: FALSE;
newobj->size = sizeof(char);
return newobj;
}
/**
* new_etch_ieee32()
* constructor for ETCH_IEEE32, a boxed float
*/
ETCH_IEEE32* new_etch_ieee32(const float value)
{
etchobject* newobj = new_etchobject_primitive(ETCHTYPE_BOXED_IEEE32);
newobj->value_ieee32 = value;
newobj->size = sizeof(float);
return newobj;
}
/**
* new_etch_ieee64()
* constructor for ETCH_IEEE64, a boxed float
*/
ETCH_IEEE64* new_etch_ieee64(const double value)
{
etchobject* newobj = new_etchobject_primitive(ETCHTYPE_BOXED_IEEE64);
newobj->value_ieee64 = value;
newobj->size = sizeof(double);
return newobj;
}
/**
* new_etch_string()
* constructor for ETCH_STRING, a boxed array of wchar_t
*/
ETCH_STRING* new_etch_string(const wchar_t* value)
{
etchobject* newobj = NULL;
wchar_t* newval = NULL;
size_t bytelen = 0;
size_t numchars = value? wcslen(value) + 1: 0;
bytelen = sizeof(wchar_t) * numchars;
newval = etch_malloc (bytelen, ETCHTYPEB_BYTES);
memcpy(newval, value, bytelen);
newobj = new_etchobject(ETCHTYPE_BOXED_STRING);
newobj->value_ptr_to = newval;
newobj->size = bytelen;
return newobj;
}
/**
* new_etch_static_string()
* constructor for ETCH_STRING, a boxed array of wchar_t
* specified string will not be freed when the object is destroyed
*/
ETCH_STRING* new_etch_static_string(const wchar_t* value)
{
etchobject* newobj = NULL;
//size_t bytelen = 0;
//size_t numchars = value? wcslen(value) + 1: 0;
//bytelen = sizeof(wchar_t) * numchars;
//newobj = new_etchobject(ETCHTYPE_BOXED_STRING);
//newobj->value_ptr_to = (wchar_t*)value;
//newobj->size = bytelen;
//newobj->is_static_data = TRUE;
return newobj;
}
/**
* destroy_boxed_arraylist(()
* destructor for ETCH_ARRAYLIST, a boxed etch_arraylist.
*/
void destroy_boxed_arraylist(ETCH_ARRAYLIST* thisp)
{
//if (!thisp->is_static_data && thisp->value_ptr_to)
// arraylist_destroy((etch_arraylist*)thisp->value_ptr_to, TRUE);
//if (!thisp->is_static_object)
// etch_free(thisp);
}
/**
* clone_boxed_arraylist()
*/
ETCH_ARRAYLIST* clone_boxed_arraylist(ETCH_ARRAYLIST* thisp)
{
int i = 0, result = 0;
void* content = NULL;
etchobject* newobj = NULL;
//etch_arraylist* newlist = NULL, *oldlist = NULL;
//if (thisp == NULL) return NULL;
//if (thisp->is_static_data) /* if static string return it */
// return thisp->value_ptr_to;
// /* null if nothing to copy */
//if (thisp->value_ptr_to == NULL || thisp->size < 1)
// return NULL;
//oldlist = (etch_arraylist*) thisp->value_ptr_to;
//newlist = new_arraylist(oldlist->count, oldlist->delta);
//newlist->is_readonly = oldlist->is_readonly;
//newlist->content_type = oldlist->content_type;
//while((result == 0) && (NULL != (content = arraylist_get(oldlist, i++))))
// result = arraylist_add(newlist, content);
//newobj = new_etchobject(ETCHTYPE_BOXED_ARRAYLIST);
//memcpy(newobj, thisp, sizeof(etchobject));
//newobj->value_ptr_to = newlist;
return newobj;
}
/**
* new_etch_arraylist(initsize, delta)
* constructor for ETCH_ARRAYLIST, a boxed etch_arraylist.
* initsize: initial number of entries allocated, default configured.
* deltsize: number of entries added upon expansion, default initsize.
* is_readonly: if TRUE, memory for arraylist content will not be freed
* upon invoking destroy() (of course, more control could be exerted
* by operating on the underlying etch_arraylist directly).
*/
ETCH_ARRAYLIST* new_etch_arraylist
(const unsigned initsize, const unsigned deltsize, const unsigned is_readonly)
{
etchobject* newobj = NULL;
//i_etchobject* vtab = NULL;
//const int VTAB_KEY = ETCHTYPEB_ARRAYLIST;
//etch_arraylist* list = new_arraylist(initsize, deltsize);
//if (NULL == list) return NULL;
//newobj = new_etchobject(ETCHTYPE_BOXED_ARRAYLIST);
//newobj->value_ptr_to = list;
//newobj->size = list->size; /* TODO size as elsewhere */
//list->is_readonly = is_readonly != 0; /* static content indicator */
//vtab = cache_find(VTAB_KEY, 0);
//if(!vtab) /* cache the vtable for this object type */
//{
// vtab = new_vtable(newobj->vtab, ETCHOBJ_VTABSIZE, ETCHTYPEB_VTABLE, 0);
// /* function overrides */
// vtab->destroy = destroy_boxed_arraylist;
// vtab->clone = clone_boxed_arraylist;
//
// vtab->vtab = newobj->vtab; /* chain parent vtable to override vtable */
// cache_insert(VTAB_KEY, vtab, 0); /* cache the new vtable */
//}
//newobj->vtab = vtab; /* set override vtable */
return newobj;
}