diff --git a/reader.cc b/reader.cc
index 581917197f2c9bdbcbcbd3e6dc130193784e1263..08bd498f174bbe7167562eff91fb8cd7fae2bd4d 100644 (file)
--- a/reader.cc
+++ b/reader.cc
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();
@@ -237,75 +234,42 @@ void Reader::internalizeAlien(Alien *alien, std::streampos down, std::streampos
}
}
-void Reader::readPath(SHORTCHAR **path) {
+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) {
- std::cout << i << std::endl;
- readSString(path[i]);
+ readSString(buf);
+ path.push_back(std::string(buf));
addPathComponent(i == 0, path[i]);
// IF path[i] # elemTName THEN INC(i) END;
kind = readSChar();
}
if (kind == Store::NEWBASE) {
- std::cout << i << std::endl;
- readSString(path[i]);
+ readSString(buf);
+ path.push_back(std::string(buf));
addPathComponent(i == 0, path[i]);
++i;
} else if (kind == Store::OLDTYPE) {
int id = readInt();
- d_typeList[d_typeList.size() - 1]->baseId = id;
+ if (i > 0) {
+ d_typeList[d_typeList.size() - 1]->baseId = id;
+ }
while (id != -1) {
- std::cout << "old " << i << "id " << id << d_typeList[id]->name << std::endl;
- 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;
}
-// REPEAT
-// GetThisType(rd.tDict, id, path[i]); id := ThisBaseId(rd.tDict, id);
-// IF path[i] # elemTName THEN INC(i) END
-// UNTIL id = -1
} else {
throw 100;
}
- std::cout << "term " << i << std::endl;
- path[i] = 0;
+ return path;
}
-// PROCEDURE ReadPath (VAR rd: Reader; VAR path: TypePath);
-// VAR h: TypeDict; id, extId: INTEGER; i: INTEGER; kind: SHORTCHAR;
-//
-// PROCEDURE AddPathComp (VAR rd: Reader);
-// BEGIN
-// IF h # NIL THEN AddBaseId(h, extId, rd.nextTypeId) END;
-// AddType(rd.tDict, rd.tHead, rd.nextTypeId, path[i]);
-// h := rd.tHead; extId := rd.nextTypeId
-// END AddPathComp;
-//
-// BEGIN
-// h := NIL; i := 0; rd.ReadSChar(kind);
-// WHILE kind = newExt DO
-// rd.ReadXString(path[i]);
-// AddPathComp(rd); INC(rd.nextTypeId);
-// IF path[i] # elemTName THEN INC(i) END;
-// rd.ReadSChar(kind)
-// END;
-// IF kind = newBase THEN
-// rd.ReadXString(path[i]);
-// AddPathComp(rd); INC(rd.nextTypeId); INC(i)
-// ELSE
-// ASSERT(kind = oldType, 100);
-// rd.ReadInt(id);
-// IF h # NIL THEN AddBaseId(h, extId, id) END;
-// REPEAT
-// GetThisType(rd.tDict, id, path[i]); id := ThisBaseId(rd.tDict, id);
-// IF path[i] # elemTName THEN INC(i) END
-// UNTIL id = -1
-// END;
-// path[i] := ""
-// END ReadPath;
-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) {