Initial revision
This commit is contained in:
62
include/occam/dec.ocm
Normal file
62
include/occam/dec.ocm
Normal file
@@ -0,0 +1,62 @@
|
||||
-- decin/decout - Decimal i/o
|
||||
|
||||
proc decin(chan in, var d, c)=
|
||||
-- Reads a decimal number from input into d. c is used as the first input
|
||||
-- character, and it contains the character just after the decimal number
|
||||
-- when decin exits.
|
||||
|
||||
var neg:
|
||||
seq
|
||||
while (c='*s') or (c='*t') or (c='*n')
|
||||
in ? c
|
||||
if
|
||||
(c='-') or (c='+')
|
||||
seq
|
||||
neg:=(c='-')
|
||||
in ? c
|
||||
true
|
||||
neg:=false
|
||||
d:=0
|
||||
while ('0'<=c) and (c<='9')
|
||||
seq
|
||||
d:=(d*10)+(c-'0')
|
||||
in ? c
|
||||
if
|
||||
neg
|
||||
d:= -d
|
||||
:
|
||||
proc decout(chan out, value d, w)=
|
||||
-- Sends d to channel out in decimal on a field of w spaces. It is just like
|
||||
-- fprintf(out, "%*d", w, d);
|
||||
|
||||
var dec[BYTE 12], di, dd, d0, neg:
|
||||
seq
|
||||
di:=0
|
||||
if
|
||||
d<0
|
||||
seq
|
||||
neg:=true
|
||||
dd:= -d
|
||||
d>=0
|
||||
seq
|
||||
neg:=false
|
||||
dd:=d
|
||||
d0:=1
|
||||
while d0<>0
|
||||
seq
|
||||
dec[BYTE di]:=(dd\10)+'0'
|
||||
di:=di+1
|
||||
dd:=dd/10
|
||||
d0:=dd
|
||||
if
|
||||
neg
|
||||
seq
|
||||
dec[BYTE di]:='-'
|
||||
di:=di+1
|
||||
seq i=[0 for w-di]
|
||||
out ! '*s'
|
||||
while di<>0
|
||||
seq
|
||||
di:=di-1
|
||||
out ! dec[BYTE di]
|
||||
:
|
||||
Reference in New Issue
Block a user