1 #include <reader.h>
2 #include <alien.h>
4 #include <string>
8 Reader::Reader(std::istream &rider): d_rider(rider), d_cancelled(false), d_readAlien(false), d_typeList(),
12 SHORTCHAR out;
15 }
18 BYTE out;
21 }
32 }
33 }
38 }
39 }
43 //if (version < min || version > max) {
44 // rd.TurnIntoAlien(alienVersion)
45 //}
47 }
68 }
69 }
70 // PROCEDURE (VAR rd: Reader) ReadStore* (OUT x: Store), NEW;
71 // VAR a: Alien; t: Kernel.Type;
72 // len, pos, pos1, id, comment, next, down, downPos, nextTypeId, nextElemId, nextStoreId: INTEGER;
73 // kind: SHORTCHAR; path: TypePath; type: TypeName;
74 // save: ReaderState;
77 }
78 // IF kind = nil THEN
79 // rd.ReadInt(comment); rd.ReadInt(next);
80 // rd.st.end := rd.Pos();
81 // IF (next > 0) OR ((next = 0) & ODD(comment)) THEN rd.st.next := rd.st.end + next ELSE rd.st.next := 0 END;
82 // x := NIL
85 }
86 // ELSIF kind = link THEN
87 // rd.ReadInt(id); rd.ReadInt(comment); rd.ReadInt(next);
88 // rd.st.end := rd.Pos();
89 // IF (next > 0) OR ((next = 0) & ODD(comment)) THEN rd.st.next := rd.st.end + next ELSE rd.st.next := 0 END;
90 // x := ThisStore(rd.eDict, id)
93 }
94 // ELSIF kind = newlink THEN
95 // rd.ReadInt(id); rd.ReadInt(comment); rd.ReadInt(next);
96 // rd.st.end := rd.Pos();
97 // IF (next > 0) OR ((next = 0) & ODD(comment)) THEN rd.st.next := rd.st.end + next ELSE rd.st.next := 0 END;
98 // x := ThisStore(rd.sDict, id)
115 }
119 }
122 // FIXME: insert whole bunch of checks here
123 // ASSERT(len >= 0, 101);
124 // IF next # 0 THEN
125 // ASSERT(rd.st.next > pos1, 102);
126 // IF down # 0 THEN
127 // ASSERT(downPos < rd.st.next, 103)
128 // END
129 // END;
130 // IF down # 0 THEN
131 // ASSERT(downPos > pos1, 104);
132 // ASSERT(downPos < rd.st.end, 105)
133 // END;
140 // x := NewStore(t); x.isElem := kind = elem
142 // rd.cause := thisTypeRes; AlienTypeReport(rd.cause, type);
143 // x := NIL
144 }
148 // rd.SetPos(pos);
149 // ASSERT(rd.cause # 0, 107);
154 // join(d_store, alien)
156 }
161 }
163 // rd.nextTypeId := nextTypeId; rd.nextElemId := nextElemId; rd.nextStoreId := nextStoreId;
166 // ASSERT(rd.Pos() = rd.st.end, 108);
167 // rd.cause := 0; rd.cancelled := FALSE; rd.readAlien := TRUE
169 }
172 }
173 // t := ThisType(type);
174 // IF t # NIL THEN
175 // x := NewStore(t); x.isElem := kind = elem
176 // ELSE
177 // rd.cause := thisTypeRes; AlienTypeReport(rd.cause, type);
178 // x := NIL
179 // END;
180 // IF x # NIL THEN
181 // IF SamePath(t, path) THEN
182 // IF kind = elem THEN
183 // x.id := id; AddStore(rd.eDict, rd.eHead, x)
184 // ELSE
185 // x.id := id; AddStore(rd.sDict, rd.sHead, x)
186 // END;
187 // save := rd.st; rd.cause := 0; rd.cancelled := FALSE;
188 // x.Internalize(rd);
189 // rd.st := save;
190 // IF rd.cause # 0 THEN x := NIL
191 // ELSIF (rd.Pos() # rd.st.end) OR rd.rider.eof THEN
192 // rd.cause := inconsistentVersion; AlienReport(rd.cause);
193 // x := NIL
194 // END
195 // ELSE
196 // rd.cause := inconsistentType; AlienTypeReport(rd.cause, type);
197 // x := NIL
198 // END
199 // END;
200 //
201 // IF x # NIL THEN
202 // IF rd.noDomain THEN
203 // rd.store := x;
204 // rd.noDomain := FALSE
205 // ELSE
206 // Join(rd.store, x)
207 // END
208 // ELSE (* x is an alien *)
209 // rd.SetPos(pos);
210 // ASSERT(rd.cause # 0, 107);
211 // NEW(a); a.path := path; a.cause := rd.cause; a.file := rd.rider.Base();
212 // IF rd.noDomain THEN
213 // rd.store := a;
214 // rd.noDomain := FALSE
215 // ELSE
216 // Join(rd.store, a)
217 // END;
218 // IF kind = elem THEN
219 // a.id := id; AddStore(rd.eDict, rd.eHead, a)
220 // ELSE
221 // a.id := id; AddStore(rd.sDict, rd.sHead, a)
222 // END;
223 // save := rd.st;
224 // rd.nextTypeId := nextTypeId; rd.nextElemId := nextElemId; rd.nextStoreId := nextStoreId;
225 // InternalizeAlien(rd, a.comps, downPos, pos, len);
226 // rd.st := save;
227 // x := a;
228 // ASSERT(rd.Pos() = rd.st.end, 108);
229 // rd.cause := 0; rd.cancelled := FALSE; rd.readAlien := TRUE
230 // END
249 }
250 }
251 }
257 }
259 }
262 TypePath path;
264 SHORTCHAR *buf = new SHORTCHAR[64]; // TypeName has a maximum of length 64 (including terminator).
271 // IF path[i] # elemTName THEN INC(i) END;
273 }
285 }
289 // IF path[i] # elemTName THEN INC(i) END
291 }
294 }
296 }
303 }
305 }