3 #if defined(ECERE_BOOTSTRAP)
9 default extern Platform runtimePlatform;
12 public define MAXBYTE = 0xff;
13 public define MAXWORD = 0xffff;
14 public define MININT = ((int)0x80000000);
15 public define MAXINT = ((int)0x7fffffff);
16 public define MININT64 = ((int64)0x8000000000000000LL);
17 public define MAXINT64 = ((int64)0x7fffffffffffffffLL);
18 public define MAXDWORD = 0xffffffff;
19 public define MAXQWORD = 0xffffffffffffffffLL;
20 public define MINFLOAT = ((float)1.17549435082228750e-38);
21 public define MAXFLOAT = ((float)3.40282346638528860e+38);
22 public define MINDOUBLE = ((double) 2.2250738585072014e-308);
23 public define MAXDOUBLE = ((double) 1.7976931348623158e+308);
25 public define FORMAT64HEXLL = (GetRuntimePlatform() == win32) ? "0x%I64XLL" : "0x%llXLL";
26 public define FORMAT64HEX = (GetRuntimePlatform() == win32) ? "0x%I64X" : "0x%llX";
27 public define FORMAT64DLL = (GetRuntimePlatform() == win32) ? "%I64dLL" : "%lldLL";
28 public define FORMAT64D = (GetRuntimePlatform() == win32) ? "%I64d" : "%lld";
29 public define FORMAT64U = (GetRuntimePlatform() == win32) ? "%I64u" : "%llu";
31 #define PUTXWORD(b, w) \
32 (b)[0] = (byte)(((w) >> 8) & 0xFF); \
33 (b)[1] = (byte)(((w) ) & 0xFF);
35 #define GETXWORD(b) (uint16)(((b)[0] << 8) | (b)[1])
37 #define PUTXDWORD(b, d) \
38 (b)[0] = (byte)(((d) >> 24) & 0xFF); \
39 (b)[1] = (byte)(((d) >> 16) & 0xFF); \
40 (b)[2] = (byte)(((d) >> 8) & 0xFF); \
41 (b)[3] = (byte)( (d) & 0xFF);
43 #define GETXDWORD(b) (uint32)(((b)[0] << 24) | ((b)[1] << 16) | ((b)[2] << 8) | (b)[3])
45 #define PUTXQWORD(b, d) \
46 (b)[0] = (byte)(((d) >> 56) & 0xFF); \
47 (b)[1] = (byte)(((d) >> 48) & 0xFF); \
48 (b)[2] = (byte)(((d) >> 40) & 0xFF); \
49 (b)[3] = (byte)(((d) >> 32) & 0xFF); \
50 (b)[4] = (byte)(((d) >> 24) & 0xFF); \
51 (b)[5] = (byte)(((d) >> 16) & 0xFF); \
52 (b)[6] = (byte)(((d) >> 8) & 0xFF); \
53 (b)[7] = (byte)( (d) & 0xFF);
55 #define GETXQWORD(b) (uint64)(((uint64)(b)[0] << 56) | ((uint64)(b)[1] << 48) | ((uint64)(b)[2] << 40) | ((uint64)(b)[3] << 32) | ((uint64)(b)[4] << 24) | ((b)[5] << 16) | ((b)[6] << 8) | (b)[7])
57 static void UnusedFunction()
65 a.OnEdit(null,null,0,0,0,20,0);
66 a.OnGetDataFromString(null);
71 FILE *eC_stdout(void);
72 FILE *eC_stderr(void);
74 extern int __ecereVMethodID_class_OnGetString;
75 extern int __ecereVMethodID_class_OnGetDataFromString;
76 extern int __ecereVMethodID_class_OnCompare;
77 extern int __ecereVMethodID_class_OnSerialize;
78 extern int __ecereVMethodID_class_OnUnserialize;
79 extern int __ecereVMethodID_class_OnCopy;
82 #if defined(ECERE_BOOTSTRAP) || defined(ECERE_STATIC)
86 // TOFIX: Declaration ordering (Required on gcc 3.4.5)
87 dllexport void eSystem_Delete(void * memory);
89 public class IOChannel
92 virtual uint WriteData(byte * data, uint numBytes);
93 virtual uint ReadData(byte * data, uint numBytes);
95 dllexport void Serialize(typed_object data)
97 data.OnSerialize(this);
100 dllexport void Unserialize(typed_object & data)
102 data.OnUnserialize(this);
105 dllexport void Put(typed_object data)
107 data.OnSerialize(this);
110 dllexport void Get(typed_object & data)
112 data.OnUnserialize(this);
116 public class SerialBuffer : IOChannel
124 uint WriteData(byte * bytes, uint numBytes)
128 if(count + numBytes > _size)
130 _size = count + numBytes;
132 _buffer = renew _buffer byte[_size];
134 memcpy(_buffer + count, bytes, numBytes);
141 uint ReadData(byte * bytes, uint numBytes)
145 int read = Min(numBytes, count - pos);
146 memcpy(bytes, _buffer + pos, read);
158 dllexport void Free()
169 // TODO: THIS IS VERY BAD!
170 property byte * buffer
172 get { return _buffer + pos; }
173 set { _buffer = value; }
178 get { return count - pos; }
179 set { count = value; }
183 /*static */char * Enum_OnGetString(Class _class, int * data, char * tempString, void * fieldData, bool * needClass)
185 EnumClassData enumeration = (EnumClassData)_class.data;
187 for(item = enumeration.values.first; item; item = item.next)
188 if((int)item.data == *data)
192 strcpy(tempString, item.name);
193 if(!needClass || !*needClass)
194 tempString[0] = (char)toupper(tempString[0]);
202 static bool Enum_OnGetDataFromString(Class _class, int * data, char * string)
204 EnumClassData enumeration = (EnumClassData)_class.data;
206 for(item = enumeration.values.first; item; item = item.next)
208 if(item.name && !strcmpi(item.name, string))
213 *data = (int)item.data;
217 return Integer_OnGetDataFromString(_class, data, string);
221 static void OnFree(Class _class, void * data)
223 if(_class.templateClass) _class = _class.templateClass;
224 if(_class.type == normalClass)
226 // eInstance_Delete(data);
227 eInstance_DecRef(data);
229 else if(_class.type == noHeadClass && data)
231 while(_class && _class.type == noHeadClass)
233 if(_class.Destructor)
234 _class.Destructor(data);
235 _class = _class.base;
241 static int DataMember_OnCompare(DataMember parentMember, void * data1, void * data2)
244 Module module = parentMember._class.module;
245 for(member = parentMember.members.first; member; member = member.next)
247 int memberResult = 0;
248 if(member.type == normalMember)
250 Class memberType = member.dataTypeClass;
253 memberType = member.dataTypeClass = eSystem_FindClass(module, member.dataTypeString);
255 memberType = member.dataTypeClass = eSystem_FindClass(module, "int");
257 if(memberType.type == structClass || memberType.type == normalClass || memberType.type == noHeadClass)
259 memberResult = ((int (*)(void *, void *, void *))(void *)memberType._vTbl[__ecereVMethodID_class_OnCompare])(memberType,
260 (byte *)data1 + member.offset,
261 (byte *)data2 + member.offset);
267 DataValue value1, value2;
268 value1.i = *(int *)((byte *)data1 + member.offset);
269 value2.i = *(int *)((byte *)data2 + member.offset);
270 memberResult = ((int (*)(void *, void *, void *))(void *)memberType._vTbl[__ecereVMethodID_class_OnCompare])(memberType, &value1, &value2);
277 memberResult = DataMember_OnCompare(member,
278 (byte *)data1 + member.offset,
279 (byte *)data2 + member.offset);
287 static int OnCompare(Class _class, void * data1, void * data2)
289 Module module = _class.module;
290 if(_class.type == normalClass || _class.type == noHeadClass || _class.type == structClass)
294 // NOTE: Comparing from top class down here... might want to reverse it
295 for(; _class && _class.type != systemClass; _class = _class.base)
299 // TESTING THIS HERE...
300 if(_class.noExpansion)
302 if(data1 > data2) return 1;
303 else if(data1 < data2) return -1;
308 for(member = _class.membersAndProperties.first; member; member = member.next)
310 int memberResult = 0;
311 if(member.isProperty || member.type == normalMember)
313 Class memberType = member.dataTypeClass;
316 memberType = member.dataTypeClass = eSystem_FindClass(module, member.dataTypeString);
319 memberType = member.dataTypeClass = eSystem_FindClass(module, "int");
323 if(member.isProperty)
325 Property prop = (Property)member;
326 if(!prop.conversion && prop.Get && prop.Set)
328 if(memberType.type == structClass || memberType.type == normalClass || memberType.type == noHeadClass)
330 if(!strcmp(memberType.dataTypeString, "char *"))
332 String a = ((String(*)(void *))(void *)prop.Get)(data1);
333 String b = ((String(*)(void *))(void *)prop.Get)(data2);
334 memberResult = ((int (*)(void *, void *, void *))(void *)memberType._vTbl[__ecereVMethodID_class_OnCompare])(memberType, a, b);
339 DataValue value1, value2;
340 if(!strcmp(memberType.dataTypeString, "float"))
342 value1.f = ((float(*)(void *))(void *)prop.Get)(data1);
343 value2.f = ((float(*)(void *))(void *)prop.Get)(data2);
347 value1.i = ((int(*)(void*))(void *)prop.Get)(data1);
348 value2.i = ((int(*)(void*))(void *)prop.Get)(data2);
350 memberResult = ((int (*)(void *, void *, void *))(void *)memberType._vTbl[__ecereVMethodID_class_OnCompare])(memberType, &value1, &value2);
356 if(memberType.type == structClass || memberType.type == normalClass || memberType.type == noHeadClass)
358 if(memberType.type == normalClass || memberType.type == noHeadClass)
361 memberResult = ((int (*)(void *, void *, void *))(void *)memberType._vTbl[__ecereVMethodID_class_OnCompare])(memberType,
362 *(void **)((byte *)data1 + (((member._class.type == normalClass) ? member._class.offset : 0) + member.offset)),
363 *(void **)((byte *)data2 + (((member._class.type == normalClass) ? member._class.offset : 0) + member.offset)));
367 memberResult = ((int (*)(void *, void *, void *))(void *)memberType._vTbl[__ecereVMethodID_class_OnCompare])(memberType,
368 (byte *)data1 + (((member._class.type == normalClass) ? member._class.offset : 0) + member.offset),
369 (byte *)data2 + (((member._class.type == normalClass) ? member._class.offset : 0) + member.offset));
374 DataValue value1, value2;
375 if(memberType.typeSize == 8)
377 value1.ui64 = *(uint64 *)((byte *)data1 + (((member._class.type == normalClass) ? member._class.offset : 0) + member.offset));
378 value2.ui64 = *(uint64 *)((byte *)data2 + (((member._class.type == normalClass) ? member._class.offset : 0) + member.offset));
382 value1.i = *(int *)((byte *)data1 + (((member._class.type == normalClass) ? member._class.offset : 0) + member.offset));
383 value2.i = *(int *)((byte *)data2 + (((member._class.type == normalClass) ? member._class.offset : 0) + member.offset));
385 memberResult = ((int (*)(void *, void *, void *))(void *)memberType._vTbl[__ecereVMethodID_class_OnCompare])(memberType, &value1, &value2);
391 // printf("Unknown type\n");
396 memberResult = DataMember_OnCompare(member,
397 (byte *)data1 + (((member._class.type == normalClass) ? member._class.offset : 0) + member.offset),
398 (byte *)data2 + (((member._class.type == normalClass) ? member._class.offset : 0) + member.offset));
405 else if(!data1 && data2)
407 else if(data1 && !data2)
410 else if(_class.type == unitClass)
412 Class dataType = eSystem_FindClass(module, _class.dataTypeString);
413 return ((int (*)(void *, void *, void *))(void *)dataType._vTbl[__ecereVMethodID_class_OnCompare])(dataType, data1, data2);
420 if(_class.typeSize == 8)
422 if(*(uint64 *)data1 > *(uint64 *)data2)
424 else if(*(uint64 *)data1 < *(uint64 *)data2)
429 if(*(uint *)data1 > *(uint *)data2)
431 else if(*(uint *)data1 < *(uint *)data2)
435 else if(!data1 && data2)
437 else if(data1 && !data2)
444 static char * OnGetString(Class _class, void * data, char * tempString, void * fieldData, bool * needClass)
446 // WHY DOES _class.module NOT SEEM TO WORK?
447 Module module = _class.templateClass ? _class.templateClass.module : _class.module;
448 if(_class.type == enumClass)
450 return Enum_OnGetString(_class, data, tempString, fieldData, needClass);
452 else if(_class.type == unitClass)
454 Class dataType = eSystem_FindClass(module, _class.dataTypeString);
455 return ((char *(*)(void *, void *, char *, void *, bool *))(void *)dataType._vTbl[__ecereVMethodID_class_OnGetString])(dataType, data, tempString, fieldData, needClass);
459 bool atMember = true;
461 Class mainClass = _class;
463 tempString[0] = '\0';
464 if(!data && (mainClass.type == normalClass || mainClass.type == noHeadClass)) return tempString;
466 while(_class != mainClass)
469 Class lastClass = _class;
471 for(_class = mainClass; _class.base != lastClass && _class.base.type != systemClass; _class = _class.base);
473 for(member = _class.membersAndProperties.first; member; member = member.next)
475 char memberString[1024];
476 Class memberType = member.dataTypeClass;
477 char * name = member.name;
482 memberType = member.dataTypeClass = eSystem_FindClass(module, member.dataTypeString);
484 memberType = member.dataTypeClass = eSystem_FindClass(module, "int");
486 if(member.isProperty)
488 Property prop = (Property) member;
490 if(!prop.conversion && prop.Get && prop.Set && (!prop.IsSet || prop.IsSet(data)))
492 if(memberType.type != structClass && (memberType.type != normalClass || !strcmp(memberType.dataTypeString, "char *")) && memberType.type != bitClass && data)
494 DataValue value = { 0 };
495 if(!strcmp(prop.dataTypeString, "float"))
497 value.f = ((float(*)(void *))(void *)prop.Get)(data);
500 bool needClass = true;
501 char * result = ((char *(*)(void *, void *, char *, void *, bool *))(void *)memberType._vTbl[__ecereVMethodID_class_OnGetString])(memberType, &value, memberString, null, &needClass);
502 if(result && result != memberString)
503 strcpy(memberString, result);
505 if(strchr(memberString, '.'))
506 strcat(memberString, "f");
509 else if(memberType.type == normalClass || memberType.type == noHeadClass)
511 value.p = ((void *(*)(void *))(void *)prop.Get)(data);
512 if(value.p || prop.IsSet)
514 bool needClass = true;
515 char * result = ((char *(*)(void *, void *, char *, void *, bool *))(void *)memberType._vTbl[__ecereVMethodID_class_OnGetString])(memberType,
516 (memberType.type == normalClass) ? value.p : &value, memberString, null, &needClass);
517 if(result && result != memberString)
518 strcpy(memberString, result);
523 value.i = ((int(*)(void *))(void *)prop.Get)(data);
524 if(value.i || prop.IsSet)
526 bool needClass = true;
527 char * result = ((char *(*)(void *, void *, char *, void *, bool *))(void *)memberType._vTbl[__ecereVMethodID_class_OnGetString])(memberType, &value, memberString, null, &needClass);
528 if(result && result != memberString)
529 strcpy(memberString, result);
537 if(member.type == normalMember)
539 if(memberType.type == structClass || memberType.type == normalClass)
541 char internalMemberString[1024];
542 byte * memberData = ((byte *)data + (((member._class.type == normalClass) ? member._class.offset : 0) + member.offset));
544 for(c = 0; c < memberType.structSize; c++)
547 if(c < memberType.structSize)
549 bool needClass = true;
551 if(memberType.type == normalClass)
552 result = ((char *(*)(void *, void *, char *, void *, bool *))(void *)memberType._vTbl[__ecereVMethodID_class_OnGetString])(memberType, *(Instance *)memberData, internalMemberString, null, &needClass);
554 result = ((char *(*)(void *, void *, char *, void *, bool *))(void *)memberType._vTbl[__ecereVMethodID_class_OnGetString])(memberType, memberData, internalMemberString, null, &needClass);
557 //strcpy(memberString, memberType.name);
558 strcat(memberString, "{ ");
559 if(result) strcat(memberString, result);
560 strcat(memberString, " }");
563 strcpy(memberString, result);
566 //else if(_class /*memberType*/.type != bitClass)
567 else // if(_class /*memberType*/.type != bitClass)
569 DataValue value = { 0 };
570 if(_class.type == bitClass)
572 BitMember bitMember = (BitMember) member;
573 // TODO: Check if base type is 32 or 64 bit
575 //value.ui = (((uint)data & bitMember.mask) >> bitMember.pos);
576 value.ui64 = ((*(uint*)data & bitMember.mask) >> bitMember.pos);
579 bool needClass = true;
580 char internalMemberString[1024];
581 char * result = ((char *(*)(void *, void *, char *, void *, bool *))(void *)memberType._vTbl[__ecereVMethodID_class_OnGetString])(memberType, &value, internalMemberString, null, &needClass);
583 if(needClass && memberType.type != systemClass && memberType.type != enumClass && memberType.type != unitClass)
585 //strcpy(memberString, memberType.name);
586 strcat(memberString, " { ");
587 if(result) strcat(memberString, result);
588 strcat(memberString, " }");
591 strcpy(memberString, result);
593 if(result && memberString != result)
594 strcpy(memberString, result);
598 else if(!memberType.noExpansion)
600 // TOCHECK: Is this still right??
601 if(memberType.typeSize <= 4)
603 value.i = *(int *)((byte *)data + (((member._class.type == normalClass) ? member._class.offset : 0) + member.offset));
606 bool needClass = true;
607 char * result = ((char *(*)(void *, void *, char *, void *, bool *))(void *)memberType._vTbl[__ecereVMethodID_class_OnGetString])(memberType, &value, memberString, null, &needClass);
608 if(result && memberString != result)
609 strcpy(memberString, result);
614 bool needClass = true;
615 char * result = ((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);
616 if(result && memberString != result)
617 strcpy(memberString, result);
623 char internalMemberString[1024];
624 byte * memberData = ((byte *)data + (((member._class.type == normalClass) ? member._class.offset : 0) + member.offset));
625 bool needClass = true;
627 result = ((char *(*)(void *, void *, char *, void *, bool *))(void *)memberType._vTbl[__ecereVMethodID_class_OnGetString])(memberType, memberData, internalMemberString, null, &needClass);
630 //strcpy(memberString, memberType.name);
631 strcat(memberString, "{ ");
632 if(result) strcat(memberString, result);
633 strcat(memberString, " }");
636 strcpy(memberString, result);
642 // TODO: Fix atID stuff
646 strcat(tempString, ", ");
647 if(!atMember || !strcmp(memberType.name, "bool"))
649 strcat(tempString, name);
650 strcat(tempString, " = ");
653 if(!strcmp(memberType.name, "char *"))
655 int len = strlen(tempString);
657 strcat(tempString, "\"");
659 for(c = 0; memberString[c]; c++)
661 if(memberString[c] == '\"')
663 strcat(tempString, "\\\"");
666 else if(memberString[c] == '\\')
668 strcat(tempString, "\\\\");
673 tempString[len++] = memberString[c];
677 strcat(tempString, "\"");
680 strcat(tempString, memberString);
685 else if(member && (!member.isProperty || !((Property)member).conversion))
693 static bool OnGetDataFromString(Class _class, void ** data, char * string)
696 Module module = _class.module;
697 if(_class.type == enumClass)
698 result = Enum_OnGetDataFromString(_class, (int *)data, string);
699 else if(_class.type == unitClass)
701 Class dataType = eSystem_FindClass(module, _class.dataTypeString);
702 return ((bool (*)(void *, void *, const char *))(void *)dataType._vTbl[__ecereVMethodID_class_OnGetDataFromString])(dataType, data, string);
704 else if(!string[0] && _class.type == normalClass)
706 // result = false; // Why was this data = null commented?
713 char memberName[1024];
714 char memberString[10240];
722 Class curClass = null;
723 DataMember curMember = null;
724 DataMember subMemberStack[256];
725 int subMemberStackPos = 0;
729 if(_class.type == noHeadClass || _class.type == normalClass)
731 data = *data = eInstance_New(_class);
732 if(_class.type == normalClass)
733 ((Instance)data)._refCount++;
735 else if(/*_class.type == noHeadClass || */_class.type == structClass)
736 memset(data, 0, _class.structSize);
737 // Bit classes cleared outside?
739 memberName[0] = '\0';
741 for(c = 0; string[c] && count < sizeof(memberString); )
744 DataMember thisMember = null;
748 for(; (ch = string[c]) && count < sizeof(memberString); c++)
750 if(ch == '\"' && !escape)
756 if(!escape && ch == '\\')
762 memberString[count++] = ch;
766 // TOFIX: OnGetDataFromString is far from ready as a generic object notation reader...
767 // It has mostly been tested/used for entering data in the IDE's property sheet, as well as for parsing code in the Code Editor
768 // Is it used by the compiler?
769 else if(ch == ' ') // || ch == '\n' || ch == '\t' || ch == '\r')
772 memberString[count++] = ch;
778 memberString[count++] = ch;
788 // If bracket is not initialization
789 if(gotChar && !brackets)
797 memberString[count++] = ch;
808 memberString[count++] = ch;
815 memberString[count++] = ch;
819 memberString[count] = '\0';
820 //TrimLSpaces(memberString, memberName);
821 //TrimRSpaces(memberName, memberString);
822 //strcpy(memberName, memberString);
824 TrimRSpaces(memberString, memberName);
831 memberString[count++] = ch;
836 memberString[count] = '\0';
837 TrimRSpaces(memberString, memberString);
841 DataMember _subMemberStack[256];
842 int _subMemberStackPos = 0;
844 thisMember = eClass_FindDataMemberAndOffset(_class, memberName, &memberOffset, _class.module, _subMemberStack, &_subMemberStackPos);
847 thisMember = (DataMember)eClass_FindProperty(_class, memberName, _class.module);
850 if(thisMember.memberAccess == publicAccess)
852 curMember = thisMember;
853 curClass = thisMember._class;
854 memcpy(subMemberStack, _subMemberStack, sizeof(int) * _subMemberStackPos);
855 subMemberStackPos = _subMemberStackPos;
862 eClass_FindNextMember(_class, &curClass, (DataMember *)&curMember, subMemberStack, &subMemberStackPos);
863 thisMember = curMember;
867 eClass_FindDataMemberAndOffset(_class, thisMember.name, &memberOffset, _class.module, null, null);
872 Class memberType = thisMember.dataTypeClass;
875 memberType = thisMember.dataTypeClass = eSystem_FindClass(module, thisMember.dataTypeString);
877 memberType = thisMember.dataTypeClass = eSystem_FindClass(module, "int");
878 if(memberType.type == structClass)
882 if(!((bool (*)(void *, void *, const char *))(void *)memberType._vTbl[__ecereVMethodID_class_OnGetDataFromString])(memberType,
883 (byte *)data + (((thisMember._class.type == normalClass) ? thisMember._class.offset : 0) + memberOffset), memberString))
889 DataValue value = { 0 };
890 // Patch for hotKey crash ( #556 )
891 // Key has a member KeyCode, which inherits from Key
892 // We don't want KeyCode to use its base class OnGetDataFromString
893 if(memberType._vTbl[__ecereVMethodID_class_OnGetDataFromString] == _class._vTbl[__ecereVMethodID_class_OnGetDataFromString])
895 if(!OnGetDataFromString(memberType, &value, memberString))
898 else if(!((bool (*)(void *, void *, const char *))(void *)memberType._vTbl[__ecereVMethodID_class_OnGetDataFromString])(memberType, &value, memberString))
900 if(thisMember && !thisMember.isProperty)
902 if(_class.type == bitClass)
904 BitMember bitMember = (BitMember) thisMember;
905 // TODO: Check if bit _class is 32 or 64 bit
906 *(uint *)data = (uint32)(((*(uint *)data & ~bitMember.mask)) | ((value.ui64<<bitMember.pos)&bitMember.mask));
909 *(int *)((byte *)data + (((thisMember._class.type == normalClass) ? thisMember._class.offset : 0) + thisMember.offset)) = value.i;
911 else if(thisMember.isProperty && ((Property)thisMember).Set)
913 if(memberType.type == noHeadClass || memberType.type == normalClass || memberType.type == structClass)
914 ((void (*)(void *, void *))(void *)((Property)thisMember).Set)(data, value.p);
916 ((void (*)(void *, int))(void *)((Property)thisMember).Set)(data, value.i);
924 memberName[0] = '\0';
930 static void OnCopy(Class _class, void ** data, void * newData)
932 // TO IMPROVE: Inherit from Unit class for better performance?
933 if(_class.type == unitClass || _class.type == bitClass || _class.type == enumClass)
935 Class dataType = eSystem_FindClass(_class.module, _class.dataTypeString);
937 ((void (*)(void *, void *, void *))(void *)dataType._vTbl[__ecereVMethodID_class_OnCopy])(dataType, data, newData);
939 else if(_class.type != structClass && _class.type != systemClass)
943 // Here we have either a structClass or a systemClass
945 memcpy(data, newData, _class.typeSize);
947 memset(data, 0, _class.typeSize);
950 static int DataMember_OnSerialize(DataMember parentMember, void * data, IOChannel channel)
953 Module module = parentMember._class.module;
954 for(member = parentMember.members.first; member; member = member.next)
956 if(member.type == normalMember)
958 Class memberType = member.dataTypeClass;
961 memberType = member.dataTypeClass = eSystem_FindClass(module, member.dataTypeString);
963 memberType = member.dataTypeClass = eSystem_FindClass(module, "int");
965 if(memberType.type == structClass || memberType.type == normalClass || memberType.type == noHeadClass)
967 ((void (*)(void *, void *, void *))(void *)memberType._vTbl[__ecereVMethodID_class_OnSerialize])(memberType, (byte *)data + member.offset, channel);
972 value.i = *(int *)((byte *)data + member.offset);
973 ((void (*)(void *, void *, void *))(void *)memberType._vTbl[__ecereVMethodID_class_OnSerialize])(memberType, &value, channel);
978 DataMember_OnSerialize(member, (byte *)data + member.offset, channel);
984 static void OnSerialize(Class _class, void * data, IOChannel channel)
986 Module module = _class.module;
987 // TO IMPROVE: Inherit from Unit class for better performance?
988 if(_class.type == unitClass || _class.type == bitClass || _class.type == enumClass)
990 Class dataType = eSystem_FindClass(module, _class.dataTypeString);
992 ((void (*)(void *, void *, void *))(void *)dataType._vTbl[__ecereVMethodID_class_OnSerialize])(dataType, data, channel);
994 else if(_class.type == normalClass || _class.type == noHeadClass || _class.type == structClass)
998 Class lastClass = null;
999 while(lastClass != _class)
1002 for(; _class && (!_class.base || _class.base.type != systemClass) && _class != lastClass; _class = _class.base);
1005 for(member = _class.membersAndProperties.first; member; member = member.next)
1007 if(member.isProperty || member.type == normalMember)
1009 Class memberType = member.dataTypeClass;
1012 memberType = member.dataTypeClass = eSystem_FindClass(module, member.dataTypeString);
1015 if(member.isProperty)
1017 /*Property prop = (Property)member;
1018 if(!prop.conversion && prop.Get && prop.Set)
1020 if(memberType.type == structClass || memberType.type == normalClass || memberType.type == noHeadClass)
1027 if(!strcmp(memberType.dataTypeString, "float"))
1029 value.f = ((float(*)())(void *)prop.Get)(data);
1033 value.i = prop.Get(data);
1035 ((void (*)(void *, void *, void *))(void *)memberType._vTbl[__ecereVMethodID_class_OnSerialize])(memberType, &value, channel);
1041 if(!strcmp(memberType.name, "String") || memberType.type == normalClass || memberType.type == noHeadClass)
1043 ((void (*)(void *, void *, void *))(void *)memberType._vTbl[__ecereVMethodID_class_OnSerialize])(memberType, data ? (*(void **)((byte *)data + member._class.offset + member.offset)) : null, channel);
1046 ((void (*)(void *, void *, void *))(void *)memberType._vTbl[__ecereVMethodID_class_OnSerialize])(memberType, data ? (((byte *)data + (((member._class.type == normalClass) ? member._class.offset : 0) + member.offset))) : null, channel);
1051 // printf("Unknown type\n");
1056 DataMember_OnSerialize(member, data ? ((byte *)data + (((member._class.type == normalClass) ? member._class.offset : 0) + member.offset)) : null, channel);
1064 static int DataMember_OnUnserialize(DataMember parentMember, void * data, IOChannel channel)
1067 Module module = parentMember._class.module;
1068 for(member = parentMember.members.first; member; member = member.next)
1070 if(member.type == normalMember)
1072 Class memberType = member.dataTypeClass;
1075 memberType = member.dataTypeClass = eSystem_FindClass(module, member.dataTypeString);
1077 memberType = member.dataTypeClass = eSystem_FindClass(module, "int");
1079 if(memberType.type == structClass || memberType.type == normalClass || memberType.type == noHeadClass)
1081 ((void (*)(void *, void *, void *))(void *)memberType._vTbl[__ecereVMethodID_class_OnUnserialize])(memberType, (byte *)data + member.offset, channel);
1086 ((void (*)(void *, void *, void *))(void *)memberType._vTbl[__ecereVMethodID_class_OnUnserialize])(memberType, &value, channel);
1087 *(int *)((byte *)data + member.offset) = value.i;
1092 DataMember_OnUnserialize(member, (byte *)data + member.offset, channel);
1098 static void OnUnserialize(Class _class, void ** data, IOChannel channel)
1100 Module module = _class.module;
1101 if(_class.type == unitClass || _class.type == bitClass || _class.type == enumClass)
1103 Class dataType = eSystem_FindClass(module, _class.dataTypeString);
1105 ((void (*)(void *, void *, void *))(void *)dataType._vTbl[__ecereVMethodID_class_OnUnserialize])(dataType, data, channel);
1107 else if(_class.type == normalClass || _class.type == noHeadClass || _class.type == structClass)
1111 Class lastClass = null;
1112 if(_class.type == normalClass || _class.type == noHeadClass)
1114 // TOFIX: Seriously!?!?? Fix me!
1115 data = *data = eInstance_New(_class);
1116 if(_class.type == normalClass)
1117 ((Instance)data)._refCount++;
1119 else if(/*_class.type == noHeadClass || */_class.type == structClass)
1120 memset(data, 0, _class.structSize);
1122 while(lastClass != _class)
1125 for(; _class && (!_class.base || _class.base.type != systemClass) && _class != lastClass; _class = _class.base);
1128 for(member = _class.membersAndProperties.first; member; member = member.next)
1130 if(member.isProperty || member.type == normalMember)
1132 Class memberType = member.dataTypeClass;
1135 memberType = member.dataTypeClass = eSystem_FindClass(module, member.dataTypeString);
1138 if(member.isProperty)
1140 /*Property prop = (Property)member;
1141 if(!prop.conversion && prop.Get && prop.Set)
1143 if(memberType.type == structClass || memberType.type == normalClass || memberType.type == noHeadClass)
1150 ((void (*)(void *, void *, void *))(void *)memberType._vTbl[__ecereVMethodID_class_OnUnserialize])(memberType, &value, channel);
1151 prop.Set(data, value.i);
1156 ((void (*)(void *, void *, void *))(void *)memberType._vTbl[__ecereVMethodID_class_OnUnserialize])(memberType,
1157 (byte *)data + (((member._class.type == normalClass) ? member._class.offset : 0) + member.offset), channel);
1161 // printf("Unknown type\n");
1166 DataMember_OnUnserialize(member, (byte *)data + (((member._class.type == normalClass) ? member._class.offset : 0) + member.offset), channel);
1175 static int Integer_OnCompare(Class _class, int * data1, int * data2)
1178 if(!data1 && !data2) result = 0;
1179 else if(data1 && !data2) result = 1;
1180 else if(!data1 && data2) result = -1;
1181 else if(*data1 > *data2) result = 1;
1182 else if(*data1 < *data2) result = -1;
1186 /*static */char * Integer_OnGetString(Class _class, int * data, char * string, void * fieldData, bool * needClass)
1188 sprintf(string, "%d", *data);
1192 static bool Integer_OnGetDataFromString(Class _class, int * data, char * string)
1195 int result = strtol(string, &end, 0);
1205 static int UInteger_OnCompare(Class _class, unsigned int * data1, unsigned int * data2)
1208 if(!data1 && !data2) result = 0;
1209 else if(data1 && !data2) result = 1;
1210 else if(!data1 && data2) result = -1;
1211 else if(*data1 > *data2) result = 1;
1212 else if(*data1 < *data2) result = -1;
1216 static char * UInteger_OnGetString(Class _class, unsigned int * data, char * string, void * fieldData, bool * needClass)
1218 sprintf(string, "%u", *data);
1222 static bool UInteger_OnGetDataFromString(Class _class, unsigned int * data, char * string)
1225 uint result = strtoul(string, &end, 0);
1234 static int Byte_OnCompare(Class _class, byte * data1, byte * data2)
1237 if(!data1 && !data2) result = 0;
1238 else if(data1 && !data2) result = 1;
1239 else if(!data1 && data2) result = -1;
1240 else if(*data1 > *data2) result = 1;
1241 else if(*data1 < *data2) result = -1;
1245 static char * Byte_OnGetString(Class _class, byte * data, char * string, void * fieldData, bool * needClass)
1247 sprintf(string, "%u", (int)*data);
1251 static char * Char_OnGetString(Class _class, char * data, char * string, void * fieldData, bool * needClass)
1253 if(needClass && *needClass)
1256 if(ch == '\t') strcpy(string, "'\t'");
1257 else if(ch == '\n') strcpy(string, "'\n'");
1258 else if(ch == '\r') strcpy(string, "'\r'");
1259 else if(ch == '\a') strcpy(string, "'\a'");
1260 else if(ch == '\\') strcpy(string, "'\\'");
1261 else if(ch < 32 || ch >= 127) sprintf(string, "'\o'", ch);
1262 else sprintf(string, "'%c'", ch);
1265 sprintf(string, "%c", *data);
1269 static bool Byte_OnGetDataFromString(Class _class, byte * data, char * string)
1272 byte result = (byte)strtoul(string, &end, 0);
1281 static int Int64_OnCompare(Class _class, int64 * data1, int64 * data2)
1284 if(!data1 && !data2) result = 0;
1285 else if(data1 && !data2) result = 1;
1286 else if(!data1 && data2) result = -1;
1287 else if(*data1 > *data2) result = 1;
1288 else if(*data1 < *data2) result = -1;
1292 static int UInt64_OnCompare(Class _class, uint64 * data1, uint64 * data2)
1295 if(!data1 && !data2) result = 0;
1296 else if(data1 && !data2) result = 1;
1297 else if(!data1 && data2) result = -1;
1298 else if(*data1 > *data2) result = 1;
1299 else if(*data1 < *data2) result = -1;
1303 static char * Int64_OnGetString(Class _class, int64 * data, char * string, void * fieldData, bool * needClass)
1305 sprintf(string, FORMAT64D, *data);
1309 static char * UInt64_OnGetString(Class _class, uint64 * data, char * string, void * fieldData, bool * needClass)
1311 sprintf(string, FORMAT64U, *data);
1315 static bool Int64_OnGetDataFromString(Class _class, uint64 * data, char * string)
1318 uint64 result = _strtoi64(string, &end, 0);
1327 static bool UInt64_OnGetDataFromString(Class _class, uint64 * data, char * string)
1330 uint64 result = _strtoui64(string, &end, 0);
1339 /*static */void Byte_OnSerialize(Class _class, byte * data, IOChannel channel)
1341 channel.WriteData(data, 1);
1344 /*static */void Byte_OnUnserialize(Class _class, byte * data, IOChannel channel)
1346 if(channel.ReadData(data, 1) != 1)
1351 /*static */void Int_OnSerialize(Class _class, int * data, IOChannel channel)
1354 PUTXDWORD(bytes, * data);
1355 channel.WriteData(bytes, 4);
1358 /*static */void Int_OnUnserialize(Class _class, int * data, IOChannel channel)
1361 if(channel.ReadData(bytes, 4) == 4)
1362 *data = GETXDWORD(bytes);
1367 /*static */void Int64_OnSerialize(Class _class, int64 * data, IOChannel channel)
1370 PUTXQWORD(bytes, * data);
1371 channel.WriteData(bytes, 8);
1374 /*static */void Int64_OnUnserialize(Class _class, int64 * data, IOChannel channel)
1377 if(channel.ReadData(bytes, 8) == 8)
1378 *data = GETXQWORD(bytes);
1383 /*static */void Word_OnSerialize(Class _class, uint16 * data, IOChannel channel)
1386 PUTXWORD(bytes, * data);
1387 channel.WriteData(bytes, 2);
1390 /*static */void Word_OnUnserialize(Class _class, uint16 * data, IOChannel channel)
1393 if(channel.ReadData(bytes, 2) == 2)
1394 *data = GETXWORD(bytes);
1399 static void RegisterClass_Integer(Module module)
1401 Class integerClass = eSystem_RegisterClass(normalClass, "int", null, 0, 0, null, null, module, baseSystemAccess, publicAccess);
1402 integerClass.type = systemClass;
1403 delete integerClass.dataTypeString;
1404 integerClass.dataTypeString = CopyString("int");
1405 integerClass.structSize = 0;
1406 integerClass.typeSize = sizeof(int);
1408 eClass_AddMethod(integerClass, "OnCompare", null, Integer_OnCompare, publicAccess);
1409 eClass_AddMethod(integerClass, "OnGetString", null, Integer_OnGetString, publicAccess);
1410 eClass_AddMethod(integerClass, "OnGetDataFromString", null, Integer_OnGetDataFromString, publicAccess);
1411 eClass_AddMethod(integerClass, "OnSerialize", null, Int_OnSerialize, publicAccess);
1412 eClass_AddMethod(integerClass, "OnUnserialize", null, Int_OnUnserialize, publicAccess);
1414 integerClass = eSystem_RegisterClass(normalClass, "int64", null, 0, 0, null, null, module, baseSystemAccess, publicAccess);
1415 integerClass.type = systemClass;
1416 integerClass.structSize = 0;
1417 integerClass.typeSize = sizeof(int64);
1418 delete integerClass.dataTypeString;
1419 integerClass.dataTypeString = CopyString("int64");
1420 eClass_AddMethod(integerClass, "OnGetString", null, Int64_OnGetString, publicAccess);
1421 eClass_AddMethod(integerClass, "OnCompare", null, Int64_OnCompare, publicAccess);
1422 eClass_AddMethod(integerClass, "OnGetDataFromString", null, Int64_OnGetDataFromString, publicAccess);
1423 eClass_AddMethod(integerClass, "OnSerialize", null, Int64_OnSerialize, publicAccess);
1424 eClass_AddMethod(integerClass, "OnUnserialize", null, Int64_OnUnserialize, publicAccess);
1426 integerClass = eSystem_RegisterClass(normalClass, "uint", null, 0, 0, null, null, module, baseSystemAccess, publicAccess);
1427 integerClass.type = systemClass;
1428 delete integerClass.dataTypeString;
1429 integerClass.dataTypeString = CopyString("unsigned int");
1430 integerClass.structSize = 0;
1431 integerClass.typeSize = sizeof(uint);
1432 eClass_AddMethod(integerClass, "OnCompare", null, UInteger_OnCompare, publicAccess);
1433 eClass_AddMethod(integerClass, "OnGetString", null, UInteger_OnGetString, publicAccess);
1434 eClass_AddMethod(integerClass, "OnGetDataFromString", null, UInteger_OnGetDataFromString, publicAccess);
1435 eClass_AddMethod(integerClass, "OnSerialize", null, Int_OnSerialize, publicAccess);
1436 eClass_AddMethod(integerClass, "OnUnserialize", null, Int_OnUnserialize, publicAccess);
1438 integerClass = eSystem_RegisterClass(normalClass, "unsigned int", null, 0, 0, null, null, module, baseSystemAccess, publicAccess);
1439 integerClass.type = systemClass;
1440 delete integerClass.dataTypeString;
1441 integerClass.dataTypeString = CopyString("unsigned int");
1442 integerClass.structSize = 0;
1443 integerClass.typeSize = sizeof(uint);
1445 eClass_AddMethod(integerClass, "OnCompare", null, UInteger_OnCompare, publicAccess);
1446 eClass_AddMethod(integerClass, "OnGetString", null, UInteger_OnGetString, publicAccess);
1447 eClass_AddMethod(integerClass, "OnGetDataFromString", null, UInteger_OnGetDataFromString, publicAccess);
1448 eClass_AddMethod(integerClass, "OnSerialize", null, Int_OnSerialize, publicAccess);
1449 eClass_AddMethod(integerClass, "OnUnserialize", null, Int_OnUnserialize, publicAccess);
1451 integerClass = eSystem_RegisterClass(normalClass, "uint16", null, 0, 0, null, null, module, baseSystemAccess, publicAccess);
1452 integerClass.type = systemClass;
1453 delete integerClass.dataTypeString;
1454 integerClass.dataTypeString = CopyString("unsigned short");
1455 integerClass.structSize = 0;
1456 integerClass.typeSize = sizeof(uint16);
1458 eClass_AddMethod(integerClass, "OnSerialize", null, Word_OnSerialize, publicAccess);
1459 eClass_AddMethod(integerClass, "OnUnserialize", null, Word_OnUnserialize, publicAccess);
1461 integerClass = eSystem_RegisterClass(normalClass, "short", null, 0, 0, null, null, module, baseSystemAccess, publicAccess);
1462 integerClass.type = systemClass;
1463 delete integerClass.dataTypeString;
1464 integerClass.dataTypeString = CopyString("short");
1465 integerClass.structSize = 0;
1466 integerClass.typeSize = sizeof(short);
1468 eClass_AddMethod(integerClass, "OnSerialize", null, Word_OnSerialize, publicAccess);
1469 eClass_AddMethod(integerClass, "OnUnserialize", null, Word_OnUnserialize, publicAccess);
1472 integerClass = eSystem_RegisterClass(normalClass, "uint32", null, 0, 0, null, null, module, baseSystemAccess);
1473 integerClass.type = systemClass;
1474 delete integerClass.dataTypeString;
1475 integerClass.dataTypeString = CopyString("uint32");
1476 eClass_AddMethod(integerClass, "OnCompare", null, UInteger_OnCompare, publicAccess);
1477 eClass_AddMethod(integerClass, "OnGetString", null, UInteger_OnGetString, publicAccess);
1478 eClass_AddMethod(integerClass, "OnGetDataFromString", null, UInteger_OnGetDataFromString, publicAccess);
1480 integerClass = eSystem_RegisterClass(normalClass, "uint32", "uint", 0, 0, null, null, module, baseSystemAccess, publicAccess);
1481 integerClass.type = systemClass;
1482 delete integerClass.dataTypeString;
1483 integerClass.dataTypeString = CopyString("unsigned int");
1484 integerClass.structSize = 0;
1485 integerClass.typeSize = sizeof(uint32);
1487 integerClass = eSystem_RegisterClass(normalClass, "uint64", null, 0, 0, null, null, module, baseSystemAccess, publicAccess);
1488 integerClass.type = systemClass;
1489 delete integerClass.dataTypeString;
1490 integerClass.dataTypeString = CopyString("uint64");
1491 integerClass.structSize = 0;
1492 integerClass.typeSize = sizeof(uint64);
1493 eClass_AddMethod(integerClass, "OnGetString", null, UInt64_OnGetString, publicAccess);
1494 eClass_AddMethod(integerClass, "OnGetDataFromString", null, UInt64_OnGetDataFromString, publicAccess);
1495 eClass_AddMethod(integerClass, "OnSerialize", null, Int64_OnSerialize, publicAccess);
1496 eClass_AddMethod(integerClass, "OnUnserialize", null, Int64_OnUnserialize, publicAccess);
1497 eClass_AddMethod(integerClass, "OnCompare", null, UInt64_OnCompare, publicAccess);
1499 integerClass = eSystem_RegisterClass(normalClass, "byte", null, 0, 0, null, null, module, baseSystemAccess, publicAccess);
1500 integerClass.type = systemClass;
1501 delete integerClass.dataTypeString;
1502 integerClass.dataTypeString = CopyString("unsigned char");
1503 integerClass.structSize = 0;
1504 integerClass.typeSize = sizeof(byte);
1505 eClass_AddMethod(integerClass, "OnCompare", null, Byte_OnCompare, publicAccess);
1506 eClass_AddMethod(integerClass, "OnGetString", null, Byte_OnGetString, publicAccess);
1507 eClass_AddMethod(integerClass, "OnGetDataFromString", null, Byte_OnGetDataFromString, publicAccess);
1508 eClass_AddMethod(integerClass, "OnSerialize", null, Byte_OnSerialize, publicAccess);
1509 eClass_AddMethod(integerClass, "OnUnserialize", null, Byte_OnUnserialize, publicAccess);
1511 integerClass = eSystem_RegisterClass(normalClass, "char", null, 0, 0, null, null, module, baseSystemAccess, publicAccess);
1512 integerClass.type = systemClass;
1513 delete integerClass.dataTypeString;
1514 integerClass.dataTypeString = CopyString("char");
1515 integerClass.structSize = 0;
1516 integerClass.typeSize = sizeof(char);
1517 eClass_AddMethod(integerClass, "OnCompare", null, Byte_OnCompare, publicAccess);
1518 eClass_AddMethod(integerClass, "OnGetString", null, Char_OnGetString, publicAccess);
1519 eClass_AddMethod(integerClass, "OnGetDataFromString", null, Byte_OnGetDataFromString, publicAccess);
1520 eClass_AddMethod(integerClass, "OnSerialize", null, Byte_OnSerialize, publicAccess);
1521 eClass_AddMethod(integerClass, "OnUnserialize", null, Byte_OnUnserialize, publicAccess);
1523 integerClass = eSystem_RegisterClass(normalClass, "uintptr", null, 0, 0, null, null, module, baseSystemAccess, publicAccess);
1524 integerClass.type = systemClass;
1525 delete integerClass.dataTypeString;
1526 integerClass.dataTypeString = CopyString("uintptr_t");
1527 integerClass.structSize = 0;
1528 integerClass.typeSize = sizeof(uintptr);
1529 if(sizeof(uintptr) == 8)
1531 eClass_AddMethod(integerClass, "OnGetString", null, UInt64_OnGetString, publicAccess);
1532 eClass_AddMethod(integerClass, "OnGetDataFromString", null, UInt64_OnGetDataFromString, publicAccess);
1533 eClass_AddMethod(integerClass, "OnSerialize", null, Int64_OnSerialize, publicAccess);
1534 eClass_AddMethod(integerClass, "OnUnserialize", null, Int64_OnUnserialize, publicAccess);
1535 eClass_AddMethod(integerClass, "OnCompare", null, UInt64_OnCompare, publicAccess);
1539 eClass_AddMethod(integerClass, "OnCompare", null, UInteger_OnCompare, publicAccess);
1540 eClass_AddMethod(integerClass, "OnGetString", null, UInteger_OnGetString, publicAccess);
1541 eClass_AddMethod(integerClass, "OnGetDataFromString", null, UInteger_OnGetDataFromString, publicAccess);
1542 eClass_AddMethod(integerClass, "OnSerialize", null, Int_OnSerialize, publicAccess);
1543 eClass_AddMethod(integerClass, "OnUnserialize", null, Int_OnUnserialize, publicAccess);
1546 integerClass = eSystem_RegisterClass(normalClass, "intptr", null, 0, 0, null, null, module, baseSystemAccess, publicAccess);
1547 integerClass.type = systemClass;
1548 delete integerClass.dataTypeString;
1549 integerClass.dataTypeString = CopyString("intptr_t");
1550 integerClass.structSize = 0;
1551 integerClass.typeSize = sizeof(intptr);
1552 if(sizeof(intptr) == 8)
1554 eClass_AddMethod(integerClass, "OnGetString", null, Int64_OnGetString, publicAccess);
1555 eClass_AddMethod(integerClass, "OnGetDataFromString", null, Int64_OnGetDataFromString, publicAccess);
1556 eClass_AddMethod(integerClass, "OnSerialize", null, Int64_OnSerialize, publicAccess);
1557 eClass_AddMethod(integerClass, "OnUnserialize", null, Int64_OnUnserialize, publicAccess);
1558 eClass_AddMethod(integerClass, "OnCompare", null, Int64_OnCompare, publicAccess);
1562 eClass_AddMethod(integerClass, "OnCompare", null, Integer_OnCompare, publicAccess);
1563 eClass_AddMethod(integerClass, "OnGetString", null, Integer_OnGetString, publicAccess);
1564 eClass_AddMethod(integerClass, "OnGetDataFromString", null, Integer_OnGetDataFromString, publicAccess);
1565 eClass_AddMethod(integerClass, "OnSerialize", null, Int_OnSerialize, publicAccess);
1566 eClass_AddMethod(integerClass, "OnUnserialize", null, Int_OnUnserialize, publicAccess);
1571 static int Float_OnCompare(Class _class, float * data1, float * data2)
1574 if(!data1 && !data2) result = 0;
1575 else if(data1 && !data2) result = 1;
1576 else if(!data1 && data2) result = -1;
1577 else if(*data1 > *data2) result = 1;
1578 else if(*data1 < *data2) result = -1;
1582 static char * Float_OnGetString(Class _class, float * data, char * string, void * fieldData, bool * needClass)
1586 int numDigits = 7, num = 1;
1588 while(numDigits && num < *data) numDigits--, num *= 10;
1589 sprintf(format, "%%.%df", numDigits);
1591 //sprintf(string, "%f", *data);
1592 sprintf(string, format, *data);
1594 c = strlen(string)-1;
1597 if(string[c] != '0')
1598 last = Max(last, c);
1599 if(string[c] == '.')
1611 static bool Float_OnGetDataFromString(Class _class, float * data, char * string)
1614 float result = (float)strtod(string, &end);
1615 //*data = atof(string);
1624 static void Float_OnSerialize(Class _class, float * data, IOChannel channel)
1627 PUTXDWORD(bytes, * (uint *)data);
1628 channel.WriteData(bytes, 4);
1631 static void Float_OnUnserialize(Class _class, float * data, IOChannel channel)
1634 if(channel.ReadData(bytes, 4) == 4)
1635 *(uint *)data = GETXDWORD(bytes);
1640 static void RegisterClass_Float(Module module)
1642 Class floatClass = eSystem_RegisterClass(normalClass, "float", null, 0, 0, null, null, module, baseSystemAccess, publicAccess);
1643 floatClass.type = systemClass;
1644 delete floatClass.dataTypeString;
1645 floatClass.dataTypeString = CopyString("float");
1646 floatClass.structSize = 0;
1647 floatClass.typeSize = sizeof(float);
1648 eClass_AddMethod(floatClass, "OnCompare", null, Float_OnCompare, publicAccess);
1649 eClass_AddMethod(floatClass, "OnGetString", null, Float_OnGetString, publicAccess);
1650 eClass_AddMethod(floatClass, "OnGetDataFromString", null, Float_OnGetDataFromString, publicAccess);
1651 eClass_AddMethod(floatClass, "OnSerialize", null, Float_OnSerialize, publicAccess);
1652 eClass_AddMethod(floatClass, "OnUnserialize", null, Float_OnUnserialize, publicAccess);
1656 static int Double_OnCompare(Class _class, double * data1, double * data2)
1659 if(!data1 && !data2) result = 0;
1660 else if(data1 && !data2) result = 1;
1661 else if(!data1 && data2) result = -1;
1662 else if(*data1 > *data2) result = 1;
1663 else if(*data1 < *data2) result = -1;
1667 static char * Double_OnGetString(Class _class, double * data, char * string, void * fieldData, bool * needClass)
1671 //sprintf(string, "%.20f", *data);
1672 if(runtimePlatform == win32)
1673 // sprintf(string, "%.16g", *data);
1674 sprintf(string, "%.15g", *data);
1676 sprintf(string, "%.13lf", *data);
1678 c = strlen(string)-1;
1681 if(string[c] != '0')
1682 last = Max(last, c);
1683 if(string[c] == '.')
1695 static bool Double_OnGetDataFromString(Class _class, double * data, char * string)
1699 //*data = (double)strtod(string, null);
1700 result = strtod(string, &end);
1710 static void Double_OnSerialize(Class _class, double * data, IOChannel channel)
1713 PUTXQWORD(bytes, * (uint64 *)data);
1714 channel.WriteData(bytes, 8);
1717 static void Double_OnUnserialize(Class _class, double * data, IOChannel channel)
1720 if(channel.ReadData(bytes, 8) == 8)
1721 *(uint64 *)data = GETXQWORD(bytes);
1726 static void RegisterClass_Double(Module module)
1728 Class doubleClass = eSystem_RegisterClass(normalClass, "double", null, 0, 0, null, null, module, baseSystemAccess, publicAccess);
1729 doubleClass.type = systemClass;
1730 delete doubleClass.dataTypeString;
1731 doubleClass.dataTypeString = CopyString("double");
1732 doubleClass.structSize = 0;
1733 doubleClass.typeSize = sizeof(double);
1734 eClass_AddMethod(doubleClass, "OnCompare", null, Double_OnCompare, publicAccess);
1735 eClass_AddMethod(doubleClass, "OnGetString", null, Double_OnGetString, publicAccess);
1736 eClass_AddMethod(doubleClass, "OnGetDataFromString", null, Double_OnGetDataFromString, publicAccess);
1737 eClass_AddMethod(doubleClass, "OnSerialize", null, Double_OnSerialize, publicAccess);
1738 eClass_AddMethod(doubleClass, "OnUnserialize", null, Double_OnUnserialize, publicAccess);
1741 public struct StaticString
1745 void OnSerialize(IOChannel channel)
1747 int len = this ? strlen(string) : 0;
1748 channel.WriteData(this ? string : "", len+1);
1751 void OnUnserialize(IOChannel channel)
1758 for(c = 0; channel.ReadData(&string[c], 1) && string[c]; c++);
1763 int OnCompare(StaticString string2)
1767 result = strcmpi(string, string2.string);
1768 else if(!this && string2)
1769 result = -1; // INVERTED THESE 2 CASES
1770 else if(this && !string2)
1775 char * OnGetString(char * tempString, void * fieldData, bool * needClass)
1777 return (char *)(this ? string : null); // Cast for memguard
1785 static void String_OnCopy(Class _class, char ** data, char * newData)
1789 int len = strlen(newData);
1792 *data = eSystem_New(len+1);
1793 memcpy(*data, newData, len+1);
1802 static bool String_OnGetDataFromString(Class _class, char ** data, char * newData)
1806 int len = strlen(newData);
1809 *data = eSystem_New(len+1);
1810 memcpy(*data, newData, len+1);
1818 /*static */int String_OnCompare(Class _class, char * string1, char * string2)
1821 if(string1 && string2)
1822 result = strcmpi(string1, string2);
1823 else if(!string1 && string2)
1825 else if(string1 && !string2)
1830 static char * String_OnGetString(Class _class, char * string, char * tempString, void * fieldData, bool * needClass)
1835 static void String_OnFree(Class _class, char * string)
1839 eSystem_Delete(string);
1843 static void String_OnSerialize(Class _class, char * string, IOChannel channel)
1845 int len = string ? strlen(string) : 0;
1846 channel.WriteData(string ? string : "", len+1);
1849 static void String_OnUnserialize(Class _class, char * * string, IOChannel channel)
1856 *string = new char[size];
1857 for(c = 0; channel.ReadData(&(*string)[c], 1) && (*string)[c]; c++)
1862 *string = renew *string char[size];
1865 (*string)[c++] = '\0';
1866 if(!UTF8Validate(*string))
1868 char * newString = new char[c*2];
1869 ISO8859_1toUTF8(*string, newString, c*2);
1871 *string = renew newString char[strlen(newString)+1];
1874 *string = renew *string char[c];
1878 static void RegisterClass_String(Module module)
1880 Class stringClass = eSystem_RegisterClass(normalClass, "char *", null, 0, 0, null, null, module, baseSystemAccess, publicAccess);
1881 delete stringClass.dataTypeString;
1882 stringClass.dataTypeString = CopyString("char *");
1883 stringClass.structSize = 0;
1885 eClass_AddMethod(stringClass, "OnCompare", null, String_OnCompare, publicAccess);
1886 eClass_AddMethod(stringClass, "OnCopy", null, String_OnCopy, publicAccess);
1887 eClass_AddMethod(stringClass, "OnFree", null, String_OnFree, publicAccess);
1888 eClass_AddMethod(stringClass, "OnGetString", null, String_OnGetString, publicAccess);
1889 eClass_AddMethod(stringClass, "OnGetDataFromString", null, String_OnGetDataFromString, publicAccess);
1890 eClass_AddMethod(stringClass, "OnSerialize", null, String_OnSerialize, publicAccess);
1891 eClass_AddMethod(stringClass, "OnUnserialize", null, String_OnUnserialize, publicAccess);
1892 // eClass_AddProperty(stringClass, null, "Class", null, String_GetClass, publicAccess);
1894 stringClass = eSystem_RegisterClass(normalClass, "String", "char *", 0, 0, null, null, module, baseSystemAccess, publicAccess);
1895 stringClass.structSize = 0;
1896 eClass_AddProperty(stringClass, null, "char *", null, null, publicAccess);
1899 void InitializeDataTypes1(Module module)
1901 Class baseClass = eSystem_FindClass(module, "class");
1903 eClass_AddVirtualMethod(baseClass, "OnDisplay", "void typed_object::OnDisplay(Surface surface, int x, int y, int width, void * fieldData, Alignment alignment, DataDisplayFlags displayFlags)", null, publicAccess);
1904 eClass_AddVirtualMethod(baseClass, "OnCompare", "int typed_object::OnCompare(any_object object)", OnCompare, publicAccess);
1905 eClass_AddVirtualMethod(baseClass, "OnCopy", "void typed_object&::OnCopy(any_object newData)", OnCopy, publicAccess);
1906 eClass_AddVirtualMethod(baseClass, "OnFree", "void typed_object::OnFree(void)", OnFree, publicAccess);
1907 eClass_AddVirtualMethod(baseClass, "OnGetString", "char * typed_object::OnGetString(char * tempString, void * fieldData, bool * needClass)", OnGetString, publicAccess);
1908 eClass_AddVirtualMethod(baseClass, "OnGetDataFromString", "bool typed_object&::OnGetDataFromString(char * string)", OnGetDataFromString, publicAccess);
1909 eClass_AddVirtualMethod(baseClass, "OnEdit", "Window typed_object::OnEdit(DataBox dataBox, DataBox obsolete, int x, int y, int w, int h, void * userData)", null, publicAccess);
1910 eClass_AddVirtualMethod(baseClass, "OnSerialize", "void typed_object::OnSerialize(IOChannel channel)", OnSerialize, publicAccess);
1911 eClass_AddVirtualMethod(baseClass, "OnUnserialize", "void typed_object&::OnUnserialize(IOChannel channel)", OnUnserialize, publicAccess);
1912 eClass_AddVirtualMethod(baseClass, "OnSaveEdit", "bool typed_object&::OnSaveEdit(Window window, void * object)", null, publicAccess);
1915 void InitializeDataTypes(Module module)
1917 Class enumClass = eSystem_FindClass(module, "enum");
1919 eClass_AddMethod(enumClass, "OnSerialize", null, Int_OnSerialize, publicAccess);
1920 eClass_AddMethod(enumClass, "OnUnserialize", null, Int_OnUnserialize, publicAccess);
1923 RegisterClass_Integer(module);
1924 RegisterClass_Float(module);
1925 RegisterClass_Double(module);
1926 RegisterClass_String(module);
1934 public int PrintStdArgsToBuffer(char * buffer, int maxLen, typed_object object, va_list args)
1937 // TOFIX: OnGetString will need a maxLen as well
1938 char * result = object.OnGetString(buffer, null, null);
1941 len = strlen(result);
1942 if(len >= maxLen) len = maxLen-1;
1943 if(result != buffer)
1944 memcpy(buffer, result, len);
1948 Class _class = null;
1951 _class = va_arg(args, void *);
1953 data = va_arg(args, void *);
1956 // TOFIX: OnGetString will need a maxLen as well
1957 result = ((char *(*)(void *, void *, char *, void *, bool *))(void *)_class._vTbl[__ecereVMethodID_class_OnGetString])(_class, data, buffer + len, null, null);
1960 int newLen = strlen(result);
1961 if(len + newLen >= maxLen) newLen = maxLen-1-len;
1962 if(result != buffer + len)
1963 memcpy(buffer + len, result, newLen);
1972 public int PrintBuf(char * buffer, int maxLen, typed_object object, ...)
1976 va_start(args, object);
1977 len = PrintStdArgsToBuffer(buffer, maxLen, object, args);
1982 public int PrintLnBuf(char * buffer, int maxLen, typed_object object, ...)
1986 va_start(args, object);
1987 len = PrintStdArgsToBuffer(buffer, maxLen-1, object, args);
1988 buffer[len++] = '\n';
1994 public char * PrintString(typed_object object, ...)
2000 va_start(args, object);
2001 len = PrintStdArgsToBuffer(buffer, sizeof(buffer), object, args);
2002 string = new char[len + 1];
2003 memcpy(string, buffer, len + 1);
2008 public char * PrintLnString(typed_object object, ...)
2014 va_start(args, object);
2015 len = PrintStdArgsToBuffer(buffer, sizeof(buffer), object, args);
2016 string = new char[len + 2];
2017 memcpy(string, buffer, len);
2018 string[len++] = '\n';
2024 #if defined(__ANDROID__)
2025 #include <android/log.h>
2026 #define LOGI(...) ((void)__android_log_print(ANDROID_LOG_INFO, "ecere-app", __VA_ARGS__))
2029 public void PrintLn(typed_object object, ...)
2033 va_start(args, object);
2034 PrintStdArgsToBuffer(buffer, sizeof(buffer), object, args);
2036 #if defined(__ANDROID__) && !defined(ECERE_NOFILE)
2043 public void Print(typed_object object, ...)
2047 va_start(args, object);
2048 PrintStdArgsToBuffer(buffer, sizeof(buffer), object, args);
2050 fputs(buffer, eC_stdout());