Make commstime work by copying in appropriate bits of libcourse

This commit is contained in:
Adam Sampson 2007-04-12 02:39:15 +00:00
parent f1c17bea50
commit 81d59f40de

View File

@ -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)