92ff862ade0662c199002db0ecf1b25106947596
9 const std::string
TextModel::TYPENAME("TextModels.Model^");
10 const TypeProxy
<TextModel
> TextModel::PROXY
;
12 TextModel::TextModel(INTEGER id
) : ContainerModel(id
) {}
14 const std::string
&TextModel::getType() {
18 const std::string
*TextModel::getSuper() {
19 return &ContainerModel::getType();
22 const std::string
&TextModel::getTypeName() const {
26 void TextModel::internalize(Reader
&reader
) {
27 ContainerModel::internalize(reader
);
28 if (reader
.isCancelled()) return;
29 reader
.readVersion(0, 0);
32 const std::string
StdTextModel::TYPENAME("TextModels.StdModel^");
33 const TypeProxy
<StdTextModel
> StdTextModel::PROXY
;
35 StdTextModel::StdTextModel(INTEGER id
) : TextModel(id
) {}
37 const std::string
&StdTextModel::getType() {
41 const std::string
*StdTextModel::getSuper() {
42 return &TextModel::getType();
45 const std::string
&StdTextModel::getTypeName() const {
50 * This is my current theory of how the StdTextModel storage format works:
52 * byte 1-5: len (length of piece descriptions)
53 * byte 6-5+len: piece descriptions
54 * byte 6+len-end: pieces (length of each defined in piece descriptions)
56 void StdTextModel::internalize(Reader
&reader
) {
57 TextModel::internalize(reader
);
58 if (reader
.isCancelled()) return;
59 reader
.readVersion(0, 1);
60 if (reader
.isCancelled()) return;
62 std::vector
<Store
*> dict
;
63 std::vector
<TextPiece
*> pieces
;
64 INTEGER len
= reader
.readInt();
65 BYTE ano
= reader
.readByte();
66 std::cout
<< "len " << len
<< " ano " << (int)ano
<< std::endl
;
69 if (ano
== dict
.size()) {
70 Store
*attr
= reader
.readStore(); // readAttributes(); Stores.Join(t, attr)
73 INTEGER pieceLen
= reader
.readInt();
74 if (pieceLen
> 0) { // shortchar piece
75 std::cout
<< "Found SChar piece" << std::endl
;
76 pieces
.push_back(new ShortPiece(pieceLen
));
77 // NEW(sp); sp.len := len; sp.attr := attr;
78 // sp.file := rd.rider.Base(); sp.org := org; un := sp;
79 // INC(org, len) -- increment org by len ?
80 } else if (pieceLen
< 0) { // longchar piece
81 std::cout
<< "Found LChar piece" << std::endl
;
82 assert(pieceLen
% 2 == 0);
83 pieces
.push_back(new LongPiece(pieceLen
/ 2));
84 // len := -len; ASSERT(~ODD(len), 100);
85 // NEW(lp); lp.len := len DIV 2; lp.attr := attr;
86 // lp.file := rd.rider.Base(); lp.org := org; un := lp;
87 // INC(org, len) -- increment org by len ?
88 } else { // embedded view
89 reader
.readInt(); reader
.readInt();
90 Store
*view
= reader
.readStore(); // fixme: save somewhere
91 // NEW(v); v.len := 1; v.attr := attr;
92 // rd.ReadInt(v.w); rd.ReadInt(v.h); Views.ReadView(rd, v.view);
93 // v.view.InitContext(NewContext(v, t));
94 // un := v; INC(org) -- increment org by one?? WTH?
95 pieces
.push_back(new ViewPiece());
98 ano
= reader
.readByte();
100 for (int i
= 0; i
< pieces
.size(); ++i
) {
101 pieces
[i
]->read(reader
);
105 // PROCEDURE (t: StdModel) Internalize (VAR rd: Stores.Reader);
106 // VAR u, un: Run; sp: Piece; lp: LPiece; v: ViewRef;
107 // org, len: INTEGER; ano: BYTE; thisVersion: INTEGER;
108 // attr: Attributes; dict: AttrDict;
110 // ASSERT(t.Domain() = NIL, 20); ASSERT(t.len = 0, 21);
111 // t.Internalize^(rd); IF rd.cancelled THEN RETURN END;
112 // rd.ReadVersion(minVersion, maxStdModelVersion, thisVersion);
113 // IF rd.cancelled THEN RETURN END;
115 // dict.len := 0; u := t.trailer;
116 // rd.ReadInt(len); org := rd.Pos() + len;
119 // IF ano = dict.len THEN
120 // ReadAttr(rd, attr); Stores.Join(t, attr);
121 // IF dict.len < dictSize THEN dict.attr[dict.len] := attr; INC(dict.len) END
123 // attr := dict.attr[ano]
126 // IF len > 0 THEN (* piece *)
127 // NEW(sp); sp.len := len; sp.attr := attr;
128 // sp.file := rd.rider.Base(); sp.org := org; un := sp;
130 // ELSIF len < 0 THEN (* longchar piece *)
131 // len := -len; ASSERT(~ODD(len), 100);
132 // NEW(lp); lp.len := len DIV 2; lp.attr := attr;
133 // lp.file := rd.rider.Base(); lp.org := org; un := lp;
135 // ELSE (* len = 0 => embedded view *)
136 // NEW(v); v.len := 1; v.attr := attr;
137 // rd.ReadInt(v.w); rd.ReadInt(v.h); Views.ReadView(rd, v.view);
138 // v.view.InitContext(NewContext(v, t));
141 // INC(t.len, un.len); u.next := un; un.prev := u; u := un;
145 // u.next := t.trailer; t.trailer.prev := u
149 TextPiece::TextPiece(size_t len
): d_len(len
) {}
151 LongPiece::LongPiece(size_t len
): TextPiece(len
) {}
153 void LongPiece::read(Reader
&reader
) {
154 CHAR
*buf
= new CHAR
[d_len
];
155 reader
.readLChar(buf
, d_len
);
159 ShortPiece::ShortPiece(size_t len
): TextPiece(len
) {}
161 void ShortPiece::read(Reader
&reader
) {
162 SHORTCHAR
*buf
= new SHORTCHAR
[d_len
+ 1];
163 reader
.readSChar(buf
, d_len
);
165 std::cout
<< "READING SHORT PIECE" << std::endl
;
166 std::cout
<< std::string(buf
) << std::endl
;
170 ViewPiece::ViewPiece(): TextPiece(0) {}
172 void ViewPiece::read(Reader
&reader
) {