]> git.localhorst.tv Git - l2e.git/commitdiff
split reading of literal from reading its defined name
authorDaniel Karbach <daniel.karbach@localhorst.tv>
Tue, 11 Sep 2012 19:04:54 +0000 (21:04 +0200)
committerDaniel Karbach <daniel.karbach@localhorst.tv>
Tue, 11 Sep 2012 19:04:54 +0000 (21:04 +0200)
src/loader/Interpreter.cpp
src/loader/Interpreter.h

index f9f57bfb55f1fa32a4432b12b5cda29bfc586fe8..550be2678f7e75f175b9a187a50080079d911a70 100644 (file)
@@ -107,7 +107,26 @@ void Interpreter::ReadDefinition(const Definition &dfn) {
 }
 
 void Interpreter::ReadLiteral(const Definition &dfn) {
-       switch (dfn.GetLiteral()->GetType()) {
+       const string &typeName(dfn.GetLiteral()->IsArray() ? "Array" : dfn.GetLiteral()->GetTypeName());
+       int typeId(TypeDescription::GetTypeId(typeName));
+       int id(values[typeId].size());
+       const TypeDescription &td(TypeDescription::Get(typeId));
+       int size(
+                       (dfn.GetLiteral()->GetType() == Literal::PATH
+                                       || dfn.GetLiteral()->GetType() == Literal::STRING)
+                       ? dfn.GetLiteral()->GetString().size() : td.Size());
+       char *object(new char[size]);
+       if (dfn.GetLiteral()->GetType() == Literal::OBJECT) {
+               ReadObject(typeId, id, object, *dfn.GetLiteral()->GetProperties());
+       } else {
+               ReadLiteral(typeId, id, object, *dfn.GetLiteral());
+       }
+       values[typeId].push_back(object);
+       parsedDefinitions.insert(make_pair(dfn.Identifier(), ParsedDefinition(&dfn, typeId, id)));
+}
+
+void Interpreter::ReadLiteral(int typeId, int id, char *object, const Literal &literal) {
+       switch (literal.GetType()) {
                case Literal::ARRAY_VALUES:
                        throw Error("named value arrays are not supported, sorry");
                        break;
@@ -115,55 +134,27 @@ void Interpreter::ReadLiteral(const Definition &dfn) {
                        throw Error("named property list arrays are not supported, sorry");
                        break;
                case Literal::BOOLEAN:
-                       {
-                               int typeId(TypeDescription::GetTypeId("Boolean"));
-                               values[typeId].push_back(new bool(dfn.GetLiteral()->GetBoolean()));
-                               parsedDefinitions.insert(make_pair(dfn.Identifier(), ParsedDefinition(&dfn, typeId, values[typeId].size() - 1)));
-                       }
+                       new (object) bool(literal.GetBoolean());
                        break;
                case Literal::COLOR:
-                       {
-                               int typeId(TypeDescription::GetTypeId("Color"));
-                               values[typeId].push_back(new Color(dfn.GetLiteral()->GetRed(), dfn.GetLiteral()->GetGreen(), dfn.GetLiteral()->GetBlue(), dfn.GetLiteral()->GetAlpha()));
-                               parsedDefinitions.insert(make_pair(dfn.Identifier(), ParsedDefinition(&dfn, typeId, values[typeId].size() - 1)));
-                       }
+                       new (object) Color(literal.GetRed(), literal.GetGreen(), literal.GetBlue(), literal.GetAlpha());
                        break;
                case Literal::NUMBER:
-                       {
-                               int typeId(TypeDescription::GetTypeId("Number"));
-                               values[typeId].push_back(new int(dfn.GetLiteral()->GetNumber()));
-                               parsedDefinitions.insert(make_pair(dfn.Identifier(), ParsedDefinition(&dfn, typeId, values[typeId].size() - 1)));
-                       }
+                       new (object) int(literal.GetNumber());
                        break;
                case Literal::PATH:
-                       {
-                               int typeId(TypeDescription::GetTypeId("Path"));
-                               char *str(new char[dfn.GetLiteral()->GetString().size() + 1]);
-                               std::memcpy(str, dfn.GetLiteral()->GetString().c_str(), dfn.GetLiteral()->GetString().size());
-                               str[dfn.GetLiteral()->GetString().size()] = '\0';
-                               values[typeId].push_back(str);
-                               parsedDefinitions.insert(make_pair(dfn.Identifier(), ParsedDefinition(&dfn, typeId, values[typeId].size() - 1)));
-                       }
+                       std::memcpy(object, literal.GetString().c_str(), literal.GetString().size());
+                       object[literal.GetString().size()] = '\0';
                        break;
                case Literal::STRING:
-                       {
-                               int typeId(TypeDescription::GetTypeId("String"));
-                               char *str(new char[dfn.GetLiteral()->GetString().size() + 1]);
-                               std::memcpy(str, dfn.GetLiteral()->GetString().c_str(), dfn.GetLiteral()->GetString().size());
-                               str[dfn.GetLiteral()->GetString().size()] = '\0';
-                               values[typeId].push_back(str);
-                               parsedDefinitions.insert(make_pair(dfn.Identifier(), ParsedDefinition(&dfn, typeId, values[typeId].size() - 1)));
-                       }
+                       std::memcpy(object, literal.GetString().c_str(), literal.GetString().size());
+                       object[literal.GetString().size()] = '\0';
                        break;
                case Literal::VECTOR:
-                       {
-                               int typeId(TypeDescription::GetTypeId("Vector"));
-                               values[typeId].push_back(new Vector<int>(dfn.GetLiteral()->GetX(), dfn.GetLiteral()->GetY()));
-                               parsedDefinitions.insert(make_pair(dfn.Identifier(), ParsedDefinition(&dfn, typeId, values[typeId].size() - 1)));
-                       }
+                       new (object) Vector<int>(literal.GetX(), literal.GetY());
                        break;
                case Literal::OBJECT:
-                       ReadObject(dfn);
+                       throw Error("illogical branch: read literal object as non-object literal");
                        break;
        }
 }
@@ -285,16 +276,21 @@ void Interpreter::ReadObject(int typeId, int id, char *object, const PropertyLis
                if (CanLink(*i->second)) {
                        char *dest(object + fd.Offset());
                        if (fd.IsAggregate()) {
-                               if (i->second->GetLiteral().GetType() != Literal::ARRAY_PROPS) {
-                                       throw Error("unsupported aggregate type");
-                               }
                                int arraySize(i->second->GetLiteral().ArraySize());
                                char *aggregate(new char[fieldType.Size() * arraySize]);
                                char *iter(aggregate);
-                               vector<PropertyList *> list(i->second->GetLiteral().GetPropertyLists());
-                               for (vector<PropertyList *>::const_iterator j(list.begin()), end(list.end()); j != end; ++j, iter += fieldType.Size()) {
-                                       fieldType.Construct(iter);
-                                       ReadObject(fieldType.TypeId(), -1, iter, **j);
+                               if (i->second->GetLiteral().GetType() == Literal::ARRAY_PROPS) {
+                                       const vector<PropertyList *> &list(i->second->GetLiteral().GetPropertyLists());
+                                       for (vector<PropertyList *>::const_iterator j(list.begin()), end(list.end()); j != end; ++j, iter += fieldType.Size()) {
+                                               fieldType.Construct(iter);
+                                               ReadObject(fieldType.TypeId(), -1, iter, **j);
+                                       }
+                               } else {
+                                       const vector<Value *> &list(i->second->GetLiteral().GetValues());
+                                       for (vector<Value *>::const_iterator j(list.begin()), end(list.end()); j != end; ++j, iter += fieldType.Size()) {
+                                               fieldType.Construct(iter);
+                                               ReadLiteral(fieldType.TypeId(), -1, iter, (*j)->GetLiteral());
+                                       }
                                }
                                if (fd.IsReferenced()) {
                                        std::memcpy(dest, &aggregate, sizeof(char *));
index b826d2cf7be2b15b03c58903b7b3078881545d04..8d5c1e31aadf7ca70ad042501baa2317d074fbd3 100644 (file)
@@ -47,6 +47,7 @@ namespace graphics {
 namespace loader {
 
 class Definition;
+class Literal;
 class ParsedSource;
 class PropertyList;
 class Value;
@@ -88,6 +89,7 @@ private:
        void ReadLiteral(const Definition &);
        void ReadObject(const Definition &);
 
+       void ReadLiteral(int typeId, int id, char *dest, const Literal &);
        void *GetObject(int typeId, const Value &value);
        void ReadObject(int typeId, int id, char *dest, const PropertyList &);