{
NamedLink64 item = null;
Class b;
- int64 i64Data;
+ int64 i64Data = 0;
switch(_class.typeSize)
{
case 1:
char memberString[1024];
Class memberType = member.dataTypeClass;
const char * name = member.name;
+ const char *(* onGetString)(void *, void *, char *, void *, bool *);
if(member.id < 0) continue;
memberString[0] = 0;
if(!memberType)
memberType = member.dataTypeClass = eSystem_FindClass(module, "int");
+ onGetString = memberType._vTbl[__ecereVMethodID_class_OnGetString];
+
if(member.isProperty)
{
Property prop = (Property) member;
if(value.f)
{
bool needClass = true;
- const char * result = ((const char *(*)(void *, void *, char *, void *, bool *))(void *)memberType._vTbl[__ecereVMethodID_class_OnGetString])(memberType, &value, memberString, null, &needClass);
+ const char * result = onGetString(memberType, &value, memberString, null, &needClass);
if(result && result != memberString)
strcpy(memberString, result);
// TESTING THIS HERE
if(value.p || prop.IsSet)
{
bool needClass = true;
- const char * result = ((const char *(*)(void *, void *, char *, void *, bool *))(void *)memberType._vTbl[__ecereVMethodID_class_OnGetString])(memberType,
+ const char * result = onGetString(memberType,
(memberType.type == normalClass) ? value.p : &value, memberString, null, &needClass);
if(result && result != memberString)
strcpy(memberString, result);
if(value.i || prop.IsSet)
{
bool needClass = true;
- const char * result = ((const char *(*)(void *, void *, char *, void *, bool *))(void *)memberType._vTbl[__ecereVMethodID_class_OnGetString])(memberType, &value, memberString, null, &needClass);
+ const char * result = onGetString(memberType, &value, memberString, null, &needClass);
if(result && result != memberString)
strcpy(memberString, result);
}
}
else
{
+ uint offset = member.offset + member._class.offset;
+ byte * memberData = (byte *)data + offset;
if(member.type == normalMember)
{
if(memberType.type == structClass || memberType.type == normalClass)
{
char internalMemberString[1024];
- byte * memberData = ((byte *)data + (((member._class.type == normalClass) ? member._class.offset : 0) + member.offset));
int c;
uint typeSize = (memberType.type == normalClass) ? memberType.typeSize : memberType.structSize;
for(c = 0; c < typeSize; c++)
bool needClass = true;
const char * result;
if(memberType.type == normalClass)
- result = ((const char *(*)(void *, void *, char *, void *, bool *))(void *)memberType._vTbl[__ecereVMethodID_class_OnGetString])(memberType, *(Instance *)memberData, internalMemberString, null, &needClass);
+ result = onGetString(memberType, *(Instance *)memberData, internalMemberString, null, &needClass);
else
- result = ((const char *(*)(void *, void *, char *, void *, bool *))(void *)memberType._vTbl[__ecereVMethodID_class_OnGetString])(memberType, memberData, internalMemberString, null, &needClass);
+ result = onGetString(memberType, memberData, internalMemberString, null, &needClass);
if(needClass && strcmp(memberType.dataTypeString, "char *"))
{
//strcpy(memberString, memberType.name);
else // if(_class /*memberType*/.type != bitClass)
{
DataValue value { };
- if(_class.type == bitClass)
+ if(_class.type == bitClass && !memberType.noExpansion)
{
BitMember bitMember = (BitMember) member;
// TODO: Check if base type is 32 or 64 bit
{
bool needClass = true;
char internalMemberString[1024];
- const char * result = ((const char *(*)(void *, void *, char *, void *, bool *))(void *)memberType._vTbl[__ecereVMethodID_class_OnGetString])(memberType, &value, internalMemberString, null, &needClass);
+ const char * result = onGetString(memberType, &value, internalMemberString, null, &needClass);
if(needClass && memberType.type != systemClass && memberType.type != enumClass && memberType.type != unitClass)
{
}
else if(!memberType.noExpansion)
{
- // TOCHECK: Is this still right??
- if(memberType.typeSize <= 4)
- {
- value.i = *(int *)((byte *)data + (((member._class.type == normalClass) ? member._class.offset : 0) + member.offset));
- if(value.i)
- {
- bool needClass = true;
- const char * result = ((const char *(*)(void *, void *, char *, void *, bool *))(void *)memberType._vTbl[__ecereVMethodID_class_OnGetString])(memberType, &value, memberString, null, &needClass);
- if(result && memberString != result)
- strcpy(memberString, result);
- }
- }
- else
+ // TOCHECK: Is this null check still right??
+ if(memberType.typeSize > 4 || *(int *)memberData)
{
bool needClass = true;
- const char * result = ((const char *(*)(void *, void *, char *, void *, bool *))(void *)memberType._vTbl[__ecereVMethodID_class_OnGetString])(memberType, ((byte *)data + (((member._class.type == normalClass) ? member._class.offset : 0) + member.offset)), memberString, null, &needClass);
+ const char * result = onGetString(memberType, memberData, memberString, null, &needClass);
if(result && memberString != result)
strcpy(memberString, result);
}
byte * memberData = ((byte *)data + (((member._class.type == normalClass) ? member._class.offset : 0) + member.offset));
bool needClass = true;
const char * result;
- result = ((const char *(*)(void *, void *, char *, void *, bool *))(void *)memberType._vTbl[__ecereVMethodID_class_OnGetString])(memberType, memberData, internalMemberString, null, &needClass);
+ result = onGetString(memberType, memberData, internalMemberString, null, &needClass);
if(needClass)
{
//strcpy(memberString, memberType.name);
if(found)
{
Class memberType = thisMember.dataTypeClass;
+ uint offset;
+ byte * memberData;
if(!memberType)
memberType = thisMember.dataTypeClass = eSystem_FindClass(module, thisMember.dataTypeString);
if(!memberType)
memberType = thisMember.dataTypeClass = eSystem_FindClass(module, "int");
+ offset = thisMember._class.offset + memberOffset;
+ memberData = (byte *)data + offset;
if(memberType.type == structClass)
{
if(thisMember)
{
- if(!((bool (*)(void *, void *, const char *))(void *)memberType._vTbl[__ecereVMethodID_class_OnGetDataFromString])(memberType,
- (byte *)data + (((thisMember._class.type == normalClass) ? thisMember._class.offset : 0) + memberOffset), memberString))
+ if(!((bool (*)(void *, void *, const char *))(void *)memberType._vTbl[__ecereVMethodID_class_OnGetDataFromString])(memberType, memberData, memberString))
result = false;
}
}
*(uint *)data = (uint32)(((*(uint *)data & ~bitMember.mask)) | ((value.ui64<<bitMember.pos)&bitMember.mask));
}
else
- *(int *)((byte *)data + (((thisMember._class.type == normalClass) ? thisMember._class.offset : 0) + thisMember.offset)) = value.i;
+ *(int *)memberData = value.i;
}
else if(thisMember.isProperty && ((Property)thisMember).Set)
{
if(memberType.type == noHeadClass || memberType.type == normalClass || memberType.type == structClass)
((void (*)(void *, void *))(void *)((Property)thisMember).Set)(data, value.p);
else
- ((void (*)(void *, int))(void *)((Property)thisMember).Set)(data, value.i);
+ {
+ // TODO: Complete and improve this type of stuff throughout
+ if(!strcmp(memberType.dataTypeString, "float"))
+ {
+ ((void (*)(void *, float))(void *)((Property)thisMember).Set)(data, value.f);
+ }
+ else if(!strcmp(memberType.dataTypeString, "double"))
+ {
+ ((void (*)(void *, double))(void *)((Property)thisMember).Set)(data, value.d);
+ }
+ else if(!strcmp(memberType.dataTypeString, "int64"))
+ {
+ ((void (*)(void *, int64))(void *)((Property)thisMember).Set)(data, value.i64);
+ }
+ else
+ {
+ ((void (*)(void *, int))(void *)((Property)thisMember).Set)(data, value.i);
+ }
+ }
}
}
}
static void OnCopy(Class _class, void ** data, void * newData)
{
- // TO IMPROVE: Inherit from Unit class for better performance?
if(_class.type == unitClass || _class.type == bitClass || _class.type == enumClass)
{
+ // An OnCopy is pointless for these, just copy the value
+ /*
Class dataType = eSystem_FindClass(_class.module, _class.dataTypeString);
if(dataType)
((void (*)(void *, void *, void *))(void *)dataType._vTbl[__ecereVMethodID_class_OnCopy])(dataType, data, newData);
+ */
+ if(newData)
+ memcpy(data, newData, _class.typeSize);
+ else
+ memset(data, 0, _class.typeSize);
}
else if(_class.type != structClass && (_class.type != systemClass || _class.byValueSystemClass))
{
static bool Integer_OnGetDataFromString(Class _class, int * data, const char * string)
{
char * end;
- int result = strtol(string, &end, 0);
+ int result = (int)strtol(string, &end, 0);
if(end > string)
{
{
int c;
int last = 0;
+ bool checkFor1 = true, checkFor9 = true;
int numDigits = 7, num = 1;
+ int first9 = 0;
char format[10];
+ char * dot;
+ int len;
while(numDigits && num < f) numDigits--, num *= 10;
sprintf(format, "%%.%df", numDigits);
//sprintf(string, "%f", f);
sprintf(string, format, f);
+ dot = strchr(string, '.');
- c = strlen(string)-1;
+ len = strlen(string);
+ c = len-1;
for( ; c >= 0; c--)
{
- if(string[c] != '0')
- last = Max(last, c);
- if(string[c] == '.')
+ char ch = string[c];
+ if(ch != '0' && dot)
+ {
+ if(ch == '1' && string + c - dot >= 6 && c == len - 1 && checkFor1)
+ checkFor1 = false;
+ else if(ch == '9' && string + c - dot >= 6 && c == len - 1 && checkFor9)
+ first9 = c;
+ else
+ {
+ last = Max(last, c);
+ checkFor9 = false;
+ checkFor1 = false;
+ }
+ }
+ if(ch == '.')
{
if(last == c)
string[c] = 0;
else
+ {
string[last+1] = 0;
+ if(first9)
+ {
+ while(--first9 > 0)
+ {
+ if(first9 != c)
+ if(string[first9] < '9')
+ {
+ string[first9]++;
+ break;
+ }
+ }
+ if(first9 < c)
+ {
+ string[c-1] = '1';
+ first9 = c;
+ }
+ string[first9] = 0;
+ }
+ }
break;
}
}