packages feed

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.