X-Git-Url: http://deadsoftware.ru/gitweb?a=blobdiff_plain;f=textmodel.cc;h=6ecd89e7ec8718ef0d22d032c4ace512647f6ef8;hb=f029b8c2eb3221fff98ee1e9ce0fbf8ef9f8d5d2;hp=bc76a32798a9feff7848e7014bc6ca5ece906244;hpb=9b0fce2b8ea23e4eb23485421e1d80a774c912b3;p=odcread.git diff --git a/textmodel.cc b/textmodel.cc index bc76a32..6ecd89e 100644 --- a/textmodel.cc +++ b/textmodel.cc @@ -2,6 +2,7 @@ #include #include +#include namespace odc { @@ -59,9 +60,11 @@ void StdTextModel::internalize(Reader &reader) { if (reader.isCancelled()) return; std::vector dict; + std::vector pieces; INTEGER len = reader.readInt(); BYTE ano = reader.readByte(); std::cout << "len " << len << " ano " << (int)ano << std::endl; + int skip = 0; while (ano != -1) { if (ano == dict.size()) { Store *attr = reader.readStore(); // readAttributes(); Stores.Join(t, attr) @@ -70,25 +73,34 @@ void StdTextModel::internalize(Reader &reader) { INTEGER pieceLen = reader.readInt(); if (pieceLen > 0) { // shortchar piece std::cout << "Found SChar piece" << std::endl; + pieces.push_back(new ShortPiece(pieceLen)); // NEW(sp); sp.len := len; sp.attr := attr; // sp.file := rd.rider.Base(); sp.org := org; un := sp; // INC(org, len) -- increment org by len ? } else if (pieceLen < 0) { // longchar piece std::cout << "Found LChar piece" << std::endl; + assert(pieceLen % 2 == 0); + pieces.push_back(new LongPiece(pieceLen / 2)); // len := -len; ASSERT(~ODD(len), 100); // NEW(lp); lp.len := len DIV 2; lp.attr := attr; // lp.file := rd.rider.Base(); lp.org := org; un := lp; // INC(org, len) -- increment org by len ? } else { // embedded view + std::cout << "Found View piece" << std::endl; reader.readInt(); reader.readInt(); Store *view = reader.readStore(); // fixme: save somewhere // NEW(v); v.len := 1; v.attr := attr; // rd.ReadInt(v.w); rd.ReadInt(v.h); Views.ReadView(rd, v.view); // v.view.InitContext(NewContext(v, t)); // un := v; INC(org) -- increment org by one?? WTH? + pieces.push_back(new ViewPiece()); + ++skip; } ano = reader.readByte(); } + for (int i = 0; i < pieces.size(); ++i) { + pieces[i]->read(reader); + } // rd.SetPos(org); } // PROCEDURE (t: StdModel) Internalize (VAR rd: Stores.Reader); @@ -135,4 +147,29 @@ void StdTextModel::internalize(Reader &reader) { // END Internalize; // +TextPiece::TextPiece(size_t len): d_len(len) {} + +LongPiece::LongPiece(size_t len): TextPiece(len) {} + +void LongPiece::read(Reader &reader) { + CHAR *buf = new CHAR[d_len]; + reader.readLChar(buf, d_len); + delete buf; +} + +ShortPiece::ShortPiece(size_t len): TextPiece(len) {} + +void ShortPiece::read(Reader &reader) { + SHORTCHAR *buf = new SHORTCHAR[d_len + 1]; + reader.readSChar(buf, d_len); + buf[d_len] = 0; + delete buf; +} + +ViewPiece::ViewPiece(): TextPiece(0) {} + +void ViewPiece::read(Reader &reader) { + reader.readByte(); +} + } // namespace odc