<> <> <> <<>> <<>> DIRECTORY Basics, CD, CDDirectory, Convert, IFUPW, PW, Rope; IFUPWParity: CEDAR PROGRAM IMPORTS Basics, Convert, IFUPW, PW, Rope EXPORTS IFUPW = BEGIN FlatTree: PUBLIC PROC [root: PW.ROPE, levels: INT] RETURNS[new: PW.ObjName]= { <> <> <> list: LIST OF PW.ObjName; limit: INT _ PW.TwoToThe[levels]-2; FOR index: INT IN [0..limit] DO list _ CONS[FlatTreeCell[root, levels, index], list] ENDLOOP; list _ CONS[Rope.Cat[root, "End"], list]; new _ PW.AbutListX[list] }; FlatTreeCell: PROC [root: PW.ROPE, levels, index: INT] RETURNS[new: PW.ObjName]= { <> <> level, test: INT _ 0; list: LIST OF PW.ObjName; ConsName: PROC[type: PW.ROPE] = {list _ CONS[Rope.Cat[root, type], list]}; ConsName[""]; FOR test_index, test/2 WHILE (test MOD 2 )=1 DO ConsName["Extend"]; level _ level +1 ENDLOOP; ConsName["Conn"]; level _ level +1; test _ Basics.BITXOR[test/2, test]; ConsName[IF (test MOD 2 )=1 THEN "DrRt" ELSE "DrLt"]; THROUGH (level..levels] DO IF ((test_test/2) MOD 2)=0 THEN ConsName["Blank"] ELSE ConsName["Pass"] ENDLOOP; new _ PW.AbutListY[IFUPW.ReverseList[list]] }; TreeConditionals: PROC [index: INT, root: PW.ROPE] RETURNS[list: LIST OF PW.ROPE]= { level, test: INT _ 0; ConsName: PROC[type: PW.ROPE] = {list _ CONS[Rope.Cat[root, "L", Convert.RopeFromCard[level], type], list]}; FOR test_index, test/2 WHILE (test MOD 2 )=1 DO ConsName["Extend"]; level _ level +1 ENDLOOP; ConsName["Conn"]; level _ level +1; test _ Basics.BITXOR[test/2, test]; ConsName[IF (test MOD 2 )=1 THEN "PassRt" ELSE "PassLt"]; FOR test_test/2, test/2 WHILE test#0 DO level _ level +1; IF (test MOD 2 )=0 THEN LOOP; ConsName["PassLt"]; ConsName["PassRt"]; ENDLOOP }; <<>> <> <> END. <<>> <<>>