-- ShowTimeImpl.Mesa -- Russ Atkinson, June 7, 1982 5:52 pm DIRECTORY ShowTime, System USING [GetClockPulses, Microseconds, PulsesToMicroseconds]; ShowTimeImpl: CEDAR PROGRAM IMPORTS System EXPORTS ShowTime = BEGIN OPEN System; Microseconds: TYPE = LONG CARDINAL; GetMark: PUBLIC PROC RETURNS [Microseconds] = TRUSTED { RETURN [System.PulsesToMicroseconds[System.GetClockPulses[]]]}; SinceMark: PUBLIC PROC [from: Microseconds] RETURNS [Microseconds] = { now: Microseconds _ GetMark[]; RETURN [LOOPHOLE[now - from, Microseconds]]}; ShowDecimal: PUBLIC PROC [number: Microseconds, p: PROC [CHAR] RETURNS [BOOL], field: CARDINAL _ 0, fill: CHAR _ ' ] RETURNS [BOOL] = TRUSTED { chars: STRING _ [12]; size: CARDINAL _ 0; IF LOOPHOLE[number, INT] < 0 THEN RETURN[p['?]]; DO next: Microseconds _ number / 10; chars[size] _ '0 + (number - (next * 10)); size _ size + 1; IF (number _ next) = 0 THEN EXIT; ENDLOOP; WHILE field > size DO IF p[fill] THEN RETURN [TRUE]; field _ field - 1 ENDLOOP; WHILE size > 0 DO size _ size - 1; IF p[chars[size]] THEN RETURN [TRUE] ENDLOOP; RETURN [FALSE]; }; Show: PUBLIC PROC [from: Microseconds, p: PROC [CHAR] RETURNS [BOOL], places: CARDINAL _ 6] = { ShowDelta[SinceMark[from], p, places]}; ShowDelta: PUBLIC PROC [delta: Microseconds, p: PROC [CHAR] RETURNS [BOOL], places: CARDINAL _ 6] = { adjust: Microseconds; IF places >= 6 THEN {places _ 6; adjust _ 0} ELSE {delta _ delta + (adjust _ Adjust[places])}; IF ShowDecimal[delta / 1000000, p, 0, '0] THEN RETURN; IF p['.] THEN RETURN; delta _ delta MOD 1000000; IF places < 6 THEN delta _ delta / (adjust+adjust); IF ShowDecimal[delta, p, places, '0] THEN RETURN; }; Adjust: ARRAY [0..6] OF Microseconds = [500000, 50000, 5000, 500, 50, 5, 0]; END.