X-Git-Url: http://deadsoftware.ru/gitweb?a=blobdiff_plain;f=reader.cc;h=ffca53deacab5f2a2cfa280b6107ee0e5b23371a;hb=4016b9a7f02803e28582abb02cd410dcb5021fe6;hp=587c391857cfb84416a953199cf6a0945c311c6e;hpb=9199c6da801c1555dadb23b230b400e3f1364abc;p=odcread.git diff --git a/reader.cc b/reader.cc index 587c391..ffca53d 100644 --- a/reader.cc +++ b/reader.cc @@ -24,16 +24,20 @@ CHAR Reader::readLChar() { char *bufPtr = (char *)&buf; d_rider.read(bufPtr, 2); if (isLittleEndian()) { - return buf; + return buf - 0x8000; } else { CHAR out; char *outPtr = (char *)&out; outPtr[0] = bufPtr[1]; outPtr[1] = bufPtr[0]; - return out; + return out - 0x8000; } } void Reader::readLChar(CHAR *buf, size_t len) { + for (int i = 0; i < len; ++i) { + buf[i] = readLChar(); + } + /* char *bufPtr = (char *)buf; int len2 = len * 2; d_rider.read(bufPtr, len2); @@ -45,6 +49,7 @@ void Reader::readLChar(CHAR *buf, size_t len) { bufPtr[i + 1] = tmp; } } + */ } BYTE Reader::readByte() { @@ -53,6 +58,20 @@ BYTE Reader::readByte() { return out; } +SHORTINT Reader::readSInt() { + SHORTINT buf; + char *bufPtr = (char*)&buf; + d_rider.read(bufPtr, 2); + if (isLittleEndian()) { + return buf; + } else { + SHORTINT out; + char *outPtr = (char *)&out; + outPtr[0] = bufPtr[1]; outPtr[1] = bufPtr[0]; + return out; + } +} + INTEGER Reader::readInt() { INTEGER buf; char *bufPtr = (char*)&buf; @@ -119,6 +138,7 @@ Store* Reader::readStore() { // len, pos, pos1, id, comment, next, down, downPos, nextTypeId, nextElemId, nextStoreId: INTEGER; // kind: SHORTCHAR; path: TypePath; type: TypeName; // save: ReaderState; + Store *Reader::readNilStore() { INTEGER comment = readInt(); std::streamoff next = readInt(); @@ -135,16 +155,18 @@ Store *Reader::readNilStore() { // rd.st.end := rd.Pos(); // IF (next > 0) OR ((next = 0) & ODD(comment)) THEN rd.st.next := rd.st.end + next ELSE rd.st.next := 0 END; // x := NIL + Store *Reader::readLinkStore() { - return 0; + throw "Reader::readLinkStore() not implemented"; } // ELSIF kind = link THEN // rd.ReadInt(id); rd.ReadInt(comment); rd.ReadInt(next); // rd.st.end := rd.Pos(); // IF (next > 0) OR ((next = 0) & ODD(comment)) THEN rd.st.next := rd.st.end + next ELSE rd.st.next := 0 END; // x := ThisStore(rd.eDict, id) + Store *Reader::readNewLinkStore() { - return 0; + throw "Reader::readNewLinkStore() not implemented"; } // ELSIF kind = newlink THEN // rd.ReadInt(id); rd.ReadInt(comment); rd.ReadInt(next); @@ -218,7 +240,6 @@ Store *Reader::readStoreOrElemStore(bool isElem) { d_store = x; } else { // join(d_store, x) - //std::cout << "Man, should have written join(.,.)" << std::endl; } if (isElem) { d_elemList.push_back(x); @@ -233,7 +254,6 @@ Store *Reader::readStoreOrElemStore(bool isElem) { d_store = alien; } else { // join(d_store, alien) - //std::cout << "Man, should have written join(.,.)" << std::endl; } if (isElem) { d_elemList.push_back(alien); @@ -262,14 +282,12 @@ void Reader::internalizeAlien(Alien *alien, std::streampos down, std::streampos std::streampos next = down != 0 ? down : end; while (d_rider.tellg() < end) { if (d_rider.tellg() < next) { // for some reason, this means its a piece (unstructured) - //std::cout << "Alien Piece" << std::endl; size_t len = next - d_rider.tellg(); char *buf = new char[len]; d_rider.read(buf, len); AlienComponent *comp = new AlienPiece(buf, len); alien->getComponents().push_back(comp); } else { // that means we've got a store - //std::cout << "Alien Store" << std::endl; d_rider.seekg(next); AlienComponent *comp = new AlienPart(readStore()); alien->getComponents().push_back(comp);