-- Copyright (C) 1983 by Xerox Corporation. All rights reserved.
-- FixLocalTimeParameters.mesa, HGM, 3-Dec-83 16:51:45
DIRECTORY
Ascii USING [CR],
CmFile USING [Handle, TableError],
OthelloOps USING [GetTimeFromTimeServer, SetProcessorTime, TimeServerError],
PilotMP USING [cTimeNotAvailable],
ProcessorFace USING [SetMP, mp],
Put USING [Text],
String USING [AppendChar, AppendDecimal, AppendString],
StringLookUp USING [noMatch, TableDesc],
System USING [
GetLocalTimeParameters, GreenwichMeanTime, LocalTimeParameters, LocalTimeParametersUnknown,
SetLocalTimeParameters, WestEast],
Token USING [Decimal],
Indirect USING [Close, NextValue, OpenSection];
FixLocalTimeParameters: PROGRAM
IMPORTS
CmFile, OthelloOps, ProcessorFace, Put, String, System, Token,
Indirect =
BEGIN
GetTimeFromNet: PROCEDURE =
BEGIN
timeTrys: CARDINAL ← 25;
time: System.GreenwichMeanTime;
lpt: System.LocalTimeParameters;
timeFromServer: BOOLEAN ← TRUE;
teMP: CARDINAL = ProcessorFace.mp;
ProcessorFace.SetMP[PilotMP.cTimeNotAvailable+1000];
[time, lpt] ← OthelloOps.GetTimeFromTimeServer[
! OthelloOps.TimeServerError =>
SELECT error FROM
noResponse =>
BEGIN
IF (timeTrys ← timeTrys-1)=0 THEN BEGIN timeFromServer ← FALSE; CONTINUE; END
ELSE RETRY;
END;
noCommunicationFacilities => BEGIN timeFromServer ← FALSE; CONTINUE; END;
ENDCASE => ERROR];
IF timeFromServer THEN
BEGIN
System.SetLocalTimeParameters[lpt];
OthelloOps.SetProcessorTime[time];
END;
ProcessorFace.SetMP[teMP];
END;
GetTimeParametersFromEERom: PROCEDURE =
BEGIN
dstSpecified, zoneSpecified: BOOLEAN ← FALSE;
parms: System.LocalTimeParameters;
cmFile: CmFile.Handle;
known: BOOLEAN ← TRUE;
Option: TYPE = MACHINE DEPENDENT{
dst(0), zone, noMatch(StringLookUp.noMatch)};
DefinedOption: TYPE = Option [dst..zone];
CheckType: PROCEDURE [h: CmFile.Handle, table: StringLookUp.TableDesc]
RETURNS [index: CARDINAL] = Indirect.NextValue;
MyNextValue: PROCEDURE [
h: CmFile.Handle,
table: LONG DESCRIPTOR FOR ARRAY DefinedOption OF LONG STRING]
RETURNS [index: Option] = LOOPHOLE[CheckType];
optionTable: ARRAY DefinedOption OF LONG STRING ← [
dst: "DST"L, zone: "Zone"L];
parms ← System.GetLocalTimeParameters[ !
System.LocalTimeParametersUnknown => BEGIN known ← FALSE; CONTINUE; END];
IF known THEN RETURN;
cmFile ← Indirect.OpenSection["TimeServer"L];
IF cmFile = NIL THEN
BEGIN
Message["Can't find [TimeServer] section in parameter file"L];
RETURN;
END;
DO
text: STRING = [200];
option: Option;
option ← MyNextValue[cmFile, DESCRIPTOR[optionTable] ! CmFile.TableError => RETRY];
SELECT option FROM
noMatch => EXIT;
dst => -- <begin day> <end day>
BEGIN
parms.beginDST ← Token.Decimal[cmFile];
parms.endDST ← Token.Decimal[cmFile];
String.AppendString[text, "DST: begin="L];
String.AppendDecimal[text, parms.beginDST];
String.AppendString[text, ", last="L];
String.AppendDecimal[text, parms.endDST];
Message[text];
dstSpecified ← TRUE;
END;
zone => -- <sign> <hours>:<minutes>
BEGIN
hours: INTEGER ← Token.Decimal[cmFile];
minutes: CARDINAL ← Token.Decimal[cmFile];
westEast: System.WestEast ← IF hours < 0 THEN east ELSE west;
parms.direction ← westEast;
parms.zone ← ABS[hours];
parms.zoneMinutes ← minutes;
String.AppendString[text, "ZONE: hours="L];
String.AppendDecimal[text, hours];
String.AppendString[
text, IF westEast = west THEN "(west)"L ELSE "(east)"L];
String.AppendString[text, ", minutes="L];
String.AppendDecimal[text, minutes];
Message[text];
zoneSpecified ← TRUE;
END;
ENDCASE => ERROR;
ENDLOOP;
Indirect.Close[cmFile];
IF ~dstSpecified OR ~zoneSpecified THEN RETURN;
System.SetLocalTimeParameters[parms];
END;
Message: PROCEDURE [one, two, three: LONG STRING ← NIL] =
BEGIN
text: STRING = [100];
String.AppendString[text, "FixTimeParameters: "L];
String.AppendString[text, one];
IF two # NIL THEN String.AppendString[text, two];
IF three # NIL THEN String.AppendString[text, three];
LogString[text];
END;
LogString: PROCEDURE [text: LONG STRING] =
BEGIN
String.AppendChar[text, '.];
String.AppendChar[text, Ascii.CR];
Put.Text[NIL, text];
END;
GetTimeFromNet[];
GetTimeParametersFromEERom[];
END.