X-Git-Url: http://deadsoftware.ru/gitweb?a=blobdiff_plain;f=textmodel.cc;h=2028c2e5621c2c733f0254728740272d0b896f36;hb=98bcd76b4c284676f55d754879dee9bda1898924;hp=bc76a32798a9feff7848e7014bc6ca5ece906244;hpb=9b0fce2b8ea23e4eb23485421e1d80a774c912b3;p=odcread.git diff --git a/textmodel.cc b/textmodel.cc index bc76a32..2028c2e 100644 --- a/textmodel.cc +++ b/textmodel.cc @@ -2,6 +2,10 @@ #include #include +#include + +//#include +//#include namespace odc { @@ -31,7 +35,7 @@ void TextModel::internalize(Reader &reader) { const std::string StdTextModel::TYPENAME("TextModels.StdModel^"); const TypeProxy StdTextModel::PROXY; -StdTextModel::StdTextModel(INTEGER id) : TextModel(id) {} +StdTextModel::StdTextModel(INTEGER id) : TextModel(id), d_pieces() {} const std::string &StdTextModel::getType() { return TYPENAME; @@ -62,6 +66,7 @@ void StdTextModel::internalize(Reader &reader) { 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 +75,34 @@ void StdTextModel::internalize(Reader &reader) { INTEGER pieceLen = reader.readInt(); if (pieceLen > 0) { // shortchar piece std::cout << "Found SChar piece" << std::endl; + d_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); + d_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? + d_pieces.push_back(new ViewPiece(view)); + ++skip; } ano = reader.readByte(); } + for (int i = 0; i < d_pieces.size(); ++i) { + d_pieces[i]->read(reader); + } // rd.SetPos(org); } // PROCEDURE (t: StdModel) Internalize (VAR rd: Stores.Reader); @@ -135,4 +149,54 @@ void StdTextModel::internalize(Reader &reader) { // END Internalize; // +std::string StdTextModel::toString() { + std::string sofar = "StdTextModel { "; + for (int i = 0; i < d_pieces.size(); ++i) { + sofar += d_pieces[i]->toString() + " "; + } + return sofar + "}"; +} + +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; +} + +std::string LongPiece::toString() { + return std::string("LongPiece"); +} + +ShortPiece::ShortPiece(size_t len): TextPiece(len) {} + +void ShortPiece::read(Reader &reader) { +// static char piece[] = "pieceA"; + SHORTCHAR *buf = new SHORTCHAR[d_len + 1]; + reader.readSChar(buf, d_len); + buf[d_len] = 0; +// std::ofstream ofs(piece, std::ios::out); +// ofs.write(buf, d_len); +// ofs.close(); +// ++piece[5]; + delete buf; +} + +std::string ShortPiece::toString() { + return std::string("ShortPiece"); +} + +ViewPiece::ViewPiece(Store *view): TextPiece(0), d_view(view) {} + +void ViewPiece::read(Reader &reader) { + reader.readByte(); +} + +std::string ViewPiece::toString() { + return std::string("ViewPiece { ") + d_view->toString() + " }"; +} + } // namespace odc