diff --git a/fco2/testcases/commstime-mini.occ b/fco2/testcases/commstime-mini.occ index 7ce76b0..57601ce 100644 --- a/fco2/testcases/commstime-mini.occ +++ b/fco2/testcases/commstime-mini.occ @@ -1,45 +1,106 @@ -- A standalone occam 2 version of the stock commstime benchmark. ---{{{ PROC out.string (VAL []BYTE s, VAL INT width, CHAN OF BYTE out) -PROC out.string (VAL []BYTE s, VAL INT width, CHAN OF BYTE out) - SEQ - SEQ i = 0 FOR SIZE s - out ! s[i] - SEQ j = 0 FOR width - (SIZE s) - out ! ' ' +--{{{ stuff from libcourse +--{{{ PROC out.repeat (VAL BYTE ch, VAL INT n, CHAN BYTE out) +--* Write a character repeatedly to a channel. +-- This outputs [@code ch] down the channel [@code out] [@code n] times. If +-- [@code n] is negative, nothing happens. +-- @param ch Character +-- @param n Number of times to output (negative values result in no output) +-- @param out Channel to write to +PROC out.repeat (VAL BYTE ch, VAL INT n, CHAN BYTE out) + --{{{ + IF + n > 0 + SEQ i = 0 FOR n + out ! ch + TRUE + SKIP + --}}} : --}}} - ---{{{ PROC out.int (VAL INT n, VAL INT width, CHAN OF BYTE out) -PROC out.int (VAL INT n, VAL INT width, CHAN OF BYTE out) - BYTE sign: - INT val, i: - [12]BYTE s: +--{{{ PROC out.string (VAL []BYTE s, VAL INT field, CHAN BYTE out) +--* Write a string to a channel. +-- This outputs [@code s] in a fieldwidth [@code field] down [@code out]. +-- @param s String +-- @param field Field width to right-justify in +-- @param out Channel to write to +PROC out.string (VAL []BYTE s, VAL INT field, CHAN BYTE out) + --{{{ + VAL INT length IS SIZE s: SEQ - val, i := n, 0 - IF - n < 0 - SEQ - sign := '-' - val := -val - TRUE - sign := ' ' - WHILE n > 10 - SEQ - s[i] := '0' + (BYTE (n \ 10)) - i := i + 1 - n := n / 10 - s[i] := '0' + (BYTE n) - s[i + 1] := sign - i := i + 2 - SEQ j = 0 FOR width - i - out ! ' ' - WHILE i > 0 - SEQ - i := i - 1 - out ! s[i] + out.repeat (' ', field - length, out!) + SEQ i = 0 FOR length + out ! s[i] + --}}} : --}}} +--{{{ PROC out.int (VAL INT n, VAL INT field, CHAN BYTE out) +--* Write an integer in decimal to a channel. +-- This outputs [@code n] in a fieldwidth [@code field] down [@code out]. The +-- rules for fieldwidth are as [@ref out.byte]. +-- @param n Integer +-- @param field Field width to right-justify in +-- @param out Channel to write to +PROC out.int (VAL INT n, VAL INT field, CHAN BYTE out) + --{{{ + IF + n = (MOSTNEG INT) + --{{{ minint + out.string ("-2147483648", field, out!) + --}}} + n = 0 + --{{{ zero + SEQ + IF + 1 < field + out.repeat (' ', field - 1, out!) + TRUE + SKIP + out ! '0' + --}}} + TRUE + --{{{ anything else + VAL INT max.digits IS 20: + [max.digits]INT D: + INT x, i: + SEQ + --{{{ check negative + IF + n < 0 + x := -n + TRUE -- (n > 0) + x := n + --}}} + --{{{ decompose + SEQ + i := 0 + WHILE x > 0 + SEQ + D[i] := x\10 + x := x/10 + i := i + 1 + --}}} + --{{{ pad + IF + n > 0 + out.repeat (' ', field - i, out!) + TRUE + SEQ + out.repeat (' ', (field - 1) - i, out!) + out ! '-' + --}}} + --{{{ output + WHILE i > 0 + SEQ + i := i - 1 + out ! BYTE (D[i] + (INT '0')) + --}}} + --}}} + --}}} +: +--}}} +--}}} --{{{ PROC id (CHAN OF INT in, out) PROC id (CHAN OF INT in, out)