X-Git-Url: https://deadsoftware.ru/gitweb?p=odcread.git;a=blobdiff_plain;f=textmodel.cc;h=81ac03dfe725872d202f4efec16d8243b8802a27;hp=bc76a32798a9feff7848e7014bc6ca5ece906244;hb=bfa2551119497089b987c2bce3e2f512f9e2130f;hpb=9b0fce2b8ea23e4eb23485421e1d80a774c912b3 diff --git a/textmodel.cc b/textmodel.cc index bc76a32..81ac03d 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; @@ -61,7 +65,8 @@ void StdTextModel::internalize(Reader &reader) { std::vector dict; INTEGER len = reader.readInt(); BYTE ano = reader.readByte(); - std::cout << "len " << len << " ano " << (int)ano << std::endl; + //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) @@ -69,26 +74,35 @@ void StdTextModel::internalize(Reader &reader) { } INTEGER pieceLen = reader.readInt(); if (pieceLen > 0) { // shortchar piece - std::cout << "Found SChar piece" << std::endl; + //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; + //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 - reader.readInt(); reader.readInt(); - Store *view = reader.readStore(); // fixme: save somewhere + //std::cout << "Found View piece" << std::endl; + reader.readInt(); reader.readInt(); // view width + height: ignore + Store *view = reader.readStore(); // 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,62 @@ 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) {} + +LongPiece::~LongPiece() { + delete d_buf; +} + +void LongPiece::read(Reader &reader) { + d_buf = new CHAR[d_len]; + reader.readLChar(d_buf, d_len); +} + +std::string LongPiece::toString() { + return std::string("LongPiece(FIXME)");// + std::wstring((wchar_t*)d_buf) + std::string(")"); +} + +ShortPiece::ShortPiece(size_t len): TextPiece(len) {} + +ShortPiece::~ShortPiece() { + delete d_buf; +} + +void ShortPiece::read(Reader &reader) { +// static char piece[] = "pieceA"; + d_buf = new SHORTCHAR[d_len + 1]; + reader.readSChar(d_buf, d_len); + d_buf[d_len] = 0; +// std::cout.write(buf, d_len); +// 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(") + std::string(d_buf) + std::string(")"); +} + +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