namespace sys;
+import "instance"
import "System"
import "Array"
void SkipEmpty()
{
- while(!f.Eof() && (!ch || ch == ' ' || ch == '\n' || ch == '\r' || ch == '\t'))
+ while(!f.Eof() && (!ch || ch == ' ' || ch == '\n' || ch == '\r' || ch == '\t' || ch == '/'))
{
f.Getc(&ch);
}
arrayType = type.templateArgs[0].dataTypeClass;
}
+ if(arrayType && arrayType.type == structClass)
+ value.p = new0 byte[arrayType.structSize];
itemResult = GetValue(arrayType, value);
if(itemResult == success)
{
t = (uint64)(uintptr)value.p;
}
((void *(*)(void *, uint64))(void *)array->Add)(*array, t);
+
+ if(arrayType && arrayType.type == structClass)
+ delete value.p;
}
else
{
Property prop = null;
Class type = null;
bool isKey = false;
+ uint offset = 0;
if(objectType)
{
type = eSystem_FindClass(__thisModule, member.dataTypeString);
if(!type)
type = eSystem_FindClass(__thisModule.application, member.dataTypeString);
+
+ offset = member._class.offset + member.offset;
}
else if(!member)
{
if(type && type.type == structClass)
{
- value.p = (byte *)*object + member._class.offset + member.offset;
+ if(member)
+ {
+ value.p = (byte *)*object + offset;
+ memset(value.p, 0, type.structSize);
+ }
+ else if(prop)
+ {
+ value.p = new0 byte[type.structSize];
+ }
}
ch = 0;
SkipEmpty();
;
else if(type.type == normalClass || type.type == noHeadClass)
{
- void ** ptr = (void**)((byte *)*object + member._class.offset + member.offset);
+ void ** ptr = (void**)((byte *)*object + offset);
if(eClass_IsDerived(type, class(Container)) && *ptr)
{
Container container = (Container)*ptr;
}
else if(type == class(double) || !strcmp(type.dataTypeString, "double"))
{
- *(double *)((byte *)*object + member._class.offset + member.offset) = value.d;
+ *(double *)((byte *)*object + offset) = value.d;
}
else if(type == class(float) || !strcmp(type.dataTypeString, "float"))
{
- *(float *)((byte *)*object + member._class.offset + member.offset) = value.f;
+ *(float *)((byte *)*object + offset) = value.f;
}
else if(type.typeSize == sizeof(int64) || !strcmp(type.dataTypeString, "int64") ||
!strcmp(type.dataTypeString, "unsigned int64") || !strcmp(type.dataTypeString, "uint64"))
{
- *(uint64 *)((byte *)*object + member._class.offset + member.offset) = value.ui64;
+ *(uint64 *)((byte *)*object + offset) = value.ui64;
}
else if(type.typeSize == sizeof(int) || !strcmp(type.dataTypeString, "int") ||
!strcmp(type.dataTypeString, "unsigned int") || !strcmp(type.dataTypeString, "uint"))
{
- *(int *)((byte *)*object + member._class.offset + member.offset) = value.i;
+ *(int *)((byte *)*object + offset) = value.i;
}
else if(type.typeSize == sizeof(short int) || !strcmp(type.dataTypeString, "short") ||
!strcmp(type.dataTypeString, "unsigned short") || !strcmp(type.dataTypeString, "uint16") ||
!strcmp(type.dataTypeString, "int16"))
{
- *(short *)((byte *)*object + member._class.offset + member.offset) = value.s;
+ *(short *)((byte *)*object + offset) = value.s;
}
else if(type.typeSize == sizeof(byte) || !strcmp(type.dataTypeString, "char") ||
!strcmp(type.dataTypeString, "unsigned char") || !strcmp(type.dataTypeString, "byte"))
{
- *(char *)((byte *)*object + member._class.offset + member.offset) = value.c;
+ *(char *)((byte *)*object + offset) = value.c;
}
else
{
- *(void **)((byte *)*object + member._class.offset + member.offset) = value.p;
+ *(void **)((byte *)*object + offset) = value.p;
}
}
else if(prop && prop.Set)
}
else
result = syntaxError;
+
+ if(prop && type.type == structClass)
+ {
+ delete value.p;
+ }
}
}
else if(ch && ch != '}' && ch != ',')
}
else if(type == class(uint64) || !strcmp(type.dataTypeString, "uint64"))
{
- value.ui64 = strtol(buffer, null, 10); // TOFIX: 64 bit support
+ value.ui64 = strtoul(buffer, null, 10); // TOFIX: 64 bit support
+ result = success;
+ }
+ else if(type == class(uint) || !strcmp(type.dataTypeString, "unsigned int"))
+ {
+ value.ui = strtoul(buffer, null, 10); // TOFIX: 64 bit support
result = success;
}
else
value.i = strtol(buffer, null, 10);
result = success;
}
+
+ if(result == success && type.type == unitClass)
+ {
+ // Convert to reference unit
+ Property prop;
+ for(prop = type.conversions.first; prop; prop = prop.next)
+ {
+ bool refProp = false;
+ Class c;
+ if(!strcmp(prop.name, type.base.fullName))
+ refProp = true;
+ else if( (c = eSystem_FindClass(type.module, prop.name) ) )
+ {
+ Property p;
+ for(p = c.conversions.first; p; p = p.next)
+ {
+ if(!strcmp(p.name, type.base.fullName) && !p.Set && !p.Get)
+ {
+ refProp = true;
+ break;
+ }
+ }
+ }
+ if(refProp)
+ {
+ if(prop.Set && prop.Get)
+ {
+ const String dts = type.base.dataTypeString;
+ if(!strcmp(dts, "double"))
+ value.d = ((double(*)(double))(void *)prop.Get)(value.d);
+ else if(!strcmp(dts, "float"))
+ value.f = ((float(*)(float))(void *)prop.Get)(value.f);
+ else if(!strcmp(dts, "int"))
+ value.i = ((int(*)(int))(void *)prop.Get)(value.i);
+ else if(!strcmp(dts, "int64"))
+ value.i64 = ((int64(*)(int64))(void *)prop.Get)(value.i64);
+ else if(!strcmp(dts, "unsigned int"))
+ value.ui = ((uint(*)(uint))(void *)prop.Get)(value.ui);
+ else if(!strcmp(dts, "uint64"))
+ value.ui64 = ((uint64(*)(uint64))(void *)prop.Get)(value.ui64);
+ }
+ else
+ break;
+ }
+ }
+ }
return result;
}
}
{
char buffer[1024];
bool needClass = false;
+ bool quote;
buffer[0] = 0;
if(type == class(double) || !strcmp(type.dataTypeString, "double"))
((const char *(*)(void *, void *, char *, void *, bool *))(void *)type._vTbl[__ecereVMethodID_class_OnGetString])(type, &value.d, buffer, 0, &needClass);
((const char *(*)(void *, void *, char *, void *, bool *))(void *)type._vTbl[__ecereVMethodID_class_OnGetString])(type, &value.c, buffer, null, &needClass);
else if(!strcmp(type.dataTypeString, "unsigned char") || !strcmp(type.dataTypeString, "byte") || type.typeSize == sizeof(byte))
((const char *(*)(void *, void *, char *, void *, bool *))(void *)type._vTbl[__ecereVMethodID_class_OnGetString])(type, &value.uc, buffer, null, &needClass);
+
+ quote = (type.type == unitClass && ((buffer[0] != '.' && !isdigit(buffer[0])) || strchr(buffer, ' ')));
+ if(quote) f.Puts("\"");
f.Puts(buffer);
+ if(quote) f.Puts("\"");
return true;
}
else
f.Puts("unset");
}
- else if(type.type == enumClass || type.type == unitClass)
+ else if(type.type == enumClass)
{
f.Puts("\"");
WriteNumber(f, type, value, indent);
{
WriteArray(f, type, value.p, indent);
}
- else if(type.type == normalClass || type.type == noHeadClass || type.type == structClass || type.type == bitClass)
+ else if(type.type == normalClass || type.type == noHeadClass || type.type == structClass)
{
_WriteJSONObject(f, type, value.p, indent);
}
- else if(type.type == systemClass)
+ else if(type.type == bitClass)
+ {
+ Class dataType;
+ dataType = eSystem_FindClass(__thisModule, type.dataTypeString);
+ WriteNumber(f, dataType, value, indent);
+ }
+ else if(type.type == systemClass || type.type == unitClass)
{
WriteNumber(f, type, value, indent);
}
{
value.c = ((char (*)(void *))(void *)prop.Get)(object);
}
+ else if(type.type == structClass)
+ {
+ value.p = new0 byte[type.structSize];
+ ((void (*)(void *, void *))(void *)prop.Get)(object, value.p);
+ }
else
{
value.p = ((void *(*)(void *))(void *)prop.Get)(object);
f.Puts("\" : ");
WriteValue(f, type, value, indent);
isFirst = false;
+ if(type.type == structClass)
+ delete value.p;
}
}
}
{
DataMember member = (DataMember)prop;
DataValue value { };
+ uint offset;
Class type = eSystem_FindClass(__thisModule, member.dataTypeString);
if(!type)
type = eSystem_FindClass(__thisModule.application, member.dataTypeString);
+ offset = member._class.offset + member.offset;
+
if(type)
{
if(type.type == normalClass || type.type == noHeadClass || type.type == structClass || !strcmp(type.name, "String"))
{
if(type.type == structClass)
- value.p = (void *)((byte *)object + member._class.offset + member.offset);
+ value.p = (void *)((byte *)object + offset);
else
- value.p = *(void **)((byte *)object + member._class.offset + member.offset);
+ value.p = *(void **)((byte *)object + offset);
if(!value.p)
continue;
}
else if(type == class(double) || !strcmp(type.dataTypeString, "double"))
{
- value.d = *(double *)((byte *)object + member._class.offset + member.offset);
+ value.d = *(double *)((byte *)object + offset);
}
else if(type == class(float) || !strcmp(type.dataTypeString, "float"))
{
- value.f = *(float *)((byte *)object + member._class.offset + member.offset);
+ value.f = *(float *)((byte *)object + offset);
}
else if(type.typeSize == sizeof(int64) || !strcmp(type.dataTypeString, "int64") ||
!strcmp(type.dataTypeString, "unsigned int64") || !strcmp(type.dataTypeString, "uint64"))
{
- value.ui64 = *(uint64 *)((byte *)object + member._class.offset + member.offset);
+ value.ui64 = *(uint64 *)((byte *)object + offset);
}
else if(type.typeSize == sizeof(int) || !strcmp(type.dataTypeString, "int") ||
!strcmp(type.dataTypeString, "unsigned int") || !strcmp(type.dataTypeString, "uint"))
{
- value.i = *(int *)((byte *)object + member._class.offset + member.offset);
+ value.i = *(int *)((byte *)object + offset);
if(!strcmp(type.name, "bool") || type.type == enumClass)
if(!value.i)
continue;
!strcmp(type.dataTypeString, "unsigned short") || !strcmp(type.dataTypeString, "uint16") ||
!strcmp(type.dataTypeString, "int16"))
{
- value.s = *(short *)((byte *)object + member._class.offset + member.offset);
+ value.s = *(short *)((byte *)object + offset);
}
else if(type.typeSize == sizeof(byte) || !strcmp(type.dataTypeString, "char") ||
!strcmp(type.dataTypeString, "unsigned char") || !strcmp(type.dataTypeString, "byte"))
{
- value.c = *(char *)((byte *)object + member._class.offset + member.offset);
+ value.c = *(char *)((byte *)object + offset);
}
else
{
- value.i = *(int *)((byte *)object + member._class.offset + member.offset);
+ value.i = *(int *)((byte *)object + offset);
}
if(!isFirst) f.Puts(",\n");