diff --git a/reader.cc b/reader.cc
index 051ddf555539dbc7440b12694dbe4f2ad7f62383..3ccfb7144bae80159e5172977dd3e9f475a55de9 100644 (file)
--- a/reader.cc
+++ b/reader.cc
return out;
}
+BYTE Reader::readByte() {
+ BYTE out;
+ d_rider.read((char*)&out, 1);
+ return out;
+}
+
INTEGER Reader::readInt() {
char *buf = new char[4];
d_rider.read(buf, 4);
}
}
+INTEGER Reader::readVersion(INTEGER min, INTEGER max) {
+ INTEGER version = readByte();
+ //if (version < min || version > max) {
+ // rd.TurnIntoAlien(alienVersion)
+ //}
+ return version;
+}
+
Store* Reader::readStore() {
SHORTCHAR kind = readSChar();
if (kind == Store::NIL) {
Store *Reader::readStoreOrElemStore(bool isElem) {
INTEGER id = isElem ? d_elemList.size() : d_storeList.size();
- SHORTCHAR** path = newTypePath();
- readPath(path);
- for (int i = 0; path[i] != 0; ++i) {
- std::cout << path[i] << std::endl;
- }
- SHORTCHAR* type = path[0];
+ TypePath path = readPath();
+ std::cout << path.toString() << std::endl;
+ const std::string &type = path[0];
INTEGER comment = readInt();
std::streampos pos1 = d_rider.tellg();
std::streamoff next = readInt();
// ASSERT(downPos < rd.st.end, 105)
// END;
- void *t = 0; // FIXME type lookup here
+ const TypeProxyBase *t = TypeRegister::getInstance().get(type); // FIXME type lookup here
+ Store *x = 0;
if (t != 0) {
+ x = t->newInstance(id);
+ x->internalize(*this);
// x := NewStore(t); x.isElem := kind = elem
} else {
// rd.cause := thisTypeRes; AlienTypeReport(rd.cause, type);
// x := NIL
}
- Store *x = 0;
if (x != 0) { // IF READING SUCCEEDS, INSERT MORE CHECKS HERE
} else {
// rd.SetPos(pos);
@@ -237,18 +250,32 @@ void Reader::internalizeAlien(Alien *alien, std::streampos down, std::streampos
}
}
-void Reader::readPath(SHORTCHAR **path) {
+std::string &Reader::fixTypeName(std::string &name) {
+ size_t pos = name.size() - 4;
+ if (pos > 0 && name.substr(pos, 4).compare("Desc") == 0) {
+ return name.replace(pos, 4, "^");
+ }
+ return name;
+}
+
+TypePath Reader::readPath() {
+ TypePath path;
SHORTCHAR kind = readSChar();
+ SHORTCHAR *buf = new SHORTCHAR[64]; // TypeName has a maximum of length 64 (including terminator).
int i;
for (i = 0; kind == Store::NEWEXT; ++i) {
- readSString(path[i]);
+ readSString(buf);
+ std::string name(buf);
+ path.push_back(fixTypeName(name));
addPathComponent(i == 0, path[i]);
// IF path[i] # elemTName THEN INC(i) END;
kind = readSChar();
}
if (kind == Store::NEWBASE) {
- readSString(path[i]);
+ readSString(buf);
+ std::string name(buf);
+ path.push_back(fixTypeName(name));
addPathComponent(i == 0, path[i]);
++i;
} else if (kind == Store::OLDTYPE) {
d_typeList[d_typeList.size() - 1]->baseId = id;
}
while (id != -1) {
- path[i] = d_typeList[id]->name;
+ path.push_back(d_typeList[id]->name);
id = d_typeList[id]->baseId;
// IF path[i] # elemTName THEN INC(i) END
++i;
} else {
throw 100;
}
- path[i] = 0;
+ return path;
}
-void Reader::addPathComponent(bool first, SHORTCHAR *typeName) {
+void Reader::addPathComponent(bool first, const std::string &typeName) {
int next = d_typeList.size();
int curr = next - 1;
if (!first) {