<> <> <> DIRECTORY BasicTime USING [Now, Period, Update], Commander USING [CommandProc, Register], IO USING[PutRope, STREAM], MyClock USING [ChangeAllOffSets], Process USING [Detach, Pause, SecondsToTicks], RememberDefs, RememberDefsPrivate USING [itIsNow, EnterEventMinder], Rope USING[ROPE, Equal, Cat, Substr], PrincOpsUtils USING [IsBound], Tempus USING [defaultTime, MakeRope, Packed, Parse, Unintelligible] ; RememberUtilImpl: CEDAR MONITOR IMPORTS BasicTime, Commander, IO, PrincOpsUtils, Process, Rope, Tempus, RememberDefsPrivate, MyClock SHARES RememberDefsPrivate, MyClock = BEGIN PretendIts: Commander.CommandProc = TRUSTED { -- for debugging err: Rope.ROPE; t: Tempus.Packed; t _ Tempus.Parse[cmd.commandLine, RememberDefsPrivate.itIsNow ! Tempus.Unintelligible => { err _ SELECT ec FROM invalid => "Invalid", tooVague => "Too Vague", overConstrained => "Over Constrained", nothingSpecified => "Not a time", notImplemented => "Not Implemented", ENDCASE => ERROR; IF vicinity # -1 THEN err _ Rope.Cat[ err, ": ", Rope.Substr[base: rope, len: vicinity], "<>", Rope.Substr[base: rope, start: vicinity] ]; CONTINUE; }; ].time; IF err # NIL THEN cmd.err.PutRope[err]; IF PrincOpsUtils.IsBound[MyClock.ChangeAllOffSets] THEN MyClock.ChangeAllOffSets[BasicTime.Period[BasicTime.Now[], t]]; RememberDefsPrivate.EnterEventMinder[BasicTime.Update[t, 1]]; -- + 1 so you can say remember .. at noon, then pretendits noon to see it get fired off IF PrincOpsUtils.IsBound[MyClock.ChangeAllOffSets] THEN Process.Detach[FORK LeaveItUpForAWhile[]]; cmd.out.PutRope[Tempus.MakeRope[time: t, includeDayOfWeek: TRUE]]; }; howLong: LONG CARDINAL _ 5; LeaveItUpForAWhile: PROCEDURE = TRUSTED { Process.Pause[Process.SecondsToTicks[howLong]]; MyClock.ChangeAllOffSets[0]; }; ItIsNow: Commander.CommandProc = { -- for debugging IF Rope.Equal[cmd.commandLine, "\n"] THEN { RememberDefsPrivate.itIsNow _ Tempus.defaultTime; cmd.out.PutRope["{current time}"]; } ELSE { t: Tempus.Packed = Tempus.Parse[cmd.commandLine, RememberDefsPrivate.itIsNow].time; RememberDefsPrivate.itIsNow _ BasicTime.Update[t, 1]; -- + 1 so you can say remember .. at noon, then pretendits noon to see it get fired off cmd.out.PutRope[Tempus.MakeRope[time: t, includeDayOfWeek: TRUE]]; }; }; Commander.Register["PretendIts", PretendIts, "Pretend its ... for purposes of posting a reminder. (A temporary change.)"]; Commander.Register["ItIsNow", ItIsNow, "Pretend its ... for purposes of registration as well as posting a reminder. (A permanent change, i.e. must explicitly be restored by typing ItIsNow{cr})"]; END. <> <> <> <> <> <<>>