Stores гарантирует, что можно многократно сохранять один и тот же Store, а в выходной файл попадет только 1 экземпляр данных; при это при многократном чтении будет возвращаться один и тот же указатель. Но для этого нужно, чтобы MyKey был расширением Stores.Store. Иначе вам придется самостоятельно обеспечивать "недублирование" - т.е. по сути делать тот же Stores, но только для своего списка. Я бы сделал на базе Stores вот так:
Код:
TYPE MyKey = POINTER TO RECORD (Stores.Store) ... END;
PROCEDURE WriteList (t: Turn; w: Stores.Writer);
BEGIN
WHILE t # NIL DO w.WriteStore(t); t := t.next END;
w.WriteStore(NIL)
END WriteList;
PROCEDURE WriteKeys(k: MyKey; wr: Stores.Writer);
BEGIN
WHILE k # NIL DO wr.WriteStore(k); k := k.next END;
wr.WriteStore(NIL)
END WriteKeys;
PROCEDURE (t: Turn) Externalize (VAR w: Stores.Writer);
VAR auxiliaryKeys: MyKey;
BEGIN
w.WriteString (t.name); WriteKeys(t.firstKey, w)
END Externalize;
PROCEDURE (k: MyKey) Externalize (VAR wr: Stores.Writer);
BEGIN
w.WriteByte (auxiliaryKeys.day);
w.WriteByte (auxiliaryKeys.month);
w.WriteByte (auxiliaryKeys.year);
w.WriteSReal (auxiliaryKeys.price)
END Externalize;
Тогда чтение можно организовать по такой схеме:
Код:
REPEAT rd.ReadStore(st);
IF st # NIL THEN ASSERT(st IS Turn, 20);
(* append store to the end of list *)
END
UNTIL st = NIL