diff --git a/data/Memory-ng.xml b/data/Memory-ng.xml index 100a2657b..20a7e3f37 100644 --- a/data/Memory-ng.xml +++ b/data/Memory-ng.xml @@ -823,6 +823,11 @@ + + + + +
@@ -831,6 +836,200 @@
+ +
+
+
+
+ + +
+
+
+
+
+
+
+
+
+
+
+
+ + + + + + + + + + + + + + +
+ + + + + +
+ + + + + +
+
+ + + + + vector + vector + + + +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ + + +
+ + + +
+ + + +
+
+ + + +
+ + + +
+ +
+ + + + +
+ + + + + +
+ List of offsets in the VTable : + + + + + + + + + + (in the vtable) + + +
+
+ @@ -1060,7 +1259,7 @@ -
+
@@ -1160,11 +1359,11 @@ -
-
-
-
-
+
+ +
+
+
@@ -1222,16 +1421,16 @@
-
-
-
-
-
+
+ +
+
+
-
-
-
+
+
+
@@ -1260,7 +1459,7 @@
-
+
@@ -1269,10 +1468,10 @@ -
+
-
+
@@ -1465,8 +1664,8 @@ - - + + @@ -1597,7 +1796,7 @@ -
+
diff --git a/library/VersionInfo.cpp b/library/VersionInfo.cpp index a7d427056..fe18ec4f4 100644 --- a/library/VersionInfo.cpp +++ b/library/VersionInfo.cpp @@ -26,6 +26,7 @@ distribution. #include "dfhack/VersionInfo.h" #include "dfhack/DFError.h" #include "dfhack/DFProcess.h" +#include //Inital amount of space in levels vector (since we usually know the number, efficient!) #define NUM_RESERVE_LVLS 20 @@ -102,6 +103,8 @@ namespace DFHack map offsets; map strings; map groups; + std::string name; + OffsetGroup * parent; }; } @@ -134,7 +137,7 @@ void OffsetGroup::setOffset (const string & key, const string & value) (*it).second.second = offset; (*it).second.first = true; } - else throw Error::MissingMemoryDefinition("offset", key); + else throw Error::MissingMemoryDefinition("offset", getFullName() + key); } @@ -147,7 +150,7 @@ void OffsetGroup::setAddress (const string & key, const string & value) (*it).second.second = address; (*it).second.first = true; } - else throw Error::MissingMemoryDefinition("address", key); + else throw Error::MissingMemoryDefinition("address", getFullName() + key); } @@ -159,7 +162,7 @@ void OffsetGroup::setHexValue (const string & key, const string & value) (*it).second.second = strtol(value.c_str(), NULL, 16); (*it).second.first = true; } - else throw Error::MissingMemoryDefinition("hexvalue", key); + else throw Error::MissingMemoryDefinition("hexvalue", getFullName() + key); } @@ -171,7 +174,7 @@ void OffsetGroup::setString (const string & key, const string & value) (*it).second.second = value; (*it).second.first = true; } - else throw Error::MissingMemoryDefinition("string", key); + else throw Error::MissingMemoryDefinition("string", getFullName() + key); } @@ -184,9 +187,9 @@ uint32_t OffsetGroup::getAddress (const string & key) { if((*iter).second.first) return (*iter).second.second; - throw Error::UnsetMemoryDefinition("address", key); + throw Error::UnsetMemoryDefinition("address", getFullName() + key); } - throw Error::MissingMemoryDefinition("address", key); + throw Error::MissingMemoryDefinition("address", getFullName() + key); } @@ -198,9 +201,9 @@ int32_t OffsetGroup::getOffset (const string & key) { if((*iter).second.first) return (*iter).second.second; - throw Error::UnsetMemoryDefinition("offset", key); + throw Error::UnsetMemoryDefinition("offset", getFullName() + key); } - throw Error::MissingMemoryDefinition("offset", key); + throw Error::MissingMemoryDefinition("offset", getFullName() + key); } @@ -212,9 +215,9 @@ uint32_t OffsetGroup::getHexValue (const string & key) { if((*iter).second.first) return (*iter).second.second; - throw Error::UnsetMemoryDefinition("hexvalue", key); + throw Error::UnsetMemoryDefinition("hexvalue", getFullName() + key); } - throw Error::MissingMemoryDefinition("hexvalue", key); + throw Error::MissingMemoryDefinition("hexvalue", getFullName() + key); } // Get named string @@ -225,9 +228,9 @@ std::string OffsetGroup::getString (const string &key) { if((*iter).second.first) return (*iter).second.second; - throw Error::UnsetMemoryDefinition("string", key); + throw Error::UnsetMemoryDefinition("string", getFullName() + key); } - throw Error::MissingMemoryDefinition("string", key); + throw Error::MissingMemoryDefinition("string", getFullName() + key); } OffsetGroup * OffsetGroup::getGroup(const std::string &name) @@ -243,7 +246,7 @@ OffsetGroup * OffsetGroup::createGroup(const std::string &name) OffsetGroup * ret = getGroup(name); if(ret) return ret; - ret = new OffsetGroup(); + ret = new OffsetGroup(name, this); OGd->groups[name] = ret; return ret; } @@ -264,6 +267,15 @@ void OffsetGroup::RebaseAddresses(int32_t offset) OffsetGroup::OffsetGroup() { OGd = new OffsetGroupPrivate(); + OGd->name = "Version"; + OGd->parent = 0; +} + +OffsetGroup::OffsetGroup(const std::string & name, OffsetGroup * parent) +{ + OGd = new OffsetGroupPrivate(); + OGd->name = name; + OGd->parent = parent; } OffsetGroup::~OffsetGroup() @@ -276,6 +288,65 @@ OffsetGroup::~OffsetGroup() delete OGd; } +std::string OffsetGroup::getName() +{ + return OGd->name; +} + +OffsetGroup * OffsetGroup::getParent() +{ + return OGd->parent; +} + +std::string OffsetGroup::getFullName() +{ + string temp, accum; + OffsetGroup * curr = this; + while(curr) + { + temp = curr->getName() + string("/") + accum; + accum = temp; + curr = curr->getParent(); + } + return accum; +} + +std::string OffsetGroup::PrintOffsets() +{ + uint32_Iter iter; + ostringstream ss; + for(iter = OGd->addresses.begin(); iter != OGd->addresses.end(); iter++) + { + if((*iter).second.first) + ss << "
" << endl; + } + int32_Iter iter2; + for(iter2 = OGd->offsets.begin(); iter2 != OGd->offsets.end(); iter2++) + { + if((*iter).second.first) + ss << "" << endl; + } + for(iter = OGd->hexvals.begin(); iter != OGd->hexvals.end(); iter++) + { + if((*iter).second.first) + ss << "" << endl; + } + strings_Iter iter3; + for(iter3 = OGd->strings.begin(); iter3 != OGd->strings.end(); iter3++) + { + if((*iter3).second.first) + ss << "" << endl; + } + groups_Iter iter4; + for(iter4 = OGd->groups.begin(); iter4 != OGd->groups.end(); iter4++) + { + ss << "" << endl; + ss <<(*iter4).second->PrintOffsets(); + ss << "" << endl; + } + return ss.str(); +} + /* * Private data */ @@ -325,6 +396,7 @@ VersionInfo::VersionInfo() d->moods.reserve(NUM_RESERVE_MOODS); d->md5 = "invalid"; d->PE_timestamp = 0; + OffsetGroup(); } @@ -343,7 +415,7 @@ void OffsetGroup::copy(const OffsetGroup * old) OGd->strings = old->OGd->strings; for(groups_Iter it = old->OGd->groups.begin(); it != old->OGd->groups.end(); it++) { - OffsetGroup * ogn = new OffsetGroup(); + OffsetGroup * ogn = new OffsetGroup((*it).first, this); ogn->copy((*it).second); OGd->groups[(*it).first] = ogn; } @@ -905,27 +977,7 @@ std::string VersionInfo::PrintOffsets() ss << " UNKNOWN" << endl; } ss << "" << endl; - /* - map::const_iterator iter; - for(iter = OGd->addresses.begin(); iter != OGd->addresses.end(); iter++) - { - ss << "
" << endl; - } - map::const_iterator iter2; - for(iter2 = OGd->offsets.begin(); iter2 != OGd->offsets.end(); iter2++) - { - ss << " " << endl; - } - for(iter = OGd->hexvals.begin(); iter != OGd->hexvals.end(); iter++) - { - ss << " " << endl; - } - map::const_iterator iter3; - for(iter3 = OGd->strings.begin(); iter3 != OGd->strings.end(); iter3++) - { - ss << " " << endl; - } - */ + ss << OffsetGroup::PrintOffsets(); ss << "" << endl; ss << "" << endl; return ss.str(); diff --git a/library/VersionInfoFactory.cpp b/library/VersionInfoFactory.cpp index 6a1bd517b..11007f00c 100644 --- a/library/VersionInfoFactory.cpp +++ b/library/VersionInfoFactory.cpp @@ -183,6 +183,12 @@ void VersionInfoFactory::ParseOffsets(TiXmlElement * parent, VersionInfo* target groupPair & gp = breadcrumbs.back(); gp.first = currentElem->NextSiblingElement(); + if(!og) + { + string fullname = currentGroup->getFullName() + cstr_name; + throw Error::MissingMemoryDefinition("group", fullname); + } + // add a new level that will be processed next breadcrumbs.push_back(groupPair(currentElem->FirstChildElement(), og)); continue; diff --git a/library/include/dfhack/DFError.h b/library/include/dfhack/DFError.h index 6e967218f..e4def9883 100644 --- a/library/include/dfhack/DFError.h +++ b/library/include/dfhack/DFError.h @@ -81,7 +81,7 @@ namespace DFHack MissingMemoryDefinition(const char* _type, const std::string _key) : type(_type), key(_key) { std::stringstream s; - s << "memory object not declared: type " << type << " key " << key; + s << "memory object not declared: type=" << type << " key=" << key; full = s.str(); } // Used by functios using integer keys, such as getTrait @@ -92,7 +92,7 @@ namespace DFHack key = s1.str(); std::stringstream s; - s << "memory object not declared: type " << type << " key " << key; + s << "memory object not declared: type=" << type << " key=" << key; full = s.str(); } virtual ~MissingMemoryDefinition() throw(){}; diff --git a/library/include/dfhack/VersionInfo.h b/library/include/dfhack/VersionInfo.h index e76fe65d1..571ac646a 100644 --- a/library/include/dfhack/VersionInfo.h +++ b/library/include/dfhack/VersionInfo.h @@ -49,6 +49,7 @@ namespace DFHack OffsetGroupPrivate * OGd; public: OffsetGroup(); + OffsetGroup(const std::string & _name, OffsetGroup * parent = 0); ~OffsetGroup(); void copy(const OffsetGroup * old); // recursive @@ -70,6 +71,10 @@ namespace DFHack void setAddress (const std::string & key, const std::string & value); void setHexValue (const std::string & key, const std::string & value); void setString (const std::string & key, const std::string & value); + std::string PrintOffsets(); + std::string getName(); + std::string getFullName(); + OffsetGroup * getParent(); }; /*