IMPLEMENTATION MODULE CHRONO; (******************************************************************************* Environnement : Solaris 2.3 Modula-2 ------------- Programmeurs : Pierre L'Ecuyer, Benoit Martin ----------- *******************************************************************************) FROM MYINOUT IMPORT WriteString; FROM NUM IMPORT WriteLI, WriteLR, Trunc, Round, LIToLR; FROM CLib IMPORT Heure; PROCEDURE InitChrono (VAR C : Chrono); BEGIN Heure(C.second, C.microsec) END InitChrono; PROCEDURE WriteChrono (C : Chrono; Form : TimeFormat); VAR seconde, heure, minute, centieme : LONGINT; time : LONGREAL; BEGIN IF (Form <> hms) THEN time := ValChrono (C, Form) END; CASE Form OF sec : WriteLR (time, 10, 2, 1); WriteString (' seconds ') | min : WriteLR (time, 10, 2, 1); WriteString (' minutes ') | hours : WriteLR (time, 10, 2, 1); WriteString (' hours ') | days : WriteLR (time, 10, 2, 1); WriteString (' days ') | hms : time := ValChrono (C, sec); heure := Trunc (time * 2.777777778E-4); IF (heure > 0) THEN time := time - LIToLR (heure) * 3600.0 END; minute := Trunc (time * 1.666666667E-2); IF (minute > 0) THEN time := time - LIToLR (minute) * 60.0 END; seconde := Trunc (time); centieme := Round (100.0 * (time - LIToLR (seconde))); WriteLI (heure, 1); WriteString (':'); IF (minute < 10) THEN WriteString ('0') END; WriteLI (minute, 1); WriteString (':'); IF (seconde < 10) THEN WriteString ('0') END; WriteLI (seconde, 1); WriteString ('.'); IF (centieme < 10) THEN WriteString ('0') END; WriteLI (centieme, 1); END END WriteChrono; PROCEDURE ValChrono (C : Chrono; Unit : TimeUnit) : LONGREAL; VAR time : LONGREAL; (* Temps ecoule, en secondes. *) now : Chrono; BEGIN Heure(now.second, now.microsec); time := (FLOAT (now.microsec) - FLOAT (C.microsec)) / 1000000.0 + FLOAT (now.second) - FLOAT (C.second); CASE Unit OF sec : RETURN time | min : RETURN time * 1.666666667E-2 | hours : RETURN time * 2.777777778E-4 | days : RETURN time * 1.157407407E-5 END END ValChrono; END CHRONO.