<> <> <> <> DIRECTORY Commander USING [CommandProc, Register], FS USING [StreamOpen], FSRope USING [StreamFromRope], IO, Rope, WalnutDefs USING [Error], WalnutOps USING [EndNewMail, RecordNewMailInfo, StartNewMail], WalnutRoot USING [FlushAndContinue], WalnutStream USING [CopyBytes]; RecoverNewMail: CEDAR PROGRAM IMPORTS Commander, FS, FSRope, IO, WalnutDefs, WalnutOps, WalnutRoot, WalnutStream = BEGIN ROPE: TYPE = Rope.ROPE; STREAM: TYPE = IO.STREAM; server: ROPE _ "Salvador.ms"; <<********************************************************>> <> SetupRecover: Commander.CommandProc = { clStream: STREAM _ FSRope.StreamFromRope[cmd.commandLine]; fileName, outcome: ROPE; num: INT; fileName _ clStream.GetTokenRope[IO.IDProc ! IO.EndOfStream => CONTINUE].token; num _ clStream.GetInt[ ! IO.EndOfStream => { num _ 1; CONTINUE}]; outcome _ Recover[fileName, num]; cmd.out.PutRope[outcome]; }; Recover: PUBLIC PROC[fName: ROPE, num: INT _ 1] RETURNS[ROPE] = { ENABLE WalnutDefs.Error => { WalnutOps.EndNewMail[]; GOTO err}; fStrm: STREAM; ms: STREAM _ WalnutOps.StartNewMail[]; fLength: INT; IF ms = NIL THEN RETURN["Can't get new mail stream"]; fStrm _ FS.StreamOpen[fName]; fLength _ fStrm.GetLength[]; ms.SetIndex[ms.GetLength[]]; WalnutStream.CopyBytes[from: fStrm, to: ms, num: fStrm.GetLength[]]; WalnutRoot.FlushAndContinue[ms]; WalnutOps.RecordNewMailInfo[ms.GetLength[], server, num]; WalnutOps.EndNewMail[]; fStrm.Close[]; RETURN[IO.PutFR["Copied %g bytes from %g\n", IO.int[fLength], IO.rope[fName]] ]; EXITS err => RETURN["WalnutDefs.Error"]; }; Commander.Register["Recover", SetupRecover, "Recovers a Walnut newMailLog; syntax is \"Recover logFile\""]; END.