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 }
26 }
27 }
32 }
33 }
54 }
55 }
56 // PROCEDURE (VAR rd: Reader) ReadStore* (OUT x: Store), NEW;
57 // VAR a: Alien; t: Kernel.Type;
58 // len, pos, pos1, id, comment, next, down, downPos, nextTypeId, nextElemId, nextStoreId: INTEGER;
59 // kind: SHORTCHAR; path: TypePath; type: TypeName;
60 // save: ReaderState;
63 }
64 // IF kind = nil THEN
65 // rd.ReadInt(comment); rd.ReadInt(next);
66 // rd.st.end := rd.Pos();
67 // IF (next > 0) OR ((next = 0) & ODD(comment)) THEN rd.st.next := rd.st.end + next ELSE rd.st.next := 0 END;
68 // x := NIL
71 }
72 // ELSIF kind = link THEN
73 // rd.ReadInt(id); rd.ReadInt(comment); rd.ReadInt(next);
74 // rd.st.end := rd.Pos();
75 // IF (next > 0) OR ((next = 0) & ODD(comment)) THEN rd.st.next := rd.st.end + next ELSE rd.st.next := 0 END;
76 // x := ThisStore(rd.eDict, id)
79 }
80 // ELSIF kind = newlink THEN
81 // rd.ReadInt(id); rd.ReadInt(comment); rd.ReadInt(next);
82 // rd.st.end := rd.Pos();
83 // IF (next > 0) OR ((next = 0) & ODD(comment)) THEN rd.st.next := rd.st.end + next ELSE rd.st.next := 0 END;
84 // x := ThisStore(rd.sDict, id)
101 }
105 }
108 // FIXME: insert whole bunch of checks here
109 // ASSERT(len >= 0, 101);
110 // IF next # 0 THEN
111 // ASSERT(rd.st.next > pos1, 102);
112 // IF down # 0 THEN
113 // ASSERT(downPos < rd.st.next, 103)
114 // END
115 // END;
116 // IF down # 0 THEN
117 // ASSERT(downPos > pos1, 104);
118 // ASSERT(downPos < rd.st.end, 105)
119 // END;
123 // x := NewStore(t); x.isElem := kind = elem
125 // rd.cause := thisTypeRes; AlienTypeReport(rd.cause, type);
126 // x := NIL
127 }
132 // rd.SetPos(pos);
133 // ASSERT(rd.cause # 0, 107);
138 // join(d_store, alien)
140 }
145 }
147 // rd.nextTypeId := nextTypeId; rd.nextElemId := nextElemId; rd.nextStoreId := nextStoreId;
150 // ASSERT(rd.Pos() = rd.st.end, 108);
151 // rd.cause := 0; rd.cancelled := FALSE; rd.readAlien := TRUE
153 }
156 }
157 // t := ThisType(type);
158 // IF t # NIL THEN
159 // x := NewStore(t); x.isElem := kind = elem
160 // ELSE
161 // rd.cause := thisTypeRes; AlienTypeReport(rd.cause, type);
162 // x := NIL
163 // END;
164 // IF x # NIL THEN
165 // IF SamePath(t, path) THEN
166 // IF kind = elem THEN
167 // x.id := id; AddStore(rd.eDict, rd.eHead, x)
168 // ELSE
169 // x.id := id; AddStore(rd.sDict, rd.sHead, x)
170 // END;
171 // save := rd.st; rd.cause := 0; rd.cancelled := FALSE;
172 // x.Internalize(rd);
173 // rd.st := save;
174 // IF rd.cause # 0 THEN x := NIL
175 // ELSIF (rd.Pos() # rd.st.end) OR rd.rider.eof THEN
176 // rd.cause := inconsistentVersion; AlienReport(rd.cause);
177 // x := NIL
178 // END
179 // ELSE
180 // rd.cause := inconsistentType; AlienTypeReport(rd.cause, type);
181 // x := NIL
182 // END
183 // END;
184 //
185 // IF x # NIL THEN
186 // IF rd.noDomain THEN
187 // rd.store := x;
188 // rd.noDomain := FALSE
189 // ELSE
190 // Join(rd.store, x)
191 // END
192 // ELSE (* x is an alien *)
193 // rd.SetPos(pos);
194 // ASSERT(rd.cause # 0, 107);
195 // NEW(a); a.path := path; a.cause := rd.cause; a.file := rd.rider.Base();
196 // IF rd.noDomain THEN
197 // rd.store := a;
198 // rd.noDomain := FALSE
199 // ELSE
200 // Join(rd.store, a)
201 // END;
202 // IF kind = elem THEN
203 // a.id := id; AddStore(rd.eDict, rd.eHead, a)
204 // ELSE
205 // a.id := id; AddStore(rd.sDict, rd.sHead, a)
206 // END;
207 // save := rd.st;
208 // rd.nextTypeId := nextTypeId; rd.nextElemId := nextElemId; rd.nextStoreId := nextStoreId;
209 // InternalizeAlien(rd, a.comps, downPos, pos, len);
210 // rd.st := save;
211 // x := a;
212 // ASSERT(rd.Pos() = rd.st.end, 108);
213 // rd.cause := 0; rd.cancelled := FALSE; rd.readAlien := TRUE
214 // END
233 }
234 }
235 }
238 TypePath path;
240 SHORTCHAR *buf = new SHORTCHAR[64]; // TypeName has a maximum of length 64 (including terminator).
246 // IF path[i] # elemTName THEN INC(i) END;
248 }
259 }
263 // IF path[i] # elemTName THEN INC(i) END
265 }
268 }
270 }
277 }
279 }