TempusUtilImpl.mesa; Edited by Teitelman on June 22, 1983 9:21 am
Converted by: Maxwell, January 5, 1984 2:12 pm
Last Edited by: Pier, March 1, 1984 1:50:05 pm PST
DIRECTORY
AMBridge USING [IsRemote, TVToLC],
Commander USING [Register, CommandProc],
IO USING [PutRope, STREAM],
PrintTV USING [RegisterTVPrintProc, TVPrintProc],
Rope USING [Cat, Substr, ROPE],
Tempus USING [Packed, Unintelligible, PackedSeconds, SecondsToPacked, MakeRope, defaultTime, Parse]
;
TempusUtilImpl: CEDAR PROGRAM
IMPORTS AMBridge, Commander, IO, PrintTV, Rope, Tempus
= BEGIN OPEN Tempus;
SecondsPrintProc: PrintTV.TVPrintProc = TRUSTED { -- AMBridge
s: Tempus.PackedSeconds;
t: Tempus.Packed;
IF AMBridge.IsRemote[tv] THEN ERROR; -- shouldnt be called. TVPrintProc says can't handle remote.
s ← LOOPHOLE[AMBridge.TVToLC[tv]];
t ← SecondsToPacked[s];
IF t = defaultTime THEN stream.PutRope["{current time}"]
ELSE stream.PutRope[MakeRope[time: t, precision: seconds, includeDayOfWeek: TRUE]];
};
PackedPrintProc: PrintTV.TVPrintProc = TRUSTED { -- AMBridge
t: Tempus.Packed;
IF AMBridge.IsRemote[tv] THEN ERROR; -- shouldnt be called. TVPrintProc says can't handle remote.
t ← LOOPHOLE[AMBridge.TVToLC[tv]];
IF t = defaultTime THEN stream.PutRope["{current time}"]
ELSE stream.PutRope[MakeRope[time: t, precision: seconds, includeDayOfWeek: TRUE]];
};
WhenIs: Commander.CommandProc = {
err: Rope.ROPE;
t: Packed;
[t, ] ← Parse[cmd.commandLine !
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;
};
];
IF err # NIL THEN cmd.err.PutRope[err]
ELSE cmd.out.PutRope[MakeRope[time: t, includeDayOfWeek: TRUE]];
cmd.out.PutRope["\n"];
TRUSTED { when StoreInSymTab is implemented in CommandProcOps put this back.
UserExecPrivate.StoreInSymTab[value: AMBridge.TVForReferent[NEW[Packed ← t]], event: event, exec: exec];
};
};
WhenIs: UserExec.CommandProc = {
err: Rope.ROPE;
t: Packed;
[t, ] ← Parse[event.commandLine !
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;
};
];
IF err # NIL THEN UserExecPrivate.EventFailed[event: event, msg: err];
UserExec.GetStreams[exec].out.PutRope[MakeRope[time: t, includeDayOfWeek: TRUE]];
TRUSTED {
UserExecPrivate.StoreInSymTab[value: AMBridge.TVForReferent[NEW[Packed ← t]], event: event, exec: exec];
};
};
PrintTV.RegisterTVPrintProc[type: CODE[Tempus.PackedSeconds], proc: SecondsPrintProc ! ANY => CONTINUE];
PrintTV.RegisterTVPrintProc[type: CODE[Tempus.Packed], proc: PackedPrintProc ! ANY => CONTINUE]; -- redefines printproc in basic system so that includes day of week.
Commander.Register["WhenIs", WhenIs, "For testing time.parse"];
END.