DIRECTORY BasicTime USING [Now, Period, Update], Commander USING [CommandProc, Register], IO USING[PutRope, STREAM], Clock USING [ChangeAllOffSets], Process USING [Detach, Pause, SecondsToTicks], RememberDefs, RememberDefsPrivate USING [itIsNow, EnterEventMinder], Rope USING[ROPE, Equal, Cat, Substr, Concat, Find], PrincOpsUtils USING [IsBound], Tempus USING [defaultTime, MakeRope, Packed, Parse, Unintelligible] ; RememberUtilImpl: CEDAR MONITOR IMPORTS BasicTime, Commander, IO, PrincOpsUtils, Process, Rope, Tempus, RememberDefsPrivate, Clock SHARES RememberDefsPrivate, Clock = BEGIN ShowReminders: Commander.CommandProc = TRUSTED { earlyRope, lateRope, err: Rope.ROPE; earlyIndex: INT; early, late: Tempus.Packed; IF (earlyIndex _ Rope.Find[s1: cmd.commandLine, s2: "UpTo", case: FALSE])#-1 THEN { earlyRope _ Rope.Substr[base: cmd.commandLine, len: earlyIndex]; lateRope _ Rope.Substr[base: cmd.commandLine, start: earlyIndex]; } ELSE err _ "Syntax: ShowReminders UpTo "; IF err=NIL THEN { early _ Tempus.Parse[earlyRope, 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; late _ Tempus.Parse[lateRope, 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[Rope.Concat[err, "\n"]] ELSE { IF PrincOpsUtils.IsBound[Clock.ChangeAllOffSets] THEN Clock.ChangeAllOffSets[BasicTime.Period[BasicTime.Now[], early]]; RememberDefsPrivate.EnterEventMinder[BasicTime.Update[early, 1], late]; -- + 1 so you can say remember .. at noon, then pretendits noon to see it get fired off IF PrincOpsUtils.IsBound[Clock.ChangeAllOffSets] THEN Process.Detach[FORK LeaveItUpForAWhile[]]; cmd.out.PutRope[Rope.Cat[Tempus.MakeRope[time: early, includeDayOfWeek: TRUE], " UpTo ", Tempus.MakeRope[time: late, includeDayOfWeek: TRUE], "\n"]]; }; }; 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[Rope.Concat[err, "\n"]] ELSE { IF PrincOpsUtils.IsBound[Clock.ChangeAllOffSets] THEN Clock.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[Clock.ChangeAllOffSets] THEN Process.Detach[FORK LeaveItUpForAWhile[]]; cmd.out.PutRope[Rope.Concat[Tempus.MakeRope[time: t, includeDayOfWeek: TRUE], "\n"]]; }; }; howLong: LONG CARDINAL _ 5; LeaveItUpForAWhile: PROCEDURE = TRUSTED { Process.Pause[Process.SecondsToTicks[howLong]]; Clock.ChangeAllOffSets[0]; }; ItIsNow: Commander.CommandProc = { -- for debugging IF Rope.Equal[cmd.commandLine, "\n"] THEN { RememberDefsPrivate.itIsNow _ Tempus.defaultTime; cmd.out.PutRope[Rope.Concat["{current time}", "\n"]]; } 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[Rope.Concat[Tempus.MakeRope[time: t, includeDayOfWeek: TRUE], "\n"]]; }; }; Commander.Register["PretendIts", PretendIts, "Pretend its ... for purposes of posting a reminder. (A temporary change.)"]; Commander.Register["ShowReminders", ShowReminders, "ShowReminders UpTo "]; Commander.Register["ShowRem", ShowReminders, "ShowReminders UpTo "]; 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. xReminderImpl.mesa. See Remember.Tioga for documentation and examples of how to use the Remember package. Last Edited by: Teitelman, September 15, 1983 11:00 am Last Edited by: Maxwell, January 6, 1984 2:09 pm Last Edited by: Pier, March 13, 1984 7:19:19 pm PST Edited on September 15, 1983 10:59 am, by Teitelman changes pretendits to catch signals from tempus changes to: PretendIts Edited on January 6, 1984 2:08 pm, by Maxwell changes to: DIRECTORY, IMPORTS, PretendIts, ItIsNow Edited on January 24, 1984 8:06 pm, by Pier changes to: DIRECTORY, PretendIts, ItIsNow Edited on February 13, 1984 1:08:36 pm PST, by Pier changes to: PretendIts, ItIsNow to add final CR to outputs Edited on March 1, 1984 1:40:51 pm PST, by Pier changes to: DIRECTORY, IMPORTS, SHARES, PretendIts, LeaveItUpForAWhile Edited on March 13, 1984 6:15:50 pm PST, by Pier Added ShowReminders , DIRECTORY ÊÀ˜J™hJ™6J™0J™3šÏk ˜ Jšœ œ˜&Jšœ œ˜(Jšœœ œ˜Jšœœ˜Jšœœ!˜.Jšœ ˜ Jšœœ˜6Jšœœœ$˜3Jšœœ ˜Jšœœ7˜CJšœ˜J˜—J˜šÐlnœœ˜J˜—J˜JšœœD˜dJ˜Jšœ˜!J˜šœœ˜ J˜—šÏn œœ˜2Jšœœ˜$Jšœ œ˜Jšœ˜šœ@œœ˜SJšœ@˜@JšœA˜AJ˜—Jšœ@˜Dšœœœ˜šœ=˜=šœ˜šœœ˜Jšœ˜Jšœ˜Jšœ&˜&Jšœ!˜!Jšœ$˜$Jšœœ˜—šœœ˜%Jšœ˜J˜Jšœ'˜'J•StartOfExpansion9[base: ROPE, start: INT _ 0, len: INT _ 2147483647]˜J˜(Jšœ˜—Jšœ˜ J˜—Jšœ˜—šœ;˜;šœ˜šœœ˜Jšœ˜Jšœ˜Jšœ&˜&Jšœ!˜!Jšœ$˜$Jšœœ˜—šœœ˜%Jšœ˜J˜Jšœ'˜'J–9[base: ROPE, start: INT _ 0, len: INT _ 2147483647]˜J˜(Jšœ˜—Jšœ˜ J˜—Jšœ˜—J˜—Jšœœœ(˜9šœ˜Jšœ/œB˜wJšœGÏcX˜ŸJšœ/œœ˜`JšœHœ;œ ˜•J˜—J˜—J˜šŸ œœ ˜?Jšœ œ˜Jšœ˜šœ?˜?šœ˜šœœ˜Jšœ˜Jšœ˜Jšœ&˜&Jšœ!˜!Jšœ$˜$Jšœ˜—šœœ˜%Jšœ˜J˜Jšœ'˜'J–9[base: ROPE, start: INT _ 0, len: INT _ 2147483647]˜J˜(Jšœ˜—Jšœ˜ J˜—Jšœ˜—Jšœœœ(˜9šœ˜Jšœ/œ>˜sJšœ= X˜•Jšœ/œœ˜`JšœGœ ˜UJ˜—J˜—J˜JšŸœœœ˜J˜šŸœ œœ˜*J˜/Jšœ˜J˜—J˜šŸœ ˜4šœ#œ˜+Jšœ1˜1Jšœ5˜5J˜—šœ˜JšœS˜SJšœ5 X˜JšœGœ ˜UJšœ˜—J˜—J˜J˜zJšœe˜eJšœ_˜_˜Ã˜J˜——J˜Jšœ˜J˜J˜™3J™/Jšœ Ïr ™—™-Jšœ ¡'™3—™+Jšœ ¡™*—™3Jšœ ¡œ™:—™/Jšœ ¡:™F—™0Jšœ™Jš¡ ™ —J™J™—…—Äü