X-Git-Url: http://deadsoftware.ru/gitweb?a=blobdiff_plain;f=textmodel.cc;h=c02620c36c9e0dd5c97b31c493f3ebddb827eb0a;hb=2466c23751f131a07432df964658c2de90315e7b;hp=6ecd89e7ec8718ef0d22d032c4ace512647f6ef8;hpb=f029b8c2eb3221fff98ee1e9ce0fbf8ef9f8d5d2;p=odcread.git diff --git a/textmodel.cc b/textmodel.cc index 6ecd89e..c02620c 100644 --- a/textmodel.cc +++ b/textmodel.cc @@ -4,23 +4,18 @@ #include #include +//#include +//#include + namespace odc { const std::string TextModel::TYPENAME("TextModels.Model^"); -const TypeProxy TextModel::PROXY; +const TypeProxy TextModel::PROXY; TextModel::TextModel(INTEGER id) : ContainerModel(id) {} -const std::string &TextModel::getType() { - return TYPENAME; -} - -const std::string *TextModel::getSuper() { - return &ContainerModel::getType(); -} - const std::string &TextModel::getTypeName() const { - return getType(); + return TYPENAME; } void TextModel::internalize(Reader &reader) { @@ -30,20 +25,12 @@ void TextModel::internalize(Reader &reader) { } const std::string StdTextModel::TYPENAME("TextModels.StdModel^"); -const TypeProxy StdTextModel::PROXY; - -StdTextModel::StdTextModel(INTEGER id) : TextModel(id) {} - -const std::string &StdTextModel::getType() { - return TYPENAME; -} +const TypeProxy StdTextModel::PROXY; -const std::string *StdTextModel::getSuper() { - return &TextModel::getType(); -} +StdTextModel::StdTextModel(INTEGER id) : TextModel(id), d_pieces() {} const std::string &StdTextModel::getTypeName() const { - return getType(); + return TYPENAME; } /* @@ -60,10 +47,9 @@ 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; + //std::cout << "len " << len << " ano " << (int)ano << std::endl; int skip = 0; while (ano != -1) { if (ano == dict.size()) { @@ -72,34 +58,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)); + //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); - pieces.push_back(new LongPiece(pieceLen / 2)); + 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 + //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? - pieces.push_back(new ViewPiece()); + d_pieces.push_back(new ViewPiece(view)); ++skip; } ano = reader.readByte(); } - for (int i = 0; i < pieces.size(); ++i) { - pieces[i]->read(reader); + for (int i = 0; i < d_pieces.size(); ++i) { + d_pieces[i]->read(reader); } // rd.SetPos(org); } @@ -147,29 +133,94 @@ 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 + "}"; +} + +void StdTextModel::accept(Visitor &visitor) const { + visitor.partStart(); + for (int i = 0; i < d_pieces.size(); ++i) { + d_pieces[i]->accept(visitor); + } + visitor.partEnd(); +} + 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) { - CHAR *buf = new CHAR[d_len]; - reader.readLChar(buf, d_len); - delete buf; + d_buf = new CHAR[d_len]; + reader.readLChar(d_buf, d_len); +} + +std::string LongPiece::toString() const { + return std::string("LongPiece(FIXME)");// + std::wstring((wchar_t*)d_buf) + std::string(")"); +} + +std::wstring LongPiece::getText() const { + return std::wstring((wchar_t*)d_buf); +} + +void LongPiece::accept(Visitor &visitor) const { + visitor.textLongPiece(this); } ShortPiece::ShortPiece(size_t len): TextPiece(len) {} +ShortPiece::~ShortPiece() { + delete d_buf; +} + void ShortPiece::read(Reader &reader) { - SHORTCHAR *buf = new SHORTCHAR[d_len + 1]; - reader.readSChar(buf, d_len); - buf[d_len] = 0; - delete buf; +// 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() const { + return std::string("ShortPiece(") + std::string(d_buf) + std::string(")"); +} + +std::string ShortPiece::getText() const { + std::string str(d_buf); + for (std::string::iterator it = str.begin(); it < str.end(); ++it) { + if (*it == '\r') *it = '\n'; + } + return str; +} + +void ShortPiece::accept(Visitor &visitor) const { + visitor.textShortPiece(this); } -ViewPiece::ViewPiece(): TextPiece(0) {} +ViewPiece::ViewPiece(Store *view): TextPiece(0), d_view(view) {} void ViewPiece::read(Reader &reader) { reader.readByte(); } +std::string ViewPiece::toString() const { + return std::string("ViewPiece { ") + d_view->toString() + " }"; +} + +void ViewPiece::accept(Visitor &visitor) const { + return d_view->accept(visitor); +} + } // namespace odc