-- File: PerfCommon.mesa last edited by -- Sandman on September 15, 1980 4:14 PM -- Karlton on Jun 23, 1980 3:19 PM DIRECTORY BP USING [BBHandle, Conditionalize, EnumerateBBs, Fail], Inline USING [COPY], PerfCommonOps USING [logSW, Number], Put USING [Char, Line], String USING [AppendChar, AppendLongNumber], Window USING [Handle]; PerfCommon: PROGRAM IMPORTS BP, Inline, Put, String, PerfCommonOps EXPORTS PerfCommonOps =PUBLIC BEGIN Zero: PROC [p: POINTER, l: CARDINAL] = { IF l # 0 THEN {p↑ ← 0; Inline.COPY[from: p, to: p + 1, nwords: l - 1]}}; handle: Window.Handle ← PerfCommonOps.logSW; Number: TYPE = PerfCommonOps.Number; ConditionBreaks: PROCEDURE = BEGIN gotThemAll: BOOLEAN ← TRUE; Proc: PROCEDURE [bb: BP.BBHandle] RETURNS [done: BOOLEAN] = { BP.Conditionalize[bb, "1"L]; RETURN[FALSE]}; [] ← BP.EnumerateBBs[Proc ! BP.Fail => {gotThemAll ← FALSE; CONTINUE}]; IF gotThemAll THEN Put.Line[handle, "Conditionalized breaks"L]; RETURN END; AverageTime: PROCEDURE [time, count: Number, conversion: LONG CARDINAL] RETURNS [Number] = BEGIN PreventOverflow: LONG CARDINAL = LAST[LONG CARDINAL]/conversion; WHILE time > PreventOverflow DO count ← count/4; time ← time/4; ENDLOOP; time ← IF count = 0 THEN 0 ELSE ((time*conversion)/100)/count; RETURN[time]; END; WriteConvertedTicksToMs: PROCEDURE [ ticks: Number, conversion: LONG CARDINAL, columns: CARDINAL ← 0] = BEGIN s: STRING ← [24]; PreventOverflow: LONG CARDINAL = LAST[LONG CARDINAL]/conversion; IF ticks < PreventOverflow THEN WriteTime[(ticks*conversion)/100, columns] ELSE { i: CARDINAL ← 1; DO ticks ← ticks / 10; IF ticks < PreventOverflow THEN EXIT; i ← i + 1; ENDLOOP; String.AppendLongNumber[s, (ticks*conversion)/100, 10]; THROUGH [0..i) DO String.AppendChar[s, '0]; ENDLOOP; WriteTimeString[s, columns]}; RETURN END; MaxPercent: LONG CARDINAL = LAST[LONG CARDINAL]/10000; WritePercent: PROCEDURE [count, total: Number, columns: CARDINAL ← 0] = BEGIN s: STRING ← [20]; whole: LONG INTEGER; l, i: CARDINAL; WHILE count > MaxPercent DO count ← count/4; total ← total/4; ENDLOOP; whole ← IF total = 0 THEN 0 ELSE (count*10000)/total; String.AppendLongNumber[s, whole, 10]; IF (l ← s.length) = 1 THEN BEGIN s[1] ← s[0]; s[0] ← '0; l ← 2; END; FOR i IN (l..columns - 1] DO Put.Char[handle, ' ]; ENDLOOP; FOR i IN [0..l - 2) DO Put.Char[handle, s[i]]; ENDLOOP; Put.Char[handle, '.]; FOR i IN [l - 2..l) DO Put.Char[handle, s[i]]; ENDLOOP; END; WriteTime: PROCEDURE [time: Number, columns: CARDINAL ← 0] = BEGIN s: STRING ← [20]; String.AppendLongNumber[s, time, 10]; WriteTimeString[s, columns]; RETURN END; WriteTimeString: PROCEDURE [s: STRING, columns: CARDINAL ← 0] = BEGIN i, nPuncuation: CARDINAL; nPuncuation ← MIN[(s.length - 1)/3, 3]; FOR i IN (s.length + nPuncuation..columns] DO Put.Char[handle, ' ]; ENDLOOP; FOR i IN [0..s.length) DO Put.Char[handle, s[i]]; SELECT s.length - i FROM 10 => Put.Char[handle, ',]; 7 => Put.Char[handle, '.]; 4 => Put.Char[handle, ':]; ENDCASE; ENDLOOP; RETURN END; WriteLongNumber: PROCEDURE [number: Number, columns: CARDINAL ← 0] = BEGIN s: STRING ← [20]; i, nPuncuation: CARDINAL; String.AppendLongNumber[s, number, 10]; nPuncuation ← MIN[(s.length - 1)/3, 3]; FOR i IN (s.length + nPuncuation..columns] DO Put.Char[handle, ' ]; ENDLOOP; FOR i IN [0..s.length) DO Put.Char[handle, s[i]]; SELECT s.length - i FROM 10, 7, 4 => Put.Char[handle, ',]; ENDCASE; ENDLOOP; RETURN END; END.