ecere/ECON: Fixed ECON parser expecting members in specific order
[sdk] / ecere / src / sys / JSON.ec
index a34a7e2..9d63b68 100644 (file)
@@ -155,8 +155,6 @@ private:
             if(array)
                array.Free();
             delete array;
-            if(result != success)
-               result = typeMismatch;
          }
       }
       else if(ch == '-' || isdigit(ch))
@@ -704,24 +702,13 @@ private:
                bool isKey = false;
                bool isTemplateArg = false;
                uint offset = 0;
-               if(eCON)
+
+               ch = 0;
+               SkipEmpty();
+
+               if(eCON && (ch != '=' && ch != ':'))
                {
-                  SkipEmpty();
-                  prop = null; member = null;
-                  if(ch == '=' || ch == ':')
-                  {
-                     if(wasQuoted)
-                        string[0] = (char)tolower(string[0]);
-                     while(1)
-                     {
-                        eClass_FindNextMember(objectType, &curClass, &curMember, subMemberStack, &subMemberStackPos);
-                        if(!curMember) break;
-                        if(!strcmp(curMember.name, string))
-                           break;
-                     }
-                  }
-                  else
-                     eClass_FindNextMember(objectType, &curClass, &curMember, subMemberStack, &subMemberStackPos);
+                  eClass_FindNextMember(objectType, &curClass, &curMember, subMemberStack, &subMemberStackPos);
                   if(curMember)
                   {
                      prop = curMember.isProperty ? (Property)curMember : null;
@@ -756,9 +743,10 @@ private:
                         PrintLn("Warning: default member assignment: no more members");
                   }
                }
-               if(objectType && !eCON)
+               else if(objectType)
                {
-                  string[0] = (char)tolower(string[0]);
+                  if(!eCON || wasQuoted)
+                     string[0] = (char)tolower(string[0]);
                   if(mapKeyClass && !strcmp(string, "key"))
                   {
                      prop = eClass_FindProperty(objectType, "key", objectType.module);
@@ -774,17 +762,23 @@ private:
                   }
                   else
                   {
-                     member = eClass_FindDataMember(objectType, string, objectType.module, null, null);
+                     member = eClass_FindDataMember(objectType, string, objectType.module, subMemberStack, &subMemberStackPos);
                      if(member)
                      {
                         type = superFindClass(member.dataTypeString, objectType.module);
                         offset = member._class.offset + member.offset;
+                        curMember = member;
+                        curClass = member._class;
                      }
                      else if(!member)
                      {
                         prop = eClass_FindProperty(objectType, string, objectType.module);
                         if(prop)
+                        {
                            type = superFindClass(prop.dataTypeString, objectType.module);
+                           curMember = (DataMember)prop;
+                           curClass = prop._class;
+                        }
                         else
                            PrintLn("Warning: member ", string, " not found in class ", (String)objectType.name);
                      }
@@ -818,11 +812,6 @@ private:
                         value.p = new0 byte[type.structSize];
                      }
                   }
-                  if(!eCON)
-                  {
-                     ch = 0;
-                     SkipEmpty();
-                  }
                   if(eCON && ch != '=' && ch != ':')
                   {
                      f.Seek(seek-1, start);
@@ -1381,7 +1370,7 @@ static bool WriteNumber(File f, Class type, DataValue value, int indent, bool eC
       ((const char *(*)(void *, void *, char *, void *, bool *))(void *)type._vTbl[__ecereVMethodID_class_OnGetString])(type, &value.i64, buffer, null, &needClass);
    else if(!strcmp(type.dataTypeString, "unsigned int64") || !strcmp(type.dataTypeString, "uint64") || type.typeSize == sizeof(int64))
    {
-      if(useHex)
+      if(useHex && eCON)
          sprintf(buffer, __runtimePlatform == win32 ? "0x%016I64X" : "0x%016llX", value.ui64);
       else
          ((const char *(*)(void *, void *, char *, void *, bool *))(void *)type._vTbl[__ecereVMethodID_class_OnGetString])(type, &value.ui64, buffer, null, &needClass);
@@ -1390,7 +1379,7 @@ static bool WriteNumber(File f, Class type, DataValue value, int indent, bool eC
       ((const char *(*)(void *, void *, char *, void *, bool *))(void *)type._vTbl[__ecereVMethodID_class_OnGetString])(type, &value.i, buffer, null, &needClass);
    else if(!strcmp(type.dataTypeString, "unsigned int") || !strcmp(type.dataTypeString, "uint") || type.typeSize == sizeof(int))
    {
-      if(useHex)
+      if(useHex && eCON)
          sprintf(buffer, "0x%08X", value.ui);
       else
          ((const char *(*)(void *, void *, char *, void *, bool *))(void *)type._vTbl[__ecereVMethodID_class_OnGetString])(type, &value.ui, buffer, null, &needClass);
@@ -1481,6 +1470,17 @@ static bool WriteValue(File f, Class type, DataValue value, int indent, bool eCO
                   f.Puts("\\t");
                   b = 0;
                }
+               else if(c >= 4 && ch == '>' && string[c-2] == 'r' && string[c-3] == 'b' && string[c-4] == '<')
+               {
+                  // Add an automatic newline for <br> as this is how we imported documentor data...
+                  int i;
+                  buffer[b] = 0;
+                  f.Puts(buffer);
+                  f.Puts(">\"\n");
+                  for(i = 0; i<indent; i++) f.Puts("   ");
+                  f.Puts("   \"");
+                  b = 0;
+               }
                else if(ch == '\n')
                {
                   int i;