]> git.localhorst.tv Git - l2e.git/blobdiff - src/loader/ObjectFile.cpp
relocate scripts
[l2e.git] / src / loader / ObjectFile.cpp
index 4cb886223c80150216cdad339bdbc59312bcbafe..76cc98266c1214b31395a419db68700cea97285a 100644 (file)
@@ -1,12 +1,10 @@
-/*
- * ObjectFile.cpp
- *
- *  Created on: Sep 15, 2012
- *      Author: holy
- */
-
 #include "ObjectFile.h"
 
+#include <stdexcept>
+
+using std::runtime_error;
+
+
 namespace loader {
 
 ObjectFileHeader::ObjectFileHeader()
@@ -15,40 +13,150 @@ ObjectFileHeader::ObjectFileHeader()
 , exportsEnd(0)
 , externalsBegin(0)
 , externalsEnd(0)
-, exportStringsBegin(0)
-, exportStringsEnd(0)
-, externalStringsBegin(0)
-, externalStringsEnd(0)
 , imagesBegin(0)
 , imagesEnd(0)
 , objectsBegin(0)
-, objectsEnd(0) {
+, objectsEnd(0)
+, arraysBegin(0)
+, arraysEnd(0)
+, scriptsBegin(0)
+, scriptsEnd(0) {
        ident[0] = 'L';
        ident[1] = '2';
        ident[2] = 'E';
        ident[3] = '\n';
 }
 
-LoadedObjectFile::LoadedObjectFile()
-: allocPtr(0)
-, fileHeader(0)
-, typeOffsetsBegin(0)
-, typeOffsetsEnd(0)
-, exportsBegin(0)
-, exportsEnd(0)
-, externalsBegin(0)
-, externalsEnd(0)
-, exportStringsBegin(0)
-, exportStringsEnd(0)
-, externalStringsBegin(0)
-, externalStringsEnd(0)
-, imagesBegin(0)
-, imagesEnd(0)
-, objectsBegin(0)
-, objectsEnd(0)
-, surfaces(0)
-, surfaceCount(0) {
+void ObjectFileHeader::IntegrityCheck(unsigned int fsize) const {
+       if (ident[0] != 'L'
+                       || ident[1] != '2'
+                       || ident[2] != 'E'
+                       || ident[3] != '\n') {
+               throw runtime_error("magic bytes mismatch");
+       }
+       if (versionId != FORMAT_ID) {
+               throw runtime_error("format ID mismatch");
+       }
+       if (!CheckSection(exportsBegin, exportsEnd, fsize)) {
+               throw runtime_error("exports section out of bounds");
+       }
+       if ((exportsEnd - exportsBegin) % sizeof(Export) != 0) {
+               throw runtime_error("bogus exports section end");
+       }
+       if (!CheckSection(externalsBegin, externalsEnd, fsize)) {
+               throw runtime_error("externals section out of bounds");
+       }
+       if ((externalsEnd - externalsBegin) % sizeof(External) != 0) {
+               throw runtime_error("bogus externals section end");
+       }
+       if (!CheckSection(imagesBegin, imagesEnd, fsize)) {
+               throw runtime_error("images section out of bounds");
+       }
+       if ((imagesEnd - imagesBegin) % sizeof(Image) != 0) {
+               throw runtime_error("bogus images section end");
+       }
+       if (!CheckSection(objectsBegin, objectsEnd, fsize)) {
+               throw runtime_error("objects section out of bounds");
+       }
+       if (!CheckSection(arraysBegin, arraysEnd, fsize)) {
+               throw runtime_error("arrays section out of bounds");
+       }
+}
+
+bool ObjectFileHeader::CheckSection(
+               unsigned int begin,
+               unsigned int end,
+               unsigned int fsize) const {
+       return begin >= sizeof(ObjectFileHeader)
+                       && (begin < fsize || begin == end)
+                       && end >= begin
+                       && end <= fsize;
+}
+
+Export *ObjectFileHeader::ExportsBegin() {
+       char *data = reinterpret_cast<char *>(this);
+       return reinterpret_cast<Export *>(data + exportsBegin);
+}
+
+Export *ObjectFileHeader::ExportsEnd() {
+       char *data = reinterpret_cast<char *>(this);
+       return reinterpret_cast<Export *>(data + exportsEnd);
+}
+
+External *ObjectFileHeader::ExternalsBegin() {
+       char *data = reinterpret_cast<char *>(this);
+       return reinterpret_cast<External *>(data + externalsBegin);
+}
+
+External *ObjectFileHeader::ExternalsEnd() {
+       char *data = reinterpret_cast<char *>(this);
+       return reinterpret_cast<External *>(data + externalsEnd);
+}
+
+Image *ObjectFileHeader::ImagesBegin() {
+       char *data = reinterpret_cast<char *>(this);
+       return reinterpret_cast<Image *>(data + imagesBegin);
+}
+
+Image *ObjectFileHeader::ImagesEnd() {
+       char *data = reinterpret_cast<char *>(this);
+       return reinterpret_cast<Image *>(data + imagesEnd);
+}
+
+Object *ObjectFileHeader::ObjectsBegin() {
+       char *data = reinterpret_cast<char *>(this);
+       return reinterpret_cast<Object *>(data + objectsBegin);
+}
+
+Object *ObjectFileHeader::ObjectsEnd() {
+       char *data = reinterpret_cast<char *>(this);
+       return reinterpret_cast<Object *>(data + objectsEnd);
+}
+
+Array *ObjectFileHeader::ArraysBegin() {
+       char *data = reinterpret_cast<char *>(this);
+       return reinterpret_cast<Array *>(data + arraysBegin);
+}
+
+Array *ObjectFileHeader::ArraysEnd() {
+       char *data = reinterpret_cast<char *>(this);
+       return reinterpret_cast<Array *>(data + arraysEnd);
+}
+
+Script *ObjectFileHeader::ScriptsBegin() {
+       char *data = reinterpret_cast<char *>(this);
+       return reinterpret_cast<Script *>(data + scriptsBegin);
+}
+
+Script *ObjectFileHeader::ScriptsEnd() {
+       char *data = reinterpret_cast<char *>(this);
+       return reinterpret_cast<Script *>(data + scriptsEnd);
+}
+
+
+char *Object::RawObject() {
+       return reinterpret_cast<char *>(this) + sizeof(Object);
+}
+
+Object *Object::Next() {
+       return reinterpret_cast<Object *>(RawObject() + size);
+}
+
+
+char *Array::Data() {
+       return reinterpret_cast<char *>(this) + sizeof(Array);
+}
+
+Array *Array::Next() {
+       return reinterpret_cast<Array *>(Data() + size);
+}
+
+char *Script::Text() {
+       return reinterpret_cast<char *>(this) + sizeof(Script);
+}
 
+Script *Script::Next() {
+       return reinterpret_cast<Script *>(Text() + size);
 }
 
 }