]> git.localhorst.tv Git - l2e.git/blob - src/loader/ObjectFile.cpp
relocate scripts
[l2e.git] / src / loader / ObjectFile.cpp
1 #include "ObjectFile.h"
2
3 #include <stdexcept>
4
5 using std::runtime_error;
6
7
8 namespace loader {
9
10 ObjectFileHeader::ObjectFileHeader()
11 : versionId(FORMAT_ID)
12 , exportsBegin(0)
13 , exportsEnd(0)
14 , externalsBegin(0)
15 , externalsEnd(0)
16 , imagesBegin(0)
17 , imagesEnd(0)
18 , objectsBegin(0)
19 , objectsEnd(0)
20 , arraysBegin(0)
21 , arraysEnd(0)
22 , scriptsBegin(0)
23 , scriptsEnd(0) {
24         ident[0] = 'L';
25         ident[1] = '2';
26         ident[2] = 'E';
27         ident[3] = '\n';
28 }
29
30 void ObjectFileHeader::IntegrityCheck(unsigned int fsize) const {
31         if (ident[0] != 'L'
32                         || ident[1] != '2'
33                         || ident[2] != 'E'
34                         || ident[3] != '\n') {
35                 throw runtime_error("magic bytes mismatch");
36         }
37         if (versionId != FORMAT_ID) {
38                 throw runtime_error("format ID mismatch");
39         }
40         if (!CheckSection(exportsBegin, exportsEnd, fsize)) {
41                 throw runtime_error("exports section out of bounds");
42         }
43         if ((exportsEnd - exportsBegin) % sizeof(Export) != 0) {
44                 throw runtime_error("bogus exports section end");
45         }
46         if (!CheckSection(externalsBegin, externalsEnd, fsize)) {
47                 throw runtime_error("externals section out of bounds");
48         }
49         if ((externalsEnd - externalsBegin) % sizeof(External) != 0) {
50                 throw runtime_error("bogus externals section end");
51         }
52         if (!CheckSection(imagesBegin, imagesEnd, fsize)) {
53                 throw runtime_error("images section out of bounds");
54         }
55         if ((imagesEnd - imagesBegin) % sizeof(Image) != 0) {
56                 throw runtime_error("bogus images section end");
57         }
58         if (!CheckSection(objectsBegin, objectsEnd, fsize)) {
59                 throw runtime_error("objects section out of bounds");
60         }
61         if (!CheckSection(arraysBegin, arraysEnd, fsize)) {
62                 throw runtime_error("arrays section out of bounds");
63         }
64 }
65
66 bool ObjectFileHeader::CheckSection(
67                 unsigned int begin,
68                 unsigned int end,
69                 unsigned int fsize) const {
70         return begin >= sizeof(ObjectFileHeader)
71                         && (begin < fsize || begin == end)
72                         && end >= begin
73                         && end <= fsize;
74 }
75
76 Export *ObjectFileHeader::ExportsBegin() {
77         char *data = reinterpret_cast<char *>(this);
78         return reinterpret_cast<Export *>(data + exportsBegin);
79 }
80
81 Export *ObjectFileHeader::ExportsEnd() {
82         char *data = reinterpret_cast<char *>(this);
83         return reinterpret_cast<Export *>(data + exportsEnd);
84 }
85
86 External *ObjectFileHeader::ExternalsBegin() {
87         char *data = reinterpret_cast<char *>(this);
88         return reinterpret_cast<External *>(data + externalsBegin);
89 }
90
91 External *ObjectFileHeader::ExternalsEnd() {
92         char *data = reinterpret_cast<char *>(this);
93         return reinterpret_cast<External *>(data + externalsEnd);
94 }
95
96 Image *ObjectFileHeader::ImagesBegin() {
97         char *data = reinterpret_cast<char *>(this);
98         return reinterpret_cast<Image *>(data + imagesBegin);
99 }
100
101 Image *ObjectFileHeader::ImagesEnd() {
102         char *data = reinterpret_cast<char *>(this);
103         return reinterpret_cast<Image *>(data + imagesEnd);
104 }
105
106 Object *ObjectFileHeader::ObjectsBegin() {
107         char *data = reinterpret_cast<char *>(this);
108         return reinterpret_cast<Object *>(data + objectsBegin);
109 }
110
111 Object *ObjectFileHeader::ObjectsEnd() {
112         char *data = reinterpret_cast<char *>(this);
113         return reinterpret_cast<Object *>(data + objectsEnd);
114 }
115
116 Array *ObjectFileHeader::ArraysBegin() {
117         char *data = reinterpret_cast<char *>(this);
118         return reinterpret_cast<Array *>(data + arraysBegin);
119 }
120
121 Array *ObjectFileHeader::ArraysEnd() {
122         char *data = reinterpret_cast<char *>(this);
123         return reinterpret_cast<Array *>(data + arraysEnd);
124 }
125
126 Script *ObjectFileHeader::ScriptsBegin() {
127         char *data = reinterpret_cast<char *>(this);
128         return reinterpret_cast<Script *>(data + scriptsBegin);
129 }
130
131 Script *ObjectFileHeader::ScriptsEnd() {
132         char *data = reinterpret_cast<char *>(this);
133         return reinterpret_cast<Script *>(data + scriptsEnd);
134 }
135
136
137 char *Object::RawObject() {
138         return reinterpret_cast<char *>(this) + sizeof(Object);
139 }
140
141 Object *Object::Next() {
142         return reinterpret_cast<Object *>(RawObject() + size);
143 }
144
145
146 char *Array::Data() {
147         return reinterpret_cast<char *>(this) + sizeof(Array);
148 }
149
150 Array *Array::Next() {
151         return reinterpret_cast<Array *>(Data() + size);
152 }
153
154 char *Script::Text() {
155         return reinterpret_cast<char *>(this) + sizeof(Script);
156 }
157
158 Script *Script::Next() {
159         return reinterpret_cast<Script *>(Text() + size);
160 }
161
162 }