(*============================================================================*) (* convert older file formats *) (*============================================================================*) (* ConvertFormat (complete source given here) replaces old properties by new ones when reading in FF[1] or FF[2] files. Variable CurrentFormat indicates which old file format was determined. *) PROCEDURE ConvertFormat (root: NODE); VAR node : NODE; prop : PROPERTY; spec : INTEGER; str4 : String4; labels : LIST; point : POINT; hasGoodMove : BOOLEAN; hasBadMove : BOOLEAN; BEGIN TRAVERSE(root, preOrder); WHILE NEXTNODE(node) DO hasGoodMove := FALSE; hasBadMove := FALSE; FORPROP(node); WHILE NEXTPROP(prop) DO CASE prop OF pBlackSpec, pWhiteSpec: IF (CurrentFormat = 1) THEN spec := IntProp(node, prop); IF (spec = 2) THEN spec := computerPlayer; ELSIF (spec = 3) THEN spec := modemPlayer; ELSE spec := humanPlayer; END(*IF*); SetProp(node, prop, spec); END(*IF*); | pLetter: IF (CurrentFormat <= 2) THEN str4 := "A"; labels := NIL; FOREACH(ListProp(node, pLetter)); WHILE NEXT(point) DO Append(point, labels); AppendL(str4, labels); INC(str4[0]); END(*FOREACH*); (* the following calls do not affect FORPROP *) SetPropL(node, pLabel, labels); DeleteProp(node, pLetter); END(*IF*); | pCheck: (* changed from noType to tInteger *) IF (CurrentFormat <= 2) THEN IF (IntProp(node, prop) <= 0) THEN SetProp(node, prop, 1); END(*IF*); END(*IF*); | pGoodMove: IF hasBadMove THEN DeleteProp(node, pGoodMove); DeleteProp(node, pBadMove); SetProp(node, pDoubtful, 0); END(*IF*); hasGoodMove := TRUE; | pBadMove: IF hasGoodMove THEN DeleteProp(node, pGoodMove); DeleteProp(node, pBadMove); SetProp(node, pInterest, 0); END(*IF*); hasBadMove := TRUE; ELSE (* no adjustment necessary *) END(*CASE*); END(*FORPROP*); END(*TRAVERSE*); END ConvertFormat;
IF HasProp(node, pMark) THEN (* convert into new format *) FOREACH(ListProp(node, pMark)); WHILE NEXT(point) DO IF (fBoard[point] = Empty) THEN AddPointToProp(node, pMarked, point); ELSE AddPointToProp(node, pTriangle, point); END(*IF*); END(*FOREACH*); DeleteProp(node, pMark); END(*IF*);
Martin Müller, mueller@inf.ethz.ch