Make commstime work by copying in appropriate bits of libcourse
This commit is contained in:
parent
f1c17bea50
commit
81d59f40de
|
@ -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)
|
||||
|
|
Loading…
Reference in New Issue
Block a user