public define MINDOUBLE = 2.2250738585072014e-308;
public define MAXDOUBLE = 1.7976931348623158e+308;
-public define FORMAT64HEXLL = (GetRuntimePlatform() == win32) ? "0x%I64XLL" : "0x%llXLL";
-public define FORMAT64HEX = (GetRuntimePlatform() == win32) ? "0x%I64X" : "0x%llX";
-public define FORMAT64DLL = (GetRuntimePlatform() == win32) ? "%I64dLL" : "%lldLL";
-public define FORMAT64D = (GetRuntimePlatform() == win32) ? "%I64d" : "%lld";
-public define FORMAT64U = (GetRuntimePlatform() == win32) ? "%I64u" : "%llu";
+public define FORMAT64HEXLL = (__runtimePlatform == win32) ? "0x%I64XLL" : "0x%llXLL";
+public define FORMAT64HEX = (__runtimePlatform == win32) ? "0x%I64X" : "0x%llX";
+public define FORMAT64DLL = (__runtimePlatform == win32) ? "%I64dLL" : "%lldLL";
+public define FORMAT64D = (__runtimePlatform == win32) ? "%I64d" : "%lld";
+public define FORMAT64U = (__runtimePlatform == win32) ? "%I64u" : "%llu";
#define PUTXWORD(b, w) \
(b)[0] = (byte)(((w) >> 8) & 0xFF); \
}
};
-/*static */const char * Enum_OnGetString(Class _class, int * data, char * tempString, void * fieldData, bool * needClass)
+/*static */const char * Enum_OnGetString(Class _class, void * data, char * tempString, void * fieldData, bool * needClass)
{
- NamedLink item = null;
+ NamedLink64 item = null;
Class b;
+ int64 i64Data = 0;
+ switch(_class.typeSize)
+ {
+ case 1:
+ i64Data = !strcmp(_class.dataTypeString, "byte") ? (int64)*(byte *)data : (int64)*(char *)data;
+ break;
+ case 2:
+ i64Data = !strcmp(_class.dataTypeString, "uint16") ? (int64)*(uint16 *)data : (int64)*(short *)data;
+ break;
+ case 4:
+ i64Data = !strcmp(_class.dataTypeString, "uint") ? (int64)*(uint *)data : (int64)*(int *)data;
+ break;
+ case 8:
+ i64Data = !strcmp(_class.dataTypeString, "uint64") ? *(int64 *)data : *(int64 *)data;
+ break;
+ }
for(b = _class; !item && b && b.type == enumClass; b = b.base)
{
EnumClassData enumeration = (EnumClassData)b.data;
for(item = enumeration.values.first; item; item = item.next)
- if((int)item.data == *data)
+ if(item.data == i64Data)
break;
}
if(item)
{
- strcpy(tempString, item.name);
- if(!needClass || !*needClass)
- tempString[0] = (char)toupper(tempString[0]);
- return tempString;
- //return item.name;
+ if(tempString)
+ {
+ strcpy(tempString, item.name);
+ if(!needClass || !*needClass)
+ tempString[0] = (char)toupper(tempString[0]);
+ return tempString;
+ }
+ else
+ return item.name;
}
else
return null;
}
-static bool Enum_OnGetDataFromString(Class _class, int * data, const char * string)
+static bool Enum_OnGetDataFromString(Class _class, void * data, const char * string)
{
- NamedLink item = null;
+ NamedLink64 item = null;
Class b;
for(b = _class; !item && b && b.type == enumClass; b = b.base)
{
}
if(item)
{
- *data = (int)item.data;
+ switch(_class.typeSize)
+ {
+ case 1:
+ if(!strcmp(_class.dataTypeString, "byte"))
+ *(byte *)data = (byte)item.data;
+ else
+ *(char *)data = (char)item.data;
+ break;
+ case 2:
+ if(!strcmp(_class.dataTypeString, "uint16"))
+ *(uint16 *)data = (uint16)item.data;
+ else
+ *(short *)data = (short)item.data;
+ break;
+ case 4:
+ if(!strcmp(_class.dataTypeString, "uint"))
+ *(uint *)data = (uint)item.data;
+ else
+ *(int *)data = (int)item.data;
+ break;
+ case 8:
+ if(!strcmp(_class.dataTypeString, "uint64"))
+ *(uint64 *)data = *(uint64 *)&item.data;
+ else
+ *(int64 *)data = item.data;
+ break;
+ }
return true;
}
else
- return Integer_OnGetDataFromString(_class, data, string);
+ return Int64_OnGetDataFromString(_class, data, string);
return false;
}
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);
//value.ui = (((uint)data & bitMember.mask) >> bitMember.pos);
value.ui64 = ((*(uint*)data & bitMember.mask) >> bitMember.pos);
- if(value.ui64)
+ if(value.ui64 && (memberType != _class)) // Avoid infinite recursion on bit classes holding themselves
{
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);
bool result;
Module module = _class.module;
if(_class.type == enumClass)
- result = Enum_OnGetDataFromString(_class, (int *)data, string);
+ result = Enum_OnGetDataFromString(_class, (int64 *)data, string);
else if(_class.type == unitClass)
{
Class dataType;
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;
}
}
// We don't want KeyCode to use its base class OnGetDataFromString
if(memberType._vTbl[__ecereVMethodID_class_OnGetDataFromString] == _class._vTbl[__ecereVMethodID_class_OnGetDataFromString])
{
- if(!OnGetDataFromString(memberType, &value, memberString))
+ if(!OnGetDataFromString(memberType, (void **)&value, memberString))
result = false;
}
else if(!((bool (*)(void *, void *, const char *))(void *)memberType._vTbl[__ecereVMethodID_class_OnGetDataFromString])(memberType, &value, memberString))
*(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;
}
}