<<>> <> <> <> <<>> DIRECTORY PFS, RefText, Convert, Commander, CommanderOps, Rope, IO, RopeFile, Process; RopeFileTest: CEDAR PROGRAM IMPORTS PFS, RefText, Convert, Commander, CommanderOps, Rope, IO, RopeFile, Process ~ BEGIN ROPE: TYPE ~ Rope.ROPE; bad: LIST OF ROPE ¬ NIL; Which: TYPE ~ { fetch, map, move, bigmove }; Equal: PROC [ropefile, rope: ROPE, which: Which] RETURNS [BOOL] ~ { SELECT which FROM fetch => RETURN [Rope.Equal[ropefile, rope]]; map => { i: INT ¬ 0; EachChar: PROC [c: CHAR] RETURNS [quit: BOOL ¬ FALSE] ~ { IF c # Rope.Fetch[rope, i] THEN RETURN [TRUE]; i ¬ i + 1; }; RETURN [NOT Rope.Map[base: ropefile, action: EachChar]] }; move, bigmove => { text1: REF TEXT ¬ RefText.New[IF which=move THEN 100 ELSE 10000]; text2: REF TEXT ¬ RefText.New[IF which=move THEN 100 ELSE 10000]; size: INT ~ Rope.Size[ropefile]; IF size # Rope.Size[rope] THEN RETURN [FALSE]; FOR i: INT ¬ 0, i+text1.length UNTIL i = size DO text1.length ¬ 0; text1 ¬ RefText.AppendRope[text1, ropefile, i, text1.maxLength]; text2.length ¬ 0; text2 ¬ RefText.AppendRope[text2, rope, i, text2.maxLength]; IF text1.length # text2.length THEN RETURN [FALSE]; FOR j: NAT IN [0..text1.length) DO IF text1[j] # text2[j] THEN RETURN [FALSE]; ENDLOOP; IF i+text1.length > size THEN ERROR; Process.CheckForAbort[]; ENDLOOP; RETURN [TRUE] }; ENDCASE => ERROR; }; RopeFileTestCommand: Commander.CommandProc ~ { which: Which ¬ fetch; FOR arg: ROPE ¬ CommanderOps.NextArgument[cmd], CommanderOps.NextArgument[cmd] UNTIL arg = NIL DO SELECT TRUE FROM Rope.Equal[arg, "-f"] => { RopeFile.LimitActive[Convert.IntFromRope[CommanderOps.NextArgument[cmd]]]; }; Rope.Equal[arg, "-fetch"] => { which ¬ fetch; }; Rope.Equal[arg, "-map"] => { which ¬ map; }; Rope.Equal[arg, "-move"] => { which ¬ move; }; Rope.Equal[arg, "-bigmove"] => { which ¬ bigmove; }; ENDCASE => { path: PFS.PATH ~ PFS.PathFromRope[arg]; ropefile: ROPE ~ PFS.RopeOpen[fileName: path, checkMutability: FALSE, includeFormatting: TRUE].rope; stream: IO.STREAM ~ PFS.StreamOpen[fileName: path, streamOptions: [includeFormatting: TRUE, closeFSOpenFileOnClose: TRUE]]; rope: ROPE ~ stream.GetRope[demand: FALSE]; IO.Close[stream]; IF NOT Equal[ropefile, rope, which] THEN { badIndex: INT ~ Rope.Run[ropefile, 0, rope]; bad ¬ CONS[rope, bad]; bad ¬ CONS[ropefile, bad]; bad ¬ CONS[arg, bad]; CommanderOps.Failed[ IO.PutFLR["Mismatch at %g of %g (ropefile=%08xH, rope=%08xH)", LIST[ [integer[badIndex]], [rope[arg]], [cardinal[LOOPHOLE[ropefile]]], [cardinal[LOOPHOLE[rope]]]]]]; }; }; ENDLOOP; }; Commander.Register["RopeFileTest", RopeFileTestCommand]; END.