language-Modula2-0.1: examples/Modula-2_Libraries/andrea-m2/lib/fst/timer.mod
IMPLEMENTATION MODULE Timer;
(* $S-, $R-, $T- *)
(* get time stats *)
(* John Andrea, Mar.27/92 *)
(* This code may NOT be sold, it may be freely used and distributed *)
FROM InOut IMPORT WriteString, WriteCard, WriteLn;
FROM TimeDate IMPORT Time, GetTime;
CONST
hours_per_day = 24;
min_per_day = hours_per_day * 60;
VAR
start, now :Time;
started :BOOLEAN;
digits :ARRAY [0..9] OF CHAR;
numbers :ARRAY [0..99] OF ARRAY [0..1] OF CHAR;
i, j, k :CARDINAL;
(* -------------------------------------------------------- *)
PROCEDURE StartTimer;
BEGIN
started := TRUE;
GetTime( start );
END StartTimer;
(* -------------------------------------------------------- *)
PROCEDURE ShowTimer;
VAR
dday, dmin, dmil, d, h, m, s, u :CARDINAL;
BEGIN
GetTime( now );
IF started THEN
(* the time is returned from GetTime in this style *)
(* .day is the day since 1900 *)
(* .minute is # minutes since midnight *)
(* .millisec is # millseconds past the minute *)
dday := now.day - start.day;
IF dday = 0 THEN
dmin := now.minute - start.minute;
ELSE
dmin := min_per_day + now.minute - start.minute;
END;
d := dday;
h := dmin DIV 60;
m := dmin - h * 60;
IF now.millisec >= start.millisec THEN
dmil := now.millisec - start.millisec;
ELSE
(* watch the order of the subtractions, card max is 65534 *)
dmil := start.millisec - now.millisec;
dmil := 60000 - dmil;
(* really one minute less than computed, propagate backwards *)
IF m > 0 THEN
m := m - 1;
ELSE
IF h > 0 THEN
h := h - 1;
ELSE
d := d - 1;
END;
END;
END;
s := dmil DIV 1000;
u := ( dmil - s * 1000 ) DIV 10;
WriteString( 'elapsed time: ' );
WriteString( numbers[d] );
WriteString( ' ' ); WriteString( numbers[h] );
WriteString( ':' ); WriteString( numbers[m] );
WriteString( ':' ); WriteString( numbers[s] );
WriteString( '.' ); WriteString( numbers[u] );
WriteLn;
END;
END ShowTimer;
BEGIN
started := FALSE;
digits[0] := '0'; digits[1] := '1'; digits[2] := '2'; digits[3] := '3';
digits[4] := '4'; digits[5] := '5'; digits[6] := '6'; digits[7] := '7';
digits[8] := '8'; digits[9] := '9';
(* generate 2 digit strings for numbers 0 to 99 as a lookup table *)
k := 0;
FOR i := 0 TO 9 DO
FOR j := 0 TO 9 DO
numbers[k][0] := digits[i];
numbers[k][1] := digits[j];
k := k + 1;
END;
END;
END Timer.