-- Copyright (C) 1983, 1985 by Xerox Corporation. All rights reserved.
-- TimeServersParmNoDisk.mesa, HGM, 15-Jun-85 15:52:31
DIRECTORY
Ascii USING [CR],
CmFile USING [Handle, TableError],
Inline USING [LowHalf],
Put USING [Text],
String USING [AppendChar, AppendDecimal, AppendString, AppendLongDecimal],
StringLookUp USING [noMatch, TableDesc],
System USING [GetLocalTimeParameters, LocalTimeParameters, WestEast],
TemporarySetGMT USING [adjustableClockRate, SetClockRate],
Time USING [AppendCurrent],
Token USING [Boolean, Decimal, LongDecimal],
TimeServerOps USING [SetClockDrift, SetClockWobble, Start, Stop],
Indirect USING [Close, NextValue, OpenSection],
PupTimeServer USING [PupTimeServerOn],
PupTimeServerOps USING [parmsOk, correction];
TimeServersParmNoDisk: PROGRAM
IMPORTS
CmFile, Inline, Put, String, System, TemporarySetGMT, Time, Token,
TimeServerOps,
Indirect, PupTimeServer, PupTimeServerOps =
BEGIN
FindParameters: PROCEDURE =
BEGIN
ok: BOOLEAN ← TRUE;
flakey, disableNSTimeServer: BOOLEAN ← FALSE;
dstSpecified, zoneSpecified: BOOLEAN ← FALSE;
driftSpecified, wobbleSpecified, correctionSpecified: BOOLEAN ← FALSE;
parms: System.LocalTimeParameters ← System.GetLocalTimeParameters[];
cmFile: CmFile.Handle;
Option: TYPE = MACHINE DEPENDENT{
correction(0), drift, wobble, dst, zone, disableNSTimeServer,
noMatch(StringLookUp.noMatch)};
DefinedOption: TYPE = Option [correction..disableNSTimeServer];
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 ← [
correction: "Correction"L, drift: "Drift"L, wobble: "Wobble"L,
dst: "DST"L, zone: "Zone"L,
disableNSTimeServer: "Disable NS Time Server"L];
PupTimeServerOps.parmsOk ← FALSE;
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 =>
BEGIN
IF name[0] # '; THEN Message["Unrecognized parameter: ", name];
RETRY;
END];
SELECT option FROM
noMatch => EXIT;
correction =>
BEGIN
correction: LONG INTEGER ← Token.LongDecimal[cmFile];
String.AppendLongDecimal[text, correction];
Message["The crystal correction is "L, text, " milliseconds per day"L];
SetCorrection[correction];
PupTimeServerOps.correction ← Inline.LowHalf[correction/1000];
correctionSpecified ← TRUE;
END;
drift =>
BEGIN
drift: CARDINAL ← Token.Decimal[cmFile];
String.AppendLongDecimal[text, drift];
Message["The clock drift is "L, text, " milliseconds per day"L];
TimeServerOps.SetClockDrift[86400, drift];
driftSpecified ← TRUE;
END;
wobble =>
BEGIN
wobble: CARDINAL ← Token.Decimal[cmFile];
String.AppendLongDecimal[text, wobble];
Message["The clock wobble is "L, text, " milliseconds per quarter day"L];
TimeServerOps.SetClockWobble[86400/4, wobble];
wobbleSpecified ← TRUE;
END;
dst => -- <begin day> <end day>
BEGIN
first: CARDINAL ← Token.Decimal[cmFile];
last: CARDINAL ← Token.Decimal[cmFile];
IF first # parms.beginDST OR last # parms.endDST THEN
BEGIN Message["The DST info on this disk is wrong"L]; ok ← FALSE; END;
String.AppendString[text, "DST: begin="L];
String.AppendDecimal[text, first];
String.AppendString[text, ", last="L];
String.AppendDecimal[text, last];
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;
hours ← ABS[hours];
IF westEast # parms.direction OR hours # parms.zone
OR minutes # parms.zoneMinutes THEN
BEGIN
Message["The time zone info on this disk is wrong"L];
ok ← FALSE;
END;
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;
disableNSTimeServer =>
BEGIN
IF Token.Boolean[cmFile] THEN
BEGIN
Message["Turning OFF the NS Time Server"L];
disableNSTimeServer ← TRUE;
END
ELSE Message["Didn't turn OFF the NS Time Server"L];
END;
ENDCASE => ERROR;
ENDLOOP;
Indirect.Close[cmFile];
ok ← ok AND dstSpecified AND zoneSpecified AND correctionSpecified
AND driftSpecified AND wobbleSpecified;
PupTimeServerOps.parmsOk ← ok AND ~flakey;
IF ok AND ~disableNSTimeServer THEN
TimeServerOps.Start[]
ELSE TimeServerOps.Stop[]; -- Created and Started by START Trap
END;
SetCorrection: PROCEDURE [arg: LONG INTEGER] =
BEGIN
IF arg # 0 THEN
BEGIN
secondsPerDay: LONG CARDINAL = 86400;
delta: LONG INTEGER ← arg;
bottom: LONG CARDINAL ← 1000*secondsPerDay;
IF ~TemporarySetGMT.adjustableClockRate THEN
BEGIN
Message["The clock on this machine is not adjustable"L];
RETURN;
END;
-- Yetch, what a pile of crap
-- 640 works on D0s (or at least some of them)
-- Dicentra needs 274
UNTIL ABS[delta] < 274 DO -- Avoid overflow
delta ← delta/2;
bottom ← bottom/2;
ENDLOOP;
TemporarySetGMT.SetClockRate[bottom, bottom + delta];
END;
END;
Message: PROCEDURE [one, two, three: LONG STRING ← NIL] =
BEGIN
text: STRING = [100];
Time.AppendCurrent[text];
String.AppendString[text, " TimeServer: "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;
FindParameters[];
PupTimeServer.PupTimeServerOn[];
END.